search-community-doctor.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. // TODO 社区列表示例数据
  2. //var communitiesData = {"msg":"查询成功","list":[{"code":"3502050100","name":"海沧区嵩屿街道社区卫生服务中心"},{"code":"3502050101","name":"海沧社区卫生服务站"},{"code":"3502050200","name":"石塘社区卫生服务中心"},{"code":"3502050300","name":"东孚卫生院"},{"code":"3502050301","name":"天竺社区卫生服务站"},{"code":"3502050302","name":"国营厦门第一农场社区卫生服务站"},{"code":"3502050400","name":"新阳社区卫生服务中心"},{"code":"0a11148d-5b04-11e6-8344-fa163e8aee56","name":"厦门市海沧医院","photo":""}],"status":200};
  3. // TODO 医生列表示例数据
  4. //var doctorsData = {"msg":"获取医院医生列表成功!","list":[{"code":"D2016080002","job_name":" 全科医师","introduce":"我是全科医生","name":"大米全科1","dept_name":"","photo":"http://172.19.103.85:8882/res/images/2016/08/12/20160812170142_901.jpg","id":1262,"expertise":"我是全科医生","hospital_name":"嘉莲社区医疗服务中心"},{"code":"D2016080005","job_name":" 全科医师","introduce":"我是全科医生","name":"大米全科2","dept_name":"","photo":"","id":1271,"expertise":"我是全科医生","hospital_name":"嘉莲社区医疗服务中心"},{"code":"D2016080225","job_name":" 全科医师","introduce":"我是全科医生","name":"谭仁祝(全科)","dept_name":"","photo":"","id":1274,"expertise":"我是全科医生","hospital_name":"嘉莲社区医疗服务中心"},{"code":"D2010080225","job_name":" 全科医师","introduce":"我是全科医生","name":"谭仁祝(全科1)","dept_name":"","photo":"","id":1276,"expertise":"我是全科医生","hospital_name":"嘉莲社区医疗服务中心"}],"status":200};
  5. var userAgent = window.localStorage.getItem(agentName);
  6. if(userAgent) {
  7. userAgent = JSON.parse(userAgent);
  8. }
  9. // 请求URL参数,urls[0]:社区列表,urls[1]:医生列表
  10. var urls = ["patient/hosptail/hospital_list","patient/hosptail/doctor_list"];
  11. // 搜索框
  12. var $searchbar = $('.searchbar'),
  13. // 搜索输入框
  14. $searchbarInput = $('.searchbar input'),
  15. // 搜索取消按钮
  16. $searchCancelBtn = $('.searchbar-cancel'),
  17. // 搜索框下面悬浮的搜索提示
  18. $searchSuggest = $('#search_suggest_text'),
  19. // 搜索结果展示容器
  20. $searchtResult = $('#search_result'),
  21. // 社区搜索结果容器
  22. $communityWrapper = $('#community_wrapper'),
  23. // 医生搜索结果容器
  24. $doctorWrapper = $('#doctor_wrapper'),
  25. // 查看更多社区结果容器
  26. $moreCommunityWrapper = $('#more_community_warp'),
  27. // 查看更多医生结果容器
  28. $moreDoctorWrapper = $('#more_doctor_warp'),
  29. // 搜索无结果时显示
  30. $noResultWrap = $('#no_result_wrap');
  31. // 列表分页相关,存储搜索结果最后一条记录的id
  32. var lastCommunityId = 0,
  33. lastDoctorId = 0;
  34. var page = 1;
  35. // 滚动条实例
  36. var moreCommunityScroller = null,
  37. moreDoctorScroller = null;
  38. var isFromHistory = false;
  39. var getReqPromise = function(url, data) {
  40. return new Promise(function(resolve, reject) {
  41. sendPost(url, data, "json", "post",
  42. function queryFailed (req) {
  43. dialog({contentType:'tipsbox',bottom:true, skin:'bk-popup' , content:'加载失败'}).show();
  44. // TODO 开启示例数据
  45. //resolve({});
  46. }
  47. , function success(req) {
  48. resolve(req);
  49. });
  50. });
  51. },
  52. getSearchPromise = function(data){
  53. return Promise.all(_.map(urls,function(url, index){
  54. if(index == 1){
  55. var data2 = {
  56. query: data.query,
  57. page: page,
  58. pageSize: data.pageSize
  59. };
  60. return getReqPromise(url, data2);
  61. }else{
  62. return getReqPromise(url, data);
  63. }
  64. })).then(function(data) {
  65. return {
  66. // TODO 示例数据
  67. // communities: communitiesData.list || data[0].list,
  68. // doctors: doctorsData.list || data[1].list
  69. communities: data[0].list,
  70. doctors: data[1].list
  71. };
  72. });
  73. },
  74. // 控制搜索关键字悬浮提示的显示
  75. showSearchSuggest = function(text) {
  76. var suggestText = '搜索“'+text+'”';
  77. // 如果text不为空,则显示;否则隐藏
  78. if(text&&text.trim().length) {
  79. $searchSuggest.text(suggestText);
  80. $searchSuggest.show();
  81. } else {
  82. $searchSuggest.text('');
  83. $searchSuggest.hide();
  84. }
  85. },
  86. // 显示搜索结果的社区列表(限制显示的数量最多为3)
  87. showCommunityList = function(data) {
  88. if(data && data.length) {
  89. var html = template("community_li_tmpl", {list: data.slice(0,3)}),
  90. $communityList = $('#community_list');
  91. $communityList.html(html);
  92. // 搜索结果小于等于3个时,隐藏“查看更多”
  93. if(data.length<=3) {
  94. $communityWrapper.find('.more-result').hide();
  95. } else {
  96. $communityWrapper.find('.more-result').show();
  97. }
  98. $communityWrapper.show();
  99. } else {
  100. $communityWrapper.hide();
  101. }
  102. },
  103. // 显示搜索结果的医生列表(限制显示的数量最多为3)
  104. showDoctorList = function(data) {
  105. if(data && data.length) {
  106. page ++;
  107. var html = template("doctor_li_tmpl", {list: data.slice(0,3)}),
  108. $communityList = $('#doctor_list');
  109. $communityList.html(html);
  110. // 搜索结果小于等于3个时,隐藏“查看更多”
  111. if(data.length<=3) {
  112. $doctorWrapper.find('.more-result').hide();
  113. } else {
  114. $doctorWrapper.find('.more-result').show();
  115. }
  116. $doctorWrapper.show();
  117. } else {
  118. $doctorWrapper.hide();
  119. }
  120. },
  121. // 显示更多社区列表
  122. showMoreCommunityList = function(data,isAppend) {
  123. if(data && data.length) {
  124. var html = template("community_li_tmpl", {list: data}),
  125. $moreCommunityList = $('#more_community_list');
  126. isAppend?$moreCommunityList.append(html):$moreCommunityList.html(html);
  127. $moreCommunityWrapper.show();
  128. } else {
  129. // 如果不是分页加载,也就是首屏时,若查无数据则隐藏
  130. !isAppend && $moreCommunityWrapper.hide();
  131. }
  132. },
  133. // 显示更多医生列表
  134. showMoreDoctorList = function(data,isAppend) {
  135. if(data && data.length) {
  136. var html = template("doctor_li_tmpl", {list: data}),
  137. $moreDoctorList = $('#more_doctor_list');
  138. isAppend?$moreDoctorList.append(html):$moreDoctorList.html(html);
  139. $moreDoctorWrapper.show();
  140. } else {
  141. // 如果不是分页加载,也就是首屏时,若查无数据则隐藏
  142. !isAppend && $moreDoctorWrapper.hide();
  143. }
  144. },
  145. // 分页查询社区列表
  146. searchCommunityByPaging = function () {
  147. var kw = $searchbarInput.val();
  148. // TODO 示例示例搜索参数
  149. // id: 上次搜索结果列表最后一条记录id,type固定为2,query:搜素关键字,pageSize:每页条数
  150. var url = urls[0],
  151. params = { id:0, query: kw,pageSize:15,type:2 };
  152. getReqPromise(url,params).then(function(data){
  153. // TODO 示例数据
  154. //var communities = communitiesData.list;
  155. var communities = data.list;
  156. showMoreCommunityList(communities);
  157. $moreCommunityWrapper.show();
  158. lastCommunityId = getLastId(data);
  159. if(!moreCommunityScroller) {
  160. moreCommunityScroller = initScroller($moreCommunityWrapper,url,
  161. function() { // 传递分页参数
  162. return $.extend({},params,{id:lastCommunityId});
  163. },function(data) {
  164. // TODO 示例数据
  165. showMoreCommunityList(data.list,true);
  166. lastCommunityId = getLastId(data) || lastCommunityId;
  167. var kw = $searchbarInput.val();
  168. highlightKeyword(kw);
  169. moreCommunityScroller.refresh();
  170. });
  171. }
  172. highlightKeyword(kw);
  173. moreCommunityScroller.refresh();
  174. });
  175. },
  176. // 分页查询医生列表
  177. searchDoctorByPaging = function () {
  178. var kw = $searchbarInput.val();
  179. // TODO 示例示例搜索参数
  180. // id: 上次搜索结果列表最后一条记录id,type固定为2,query:搜素关键字,pageSize:每页条数
  181. var url = urls[1],
  182. params = { page:page, query: kw,pageSize:15,type:2 };
  183. getReqPromise(url,params).then(function(data){
  184. // TODO 示例数据
  185. //var doctors = doctorsData.list;
  186. var doctors = data.list;
  187. showMoreDoctorList(doctors);
  188. $moreDoctorWrapper.show();
  189. // lastDoctorId = getLastId(data);
  190. if(!moreDoctorScroller) {
  191. moreDoctorScroller = initScroller($moreDoctorWrapper,url,
  192. function() { // 传递分页参数
  193. return $.extend({},params,{page:page +1});
  194. },function(data) {
  195. page ++;
  196. // TODO 示例数据
  197. //data = {"msg":"查询成功!","list":[{"jobName":" 全科医师","deptName":"","code":"D2010080225","sex":2,"sexName":"女","name":"谭仁祝(全科1)","photo":"","id":1276,"hospitalName":"嘉莲社区医疗服务中心","dept":"","job":"","hospital":"3502030500"},{"jobName":" 全科医师","deptName":"","code":"D2016080225","sex":2,"sexName":"女","name":"谭仁祝(全科)","photo":"","id":1274,"hospitalName":"嘉莲社区医疗服务中心","dept":"","job":"","hospital":"3502030500"},{"jobName":" 全科医师","deptName":"","code":"D2016080005","sex":2,"sexName":"女","name":"大米全科2","photo":"","id":1271,"hospitalName":"嘉莲社区医疗服务中心","dept":"","job":"","hospital":"3502030500"},{"jobName":" 全科医师","deptName":"心血管科","code":"D20160809002","sex":1,"sexName":"男","name":"孙杨(全)","photo":"","id":1264,"hospitalName":"莲前第一社区医疗服务中心","dept":"","job":"","hospital":"3502030400"},{"jobName":" 全科医师","deptName":"","code":"D2016080002","sex":1,"sexName":"男","name":"大米全科1","photo":"http://172.19.103.85:8882/res/images/2016/08/12/20160812170142_901.jpg","id":1262,"hospitalName":"嘉莲社区医疗服务中心","dept":"","job":"","hospital":"3502030500"},{"jobName":" 全科医师","deptName":"心血管科","code":"D20160802","sex":1,"sexName":"男","name":"邹林全科","photo":"","id":1244,"hospitalName":"莲前第一社区医疗服务中心","dept":"","job":"","hospital":"3502030400"},{"jobName":" 全科医师","deptName":"心血管科","code":"D2016001","sex":1,"sexName":"男","name":"陈啊咋全科","photo":"","id":1240,"hospitalName":"莲前第一社区医疗服务中心","dept":"","job":"","hospital":"3502030400"},{"jobName":"全科医师","deptName":"心血管科","code":"D20160805900002","sex":1,"sexName":"男","name":"杨炜武","photo":"http://172.19.103.85:8882/res/images/2016/08/05/20160805154335_66.png","id":1153,"hospitalName":"莲前第一社区医疗服务中心","dept":"","job":"","hospital":"3502030400"},{"jobName":"全科医师","deptName":"心血管科","code":"D20160805900001","sex":1,"sexName":"男","name":"叶泽华","photo":"","id":1152,"hospitalName":"莲前第一社区医疗服务中心","dept":"","job":"","hospital":"3502030400"},{"jobName":"副主任医师","deptName":"妇产科","code":"48833fff339111e6badcfa163e789033","sex":2,"sexName":"女","name":"丘新全","id":1137,"hospitalName":"莲前第一社区医疗服务中心","dept":"","job":"","hospital":"3502030400"}],"status":200};
  198. showMoreDoctorList(data.list,true);
  199. // lastDoctorId = getLastId(data) || lastDoctorId;
  200. var kw = $searchbarInput.val();
  201. highlightKeyword(kw);
  202. moreDoctorScroller.refresh();
  203. });
  204. }
  205. highlightKeyword(kw);
  206. moreDoctorScroller.refresh();
  207. });
  208. },
  209. // 获取分页搜索返回的最后一条记录的id
  210. getLastId = function(data) {
  211. var lastObj = data.list && data.list.length && data.list[data.list.length-1];
  212. // 最后一条记录
  213. if(lastObj) {
  214. return lastObj.id;
  215. } else {
  216. return null
  217. }
  218. },
  219. // 更新分页上拉加载的提示文本
  220. updatePullUpText= function(scroller,list) {
  221. scroller.on('refresh',function() {
  222. var $wrap = $(scroller.wrapper),
  223. $pullupLabel = $wrap.find('.pullUpLabel');
  224. if(!list || !list.length) {
  225. $pullupLabel.text('没有更多');
  226. } else {
  227. $pullupLabel.text('上拉加载更多');
  228. }
  229. });
  230. },
  231. // 关键字高亮显示
  232. highlightKeyword = function(kw) {
  233. $searchTarget = $('.search-target-text');
  234. $searchTarget.hide();
  235. _.each($searchTarget,function(ele){
  236. var $ele = $(ele),
  237. text = $ele.text(),
  238. reg = new RegExp(kw+"(?!>)","gi"),
  239. html = text.replace(reg,'<em>'+kw+'</em>');
  240. $ele.html(html);
  241. });
  242. $searchTarget.show();
  243. },
  244. // 区域滚动条分页实例初始化
  245. initScroller = function($el,url,getData,pullUpAction) {
  246. var scroller = $el.initScroll({pullDown: false,pullUpAction: function() {
  247. var data = getData();
  248. getReqPromise(url, data).then(function(data) {
  249. if(pullUpAction && $.isFunction(pullUpAction)) {
  250. pullUpAction(data);
  251. updatePullUpText(scroller,data.list);
  252. }
  253. })
  254. }});
  255. return scroller;
  256. },
  257. // 搜索框搜索执行方法
  258. search = function () {
  259. // 是否是“查看更多”模式
  260. var isMoreMode = location.hash.indexOf('more')>=0,
  261. // 获取查看更多的类型(社区或者医生)
  262. moreType = location.hash.split('-')[1];
  263. if(isMoreMode) {
  264. // 返回最初页面无hash值时的页面状态
  265. history.go(-1);
  266. }
  267. var kw = $searchbarInput.val().trim(),
  268. // 社区搜索结果列表数据
  269. communities = [],
  270. // 医生搜索结果列表数据
  271. doctors = [];
  272. // 隐藏搜索提示
  273. showSearchSuggest(false);
  274. // 搜索参数
  275. return kw && getSearchPromise({id:0,query: kw,type:2,pageSize:4}).then(function(data){
  276. communities = data.communities;
  277. doctors = data.doctors; 
  278. if(!communities.length && !doctors.length) {
  279. $noResultWrap.show();
  280. } else {
  281. $noResultWrap.hide();
  282. showCommunityList(communities);
  283. showDoctorList(doctors);
  284. showMoreCommunityList(false);
  285. showMoreDoctorList(false);
  286. $searchtResult.show();
  287. highlightKeyword(kw);
  288. }
  289. });
  290. },
  291. // 重置搜索结果的容器高度(为了让滚动条出现在容器内部,而不引起外部内容滚动)
  292. resetResultWrapHeight = function() {
  293. var winHeight = $(window).height(),
  294. diff = 45,
  295. $wrap = $('#search_result');
  296. $wrap.height(winHeight-diff);
  297. },
  298. // 监听窗口大小变化,重置所属区列表、社区列表列表容器高度
  299. resultWrapAutoAdapt = function() {
  300. resetResultWrapHeight();
  301. $(window).on('resize',function() {
  302. resetResultWrapHeight();
  303. });
  304. };
  305. resultWrapAutoAdapt();
  306. new Promise(function(resolve, reject) {
  307. // 搜索框初始化
  308. $searchbar.searchBar();
  309. $searchbarInput.click();
  310. $searchbarInput.focus();
  311. resolve(true);
  312. }).then(function() {
  313. // 注册hash值变化事件,为了判断是否点击了"查看更多",以及在点击返回时能够回到之前的查询结果页面状态
  314. window.onhashchange = function() {
  315. // 是否是“查看更多”模式
  316. var isMoreMode = location.hash.indexOf('more')>=0,
  317. // 获取查看更多的类型(社区或者医生)
  318. moreType = location.hash.split('-')[1];
  319. if(isMoreMode) {
  320. $searchtResult.hide();
  321. lastCommunityId = 0;
  322. // lastDoctorId = 0;
  323. page = 1;
  324. switch(moreType) {
  325. case 'community':
  326. searchCommunityByPaging();
  327. break;
  328. case 'doctor':
  329. searchDoctorByPaging();
  330. break;
  331. }
  332. } else {
  333. showMoreCommunityList(false);
  334. showMoreDoctorList(false);
  335. $searchtResult.show();
  336. }
  337. };
  338. $searchbarInput.on('focus',function() {
  339. // var text = $(this).val();
  340. // if(text.trim()) {
  341. // showSearchSuggest(text);
  342. // }
  343. }).on('input', function() {
  344. var text = $(this).val().trim();
  345. showMoreCommunityList(false);
  346. showMoreDoctorList(false);
  347. $searchtResult.hide();
  348. showSearchSuggest(text);
  349. }).on('keydown',function(e) {
  350. if (e.which === 13) {
  351. search();
  352. }
  353. });
  354. $searchSuggest.on('click',function() {
  355. search();
  356. });
  357. // 当点击“查看更多”后hash值发生变化,同时增加了一条历史记录,所以返回之前页面需要history.go(-2)
  358. $searchCancelBtn.on('click',function() {
  359. // 是否是“查看更多”模式
  360. var isMoreMode = location.hash.indexOf('more')>=0;
  361. isMoreMode?window.history.go(-2):window.history.go(-1);
  362. });
  363. $('#doctor_list,#more_doctor_list').on('click','li',function() {
  364. var code = $(this).attr('data-code');
  365. window.location.href = "../../ssgg/html/doctor-homepage-new.html?state="+code+"&openid="+userAgent.openid;
  366. });
  367. }).catch(function(e) {
  368. alert(e);
  369. console && console.error(e);
  370. });
  371. window.onpageshow = function() {
  372. var $input = $('.searchbar input[type=search]'),
  373. kw = $input.val().trim();
  374. if(kw) {
  375. var d = dialog({contentType:'load', skin:'bk-popup'}).show();
  376. var promise = search();
  377. if(promise) {
  378. promise.then(function() {
  379. d.close();
  380. });
  381. }
  382. }
  383. }
  384. template.helper('getHospitalImg', function(str){
  385. var url = getImgUrl(str);
  386. if(url == ''){
  387. url = '../images/hospital_default.png';
  388. }
  389. return url;
  390. });
  391. template.helper('getPhoto', function(str){
  392. return getImgUrl(str);
  393. })