utils.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  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. //获取两个时间间隔天数
  116. getTimeRangeDay(timeArr) {
  117. if(!timeArr||timeArr.length==0){
  118. return null;
  119. }
  120. return (new Date(timeArr[1]) - new Date(timeArr[0])) / (1000 * 60 * 60 * 24);
  121. },
  122. //导出接口返回流下载
  123. downloadExportedData(data, fileName) {
  124. var blob = new Blob([data], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'}); //application/vnd.openxmlformats-officedocument.spreadsheetml.sheet这里表示xlsx类型
  125. var downloadElement = document.createElement('a');
  126. var href = window.URL.createObjectURL(blob); //创建下载的链接
  127. downloadElement.href = href;
  128. downloadElement.download = fileName; //下载后文件名
  129. document.body.appendChild(downloadElement);
  130. downloadElement.click(); //点击下载
  131. document.body.removeChild(downloadElement); //下载完成移除元素
  132. window.URL.revokeObjectURL(href);
  133. },
  134. emailReg: /^([a-zA-Z0-9_\.-]+)@([\da-zA-Z\.-]+)\.([a-z\.]{2,6})$/,
  135. // pswReg: /^(?![0-9]+$)(?![a-zA-Z]+$)/,
  136. pswReg: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z\W_]{6,16}$/,//与后台保持一致
  137. phoneReg: new RegExp(/^((13|14|15|16|17|18|19)\d{9})$/),
  138. url:/[a-zA-z]+:\/\/[^\s]*/,
  139. getDateStr(string,str){
  140. var str_before = string.split(str)[0];
  141. var str_after = string.split(str)[1];
  142. },
  143. exportCondition(time){
  144. const rangeDay = this.getTimeRangeDay(time);
  145. if (!time||time.length==0) {
  146. return '请先选择导出时间';
  147. }
  148. if (rangeDay > 30) {
  149. return '目前只能导出30天内数据,请重新筛选时间';
  150. }
  151. return true;
  152. },
  153. /**
  154. *
  155. * @param {arr} 被操作的数组
  156. * @param {val} 需要剔除或者判断的值
  157. * @param {type} 是剔除(1)还是判断(2)是否存在,不存在返回[]
  158. * @param {des} 1数組元素是对象
  159. *
  160. */
  161. filterArr(arr,val,type,des){ //数组剔除指定元素
  162. if(type == 1){
  163. if(des){
  164. return arr.filter(item => item.id != val) //判断id
  165. }else{
  166. return arr.filter(item => item != val) //判断值
  167. }
  168. }else{
  169. let tmp = arr.filter(item => JSON.stringify(item) == JSON.stringify(val)) //判读是否存在
  170. if(JSON.stringify(tmp) == '[]'){
  171. return false;
  172. }else{
  173. return true;
  174. }
  175. }
  176. },
  177. /**
  178. *
  179. * @param {dataArr} 右侧选中的数据二维数组
  180. * @param {type} 填写单类型
  181. */
  182. dataRecombination(dataArr,type){
  183. // console.log(dataArr,type)
  184. let tmpArr = [];
  185. for(let i = 0;i < dataArr.length;i++){
  186. let tmpData = dataArr[i];
  187. let mapping = {
  188. "sonQuestion": "",
  189. "position": 0, //默认值,传0
  190. "formPosition": 1, // 填写单显示位置(0:左, 1:上)
  191. "exclusionType": 1, //互斥:1
  192. "text": "", //如果有文本内容,上面的值都置空
  193. "symptomType": 0, //0:默认值 1:主症状特有 2:伴随症状特有
  194. }
  195. let sonQuestionMap = { //目前只在既往史中用到,同层数据置空
  196. "id": "",
  197. "questionMappings": []
  198. }
  199. if(type == 6 && tmpData.length > 0){//既往史
  200. let sonMappingArr=[];
  201. for(let j = 0; j < tmpData.length;j++){ //多个标签
  202. let sonMappingObj = {};
  203. if(i == 0){
  204. mapping.formPosition = 1;
  205. mapping.exclusionType = 1;
  206. mapping.sonQuestion = tmpData[j];
  207. }else if(i == 1){
  208. mapping.formPosition = 0;
  209. mapping.exclusionType = 0;
  210. mapping.sonQuestion = tmpData[j];
  211. }else{
  212. mapping.formPosition = 0;
  213. mapping.exclusionType = 0;
  214. sonMappingObj.sonQuestion = tmpData[j]; //{sonQuestion:18}
  215. sonQuestionMap.questionMappings = sonMappingArr; //{id:"",[{sonQuestion:18},{sonQuestion:18}]}
  216. mapping.questionMappingSon = sonQuestionMap;
  217. }
  218. sonMappingArr.push(sonMappingObj); //[{sonQuestion:18},{sonQuestion:19}]
  219. }
  220. tmpArr.push(mapping)
  221. }else if(type == 2 && tmpData.length > 0){//杂音
  222. if(i == 0){
  223. mapping.formPosition = 1;
  224. mapping.exclusionType = 1;
  225. }else{
  226. mapping.formPosition = 0;
  227. mapping.exclusionType = 0;
  228. }
  229. mapping.sonQuestion = tmpData[0]; //{sonQuestion:18}
  230. tmpArr.push(mapping)
  231. }else if (type == 4 || type == 3 || type == 7) { //横铺展开(如咳嗽)
  232. mapping.formPosition = 0;
  233. mapping.exclusionType = 0;
  234. mapping.symptomType = dataArr[i].symptomType
  235. if(dataArr[i].type){
  236. if(dataArr[i].type === 'input') {
  237. if(dataArr[i].text) { //过滤掉输入框未输入内容项
  238. mapping.text = dataArr[i].text
  239. tmpArr.push(mapping)
  240. }
  241. } else {
  242. mapping.sonQuestion = dataArr[i].id
  243. tmpArr.push(mapping)
  244. }
  245. }
  246. } else if(type == 11) { //推送症状类型(添加症状)
  247. mapping.formPosition = 0;
  248. mapping.exclusionType = 0;
  249. mapping.sonQuestion = dataArr[i].id
  250. tmpArr.push(mapping)
  251. }
  252. }
  253. return tmpArr;
  254. },
  255. /**
  256. * 单选数据转换提交
  257. * **/
  258. simpleOptionData(data){
  259. let arr = [];
  260. data.map((it,i)=>{
  261. let code = '';
  262. let abnormal = 0
  263. if(it.isError){
  264. abnormal = 1;
  265. }
  266. if(it.isNone){
  267. code = '2';
  268. }
  269. if(it.isBan){
  270. code = '1';
  271. }
  272. if(it.name){
  273. arr.push({name:it.name,defaultSelect:it.defaultSelect?'1':'0',code,abnormal,remark:'单选项-'+it.name});
  274. }
  275. });
  276. return arr;
  277. },
  278. /**
  279. *将提交的参数转换成对应的组件form中的key
  280. *
  281. */
  282. transformKeys(data, tagFlag){ //tagFlag:独立标签还是标签组 (2是标签组)
  283. const maps = {
  284. "controlType": 'region2', //控件类型(0:默认值 1:下拉单选 2:下拉多选 6:文本框 7:数字键盘文本框 99:联合推送)
  285. // "tagType": 'region2',(这个注释掉,不要解开了!!!!)
  286. "id": "id", //新增id置空
  287. "type": 'region1', //标签归属
  288. "tagName": 'region3', //系统名称
  289. "name": 'region4', //界面名称
  290. "joint": 'region5', //标签间的连接符
  291. "subType": 'region6', //0:可以,1:不可以(当项目检索)
  292. "sexType": 'region7', //1:男,2:女,3:通用
  293. "ageBegin": 'region8', //最小年龄
  294. "ageEnd": 'region9', //最大年龄
  295. "copyType":'region10', //是否复制主标签
  296. "showAdd":'region11', //是否复制当前模块
  297. "itemType": 'region12',
  298. "disType": 'region13',
  299. "labelPrefix":'prefix', //前缀
  300. "labelSuffix":'suffix', //后缀
  301. "maxValue":'maxNormalVal', //前缀
  302. "minValue":'minNormalVal', //后缀
  303. "specFlag": 'specFlag', //标记状态(0:没有标记,1:主诉高亮,2:诱因记录)
  304. "selFlag":'selFlag',
  305. };
  306. if (tagFlag == 2) {
  307. maps["tagType"] = 'region2'
  308. }
  309. let obj = {};
  310. for(let it in maps){
  311. obj[maps[it]] = typeof data[it]=='number'?data[it]+'':data[it];
  312. }
  313. return obj;
  314. },
  315. /**
  316. * 模板数据提交转化函数
  317. */
  318. orderTemplateData(data){
  319. let tmpArr = [];
  320. for(let i =0;i<data.length;i++){
  321. let obj={
  322. "flag": '',
  323. "questionId": '',
  324. "relationModule": '',
  325. "text": ""
  326. };
  327. if(data[i].type == 'sub'){ //这是子模板
  328. obj.relationModule = parseInt(data[i].id)
  329. }else if(data[i].type == 'input'){ //这个是输入框文字
  330. if(data[i].text){ //去掉空输入框
  331. obj.text = data[i].text
  332. }
  333. }else{ //这个是标签
  334. obj.questionId = data[i].id
  335. }
  336. obj.flag = data[i].flag || ''
  337. tmpArr.push(obj)
  338. }
  339. return tmpArr;
  340. },
  341. /*返回n个row的数组
  342. *n:Number
  343. * row:Object
  344. * orderName:编号字段名称,默认orderNo
  345. */
  346. getInitRow(row,n,orderName){
  347. let arr = [];
  348. let obj = {};
  349. for(let i=0;i<n;i++){
  350. obj = Object.assign({},row);
  351. obj[orderName||'orderNo'] = i;
  352. arr.push(obj);
  353. }
  354. return arr;
  355. },
  356. /**
  357. * 预问诊-字段转换
  358. *
  359. * **/
  360. transPretreatKeys(org,isDpt){
  361. let maps = {
  362. name:'region4',
  363. description:'region5',
  364. itemType:'region12',
  365. sexType:'region7',
  366. ageBegin:'region8',
  367. ageEnd:'region9',
  368. tagName:'region3',
  369. //tagType:isDpt?'':'region2',
  370. //controlType:isDpt?'region2':'',
  371. type:'region1',
  372. url:'region13',
  373. specFlag:'specFlag',
  374. required: 'required',
  375. explains:'explains',
  376. flag:'flag'
  377. };
  378. isDpt?maps.controlType = 'region2':maps.tagType = 'region2';
  379. let obj = {};
  380. for(let i in org){
  381. if(maps[i]){
  382. obj[maps[i]] = org[i]+''==='null'?'':org[i]+'';
  383. }
  384. }
  385. return obj;
  386. },
  387. //获取图片名称
  388. getImgName(url){
  389. const arr = url.split("/");
  390. return arr[arr.length-1];
  391. },
  392. dragBox(dragWrap,dragTop,type,addDom,img) {
  393. let drag = $("#"+dragTop); //拖拽区域
  394. let wrap = $("#"+dragWrap); //被拖拽的元素
  395. width = getWindowInnerWidth();
  396. height = getWindowInnerHeight();
  397. addPart = addDom||null;
  398. dragWrapper = dragWrap;
  399. if (type === 'del') {
  400. $(document).off('mousemove', handleMove)
  401. $(document).off('mouseup', handleUp)
  402. } else {
  403. drag.on('mousedown', function (event) {
  404. let lenHeight = wrap.height()
  405. if(img){
  406. $("#preImg").css("height",(lenHeight)+'px')
  407. $("#dragModalWrap").css("height",(lenHeight)+'px')
  408. }
  409. let page = getPageCoordinate(event, '0');
  410. mouseX = page.boxLeft - wrap.offset().left; //鼠标到拖拽元素的左边界的距离
  411. mouseY = page.boxTop - wrap.offset().top; //鼠标到拖拽元素的上边界的距离
  412. isDrag = true
  413. })
  414. $(document).on('mousemove', handleMove)
  415. $(document).on('mouseup', handleUp)
  416. }
  417. }
  418. }