xuwell.js 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197
  1. /**
  2. * 通用easyui类库 v2.22
  3. * xuwei 2021-08-14
  4. */
  5. //获取参数
  6. function request(paras) {
  7. var url = location.href;
  8. var paraString = url.substring(url.indexOf("?") + 1, url.length).split("&");
  9. var paraObj = {};
  10. for (i = 0; i < paraString.length; i++) {
  11. paraObj[decodeURI(paraString[i].substring(0, paraString[i].indexOf("=")).toLowerCase())] = paraString[i].substring(paraString[i].indexOf("=") + 1, paraString[i].length);
  12. }
  13. var returnValue = paraObj[decodeURI(paras.toLowerCase())];
  14. if (typeof returnValue == "undefined") {
  15. return "";
  16. }
  17. else {
  18. return decodeURI(returnValue);
  19. }
  20. }
  21. //格式化日期
  22. Date.prototype.format = function (fmt) {
  23. var o = {
  24. "M+": this.getMonth() + 1, //月份
  25. "d+": this.getDate(), //日
  26. "h+": this.getHours(), //小时
  27. "m+": this.getMinutes(), //分
  28. "s+": this.getSeconds(), //秒
  29. "q+": Math.floor((this.getMonth() + 3) / 3), //季度
  30. "S": this.getMilliseconds() //毫秒
  31. };
  32. if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  33. for (var k in o)
  34. if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  35. return fmt;
  36. }
  37. //替换全部
  38. String.prototype.replaceAll = function (s1, s2) {
  39. if (s1 != null && s2 != null)
  40. return this.replace(new RegExp(s1, "gm"), s2);
  41. };
  42. //序列化表单为Json
  43. $.fn.serializeJson = function () {
  44. var o = {};
  45. var a = this.serializeArray();
  46. $.each(a, function () {
  47. if (o[this.name] !== undefined) {
  48. if (!o[this.name].push) {
  49. o[this.name] = [o[this.name]];
  50. }
  51. o[this.name].push(this.value || '');
  52. } else {
  53. o[this.name] = this.value || '';
  54. }
  55. });
  56. return o;
  57. };
  58. //加载tree
  59. $.fn.treeLoad = function (ops) {
  60. var url = typeof ops.url == 'undefined' ? '' : ops.url;
  61. if (url != '') {
  62. url = url.indexOf('?') > -1 ? url + '&r=' + Math.random() : url + '?r=' + Math.random();
  63. $(this).tree({
  64. url: url,
  65. method: typeof ops.method == 'undefined' ? 'post' : ops.method,
  66. tabs: typeof ops.tabs == 'undefined' ? 'tabs' : ops.tabs,
  67. animate: typeof ops.animate == 'undefined' ? true : ops.animate,
  68. lines: typeof ops.lines == 'undefined' ? false : ops.lines,
  69. onClick: function (node) {
  70. if ($(this).tree('isLeaf', node.target)) {
  71. var trueUrl = node.attributes['url'];
  72. //===============================
  73. switch (node.attributes.target) {
  74. case '_blank': {
  75. window.open(trueUrl);
  76. break;
  77. }
  78. case '_self': {
  79. window.location = trueUrl;
  80. break;
  81. }
  82. case '_tabs': {
  83. $('#tabs').tabsOpen({ id: node.text, title: node.text, url: trueUrl, closable: true });
  84. break;
  85. }
  86. default: {
  87. $('#tabs').tabsOpen({ id: node.text, title: node.text, url: trueUrl, closable: true });
  88. }
  89. }
  90. //===============================
  91. }
  92. },
  93. onBeforeLoad: function (node, param) {
  94. $.messager.progress();
  95. },
  96. onLoadSuccess: function (node, data) {
  97. $.messager.progress('close');
  98. }
  99. });
  100. }
  101. };
  102. //加载tab框架
  103. $.fn.tabsOpen = function (ops) {
  104. var url = typeof ops.url == 'undefined' ? '' : ops.url;
  105. if (url != '') {
  106. url = url.indexOf('?') > -1 ? url + '&r=' + Math.random() : url + '?r=' + Math.random();
  107. var id = typeof ops.id == 'undefined' ? '' : ops.id;
  108. var title = typeof ops.title == 'undefined' ? '' : ops.title;
  109. var closable = typeof ops.closable == 'undefined' ? true : ops.closable;
  110. if ($(this).tabs('exists', title)) {
  111. $(this).tabs('select', title);
  112. }
  113. else {
  114. $(this).tabs('add', {
  115. id: id,
  116. title: title,
  117. closable: closable,
  118. content: '<div style="overflow:hidden;width:100%;height:100%;-webkit-overflow-scrolling: touch;"><iframe id="Frame' + title + '" scrolling="auto" frameborder="0" src="' + url + '" style="width:100%;height:100%;"></iframe></div>'
  119. });
  120. }
  121. }
  122. };
  123. //加载数据
  124. $.fn.datagridLoad = function (ops) {
  125. var url = typeof ops.url == 'undefined' ? '' : ops.url;
  126. var iconCls = typeof ops.iconCls == 'undefined' ? '' : ops.iconCls;
  127. var title = typeof ops.title == 'undefined' ? '' : ops.title;
  128. var idField = typeof ops.idField == 'undefined' ? '标识' : ops.idField;
  129. var url = typeof ops.url == 'undefined' ? '' : ops.url;
  130. var fixWidth = typeof ops.fixWidth == 'undefined' ? 100 : ops.fixWidth;
  131. var mergeWidth = typeof ops.mergeWidth == 'undefined' ? 80 : ops.mergeWidth;
  132. var splitChar = typeof ops.splitChar == 'undefined' ? '_' : ops.splitChar;
  133. var onBeforeLoad = typeof ops.onBeforeLoad == 'undefined' ? function (para) { } : ops.onBeforeLoad;
  134. var onLoadSuccess = typeof ops.onLoadSuccess == 'undefined' ? function (para) { } : ops.onLoadSuccess;
  135. var onSelect = typeof ops.onSelect == 'undefined' ? function (index, row) { } : ops.onSelect;
  136. if (url != '') {
  137. url = url.indexOf('?') > -1 ? url + '&r=' + Math.random() : url + '?r=' + Math.random();
  138. var ssParams = typeof ops.queryParams == 'undefined' ? "" : ops.queryParams;
  139. if (request('ss') != "") ssParams = eval('(' + request('ss') + ')');
  140. var queryParams = ssParams == "" ? "" : ssParams;
  141. //数据表格
  142. $(this).datagrid({
  143. iconCls: iconCls,
  144. title: title,
  145. idField: idField,
  146. fit: true,
  147. columns: ops.columns == 'undefined' ? '' : ops.columns,
  148. onHeaderContextMenu: function (e, field) {
  149. e.preventDefault();
  150. $(this).datagrid('columnMenu').menu('show', {
  151. left: e.pageX,
  152. top: e.pageY
  153. });
  154. },
  155. onRowContextMenu: function (e, index, row) {
  156. e.preventDefault();
  157. var field = $(e.target).closest('td').attr('field');
  158. //保存过滤字段和值
  159. $(this).filter.field = field;
  160. $(this).filter.value = row[field];
  161. $(this).datagrid('rowMenu').menu('show', {
  162. left: e.pageX,
  163. top: e.pageY
  164. });
  165. },
  166. fitColumns: false,
  167. rownumbers: true,
  168. pagination: typeof ops.pagination == 'undefined' ? true : ops.pagination,
  169. remoteSort: true,
  170. multiSort: false,
  171. singleSelect: false,
  172. checkOnSelect: true,
  173. selectOnCheck: true,
  174. ctrlSelect: true,
  175. url: url,
  176. queryParams: queryParams,
  177. method: 'post',
  178. border: false,
  179. collapsible: true,
  180. pageNumber: typeof ops.pageNumber == 'undefined' ? 1 : ops.pageNumber,
  181. pageSize: typeof ops.pageSize == 'undefined' ? 10 : ops.pageSize,
  182. pageList: typeof ops.pageList == 'undefined' ? [10, 15, 20, 30, 40, 50, 100, 500,1000,5000,10000] : ops.pageList,
  183. onBeforeLoad: onBeforeLoad,
  184. onLoadSuccess: function (json) {
  185. if (json['success'] == true) {
  186. if (json['rows'].length > 0) {
  187. //如果未定义列动态加载列=================================
  188. if ($(this).datagrid('getColumnFields') == '') {
  189. //获取自动列
  190. var jsonColumns = $.getMergeColumns($(this), json["rows"], fixWidth, mergeWidth, splitChar);
  191. //绑定列名 此处可能多加载了一次api需要想办法处理
  192. $(this).datagrid({
  193. fitColumns: false,
  194. columns: jsonColumns
  195. });
  196. }
  197. //如果定义了列拖动加载列拖动事件=============================
  198. //var columnMoving = typeof ops.columnMoving == 'undefined' ? false : ops.columnMoving;
  199. //if (columnMoving) $(this).datagrid("columnMoving");
  200. }
  201. } else {
  202. //$.messager.alert(title, json['message'], 'error');
  203. $.messager.confirm(title, json['message'] + '\n 点击确定,查看错误日志!', function (r) {
  204. if (r) {
  205. //window.parent.location.href = "/mes";
  206. $.loaded();
  207. window.parent.open("/Logs/_error_" + (new Date()).format("yyyyMMdd") + "_.log");
  208. }
  209. });
  210. }
  211. //修正行号
  212. $(this).datagrid("fixRownumber");
  213. //加载自定义方法
  214. onLoadSuccess(json);
  215. },
  216. onLoadError: function () {
  217. $.messager.alert(title, '数据加载失败!', 'error');
  218. },
  219. onSelect: onSelect
  220. //autoRowHeight: false,
  221. //rowStyler: function (index, row) {
  222. // return 'height:32px'
  223. //},
  224. //treeField: '名称',
  225. //onLoadSuccess: function (row) {
  226. // $('#' + datagridTag).treegrid('enableDnd', row ? row.id : null);
  227. //}
  228. });
  229. }
  230. };
  231. //手动加载报表数据支持表头合并,不支持分页,应用于统计报表
  232. $.fn.datagridLoadRpt = function (ops) {
  233. var dg = $(this);
  234. var title = typeof ops.title == 'undefined' ? '' : ops.title;
  235. var onLoadSuccess = typeof ops.onLoadSuccess == 'undefined' ? function (para) { } : ops.onLoadSuccess;
  236. var onSelect = typeof ops.onSelect == 'undefined' ? function (index, row) { } : ops.onSelect;
  237. var url = typeof ops.url == 'undefined' ? '' : ops.url;
  238. if (url != '') url = url.indexOf('?') > -1 ? url + '&r=' + Math.random() : url + '?r=' + Math.random();
  239. var ssParams = typeof ops.queryParams == 'undefined' ? "" : ops.queryParams;
  240. if (request('ss') != "") ssParams = eval('(' + request('ss') + ')');
  241. var queryParams = ssParams == "" ? "" : ssParams;
  242. var fixWidth = typeof ops.fixWidth == 'undefined' ? 100 : ops.fixWidth;
  243. var mergeWidth = typeof ops.mergeWidth == 'undefined' ? 80 : ops.mergeWidth;
  244. var splitChar = typeof ops.splitChar == 'undefined' ? '_' : ops.splitChar;
  245. $.loading();
  246. $.post(url, queryParams, function (data) {
  247. var json = JSON.parse(data);
  248. if (json['success'] == true) {
  249. var jsonColumns = $.getMergeColumns(dg, json["rows"], fixWidth, mergeWidth, splitChar);
  250. dg.datagrid({
  251. title: title,
  252. rownumbers: true,
  253. fitColumns: false,
  254. columns: jsonColumns,
  255. onHeaderContextMenu: function (e, field) {
  256. e.preventDefault();
  257. $(this).datagrid('columnMenu').menu('show', {
  258. left: e.pageX,
  259. top: e.pageY
  260. });
  261. },
  262. onRowContextMenu: function (e, index, row) {
  263. e.preventDefault();
  264. var field = $(e.target).closest('td').attr('field');
  265. //保存过滤字段和值
  266. $(this).filter.field = field;
  267. $(this).filter.value = row[field];
  268. $(this).datagrid('rowMenu').menu('show', {
  269. left: e.pageX,
  270. top: e.pageY
  271. });
  272. },
  273. data: json,
  274. onLoadSuccess: function (data) {
  275. //如果定义了列拖动加载列拖动事件=============================
  276. //var columnMoving = typeof ops.columnMoving == 'undefined' ? false : ops.columnMoving;
  277. //if (columnMoving) $(dg).datagrid("columnMoving");
  278. //xuwei add 2020-11-09 end ===============================
  279. $.loaded();
  280. onLoadSuccess(data);
  281. $(this).datagrid("fixRownumber");
  282. },
  283. onSelect: function (index, row) {
  284. onSelect(index, row);
  285. }
  286. });
  287. }
  288. else {
  289. $.messager.confirm(title, json['message'] + '\n 点击确定查看错误日志!', function (r) {
  290. if (r) {
  291. //window.parent.location.href = "/mes";
  292. window.parent.open("/Logs/_error_" + (new Date()).format("yyyyMMdd") + "_.log");
  293. }
  294. $.loaded();
  295. });
  296. }
  297. });
  298. }
  299. //显示checkbox
  300. $.fn.datagridCheckbox = function (ops) {
  301. var valuefield = typeof ops.valuefield == 'undefined' ? 'SID' : ops.valuefield;
  302. var buttonid = typeof ops.buttonid == 'undefined' ? 'btnCheckbox' : ops.buttonid;
  303. var showhide = $('#' + buttonid).linkbutton('options').selected ? 'hideColumn' : 'showColumn';
  304. $(this).datagrid(showhide, valuefield);
  305. };
  306. //处理方法
  307. $.fn.datagridPost = function (ops) {
  308. var dg = $(this);
  309. var url = typeof ops.url == 'undefined' ? '' : ops.url;
  310. var title = typeof ops.title == 'undefined' ? '数据操作' : ops.title;
  311. var onValidate = typeof ops.onValidate == 'undefined' ? function (s) { return true; } : ops.onValidate;
  312. if (url != '') {
  313. url = url.indexOf('?') > -1 ? url + '&r=' + Math.random() : url + '?r=' + Math.random();
  314. var rowCount = dg.datagrid('getSelections').length;
  315. if (rowCount > 0) {
  316. if (onValidate($(this).datagrid('getSelections')) == true) {
  317. $.messager.confirm(title, '您选定了 ' + rowCount + ' 条记录!', function (r) {
  318. if (r) {
  319. var idstr = '';
  320. var idname = dg.datagrid('options')['idField'];
  321. for (i = 0; i < dg.datagrid('getSelections').length; i++) {
  322. if (i > 0) idstr += ",";
  323. idstr += dg.datagrid('getSelections')[i][idname];
  324. }
  325. var jsonstr = '{id:"' + idstr + '"}';
  326. $.post(url, eval('(' + jsonstr + ')'), function (data) {
  327. var json = eval("(" + data + ")");
  328. if (json['success'] == true) {
  329. dg.datagrid('reload');
  330. }
  331. else {
  332. $.messager.alert(title, json['message'], 'error');
  333. }
  334. });
  335. }
  336. });
  337. }
  338. else {
  339. $.messager.alert(title, '您选择的数据不允许操作!', 'warning');
  340. }
  341. }
  342. else {
  343. $.messager.alert(title, '您还没有选择任何记录!', 'warning');
  344. }
  345. }
  346. };
  347. //窗体方法
  348. $.fn.datagridDialog = function (ops) {
  349. var title = typeof ops.title == 'undefined' ? '数据操作' : ops.title;
  350. var width = typeof ops.width == 'undefined' ? 800 : ops.width;
  351. var height = typeof ops.height == 'undefined' ? 600 : ops.height;
  352. var requireSelect = typeof ops.requireSelect == 'undefined' ? false : ops.requireSelect;
  353. var onValidate = typeof ops.onValidate == 'undefined' ? function (s) { return true; } : ops.onValidate;
  354. var url = typeof ops.url == 'undefined' ? '' : ops.url;
  355. if (url != '') {
  356. if ($(this).datagrid('getSelected') != null || requireSelect == false) {
  357. if (onValidate($(this).datagrid('getSelected')) == true) {
  358. if (requireSelect == true) {
  359. url = url.indexOf('?') > -1 ?
  360. url + '&id=' + $(this).datagrid('getSelected')[$(this).datagrid('options')['idField']] :
  361. url + '?id=' + $(this).datagrid('getSelected')[$(this).datagrid('options')['idField']];
  362. }
  363. $.dialog.show({
  364. title: title,
  365. width: width,
  366. height: height,
  367. url: url
  368. });
  369. }
  370. else {
  371. $.messager.alert(title, '您选择的数据不允许操作!', 'warning');
  372. }
  373. }
  374. else {
  375. if (requireSelect) $.messager.alert(title, '您还没有选择任何记录!', 'warning');
  376. }
  377. }
  378. };
  379. //导出方法
  380. $.fn.datagridExport = function (ops) {
  381. var fileName = typeof ops.fileName == 'undefined' ? '数据导出.xls' : ops.fileName;
  382. var workSheet = typeof ops.workSheet == 'undefined' ? '数据导出' : ops.workSheet;
  383. var jsonData = $(this).datagrid('getData')['rows'];
  384. var fields1 = $(this).datagrid('getColumnFields');
  385. var fields2 = $(this).datagrid('getColumnFields', true);
  386. var fields = fields2.concat(fields1);
  387. var headers = typeof ops.headers == 'undefined' ? [] : ops.headers;
  388. var dataType = typeof ops.dataType == 'undefined' ? '' : ops.dataType;//为text时按文本导出
  389. //没定义表头从datagrid读取
  390. if (headers.length == 0) {
  391. for (var i = 0; i < fields.length; i++) {
  392. if (!$(this).datagrid('getColumnOption', fields[i]).hidden)
  393. headers.push($(this).datagrid('getColumnOption', fields[i])['title']);
  394. }
  395. }
  396. //转化json为object
  397. var excel = "<table>";
  398. //设置表头
  399. var row = "<tr>";
  400. if (headers) { //使用标题项
  401. for (var i in headers) {
  402. if (!$(this).datagrid('getColumnOption', fields[i]).hidden)
  403. row += "<th align='center'>" + headers[i] + "</th>";
  404. }
  405. } else {//不使用标题项
  406. for (var i in jsonData[0]) {
  407. if (!$(this).datagrid('getColumnOption', fields[i]).hidden)
  408. row += "<th align='center'>" + i + "</th>";
  409. }
  410. }
  411. excel += row + "</tr>";
  412. //设置数据
  413. for (var i = 0; i < jsonData.length; i++) {
  414. var row = "<tr>";
  415. for (var j = 0; j < fields.length; j++) {
  416. var value = jsonData[i][fields[j]] == null ? "" : jsonData[i][fields[j]];
  417. if (!$(this).datagrid('getColumnOption', fields[j]).hidden) {
  418. if (dataType == '') row += "<td align='center'>" + value + "</td>";
  419. //if (dataType == 'text')row += "<td align='center'>" + value + "</td>";
  420. if (dataType == 'text')row += "<td align='center'>" + value + "&nbsp;</td>";
  421. }
  422. }
  423. excel += row + "</tr>";
  424. }
  425. excel += "</table>";
  426. var excelFile =
  427. "<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:excel' xmlns='http://www.w3.org/TR/REC-html40'>";
  428. excelFile +=
  429. '<meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8">';
  430. excelFile +=
  431. '<meta http-equiv="content-type" content="application/vnd.ms-excel';
  432. excelFile += '; charset=UTF-8">';
  433. excelFile += "<head>";
  434. excelFile += "<!--[if gte mso 9]>";
  435. excelFile += "<xml>";
  436. excelFile += "<x:ExcelWorkbook>";
  437. excelFile += "<x:ExcelWorksheets>";
  438. excelFile += "<x:ExcelWorksheet>";
  439. excelFile += "<x:Name>";
  440. excelFile += workSheet;
  441. excelFile += "</x:Name>";
  442. excelFile += "<x:WorksheetOptions>";
  443. excelFile += "<x:DisplayGridlines/>";
  444. excelFile += "</x:WorksheetOptions>";
  445. excelFile += "</x:ExcelWorksheet>";
  446. excelFile += "</x:ExcelWorksheets>";
  447. excelFile += "</x:ExcelWorkbook>";
  448. excelFile += "</xml>";
  449. excelFile += "<![endif]-->";
  450. excelFile += "</head>";
  451. excelFile += "<body>";
  452. excelFile += excel;
  453. excelFile += "</body>";
  454. excelFile += "</html>";
  455. var uri = "data:application/vnd.ms-excel;charset=utf-8," + encodeURIComponent(excelFile);
  456. var link = document.createElement("a");
  457. link.href = uri;
  458. link.style = "visibility:hidden";
  459. link.download = fileName;
  460. document.body.appendChild(link);
  461. link.click();
  462. document.body.removeChild(link);
  463. };
  464. //支持列拖动
  465. $.extend($.fn.datagrid.methods, {
  466. columnMoving: function (jq) {
  467. return jq.each(function () {
  468. var target = this;
  469. var cells = $(this).datagrid('getPanel').find('div.datagrid-header td[field]');
  470. cells.draggable({
  471. revert: true,
  472. cursor: 'pointer',
  473. edge: 5,
  474. proxy: function (source) {
  475. var p = $('<div class="tree-node-proxy tree-dnd-no" style="position:absolute;border:1px solid #ff0000"/>').appendTo('body');
  476. p.html($(source).text());
  477. p.hide();
  478. return p;
  479. },
  480. onBeforeDrag: function (e) {
  481. e.data.startLeft = $(this).offset().left;
  482. e.data.startTop = $(this).offset().top;
  483. },
  484. onStartDrag: function () {
  485. $(this).draggable('proxy').css({
  486. left: -10000,
  487. top: -10000
  488. });
  489. },
  490. onDrag: function (e) {
  491. $(this).draggable('proxy').show().css({
  492. left: e.pageX + 15,
  493. top: e.pageY + 15
  494. });
  495. return false;
  496. }
  497. }).droppable({
  498. accept: 'td[field]',
  499. onDragOver: function (e, source) {
  500. $(source).draggable('proxy').removeClass('tree-dnd-no').addClass('tree-dnd-yes');
  501. $(this).css('border-left', '1px solid #ff0000');
  502. },
  503. onDragLeave: function (e, source) {
  504. $(source).draggable('proxy').removeClass('tree-dnd-yes').addClass('tree-dnd-no');
  505. $(this).css('border-left', 0);
  506. },
  507. onDrop: function (e, source) {
  508. $(this).css('border-left', 0);
  509. var fromField = $(source).attr('field');
  510. var toField = $(this).attr('field');
  511. setTimeout(function () {
  512. swapField(fromField, toField);
  513. $(target).datagrid();
  514. $(target).datagrid('columnMoving');
  515. }, 0);
  516. }
  517. });
  518. // swap Field to another location
  519. function swapField(from, to) {
  520. var columns = $(target).datagrid('options').columns;
  521. var cc = columns[0];
  522. _swap(from, to);
  523. function _swap(fromfiled, tofiled) {
  524. var fromtemp;
  525. var totemp;
  526. var fromindex = 0;
  527. var toindex = 0;
  528. for (var i = 0; i < cc.length; i++) {
  529. if (cc[i].field == fromfiled) {
  530. fromindex = i;
  531. fromtemp = cc[i];
  532. }
  533. if (cc[i].field == tofiled) {
  534. toindex = i;
  535. totemp = cc[i];
  536. }
  537. }
  538. cc.splice(fromindex, 1, totemp);
  539. cc.splice(toindex, 1, fromtemp);
  540. }
  541. }
  542. });
  543. }
  544. });
  545. //datagrid标题菜单选择列显示功能
  546. $.buildMenuColumn = function (target) {
  547. var state = $(target).data('datagrid');
  548. if (!state.columnMenu) {
  549. state.columnMenu = $('<div></div>').appendTo('body');
  550. state.columnMenu.menu({
  551. onClick: function (item) {
  552. if (item.iconCls == 'tree-checkbox1') {
  553. $(target).datagrid('hideColumn', item.name);
  554. $(this).menu('setIcon', {
  555. target: item.target,
  556. iconCls: 'tree-checkbox0'
  557. });
  558. } else {
  559. $(target).datagrid('showColumn', item.name);
  560. $(this).menu('setIcon', {
  561. target: item.target,
  562. iconCls: 'tree-checkbox1'
  563. });
  564. }
  565. }
  566. })
  567. var fields = $(target).datagrid('getColumnFields', true).concat($(target).datagrid('getColumnFields', false));
  568. for (var i = 0; i < fields.length; i++) {
  569. var field = fields[i];
  570. var col = $(target).datagrid('getColumnOption', field);
  571. state.columnMenu.menu('appendItem', {
  572. text: col.title,
  573. name: field,
  574. iconCls: 'tree-checkbox1'
  575. });
  576. }
  577. }
  578. return state.columnMenu;
  579. }
  580. $.extend($.fn.datagrid.methods, {
  581. columnMenu: function (jq) {
  582. return $.buildMenuColumn(jq[0]);
  583. }
  584. });
  585. //datagrid菜单过滤功能
  586. $.buildMenuRow = function (target) {
  587. var state = $(target).data('datagrid');
  588. if (!state.rowMenu) {
  589. state.rowMenu = $('<div></div>').appendTo('body');
  590. state.rowMenu.menu({
  591. onClick: function (item) {
  592. /*右键菜单处理 开始*/
  593. if (item.text == '过滤') {
  594. var json = $(target).datagrid('getData');
  595. var newRows = [];
  596. for (var i = 0; i < json.rows.length; i++) {
  597. if (json['rows'][i][$(target).filter.field] == $(target).filter.value) newRows.push(json['rows'][i]);
  598. }
  599. json["rows"] = newRows;
  600. $(target).datagrid('loadData', json);
  601. }
  602. if (item.text == '除外过滤') {
  603. var json = $(target).datagrid('getData');
  604. var newRows = [];
  605. for (var i = 0; i < json.rows.length; i++) {
  606. if (json['rows'][i][$(target).filter.field] != $(target).filter.value) newRows.push(json['rows'][i]);
  607. }
  608. json["rows"] = newRows;
  609. $(target).datagrid('loadData', json);
  610. }
  611. if (item.text == '取消过滤') {
  612. $(target).datagrid('reload');
  613. }
  614. if (item.text == '冻结列') {
  615. var fColumns = $(target).datagrid('getColumnFields', true);
  616. var cColumns = $(target).datagrid('getColumnFields');
  617. if (fColumns.indexOf($(target).filter.field) < 0) fColumns.push($(target).filter.field);
  618. cColumns.splice(cColumns.indexOf($(target).filter.field), 1);
  619. var jsonFrozenColumns = [[]];
  620. var jsonColumns = [[]];
  621. for (var i = 0; i < fColumns.length; i++) {
  622. jsonFrozenColumns[0].push($(target).datagrid('getColumnOption', fColumns[i]));
  623. }
  624. for (var j = 0; j < cColumns.length; j++) {
  625. jsonColumns[0].push($(target).datagrid('getColumnOption', cColumns[j]));
  626. }
  627. $(target).datagrid({
  628. frozenColumns: jsonFrozenColumns,
  629. columns: jsonColumns
  630. });
  631. }
  632. if (item.text == '取消冻结列') {
  633. var fColumns = $(target).datagrid('getColumnFields', true);
  634. var cColumns = $(target).datagrid('getColumnFields');
  635. if (cColumns.indexOf($(target).filter.field) < 0) cColumns.push($(target).filter.field);
  636. fColumns.splice(fColumns.indexOf($(target).filter.field), 1);
  637. var jsonFrozenColumns = [[]];
  638. var jsonColumns = [[]];
  639. for (var i = 0; i < fColumns.length; i++) {
  640. jsonFrozenColumns[0].push($(target).datagrid('getColumnOption', fColumns[i]));
  641. }
  642. for (var j = 0; j < cColumns.length; j++) {
  643. jsonColumns[0].push($(target).datagrid('getColumnOption', cColumns[j]));
  644. }
  645. $(target).datagrid({
  646. frozenColumns: jsonFrozenColumns,
  647. columns: jsonColumns
  648. });
  649. }
  650. /*右键菜单处理 结束*/
  651. }
  652. })
  653. state.rowMenu.menu('appendItem', {
  654. text: '过滤',
  655. name: '过滤'
  656. });
  657. state.rowMenu.menu('appendItem', {
  658. text: '除外过滤',
  659. name: '除外过滤'
  660. });
  661. state.rowMenu.menu('appendItem', {
  662. text: '取消过滤',
  663. name: '取消过滤'
  664. });
  665. state.rowMenu.menu('appendItem', {
  666. separator: true
  667. });
  668. state.rowMenu.menu('appendItem', {
  669. text: '冻结列',
  670. name: '冻结列'
  671. });
  672. state.rowMenu.menu('appendItem', {
  673. text: '取消冻结列',
  674. name: '取消冻结列'
  675. });
  676. }
  677. return state.rowMenu;
  678. }
  679. $.extend($.fn.datagrid.methods, {
  680. rowMenu: function (jq) {
  681. return $.buildMenuRow(jq[0]);
  682. }
  683. });
  684. //获取合并列头
  685. $.getMergeColumns = function (dg, rows, fixwidth, mergewidth, splitchar) {
  686. var frozenColumns = dg.datagrid('getColumnFields', true);
  687. var jsonColumns = [[]];
  688. var jsonRows = 1;
  689. var fixWidth = typeof fixwidth == 'undefined' ? 100 : fixwidth;
  690. var mergeWidth = typeof mergewidth == 'undefined' ? 80 : mergewidth;
  691. var splitChar = typeof splitchar == 'undefined' ? '_' : splitchar;
  692. //查找列头行数
  693. for (key in rows[0]) {
  694. var keys = key.split(splitChar);
  695. if (keys.length > jsonRows) jsonRows = keys.length;
  696. }
  697. //拆分列名
  698. for (key in rows[0]) {
  699. if (key.indexOf(splitChar) >= 0) {
  700. //拆分标题行
  701. var keys = key.split(splitChar);
  702. for (var i = 0; i < keys.length; i++) {
  703. if (typeof jsonColumns[i] == 'undefined') jsonColumns.push([]);
  704. if (i < keys.length - 1) {
  705. if (frozenColumns.indexOf(keys[i]) < 0)
  706. jsonColumns[i].push(JSON.parse('{ "title": "' + keys[i] + '","width":"' + mergeWidth + '","rowspan":1,"colspan":1,"align":"center" }'));
  707. }
  708. else {
  709. if (frozenColumns.indexOf(keys) < 0)
  710. jsonColumns[i].push(JSON.parse('{ "field": "' + key + '", "title": "' + keys[i] + '","width":"' + mergeWidth + '","align":"center" }'));
  711. }
  712. }
  713. }
  714. else {
  715. //合并标题行
  716. if (frozenColumns.indexOf(key) < 0 && key !='ROWNO')
  717. jsonColumns[0].push(JSON.parse('{ "field": "' + key + '","title": "' + key + '","width":"' + fixWidth + '","rowspan":' + jsonRows + ',"colspan":1,"align":"center" }'));
  718. }
  719. }
  720. //合并相同列
  721. for (var j = 0; j < jsonColumns.length - 1; j++) {
  722. for (var i = 0; i < jsonColumns[j].length - 1; i++) {
  723. while (jsonColumns[j][i]["title"] == jsonColumns[j][i + 1]["title"]) {
  724. jsonColumns[j].splice(i + 1, 1);
  725. jsonColumns[j][i]["colspan"] = jsonColumns[j][i]["colspan"] + 1;
  726. if (typeof jsonColumns[j][i + 1] == 'undefined') break;
  727. }
  728. }
  729. }
  730. return jsonColumns;
  731. }
  732. //自动合并单元格
  733. $.extend($.fn.datagrid.methods, { autoMergeCells: function (jq, fields) { return jq.each(function () { var target = $(this); if (!fields) { fields = target.datagrid("getColumnFields"); } var rows = target.datagrid("getRows"); var i = 0, j = 0, temp = {}; for (i; i < rows.length; i++) { var row = rows[i]; j = 0; for (j; j < fields.length; j++) { var field = fields[j]; var tf = temp[field]; if (!tf) { tf = temp[field] = {}; tf[row[field]] = [i]; } else { var tfv = tf[row[field]]; if (tfv) { tfv.push(i); } else { tfv = tf[row[field]] = [i]; } } } } $.each(temp, function (field, colunm) { $.each(colunm, function () { var group = this; if (group.length > 1) { var before, after, megerIndex = group[0]; for (var i = 0; i < group.length; i++) { before = group[i]; after = group[i + 1]; if (after && (after - before) == 1) { continue; } var rowspan = before - megerIndex + 1; if (rowspan > 1) { target.datagrid('mergeCells', { index: megerIndex, field: field, rowspan: rowspan }); } if (after && (after - before) != 1) { megerIndex = after; } } } }); }); }); } });
  734. //自动修复行号宽度
  735. $.extend($.fn.datagrid.methods, {
  736. fixRownumber: function (jq) {
  737. return jq.each(function () {
  738. var panel = $(this).datagrid("getPanel");
  739. var width = $(".datagrid-cell-rownumber", panel).last().width("auto").width();
  740. //默认宽度是25,所以只有大于25的时候才进行fix
  741. if (width > 25) {
  742. //多加5个像素,保持一点边距
  743. $(".datagrid-header-rownumber,.datagrid-cell-rownumber", panel).width(width + 5);
  744. //修改了宽度之后,需要对容器进行重新计算,所以调用resize
  745. $(this).datagrid("resize");
  746. } else {
  747. //还原成默认状态
  748. $(".datagrid-header-rownumber,.datagrid-cell-rownumber", panel).removeAttr("style");
  749. }
  750. });
  751. }
  752. });
  753. //按钮加载
  754. $.fn.buttonLoad = function (ops) {
  755. var toolbar = $(this);
  756. var url = typeof ops.url == 'undefined' ? '' : ops.url;
  757. url = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/') + 1) + url;
  758. url = url.indexOf('?') > -1 ? url + '&r=' + Math.random() : url + '?r=' + Math.random();
  759. $.get(url, function (data) {
  760. var json = JSON.parse(data);
  761. if (json['success'] == true) {
  762. for (var button in json['rows']) {
  763. if (json['rows'][button] == true)
  764. {
  765. if (toolbar.find('#' + button).length > 0) toolbar.find('#' + button).show();
  766. }
  767. else
  768. {
  769. if (toolbar.find('#' + button).length > 0) toolbar.find('#' + button).hide();
  770. }
  771. }
  772. }
  773. });
  774. }
  775. //加载form
  776. $.fn.formLoad = function (ops) {
  777. var ff = $(this);
  778. var url = typeof ops.url == 'undefined' ? '' : ops.url;
  779. if (url != '') {
  780. //附加参数
  781. var urlPara = location.href;
  782. var paraString = urlPara.substring(urlPara.indexOf("?") + 1, urlPara.length);
  783. url = url.indexOf('?') > -1 ?
  784. url + '&' + paraString :
  785. url + '?' + paraString ;
  786. $.get(url, function (data) {
  787. var json = JSON.parse(data);
  788. if (json["success"] == true) {
  789. ff.form('load', json["rows"][0]);
  790. var dataField = $('div[data-field="true"],span[data-field="true"]');
  791. $.each(dataField, function (i, item) {
  792. $('#' + item.id).html(json["rows"][0][item.id]);
  793. });
  794. }
  795. });
  796. }
  797. };
  798. //窗体操作
  799. $.dialog = {
  800. 'target': window.parent,
  801. 'show': function (ops) {
  802. var dialogid = typeof (ops.dialogid) == 'undefined' ? 'dlg' : ops.dialogid;
  803. var modal = typeof (ops.modal) == 'undefined' ? true : ops.modal;
  804. var height = typeof (ops.height) == 'undefined' ? 600 : ops.height;
  805. var width = typeof (ops.width) == 'undefined' ? 800 : ops.width;
  806. var modal = typeof (ops.modal) == 'undefined' ? true : ops.modal;
  807. var target = typeof (ops.target) == 'undefined' ? $.dialog.target : ops.target;
  808. if (target.$('#' + dialogid).length == 0) target.$('body').append('<div id="' + dialogid + '"></div>');
  809. var url = typeof (ops.url) == 'undefined' ? '' : ops.url;
  810. if (url != '') {
  811. url = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/') + 1) + url;
  812. url = url.indexOf('?') > -1 ? url + '&r=' + Math.random() : url + '?r=' + Math.random();
  813. target.$('#' + dialogid).dialog({
  814. iconCls: typeof (ops.iconCls) == 'undefined' ? 'icon-detail' : ops.iconCls,
  815. title: typeof (ops.title) == 'undefined' ? '数据操作' : ops.title,
  816. top: typeof (ops.top) == 'undefined' ? ($(target).height() - height) * 0.5 : ops.top,
  817. left: typeof (ops.left) == 'undefined' ? ($(target).width() - width) * 0.5 : ops.left,
  818. width: typeof (ops.width) == 'undefined' ? width : ops.width,
  819. height: typeof (ops.height) == 'undefined' ? height : ops.height,
  820. closed: false,
  821. cache: false,
  822. maximizable: true,
  823. maximized: false,
  824. minimizable: false,
  825. minimized: true,
  826. collapsible: false,
  827. resizable: true,
  828. content: '<div style="overflow:hidden;width:100%;height:100%;"><iframe id="' + dialogid + 'Frame" scrolling="yes" frameborder="0" src="' + url + '" style="width:100%;height:100%;"></iframe></div>',
  829. modal: modal
  830. });
  831. //parent.$('#' + dialogid).find('#dlgFrame')[0].src = url;
  832. }
  833. },
  834. 'close': function (ops) {
  835. var dialogid;
  836. if (typeof (ops) != 'undefined') {
  837. dialogid = typeof (ops.dialogid) == 'undefined' ? 'dlg' : ops.dialogid;
  838. }
  839. else {
  840. dialogid = 'dlg';
  841. }
  842. parent.$('#' + dialogid).dialog('close');
  843. },
  844. 'save': function (ops) {
  845. var target = $.dialog.target;
  846. var dialogid = typeof (ops.dialogid) == 'undefined' ? 'dlg' : ops.dialogid;
  847. var tabsid = typeof (ops.tabsid) == 'undefined' ? 'tabs' : ops.tabsid;
  848. var url = typeof (ops.url) == 'undefined' ? '' : ops.url;
  849. if (url != '') {
  850. url = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/') + 1) + url;
  851. url = url.indexOf('?') > -1 ? url + '&r=' + Math.random() : url + '?r=' + Math.random();
  852. var formid = typeof (ops.formid) == 'undefined' ? 'ff' : ops.formid;
  853. var datagridid = typeof (ops.datagridid) == 'undefined' ? 'dg' : ops.datagridid;
  854. var afterurl = typeof (ops.afterurl) == 'undefined' ? '' : ops.afterurl;
  855. $('#' + formid).form('submit', {
  856. url: url,
  857. onSubmit: function () {
  858. //获取编辑器数据
  859. //if (typeof (xeditor) != 'undefined') {
  860. // for (var i = 0; i < xeditor.length; i++) {
  861. // $('#' + xeditor[i].key.substring(0, xeditor[i].key.length - 6)).val(xeditor[i].getContent());
  862. // }
  863. //}
  864. var check = $('#' + formid).form("validate");
  865. if (check) $.messager.progress();
  866. return check;
  867. },
  868. success: function (data) {
  869. $.messager.progress('close');
  870. var json = eval("(" + data + ")");
  871. if (json['success'] == true) {
  872. if (target == window.parent && target.$('#' + tabsid).length > 0) {
  873. var tab = target.$('#' + tabsid).tabs('getSelected');
  874. var ff = target.$('#' + tabsid).find('#Frame' + tab.attr('id'))[0];
  875. ff.contentWindow.$('#' + datagridid).datagrid('reload');
  876. } else {
  877. target.parent.$('#' + datagridid).datagrid('reload');
  878. }
  879. if (afterurl == "") {
  880. target.parent.$('#' + dialogid).dialog('close');
  881. }
  882. else {
  883. target.parent.$('#' + dialogid).find('#dlgFrame')[0].src = afterurl;
  884. }
  885. }
  886. else {
  887. $.messager.alert('提交数据', json['message'], 'warning');
  888. }
  889. }
  890. });
  891. }
  892. },
  893. 'delete': function (ops) {
  894. var target = $.dialog.target;
  895. var dialogid = typeof (ops.dialogid) == 'undefined' ? 'dlg' : ops.dialogid;
  896. var datagridid = typeof (ops.datagridid) == 'undefined' ? 'dg' : ops.datagridid;
  897. var tabsid = typeof (ops.tabsid) == 'undefined' ? 'tabs' : ops.tabsid;
  898. var url = typeof (ops.url) == 'undefined' ? '' : ops.url;
  899. if (url != '') {
  900. url = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/') + 1) + url;
  901. url = url.indexOf('?') > -1 ? url + '&r=' + Math.random() : url + '?r=' + Math.random();
  902. $.messager.confirm('删除操作', '您确定要删除当前记录吗?', function (r) {
  903. if (r) {
  904. $.get(url, function (data) {
  905. var json = eval("(" + data + ")");
  906. if (json['success'] == true) {
  907. if (target == window.parent && target.$('#' + tabsid).length > 0) {
  908. var tab = target.$('#' + tabsid).tabs('getSelected');
  909. var ff = target.$('#' + tabsid).find('#Frame' + tab.attr('id'))[0];
  910. ff.contentWindow.$('#' + datagridid).datagrid('reload');
  911. }
  912. else {
  913. target.parent.$('#' + datagridid).datagrid('reload');
  914. }
  915. target.parent.$('#' + dialogid).dialog('close');
  916. }
  917. else {
  918. $.messager.alert('删除数据', json['message'], 'warning');
  919. }
  920. });
  921. }
  922. });
  923. }
  924. },
  925. 'go': function (ops) {
  926. var dialogid = typeof (ops.dialogid) == 'undefined' ? 'dlg' : ops.dialogid;
  927. var url = typeof (ops.url) == 'undefined' ? '' : ops.url;
  928. url = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/') + 1) + url;
  929. url = url.indexOf('?') > -1 ? url + '&r=' + Math.random() : url + '?r=' + Math.random();
  930. parent.$('#' + dialogid).find('#' + dialogid + 'Frame')[0].src = url;
  931. }
  932. };
  933. //加载框
  934. $.extend({
  935. loading: function () {
  936. $("<div class=\"datagrid-mask\"></div>").css({ display: "block", width: "100%", height: $(document.body).height() }).appendTo("body");
  937. $("<div class=\"datagrid-mask-msg\" style='height:60px;width:260px;padding-top:18px;'></div>").html("正在处理,请稍等。。。").appendTo("body").css({ display: "block", left: ($(window).outerWidth(true) - 190) / 2, top: ($(window).scrollTop() + 350) });
  938. },
  939. loaded: function (isParentWindow) {
  940. var t = $;
  941. if (typeof isParentWindow != "undefined") t = top.$;
  942. t(".datagrid-mask,.datagrid-mask-msg").remove();
  943. }
  944. });
  945. //多个table导出多个sheet到一个excel
  946. $.tablesToExcel = function tablesToExcel(tables, wsnames, wbname, appname) {
  947. var uri = 'data:application/vnd.ms-excel;base64,'
  948. , tmplWorkbookXML = '<?xml version="1.0"?><?mso-application progid="Excel.Sheet"?><Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">'
  949. + '<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"><Author>xuwei</Author><Created>{created}</Created></DocumentProperties>'
  950. + '<Styles>'
  951. + '<Style ss:ID="Currency"><NumberFormat ss:Format="Currency"></NumberFormat></Style>'
  952. + '<Style ss:ID="Date"><NumberFormat ss:Format="Medium Date"></NumberFormat></Style>'
  953. + '</Styles>'
  954. + '{worksheets}</Workbook>'
  955. , tmplWorksheetXML = '<Worksheet ss:Name="{nameWS}"><Table>{rows}</Table></Worksheet>'
  956. , tmplCellXML = '<Cell{attributeStyleID}{attributeFormula}><Data ss:Type="{nameType}">{data}</Data></Cell>'
  957. , base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))) }
  958. , format = function (s, c) { return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; }) }
  959. var ctx = "";
  960. var workbookXML = "";
  961. var worksheetsXML = "";
  962. var rowsXML = "";
  963. for (var i = 0; i < tables.length; i++) {
  964. if (!tables[i].nodeType) tables[i] = document.getElementById(tables[i]);
  965. //控制要导出的行数
  966. for (var j = 0; j < tables[i].rows.length; j++) {
  967. rowsXML += '<Row>';
  968. for (var k = 0; k < tables[i].rows[j].cells.length; k++) {
  969. var dataType = tables[i].rows[j].cells[k].getAttribute("data-type");
  970. var dataStyle = tables[i].rows[j].cells[k].getAttribute("data-style");
  971. var dataValue = tables[i].rows[j].cells[k].getAttribute("data-value");
  972. dataValue = (dataValue) ? dataValue : tables[i].rows[j].cells[k].innerHTML;
  973. var dataFormula = tables[i].rows[j].cells[k].getAttribute("data-formula");
  974. dataFormula = (dataFormula) ? dataFormula : (appname == 'Calc' && dataType == 'DateTime') ? dataValue : null;
  975. ctx = {
  976. attributeStyleID: (dataStyle == 'Currency' || dataStyle == 'Date') ? ' ss:StyleID="' + dataStyle + '"' : ''
  977. , nameType: (dataType == 'Number' || dataType == 'DateTime' || dataType == 'Boolean' || dataType == 'Error') ? dataType : 'String'
  978. , data: (dataFormula) ? '' : dataValue
  979. , attributeFormula: (dataFormula) ? ' ss:Formula="' + dataFormula + '"' : ''
  980. };
  981. rowsXML += format(tmplCellXML, ctx);
  982. }
  983. rowsXML += '</Row>'
  984. }
  985. ctx = { rows: rowsXML, nameWS: wsnames[i] || 'Sheet' + i };
  986. worksheetsXML += format(tmplWorksheetXML, ctx);
  987. rowsXML = "";
  988. }
  989. ctx = { created: (new Date()).getTime(), worksheets: worksheetsXML };
  990. workbookXML = format(tmplWorkbookXML, ctx);
  991. //查看后台的打印输出
  992. //console.log(workbookXML);
  993. var link = document.createElement("A");
  994. link.href = uri + base64(workbookXML);
  995. link.download = wbname || 'Workbook.xls';
  996. link.target = '_blank';
  997. document.body.appendChild(link);
  998. link.click();
  999. document.body.removeChild(link);
  1000. };
  1001. $.dataGridToExcel = function dataGridToExcel(datagrids, wsnames, wbname) {
  1002. var uri = 'data:application/vnd.ms-excel;base64,'
  1003. , tmplWorkbookXML = '<?xml version="1.0"?><?mso-application progid="Excel.Sheet"?><Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">'
  1004. + '<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"><Author>xuwei</Author><Created>{created}</Created></DocumentProperties>'
  1005. + '<Styles>'
  1006. + '<Style ss:ID="Currency"><NumberFormat ss:Format="Currency"></NumberFormat></Style>'
  1007. + '<Style ss:ID="Date"><NumberFormat ss:Format="Medium Date"></NumberFormat></Style>'
  1008. + '</Styles>'
  1009. + '{worksheets}</Workbook>'
  1010. , tmplWorksheetXML = '<Worksheet ss:Name="{nameWS}"><Table>{rows}</Table></Worksheet>'
  1011. , tmplCellXML = '<Cell{attributeStyleID}{attributeFormula}><Data ss:Type="{nameType}">{data}</Data></Cell>'
  1012. , base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))) }
  1013. , format = function (s, c) { return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; }) }
  1014. var ctx = "";
  1015. var workbookXML = "";
  1016. var worksheetsXML = "";
  1017. var rowsXML = "";
  1018. for (var i = 0; i < datagrids.length; i++) {
  1019. //读取数据
  1020. var jsonData = $('#' + datagrids[i]).datagrid('getData')['rows'];
  1021. //读取字段
  1022. var fields = $('#' + datagrids[i]).datagrid('getColumnFields');
  1023. //读取列头
  1024. var headers = [];
  1025. if (headers.length == 0) {
  1026. for (var j = 0; j < fields.length; j++) {
  1027. headers.push($('#' + datagrids[i]).datagrid('getColumnOption', fields[j])['title']);
  1028. }
  1029. }
  1030. //写入标题列
  1031. rowsXML += '<Row>';
  1032. for (var h in headers) {
  1033. rowsXML += '<Cell><Data ss:Type="String">' + headers[h] + '</Data></Cell>';
  1034. }
  1035. rowsXML += '</Row>';
  1036. //写入数据
  1037. for (var d = 0; d < jsonData.length; d++) {
  1038. rowsXML += '<Row>';
  1039. for (var r = 0; r < fields.length; r++) {
  1040. var value = jsonData[d][fields[r]] == null ? "" : jsonData[d][fields[r]];
  1041. var valueType = typeof value == 'number' ? 'Number' : 'String';
  1042. if (typeof value == 'number') {
  1043. rowsXML += '<Cell><Data ss:Type="' + valueType + '">' + value + '</Data></Cell>';
  1044. }
  1045. else {
  1046. //数字要转成文本,前面加单引号未处理成功,excel中单击会变为数字
  1047. rowsXML += '<Cell ss:Forluma=""><Data ss:Type="String">' + value + '</Data></Cell>';
  1048. }
  1049. //rowsXML += '<Cell><Data ss:Type="' + valueType + '">' + value + '</Data></Cell>';
  1050. }
  1051. rowsXML += '</Row>';
  1052. }
  1053. //拼合数据
  1054. ctx = { rows: rowsXML, nameWS: wsnames[i] || 'Sheet' + i };
  1055. worksheetsXML += format(tmplWorksheetXML, ctx);
  1056. rowsXML = "";
  1057. }
  1058. ctx = { created: (new Date()).getTime(), worksheets: worksheetsXML };
  1059. workbookXML = format(tmplWorkbookXML, ctx);
  1060. var link = document.createElement("A");
  1061. link.href = uri + base64(workbookXML);
  1062. link.download = wbname || 'Workbook.xls';
  1063. link.target = '_blank';
  1064. document.body.appendChild(link);
  1065. link.click();
  1066. document.body.removeChild(link);
  1067. }
  1068. //把日期框置为只读
  1069. $.fn.setDateboxDisable = function (checked) {
  1070. $(this).datebox('readonly', !checked);
  1071. $(this).datebox('textbox').css("color", checked ? "white" : "gray");
  1072. }
  1073. //日期时间框转换为年月输入框
  1074. $.fn.DateTimeBox2YearMonthBox = function (isChange) {
  1075. if (isChange) {
  1076. var db = $(this);
  1077. var dbValue = $(this).datetimebox('getValue');
  1078. db.datebox({
  1079. onShowPanel: function () {
  1080. span.trigger('click');
  1081. if (!tds) setTimeout(function () {
  1082. tds = p.find('div.calendar-menu-month-inner td');
  1083. tds.click(function (e) {
  1084. e.stopPropagation();
  1085. var year = /\d{4}/.exec(span.html())[0], month = parseInt($(this).attr('abbr'), 10);
  1086. db.datebox('hidePanel').datebox('setValue', year + '-' + month);
  1087. });
  1088. }, 0);
  1089. yearIpt.unbind();
  1090. },
  1091. parser: function (s) {
  1092. if (!s) return new Date();
  1093. var arr = s.split('-');
  1094. return new Date(parseInt(arr[0], 10), parseInt(arr[1], 10) - 1, 1);
  1095. },
  1096. formatter: function (d) {
  1097. return d.getFullYear() + '-' + (d.getMonth() + 1);
  1098. }
  1099. });
  1100. var p = db.datebox('panel'),
  1101. tds = false,
  1102. aToday = p.find('a.datebox-current'),
  1103. yearIpt = p.find('input.calendar-menu-year'),
  1104. span = aToday.length ? p.find('div.calendar-title span') : p.find('span.calendar-text');
  1105. p.find('div.calendar-header').hide();
  1106. if (aToday.length) {
  1107. aToday.unbind('click').click(function () {
  1108. var now = new Date();
  1109. db.datebox('hidePanel').datebox('setValue', now.getFullYear() + '-' + (now.getMonth() + 1));
  1110. });
  1111. }
  1112. db.datebox('setValue', dbValue);
  1113. }
  1114. else {
  1115. var dbValue = $(this).datebox('getValue') + '-01 00:00:00';
  1116. $(this).datetimebox();
  1117. $(this).datetimebox('setValue', dbValue);
  1118. $(this).datebox('panel').find('div.calendar-header').show();
  1119. }
  1120. }
  1121. //tabs操作
  1122. $.tabs = {
  1123. 'target': window.parent,
  1124. 'open': function (ops) {
  1125. var title = typeof (ops.title) == 'undefined' ? '未命名' : ops.title;
  1126. var url = typeof (ops.url) == 'undefined' ? '/mes/blank.html' : ops.url;
  1127. if (this.target.$('#tabs').tabs('exists', title)) this.target.$('#tabs').tabs('close', title);
  1128. this.target.$('#tabs').tabsOpen({
  1129. title: title,
  1130. url: url,
  1131. closable: true
  1132. });
  1133. }
  1134. }