pharmacy-com.js 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067
  1. //@ sourceURL=pharmacy-com.js
  2. var readcardUrl = 'http://localhost:8321/readcard/entry';
  3. var url = '/thmz';
  4. /**
  5. * 加载搜索窗口
  6. */
  7. function initSearchList(content, searchTextIds, width, height) {
  8. var settings = {
  9. placement: 'bottom-right',//值: auto,top,right,bottom,left,top-right,top-left,bottom-right,bottom-left 要显示的位置
  10. trigger: 'click', //值:click,hover 触发方式
  11. content: '',//内容,内容可以是函数
  12. width: width,
  13. //arrow:false,//是否显示箭头
  14. multi: true,//在页面允许其他弹出层
  15. closeable: true,//显示关闭按钮
  16. style: '', //值:'',inverse
  17. delay: 300,//延迟时间, 悬浮属性才执行
  18. padding: true,//内容填充
  19. height: height,
  20. //offsetTop:10,
  21. cache: true,//如果缓存设置为false,则popover将销毁并重新创建
  22. content: content
  23. };
  24. if(Array.isArray(searchTextIds)){
  25. for (let i = 0; i < searchTextIds.length; i++) {
  26. $('#' + searchTextIds[i]).webuiPopover('destroy').webuiPopover(settings);
  27. }
  28. }else{
  29. $('#' + searchTextIds).webuiPopover('destroy').webuiPopover(settings);
  30. }
  31. }
  32. /**
  33. * 修改列数据
  34. * @param $table 表格元素
  35. * @param index 行索引
  36. * @param field 列名
  37. * @param value cell值
  38. */
  39. function saveCellData($table, index, field, value) {
  40. $table.bootstrapTable('updateCell', {
  41. index: index,
  42. field: field,
  43. value: value
  44. })
  45. }
  46. /**
  47. * 初始化下拉列表
  48. */
  49. function initDynamicSelect(url, id, codeColumn, nameColumn) {
  50. codeColumn = codeColumn==null?'code':codeColumn;
  51. nameColumn = nameColumn==null?'name':nameColumn;
  52. $.ajax({
  53. type: "GET",
  54. url: '/thmz/'+url,
  55. dataType: "json",
  56. headers: {'Accept': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem("token")},
  57. success: function (data) {
  58. if (data == '401' || data == 401) {
  59. window.location.href = '/thmz/login/view';
  60. return;
  61. }
  62. var html = '';
  63. $.each(data.data, function (commentIndex, comment) {
  64. let pyCode = typeof comment.pyCode === 'undefined'?'':'(' +comment.pyCode+ ')';
  65. html += '<option value="' + comment[codeColumn] + '">' + comment[nameColumn] + pyCode + '</option>';
  66. });
  67. $('#' + id).empty();
  68. $('#' + id).html(html);
  69. $('#' + id).selectpicker('refresh');
  70. }
  71. });
  72. }
  73. /**
  74. * 初始化员工下拉列表
  75. */
  76. function initEmployeeSelect(id) {
  77. $.ajax({
  78. type: "GET",
  79. url: '/thmz/getEmployee',
  80. dataType: "json",
  81. headers: {'Accept': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem("token")},
  82. success: function (data) {
  83. if (data == '401' || data == 401) {
  84. window.location.href = '/thmz/login/view';
  85. return;
  86. }
  87. var html = '';
  88. $.each(data.data, function (commentIndex, comment) {
  89. let pyCode = typeof comment.pyCode === 'undefined'?'':'(' +comment.pyCode+ ')';
  90. html += '<option value="' + comment['employeeCode'] + '">' + comment['employeeName']+"-"+comment['deptName'] + pyCode + '</option>';
  91. });
  92. $('#' + id).empty();
  93. $('#' + id).html(html);
  94. $('#' + id).selectpicker('refresh');
  95. }
  96. });
  97. }
  98. //初始化药房下拉
  99. function initAllGroup(id) {
  100. $.ajax({
  101. type: "GET",
  102. url: '/thmz/queryAllGroupName',
  103. contentType: "application/json;charset=UTF-8",
  104. dataType: "json",
  105. headers: {'Accept': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem("token")},
  106. success: function (res) {
  107. if (res == '401' || res == 401) {
  108. window.location.href = '/thmz/login/view';
  109. return;
  110. }
  111. if (res.code == 0) {
  112. //初始化部门下拉
  113. var arr = res.data;
  114. if (arr != null && arr.length > 0) {
  115. var html = "";
  116. for (var i = 0; i < arr.length; i++) {
  117. html += "<option value='" + arr[i].groupNo + "'>" + arr[i].groupName + '(' + arr[i].pyCode + ")</option>";
  118. }
  119. $('#'+id).html(html);
  120. $('#'+id).selectpicker('refresh');
  121. } else {
  122. errorMesage(res);
  123. }
  124. }
  125. }
  126. });
  127. }
  128. /**
  129. * 四舍五入保留2位小数(若第二位小数为0,则保留一位小数)
  130. * @param num
  131. * @returns {*}
  132. */
  133. function keepTwoDecimal(num) {
  134. var result = parseFloat(num);
  135. if (isNaN(result)) {
  136. return false;
  137. }
  138. result = Math.round(num * 100) / 100;
  139. return result;
  140. }
  141. //默认打印机下标
  142. var defaultPrintIndex = -1;
  143. /**
  144. * 查询默认打印机
  145. */
  146. function setDefaultPrint() {
  147. if (defaultPrintIndex >= 0) {
  148. return;
  149. }
  150. $.ajax({
  151. type: "GET",
  152. url: '/thmz/getLastWindowsByCurrentUser',
  153. contentType: "application/json;charset=UTF-8",
  154. dataType: "json",
  155. headers: {'Accept': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem("token")},
  156. async: false,
  157. success: function (res) {
  158. if (res == '401' || res == 401) {
  159. window.location.href = '/thmz/login/view'
  160. return;
  161. }
  162. if (res.code == 0) {
  163. defaultPrintIndex = res.data.cgPrintIndex;
  164. } else {
  165. defaultPrintIndex = -1;
  166. }
  167. }
  168. });
  169. }
  170. /**
  171. * 显示查询所有药品悬浮窗
  172. * @param data
  173. */
  174. function showDrugPopover(data) {
  175. let columns = [
  176. {
  177. field: 'code',
  178. title: '编码',
  179. align: "center",
  180. valign: 'middle'
  181. }, {
  182. field: 'name',
  183. title: '药品名',
  184. align: "center",
  185. valign: 'middle'
  186. }, {
  187. field: 'manufactoryName',
  188. title: '厂家',
  189. align: "center",
  190. valign: 'middle'
  191. },
  192. {
  193. field: 'specification',
  194. title: '规格',
  195. align: "center",
  196. valign: 'middle'
  197. },
  198. {
  199. field: 'packRetprice',
  200. title: '零售价',
  201. align: "center",
  202. valign: 'middle'
  203. }
  204. ];
  205. columns = columns.concat(data.columns);
  206. $('#tb_table_medicine').bootstrapTable('destroy');
  207. $('#tb_table_medicine').bootstrapTable({
  208. url: data.url==null?'/thmz/getYp':data.url, //请求后台的URL(*)
  209. method: data.method==null?'GET':data.method, //请求方式(*)
  210. toolbar: '#toolbar', //工具按钮用哪个容器
  211. striped: true, //是否显示行间隔色
  212. cache: true, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
  213. pagination: false, //是否显示分页(*)
  214. sortable: true, //是否启用排序
  215. sortOrder: "asc", //排序方式
  216. queryParams: data.data,
  217. sidePagination: "client", //分页方式:client客户端分页,server服务端分页(*)
  218. pageNumber: 1, //初始化加载第一页,默认第一页
  219. pageSize: 5, //每页的记录行数(*)
  220. pageList: [5, 10, 25, 50, 100], //可供选择的每页的行数(*)
  221. search: false, //是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大
  222. strictSearch: true,
  223. showColumns: false, //是否显示所有的列
  224. showRefresh: false, //是否显示刷新按钮
  225. minimumCountColumns: 2, //最少允许的列数
  226. clickToSelect: true, //是否启用点击选中行
  227. uniqueId: "ID", //每一行的唯一标识,一般为主键列
  228. showToggle: false, //是否显示详细视图和列表视图的切换按钮
  229. cardView: false, //是否显示详细视图
  230. detailView: false,
  231. ajaxOptions: {
  232. headers: {
  233. 'Accept': 'application/json',
  234. 'Authorization': 'Bearer ' + localStorage.getItem("token")
  235. }
  236. },
  237. columns: columns,
  238. onClickRow: data.onClickRow==null?function (row, $element) {
  239. $('#searchTextDrug').webuiPopover('hide');
  240. $('#codeSearch').val(row.code);
  241. $('#serialSearch').val(row.serial);
  242. $('#searchTextDrug').val(row.name);
  243. }:data.onClickRow,
  244. responseHandler: function (res) {
  245. if (res == '401' || res == 401) {
  246. window.location.href = '/thmz/login/view'
  247. return;
  248. }
  249. var ress = eval(res);
  250. if (ress.code == -1) {
  251. errorMesage(res);
  252. return {
  253. "total": 0,//总页数
  254. "rows": {} //数据
  255. };
  256. }
  257. return {
  258. "total": ress.data.length,//总页数
  259. "rows": ress.data //数据
  260. };
  261. }
  262. });
  263. }
  264. /**
  265. * 显示员工悬浮窗
  266. * @param data
  267. */
  268. function showEmployeePopover(data) {
  269. let columns = [
  270. {
  271. field: 'employeeCode',
  272. title: '员工编码',
  273. align: "center",
  274. valign: 'middle'
  275. }, {
  276. field: 'employeeName',
  277. title: '姓名',
  278. align: "center",
  279. valign: 'middle'
  280. }, {
  281. field: 'deptName',
  282. title: '科室',
  283. align: "center",
  284. valign: 'middle'
  285. }
  286. ];
  287. columns = columns.concat(data.columns);
  288. $('#tb_table_employee').bootstrapTable('destroy');
  289. $('#tb_table_employee').bootstrapTable({
  290. url: data.url==null?'/thmz/getEmployeeBySearchText':data.url, //请求后台的URL(*)
  291. method: 'GET', //请求方式(*)
  292. toolbar: '#toolbar', //工具按钮用哪个容器
  293. striped: true, //是否显示行间隔色
  294. cache: true, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
  295. pagination: false, //是否显示分页(*)
  296. sortable: true, //是否启用排序
  297. sortOrder: "asc", //排序方式
  298. queryParams: data.data,
  299. sidePagination: "client", //分页方式:client客户端分页,server服务端分页(*)
  300. pageNumber: 1, //初始化加载第一页,默认第一页
  301. pageSize: 5, //每页的记录行数(*)
  302. pageList: [5, 10, 25, 50, 100], //可供选择的每页的行数(*)
  303. search: false, //是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大
  304. strictSearch: true,
  305. showColumns: false, //是否显示所有的列
  306. showRefresh: false, //是否显示刷新按钮
  307. minimumCountColumns: 2, //最少允许的列数
  308. clickToSelect: true, //是否启用点击选中行
  309. uniqueId: "ID", //每一行的唯一标识,一般为主键列
  310. showToggle: false, //是否显示详细视图和列表视图的切换按钮
  311. cardView: false, //是否显示详细视图
  312. detailView: false,
  313. ajaxOptions: {
  314. headers: {
  315. 'Accept': 'application/json',
  316. 'Authorization': 'Bearer ' + localStorage.getItem("token")
  317. }
  318. },
  319. columns: columns,
  320. onClickRow: data.onClickRow,
  321. responseHandler: function (res) {
  322. if (res == '401' || res == 401) {
  323. window.location.href = '/thmz/login/view'
  324. return;
  325. }
  326. var ress = eval(res);
  327. if (ress.code == -1) {
  328. errorMesage(res);
  329. return {
  330. "total": 0,//总页数
  331. "rows": {} //数据
  332. };
  333. }
  334. return {
  335. "total": ress.data.length,//总页数
  336. "rows": ress.data //数据
  337. };
  338. }
  339. });
  340. }
  341. /**
  342. * 显示药品厂家悬浮窗
  343. * @param data
  344. */
  345. function showManufactoryPopover(data) {
  346. let columns = [
  347. {
  348. field: 'code',
  349. title: '编码',
  350. align: "center",
  351. valign: 'middle'
  352. }, {
  353. field: 'name',
  354. title: '厂名',
  355. align: "center",
  356. valign: 'middle'
  357. }
  358. ];
  359. columns = columns.concat(data.columns);
  360. $('#tb_table_manufactory').bootstrapTable('destroy');
  361. $('#tb_table_manufactory').bootstrapTable({
  362. url: data.url==null?'/thmz/getYpZdManufactoryBySearchText':data.url, //请求后台的URL(*)
  363. method: 'GET', //请求方式(*)
  364. toolbar: '#toolbar', //工具按钮用哪个容器
  365. striped: true, //是否显示行间隔色
  366. cache: true, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
  367. pagination: false, //是否显示分页(*)
  368. sortable: true, //是否启用排序
  369. sortOrder: "asc", //排序方式
  370. queryParams: data.data,
  371. sidePagination: "client", //分页方式:client客户端分页,server服务端分页(*)
  372. pageNumber: 1, //初始化加载第一页,默认第一页
  373. pageSize: 5, //每页的记录行数(*)
  374. pageList: [5, 10, 25, 50, 100], //可供选择的每页的行数(*)
  375. search: false, //是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大
  376. strictSearch: true,
  377. showColumns: false, //是否显示所有的列
  378. showRefresh: false, //是否显示刷新按钮
  379. minimumCountColumns: 2, //最少允许的列数
  380. clickToSelect: true, //是否启用点击选中行
  381. uniqueId: "ID", //每一行的唯一标识,一般为主键列
  382. showToggle: false, //是否显示详细视图和列表视图的切换按钮
  383. cardView: false, //是否显示详细视图
  384. detailView: false,
  385. ajaxOptions: {
  386. headers: {
  387. 'Accept': 'application/json',
  388. 'Authorization': 'Bearer ' + localStorage.getItem("token")
  389. }
  390. },
  391. columns: columns,
  392. onClickRow: data.onClickRow,
  393. responseHandler: function (res) {
  394. if (res == '401' || res == 401) {
  395. window.location.href = '/thmz/login/view'
  396. return;
  397. }
  398. var ress = eval(res);
  399. if (ress.code == -1) {
  400. errorMesage(res);
  401. return {
  402. "total": 0,//总页数
  403. "rows": {} //数据
  404. };
  405. }
  406. return {
  407. "total": ress.data.length,//总页数
  408. "rows": ress.data //数据
  409. };
  410. }
  411. });
  412. }
  413. /**
  414. * 显示供应商悬浮窗
  415. * @param data
  416. */
  417. function showSupplyPopover(data) {
  418. let columns = [
  419. {
  420. field: 'code',
  421. title: '编码',
  422. align: "center",
  423. valign: 'middle'
  424. }, {
  425. field: 'name',
  426. title: '供应商',
  427. align: "center",
  428. valign: 'middle'
  429. }
  430. ];
  431. columns = columns.concat(data.columns);
  432. $('#tb_table_supply').bootstrapTable('destroy');
  433. $('#tb_table_supply').bootstrapTable({
  434. url: data.url==null?'/thmz/getYpZdSupplyBySearchText':data.url, //请求后台的URL(*)
  435. method: 'GET', //请求方式(*)
  436. toolbar: '#toolbar', //工具按钮用哪个容器
  437. striped: true, //是否显示行间隔色
  438. cache: true, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
  439. pagination: false, //是否显示分页(*)
  440. sortable: true, //是否启用排序
  441. sortOrder: "asc", //排序方式
  442. queryParams: data.data,
  443. sidePagination: "client", //分页方式:client客户端分页,server服务端分页(*)
  444. pageNumber: 1, //初始化加载第一页,默认第一页
  445. pageSize: 5, //每页的记录行数(*)
  446. pageList: [5, 10, 25, 50, 100], //可供选择的每页的行数(*)
  447. search: false, //是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大
  448. strictSearch: true,
  449. showColumns: false, //是否显示所有的列
  450. showRefresh: false, //是否显示刷新按钮
  451. minimumCountColumns: 2, //最少允许的列数
  452. clickToSelect: true, //是否启用点击选中行
  453. uniqueId: "ID", //每一行的唯一标识,一般为主键列
  454. showToggle: false, //是否显示详细视图和列表视图的切换按钮
  455. cardView: false, //是否显示详细视图
  456. detailView: false,
  457. ajaxOptions: {
  458. headers: {
  459. 'Accept': 'application/json',
  460. 'Authorization': 'Bearer ' + localStorage.getItem("token")
  461. }
  462. },
  463. columns: columns,
  464. onClickRow: data.onClickRow,
  465. responseHandler: function (res) {
  466. if (res == '401' || res == 401) {
  467. window.location.href = '/thmz/login/view'
  468. return;
  469. }
  470. var ress = eval(res);
  471. if (ress.code == -1) {
  472. errorMesage(res);
  473. return {
  474. "total": 0,//总页数
  475. "rows": {} //数据
  476. };
  477. }
  478. return {
  479. "total": ress.data.length,//总页数
  480. "rows": ress.data //数据
  481. };
  482. }
  483. });
  484. }
  485. /**
  486. * 将table导出Excel
  487. * @param tableid
  488. * @param sheetName
  489. */
  490. function tableToExcel(tableid, sheetName) {
  491. var uri = 'data:application/vnd.ms-excel;base64,';
  492. var template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel"' +
  493. 'xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>'
  494. + '<x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets>'
  495. + '</x:ExcelWorkbook></xml><![endif]-->' +
  496. '<style type="text/css">' +
  497. 'table td{' +
  498. 'border: 1px solid #000000;' +
  499. 'width: 150px;' +
  500. 'height: 30px;' +
  501. 'text-align: center;' +
  502. '}' +
  503. '.xtd{' +
  504. 'border: 1px solid #000000;' +
  505. 'width: 50px;' +
  506. 'height: 30px;' +
  507. 'text-align: center;' +
  508. '}' +
  509. '</style>' +
  510. '</head><body ><table class="excelTable">{table}</table></body></html>';
  511. if (!tableid.nodeType) tableid = document.getElementById(tableid);
  512. var ctx = {worksheet: sheetName || 'Worksheet', table: tableid.innerHTML};
  513. var blobExel = self.baseExel(uri + base64(formatName(template, ctx))); //把base64位文件转化为exel文件
  514. document.getElementById("btn_excel").href = URL.createObjectURL(blobExel);
  515. document.getElementById("btn_excel").download = ctx.worksheet;
  516. console.log(document.getElementById("btn_excel").href);
  517. }
  518. /*处理后端返回的base64位文件变成exel文件进行下载
  519. * 不要直接把base64位的exel文件直接给a标签的href,
  520. * 文件过大时base64位长度过长;chrome浏览器对a标签的href长度有限制;导致下载失败;
  521. * 建议用以下方法处理成本地文件再下载
  522. * */
  523. function baseExel(base64) {
  524. function getContentType(base64) {
  525. return /data:([^;]*);/i.exec(base64)[1];
  526. };
  527. function getData(base64) {
  528. return base64.substr(base64.indexOf("base64,") + 7, base64.length);
  529. };
  530. function b64toBlob(b64Data, contentType, sliceSize) {
  531. contentType = contentType || '';
  532. sliceSize = sliceSize || 512;
  533. var byteCharacters = atob(b64Data);
  534. var byteArrays = [];
  535. for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
  536. var slice = byteCharacters.slice(offset, offset + sliceSize);
  537. var byteNumbers = new Array(slice.length);
  538. for (var i = 0; i < slice.length; i++) {
  539. byteNumbers[i] = slice.charCodeAt(i);
  540. }
  541. var byteArray = new Uint8Array(byteNumbers);
  542. byteArrays.push(byteArray);
  543. }
  544. var blob = new Blob(byteArrays, {type: contentType});
  545. return blob;
  546. };
  547. return b64toBlob(getData(base64), getContentType(base64));
  548. }
  549. /**
  550. * 获取jqgrid的所有数据
  551. * @param tableId
  552. * @returns {any[]}
  553. */
  554. function getJQAllData(tableId) {
  555. //拿到grid对象
  556. var obj = $("#" + tableId);
  557. //获取grid表中所有的rowid值
  558. var rowIds = obj.getDataIDs();
  559. //初始化一个数组arrayData容器,用来存放rowData
  560. var arrayData = new Array();
  561. if (rowIds.length > 0) {
  562. for (var i = 0; i < rowIds.length; i++) {
  563. arrayData.push(obj.getRowData(rowIds[i]));
  564. }
  565. }
  566. return arrayData;
  567. }
  568. //base64转码
  569. function base64(s) {
  570. return window.btoa(unescape(encodeURIComponent(s)));
  571. };
  572. //替换table数据和worksheet名字
  573. function formatName(s, c) {
  574. return s.replace(/{(\w+)}/g,
  575. function (m, p) {
  576. return c[p];
  577. });
  578. };
  579. /**
  580. * ajax封装请求
  581. * @param config
  582. * @returns {Promise<any>}
  583. */
  584. function request(config) {
  585. return new Promise(((resolve, reject) => {
  586. $.ajax({
  587. type: config.method,
  588. url: url + config.url,
  589. data: config.data,
  590. contentType: "application/json;charset=UTF-8",
  591. dataType: "json",
  592. headers: {'Accept': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem("token")},
  593. success: function (res) {
  594. if (res == '401' || res == 401) {
  595. window.location.href = '/thmz/login/view';
  596. return;
  597. }
  598. if (res.code == 0) {
  599. resolve(res);
  600. } else {
  601. new PNotify({
  602. title: '错误提示',
  603. text: res.message,
  604. type: 'error',
  605. hide: true,
  606. styling: 'bootstrap3'
  607. });
  608. reject(res)
  609. }
  610. },
  611. error: err => {
  612. new PNotify({
  613. title: '错误提示',
  614. text: err.responseText,
  615. type: 'error',
  616. hide: true,
  617. styling: 'bootstrap3'
  618. });
  619. reject(err)
  620. }
  621. });
  622. }))
  623. }
  624. /**
  625. * 医保凭证接口
  626. * @param config
  627. * @returns {Promise<any>}
  628. */
  629. function readcardRequest(config) {
  630. return new Promise(((resolve, reject) => {
  631. $.ajax({
  632. type: config.method,
  633. url: readcardUrl,
  634. data: config.data,
  635. contentType: "application/json;charset=UTF-8",
  636. dataType: "json",
  637. headers: {'Accept': 'application/json'},
  638. success: res => {
  639. if (res == '401' || res == 401) {
  640. window.location.href = '/thmz/login/view';
  641. return;
  642. }
  643. if (res.code == 200) {
  644. resolve(JSON.parse(res.data));
  645. } else {
  646. $("#showErrorModal").modal("show");
  647. hideModelTimeout('showErrorModal',3000);
  648. reject(res.message)
  649. }
  650. },
  651. error: err => {
  652. $("#showErrorModal").modal("show");
  653. hideModelTimeout('showErrorModal',3000);
  654. reject(err)
  655. }
  656. });
  657. }))
  658. }
  659. /**
  660. * 排序函数
  661. * @param property
  662. * @returns {function(*, *): number}
  663. */
  664. function compare(property) {
  665. return function (a,b) {
  666. var va1 = a[property];
  667. var va2 = b[property];
  668. return va1 - va2
  669. }
  670. }
  671. /**
  672. * 根据对象属性删除对象数组内容
  673. * @param array 对象数组
  674. * @param abj 对象
  675. * @param property 对象属性
  676. * @returns {*}
  677. */
  678. function removeObjArrayByProperty(array,abj,property) {
  679. for (let j = 0; j < array.length; j++) {
  680. if(abj != null && array[j][property] === abj[property]){
  681. array.splice(j,1);
  682. }
  683. }
  684. return array
  685. }
  686. /**
  687. * 获取LocalStorage
  688. * @param name
  689. * @param nullReturn
  690. */
  691. function getLocalStorage(name,nullReturn) {
  692. let returnValue = nullReturn ? nullReturn:-1;
  693. let data = window.localStorage[name];
  694. if(data){
  695. try {
  696. return JSON.parse(data);
  697. }catch (e) {
  698. return data;
  699. }
  700. }
  701. return returnValue;
  702. }
  703. /**
  704. * 指定区域全屏显示
  705. * @param divStr 指定元素ID
  706. */
  707. function fullScreen(divStr) {
  708. let fullarea = document.getElementById(divStr);
  709. if (fullscreen) {    // 退出全屏
  710. if (document.exitFullscreen) {
  711. document.exitFullscreen();
  712. } else if (document.webkitCancelFullScreen) {
  713. document.webkitCancelFullScreen();
  714. } else if (document.mozCancelFullScreen) {
  715. document.mozCancelFullScreen();
  716. } else if (document.msExitFullscreen) {
  717. document.msExitFullscreen();
  718. }
  719. } else {    // 进入全屏
  720. if (fullarea.requestFullscreen) {
  721. fullarea.requestFullscreen();
  722. } else if (fullarea.webkitRequestFullScreen) {
  723. fullarea.webkitRequestFullScreen();
  724. } else if (fullarea.mozRequestFullScreen) {
  725. fullarea.mozRequestFullScreen();
  726. } else if (fullarea.msRequestFullscreen) {
  727. // IE11
  728. fullarea.msRequestFullscreen();
  729. }
  730. }
  731. fullscreen = !fullscreen;
  732. }
  733. /**
  734. * 定时关闭模态框
  735. * @param str 模态框id
  736. * @param times 毫秒数
  737. */
  738. function hideModelTimeout(str,times){
  739. setTimeout(function () {
  740. $("#"+str).modal("hide");
  741. },times)
  742. }
  743. /**
  744. * 定义serializeObject方法,序列化表单
  745. */
  746. $.fn.serializeObject = function () {
  747. var o = {};
  748. var a = this.serializeArray();
  749. $.each(a, function () {
  750. if (o[this.name]) {
  751. if (!o[this.name].push) {
  752. o[this.name] = [o[this.name]];
  753. }
  754. o[this.name].push(this.value || '');
  755. } else {
  756. o[this.name] = this.value || '';
  757. }
  758. });
  759. return o;
  760. };
  761. /**
  762. * 获取药库药房名称
  763. * @param groupNo 编码
  764. */
  765. function getGroupName(groupNo) {
  766. let groupName;
  767. switch (groupNo){
  768. case '11':
  769. groupName='西药库';
  770. break;
  771. case '22':
  772. groupName='中药库';
  773. break;
  774. case '50':
  775. groupName='医材库';
  776. break;
  777. case '71':
  778. groupName='门诊西药房';
  779. break;
  780. case '81':
  781. groupName='门诊中药房';
  782. break;
  783. case '73':
  784. groupName='住院药房';
  785. break;
  786. case '91':
  787. groupName='医材药房';
  788. break;
  789. }
  790. return groupName;
  791. }
  792. /**
  793. * 获取药品类型(大类)
  794. * @param groupNo 编码
  795. */
  796. function getYpTypeName(ypType) {
  797. let ypTypeName;
  798. switch (ypType){
  799. case '1':
  800. ypTypeName='西药';
  801. break;
  802. case '2':
  803. ypTypeName='成药';
  804. break;
  805. case '3':
  806. ypTypeName='草药';
  807. break;
  808. default:
  809. ypTypeName='卫生材料';
  810. }
  811. return ypTypeName;
  812. }
  813. //判断字符是否为空的方法
  814. function isEmpty(obj) {
  815. if (typeof obj === "undefined" || obj === null || obj === "") {
  816. return true;
  817. } else {
  818. return false;
  819. }
  820. }
  821. /**
  822. * 根据编码获取性别
  823. * @param code
  824. * @returns {string}
  825. */
  826. function getSex(code) {
  827. var sex = '';
  828. if (code == 1) {
  829. sex = '男';
  830. } else if (code == 2) {
  831. sex = '女';
  832. } else {
  833. sex = '未知';
  834. }
  835. return sex
  836. }
  837. /**
  838. * bootstrapTable修改列数据
  839. * @param index
  840. * @param field
  841. * @param value
  842. */
  843. function saveData(index, field, value,id) {
  844. $('#'+id).bootstrapTable('updateCell', {
  845. index: index, //行索引
  846. field: field, //列名
  847. value: value //cell值
  848. })
  849. }
  850. //将checkbox未选中将设置为指定值并系列化
  851. jQuery.fn.extend({
  852. serializeWithCheckbox: function (uncheckedValue) {
  853. return jQuery.param(this.serializeArrayWithCheckbox(uncheckedValue));
  854. },
  855. serializeArrayWithCheckbox: function (uncheckedValue) {
  856. var
  857. rCRLF = /\r?\n/g,
  858. rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
  859. rsubmittable = /^(?:input|select|textarea|keygen)/i,
  860. rcheckableType = (/^(?:radio)$/i); //仅将radio设置为不发送未选中项
  861. //未指定的转换为false
  862. if (uncheckedValue == undefined)
  863. uncheckedValue = 'false'
  864. uncheckedValue = uncheckedValue + '';//转字符串
  865. return this.map(function () {
  866. // Can add propHook for "elements" to filter or add form elements
  867. var elements = jQuery.prop(this, "elements");
  868. return elements ? jQuery.makeArray(elements) : this;
  869. })
  870. .filter(function () {
  871. var type = this.type;
  872. // Use .is( ":disabled" ) so that fieldset[disabled] works
  873. return this.name && !jQuery(this).is(":disabled") &&
  874. rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) &&
  875. (this.checked || !rcheckableType.test(type));
  876. })
  877. .map(function (_i, elem) {
  878. var val = jQuery(this).val();
  879. if (val == null) {
  880. return null;
  881. }
  882. //将未勾选的checkbox值设置为指定值
  883. if (this.type == 'checkbox' && this.checked == false)
  884. val = uncheckedValue;
  885. if (Array.isArray(val)) {
  886. return jQuery.map(val, function (val) {
  887. return { name: elem.name, value: val.replace(rCRLF, "\r\n") };
  888. });
  889. }
  890. return { name: elem.name, value: val.replace(rCRLF, "\r\n") };
  891. }).get();
  892. }
  893. });
  894. /**
  895. * 初始化日期时间范围选择
  896. */
  897. function init_daterangepickertime() {
  898. if (typeof ($.fn.daterangepicker) === 'undefined') {
  899. return;
  900. }
  901. var optionSet1 = {
  902. startDate: moment().subtract(1, 'days').format("YYYY-MM-DD 00:00:00"),
  903. endDate: moment().subtract(1, 'days').format("YYYY-MM-DD 23:59:59"),
  904. minDate: '2012-01-01',
  905. maxDate: nowString() + ' 23:59:59',
  906. /*dateLimit: {
  907. days: 1200
  908. },//起止时间的最大间隔*/
  909. showDropdowns: true,
  910. showWeekNumbers: true,
  911. ranges: {
  912. '今天': [moment(), moment()],
  913. '昨天': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
  914. '最近7天': [moment().subtract(6, 'days'), moment()],
  915. '最近30天': [moment().subtract(29, 'days'), moment()],
  916. '当月': [moment().startOf('month'), moment().endOf('month')],
  917. '上个月': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
  918. },
  919. opens: 'right',
  920. buttonClasses: ['btn btn-default'],
  921. applyClass: 'btn-small btn-primary',
  922. cancelClass: 'btn-small',
  923. timePicker: true, //显示时间
  924. timePicker24Hour: true, //时间制
  925. timePickerSeconds: true, //时间显示到秒
  926. timePickerIncrement: 1,
  927. format: 'YYYY-MM-DD HH:mm:ss',
  928. separator: ' to ',
  929. locale: {
  930. applyLabel: '确定',
  931. cancelLabel: '取消',
  932. fromLabel: 'From',
  933. toLabel: 'To',
  934. customRangeLabel: '自定义',
  935. daysOfWeek: ['天', '一', '二', '三', '四', '五', '六'],
  936. monthNames: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
  937. firstDay: 1
  938. }
  939. };
  940. $('#reportrange').daterangepicker(optionSet1, function (start, end, label) {
  941. $('#reportrange span').html(start.format('YYYY-MM-DD HH:mm:ss') + ' - ' + end.format('YYYY-MM-DD HH:mm:ss'));
  942. });
  943. $('#reportrange span').html(moment().subtract(1, 'days').format("YYYY-MM-DD 00:00:00") + ' - ' + moment().subtract(1, 'days').format("YYYY-MM-DD 23:59:59"));
  944. }
  945. /**
  946. * 获取时间选择器的时间数组
  947. * @returns {string[]}
  948. */
  949. function getRePortRangeArr() {
  950. var rePortRange = $('#reportrange span').html();
  951. var rePortRangeArr = rePortRange.split(" - ");
  952. rePortRangeArr[0] = rePortRangeArr[0] + " 00:00:00";
  953. rePortRangeArr[1] = rePortRangeArr[1] + " 23:59:59";
  954. return rePortRangeArr;
  955. }
  956. /**
  957. * 防抖处理
  958. * @param method
  959. * @param delay
  960. * @returns {Function}
  961. */
  962. function debounce(cb, delay) {
  963. let timer;
  964. return function (...args) {
  965. if (timer) {
  966. clearTimeout(timer)
  967. }
  968. timer = setTimeout(() => {
  969. cb.call(this, ...args)
  970. }, delay)
  971. }
  972. }
  973. /**
  974. * 根据编码 查询药单名称
  975. */
  976. function getPageName(pageClass) {
  977. let ypTypeName;
  978. switch (pageClass){
  979. case '1':
  980. ypTypeName='出院带药';
  981. break;
  982. case '2':
  983. ypTypeName='毒麻药';
  984. break;
  985. case '3':
  986. ypTypeName='基数药';
  987. break;
  988. case '4':
  989. ypTypeName='大输液';
  990. break;
  991. case '5':
  992. ypTypeName='长期口服';
  993. break;
  994. case '6':
  995. ypTypeName='临时口服';
  996. break;
  997. case '7':
  998. ypTypeName='统领单';
  999. break;
  1000. case '8':
  1001. ypTypeName='门诊领药单';
  1002. break;
  1003. case 'A':
  1004. ypTypeName='医技科室领药';
  1005. break;
  1006. case 'Y':
  1007. ypTypeName='节余药品';
  1008. break;
  1009. case 'T':
  1010. ypTypeName='退药单';
  1011. break;
  1012. case 'HT':
  1013. ypTypeName='护士退药单';
  1014. break;
  1015. case 'S':
  1016. ypTypeName='手术室药单';
  1017. break;
  1018. case 'HT':
  1019. ypTypeName='护士退药单';
  1020. break;
  1021. case 'Z':
  1022. ypTypeName='草药处方';
  1023. break;
  1024. default:
  1025. ypTypeName=pageClass;
  1026. }
  1027. return ypTypeName;
  1028. }