utils.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  1. import $ from 'jquery';
  2. function getWindowInnerHeight(){
  3. if(window.innerHeight!=undefined){
  4. return window.innerHeight;
  5. }else{
  6. let by = document.body, ele = document.documentElement;
  7. return Math.min(by.clientHeight,ele.clientHeight);
  8. }
  9. };
  10. function getWindowInnerWidth(){
  11. let width = window.innerWidth || document.body.clientWidth || document.documentElement.clientWidth
  12. return width
  13. };
  14. function getPageCoordinate(event,stic){//获取鼠标点击的位置
  15. let e = event || window.event;
  16. var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
  17. var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
  18. var x = e.pageX || (e.clientX + scrollX);
  19. var y = (e.pageY+(stic?25:0)) || (e.clientY + scrollY + (stic?25:0));//弹窗位置偏下25
  20. let obj = {
  21. boxLeft : x ,
  22. boxTop : y+18
  23. }
  24. return obj;
  25. }
  26. /**
  27. * @param {拖动元素/清除拖动事件监听} type add:添加事件监听 del:移除事件监听
  28. * @param {展开元素id} addDom
  29. */
  30. let width = '',//屏幕宽度
  31. height = '', //屏幕高度
  32. dragWrapper = '',//拖拽元素
  33. mouseX = 0,//鼠标距离页面左侧
  34. mouseY = 0,//鼠标距离页面上部
  35. dragX = 0,//鼠标可拖拽到左边的最大距离(元素定位左侧距离)
  36. dragY = 0,//鼠标可拖拽到上边的最大距离(元素定位上边距离)
  37. isDrag = false,//元素是否处于拖拽中
  38. addPart = null;//展开区域,这个展开的宽度应当是固定宽度了
  39. /**
  40. *
  41. * @param {事件对象} event
  42. * @param {被拖动的元素} dragModalWrap
  43. * @param {可拖动的区域} dragModalTitle
  44. */
  45. function handleMove(event) {
  46. let wrap = $("#"+dragWrapper); //被拖拽的元素
  47. let dragDes = $("#"+addPart); //展開区域
  48. let page = getPageCoordinate(event, '0');//获取鼠标位置
  49. let maxDragX = 0,dragDesWidth = 0;
  50. let wrapHeight = wrap[0].offsetHeight;//直接用.height()获取的高度不准确
  51. let wrapWidth = wrap[0].offsetWidth;
  52. let maxDragY = height - wrapHeight; //最大可拖拽y方向距离
  53. if (dragDes[0]) { //存在就有类似治疗方案的弹窗,最大可推拽x方向距离
  54. dragDesWidth = dragDes[0].offsetWidth//展开元素的宽度
  55. maxDragX = width - wrapWidth - dragDesWidth
  56. } else {
  57. maxDragX = width - wrapWidth
  58. }
  59. if (isDrag) {
  60. dragX = page.boxLeft - mouseX //鼠标可拖拽到左边的最大距离
  61. dragY = page.boxTop - mouseY //鼠标可拖拽到上边的最大距离
  62. if (dragX < 300) { //不能超出左边界
  63. dragX = 300
  64. }
  65. if (dragY < 100) { //不能超出上边界
  66. dragY = 100
  67. }
  68. if (dragDes[0]) {
  69. if (width - dragX - dragDesWidth < wrapWidth) { //不能超出右边界
  70. dragX = maxDragX
  71. }
  72. } else {
  73. if (width - dragX < wrapWidth) { //不能超出右边界
  74. dragX = maxDragX
  75. }
  76. }
  77. if (height - dragY < wrapHeight) { //不能超出下边界
  78. dragY = maxDragY
  79. }
  80. // isMove = true
  81. wrap.css({
  82. left: dragX + 'px',
  83. marginLeft: 0 + 'px',
  84. marginTop: 0 + 'px',
  85. top: dragY + 'px',
  86. bottom:'auto',
  87. right:'inherit',
  88. })
  89. }
  90. }
  91. /**
  92. * 鼠标弹起弹窗不在跟随鼠标移动
  93. */
  94. function handleUp(){
  95. isDrag = false;
  96. return
  97. }
  98. export default {
  99. //判断字符串是否能转成json
  100. isJsonStr(str) {
  101. if (typeof str === 'string') {
  102. try {
  103. const myStr = str.replace(/^\s*/, '');
  104. const obj = JSON.parse(str);
  105. if (myStr[0] === '{') {
  106. return true;
  107. } else {
  108. return false;
  109. }
  110. } catch (e) {
  111. return false;
  112. }
  113. }
  114. },
  115. tranformDate(time,str,flag='-'){
  116. if(!time){
  117. return time;
  118. }
  119. const year=time.getFullYear();
  120. const month = time.getMonth()+1;
  121. const day = time.getDate();
  122. return year+flag+(month>9?month:'0'+month)+flag+(day>9?day:'0'+day)+str;
  123. },
  124. //获取两个时间间隔天数
  125. getTimeRangeDay(timeArr) {
  126. if(!timeArr||timeArr.length==0){
  127. return null;
  128. }
  129. return (new Date(timeArr[1]) - new Date(timeArr[0])) / (1000 * 60 * 60 * 24);
  130. },
  131. //导出接口返回流下载
  132. downloadExportedData(data, fileName) {
  133. var blob = new Blob([data],
  134. {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'}
  135. ); //application/vnd.openxmlformats-officedocument.spreadsheetml.sheet这里表示xlsx类型
  136. var downloadElement = document.createElement('a');
  137. var href = window.URL.createObjectURL(blob); //创建下载的链接
  138. downloadElement.href = href;
  139. downloadElement.download = fileName; //下载后文件名
  140. document.body.appendChild(downloadElement);
  141. downloadElement.click(); //点击下载
  142. document.body.removeChild(downloadElement); //下载完成移除元素
  143. window.URL.revokeObjectURL(href);
  144. },
  145. emailReg: /^([a-zA-Z0-9_\.-]+)@([\da-zA-Z\.-]+)\.([a-z\.]{2,6})$/,
  146. // pswReg: /^(?![0-9]+$)(?![a-zA-Z]+$)/,
  147. pswReg: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z\W_]{6,16}$/,//与后台保持一致
  148. phoneReg: new RegExp(/^((13|14|15|16|17|18|19)\d{9})$/),
  149. url:/[a-zA-z]+:\/\/[^\s]*/,
  150. getDateStr(string,str){
  151. var str_before = string.split(str)[0];
  152. var str_after = string.split(str)[1];
  153. },
  154. exportCondition(time){
  155. const rangeDay = this.getTimeRangeDay(time);
  156. if (!time||time.length==0) {
  157. return '请先选择导出时间';
  158. }
  159. if (rangeDay > 30) {
  160. return '目前只能导出30天内数据,请重新筛选时间';
  161. }
  162. return true;
  163. },
  164. /**
  165. *
  166. * @param {arr} 被操作的数组
  167. * @param {val} 需要剔除或者判断的值
  168. * @param {type} 是剔除(1)还是判断(2)是否存在,不存在返回[]
  169. * @param {des} 1数組元素是对象
  170. *
  171. */
  172. filterArr(arr,val,type,des){ //数组剔除指定元素
  173. if(type == 1){
  174. if(des){
  175. return arr.filter(item => item.id != val) //判断id
  176. }else{
  177. return arr.filter(item => item != val) //判断值
  178. }
  179. }else{
  180. let tmp = arr.filter(item => JSON.stringify(item) == JSON.stringify(val)) //判读是否存在
  181. if(JSON.stringify(tmp) == '[]'){
  182. return false;
  183. }else{
  184. return true;
  185. }
  186. }
  187. },
  188. /**
  189. *
  190. * @param {dataArr} 右侧选中的数据二维数组
  191. * @param {tmpArrAdd} 既往史自动生成的组合标签的id存储
  192. * @param {type} 填写单类型
  193. */
  194. dataRecombination(dataArr,type,tmpArrAdd){
  195. // console.log(11111,tmpArrAdd,dataArr)
  196. let tmpArr = [];
  197. for(let i = 0;i < dataArr.length;i++){
  198. let tmpData = dataArr[i];
  199. let mapping = {
  200. "sonQuestion": "",
  201. "position": 0, //默认值,传0
  202. "formPosition": 1, // 填写单显示位置(0:左, 1:上)
  203. "exclusionType": 1, //互斥:1
  204. "text": "", //如果有文本内容,上面的值都置空
  205. "symptomType": 0, //0:默认值 1:主症状特有 2:伴随症状特有
  206. }
  207. let sonQuestionMap = { //目前只在既往史中用到,同层数据置空
  208. "id": "",
  209. "questionMappings": []
  210. }
  211. if(type == 6 && tmpData.length > 0){//既往史
  212. let sonMappingArr=[];
  213. for(let j = 0; j < tmpData.length;j++){ //多个标签
  214. let sonMappingObj = {};
  215. if(i == 0){
  216. mapping.formPosition = 1;
  217. mapping.exclusionType = 1;
  218. mapping.sonQuestion = tmpData[j];
  219. }else if(i == 1){
  220. mapping.formPosition = 0;
  221. mapping.exclusionType = 0;
  222. mapping.sonQuestion = tmpData[j];
  223. }else{
  224. mapping.formPosition = 0;
  225. mapping.exclusionType = 0;
  226. mapping.sonQuestion = tmpArrAdd[i][0] || ''; //既往史新增标签的id
  227. sonMappingObj.sonQuestion = tmpData[j]; //{sonQuestion:18}
  228. sonQuestionMap.id = tmpArrAdd[i][0] || ''; //{sonQuestion:18}
  229. sonQuestionMap.questionMappings = sonMappingArr; //{id:"",[{sonQuestion:18},{sonQuestion:18}]}
  230. mapping.questionMappingSon = sonQuestionMap;
  231. }
  232. sonMappingArr.push(sonMappingObj); //[{sonQuestion:18},{sonQuestion:19}]
  233. }
  234. tmpArr.push(mapping)
  235. }else if(type == 2 && tmpData.length > 0){//杂音
  236. if(i == 0){
  237. mapping.formPosition = 1;
  238. mapping.exclusionType = 1;
  239. }else{
  240. mapping.formPosition = 0;
  241. mapping.exclusionType = 0;
  242. }
  243. mapping.sonQuestion = tmpData[0]; //{sonQuestion:18}
  244. tmpArr.push(mapping)
  245. }else if (type == 4 || type == 3 || type == 7) { //横铺展开(如咳嗽)
  246. mapping.formPosition = 0;
  247. mapping.exclusionType = 0;
  248. mapping.symptomType = dataArr[i].symptomType
  249. if(dataArr[i].type){
  250. if(dataArr[i].type === 'input') {
  251. if(dataArr[i].text) { //过滤掉输入框未输入内容项
  252. mapping.text = dataArr[i].text
  253. tmpArr.push(mapping)
  254. }
  255. } else {
  256. mapping.sonQuestion = dataArr[i].id
  257. tmpArr.push(mapping)
  258. }
  259. }
  260. } else if(type == 11) { //推送症状类型(添加症状)
  261. mapping.formPosition = 0;
  262. mapping.exclusionType = 0;
  263. mapping.sonQuestion = dataArr[i].id
  264. tmpArr.push(mapping)
  265. }
  266. }
  267. return tmpArr;
  268. },
  269. /**
  270. * 单选数据转换提交
  271. * **/
  272. simpleOptionData(data){
  273. let arr = [];
  274. data.map((it,i)=>{
  275. let code = '';
  276. let abnormal = 0
  277. if(it.isError){
  278. abnormal = 1;
  279. }
  280. if(it.isNone){
  281. code = '2';
  282. }
  283. if(it.isBan){
  284. code = '1';
  285. }
  286. if(it.name){
  287. arr.push({name:it.name,defaultSelect:it.defaultSelect?'1':'0',code,abnormal,remark:'单选项-'+it.name});
  288. }
  289. });
  290. return arr;
  291. },
  292. /**
  293. *将提交的参数转换成对应的组件form中的key
  294. *
  295. */
  296. transformKeys(data, tagFlag){ //tagFlag:独立标签还是标签组 (2是标签组)
  297. const maps = {
  298. "controlType": 'region2', //控件类型(0:默认值 1:下拉单选 2:下拉多选 6:文本框 7:数字键盘文本框 99:联合推送)
  299. // "tagType": 'region2',(这个注释掉,不要解开了!!!!)
  300. "id": "id", //新增id置空
  301. "type": 'region1', //标签归属
  302. "tagName": 'region3', //系统名称
  303. "name": 'region4', //界面名称
  304. "joint": 'region5', //标签间的连接符
  305. "subType": 'region6', //0:可以,1:不可以(当项目检索)
  306. "sexType": 'region7', //1:男,2:女,3:通用
  307. "ageBegin": 'region8', //最小年龄
  308. "ageEnd": 'region9', //最大年龄
  309. "copyType":'region10', //是否复制主标签
  310. "showAdd":'region11', //是否复制当前模块
  311. "itemType": 'region12',
  312. "disType": 'region13',
  313. "labelPrefix":'prefix', //前缀
  314. "labelSuffix":'suffix', //后缀
  315. "maxValue":'maxNormalVal', //前缀
  316. "minValue":'minNormalVal', //后缀
  317. "specFlag": 'specFlag', //标记状态(0:没有标记,1:主诉高亮,2:诱因记录)
  318. "selFlag":'selFlag',
  319. };
  320. if (tagFlag == 2) {
  321. maps["tagType"] = 'region2'
  322. }
  323. let obj = {};
  324. for(let it in maps){
  325. obj[maps[it]] = typeof data[it]=='number'?data[it]+'':data[it];
  326. }
  327. return obj;
  328. },
  329. /**
  330. * 模板数据提交转化函数
  331. */
  332. orderTemplateData(data){
  333. let tmpArr = [];
  334. for(let i =0;i<data.length;i++){
  335. let obj={
  336. "flag": '',
  337. "questionId": '',
  338. "relationModule": '',
  339. "text": ""
  340. };
  341. if(data[i].type == 'sub'){ //这是子模板
  342. obj.relationModule = parseInt(data[i].id)
  343. }else if(data[i].type == 'input'){ //这个是输入框文字
  344. if(data[i].text){ //去掉空输入框
  345. obj.text = data[i].text
  346. }
  347. }else{ //这个是标签
  348. obj.questionId = data[i].id
  349. }
  350. obj.flag = data[i].flag || ''
  351. tmpArr.push(obj)
  352. }
  353. return tmpArr;
  354. },
  355. /*返回n个row的数组
  356. *n:Number
  357. * row:Object
  358. * orderName:编号字段名称,默认orderNo
  359. */
  360. getInitRow(row,n,orderName){
  361. let arr = [];
  362. let obj = {};
  363. for(let i=0;i<n;i++){
  364. obj = Object.assign({},row);
  365. obj[orderName||'orderNo'] = i;
  366. arr.push(obj);
  367. }
  368. return arr;
  369. },
  370. /**
  371. * 预问诊-字段转换
  372. *
  373. * **/
  374. transPretreatKeys(org,isDpt){
  375. let maps = {
  376. name:'region4',
  377. description:'region5',
  378. itemType:'region12',
  379. sexType:'region7',
  380. ageBegin:'region8',
  381. ageEnd:'region9',
  382. tagName:'region3',
  383. //tagType:isDpt?'':'region2',
  384. //controlType:isDpt?'region2':'',
  385. type:'region1',
  386. url:'region13',
  387. specFlag:'specFlag',
  388. required: 'required',
  389. explains:'explains',
  390. flag:'flag'
  391. };
  392. isDpt?maps.controlType = 'region2':maps.tagType = 'region2';
  393. let obj = {};
  394. for(let i in org){
  395. if(maps[i]){
  396. obj[maps[i]] = org[i]+''==='null'?'':org[i]+'';
  397. }
  398. }
  399. return obj;
  400. },
  401. //获取图片名称
  402. getImgName(url){
  403. const arr = url.split("/");
  404. return arr[arr.length-1];
  405. },
  406. dragBox(dragWrap,dragTop,type,addDom,img) {
  407. let drag = $("#"+dragTop); //拖拽区域
  408. let wrap = $("#"+dragWrap); //被拖拽的元素
  409. width = getWindowInnerWidth();
  410. height = getWindowInnerHeight();
  411. addPart = addDom||null;
  412. dragWrapper = dragWrap;
  413. if (type === 'del') {
  414. $(document).off('mousemove', handleMove)
  415. $(document).off('mouseup', handleUp)
  416. } else {
  417. drag.on('mousedown', function (event) {
  418. let lenHeight = wrap.height()
  419. if(img){
  420. $("#preImg").css("height",(lenHeight)+'px')
  421. $("#dragModalWrap").css("height",(lenHeight)+'px')
  422. }
  423. let page = getPageCoordinate(event, '0');
  424. mouseX = page.boxLeft - wrap.offset().left; //鼠标到拖拽元素的左边界的距离
  425. mouseY = page.boxTop - wrap.offset().top; //鼠标到拖拽元素的上边界的距离
  426. isDrag = true
  427. })
  428. $(document).on('mousemove', handleMove)
  429. $(document).on('mouseup', handleUp)
  430. }
  431. },
  432. getCurrentPage(currentChange, total, pageSize) {
  433. const currentPage = currentChange > Math.ceil(total/pageSize) ? Math.ceil(total/pageSize) : currentChange
  434. return currentPage;
  435. },
  436. formatObj(data,key){
  437. let obj={};
  438. data.map((it)=>{
  439. obj[it[key]]=it.subMenuList;
  440. });
  441. return obj;
  442. },
  443. delNullObj(arr){
  444. return arr.filter((it)=>it!==null);
  445. }
  446. }