import $ from 'jquery'; function getWindowInnerHeight() { if (window.innerHeight != undefined) { return window.innerHeight; } else { let by = document.body, ele = document.documentElement; return Math.min(by.clientHeight, ele.clientHeight); } }; function getWindowInnerWidth() { let width = window.innerWidth || document.body.clientWidth || document.documentElement.clientWidth return width }; function getPageCoordinate(event, stic) {//获取鼠标点击的位置 let e = event || window.event; var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; var scrollY = document.documentElement.scrollTop || document.body.scrollTop; var x = e.pageX || (e.clientX + scrollX); var y = (e.pageY + (stic ? 25 : 0)) || (e.clientY + scrollY + (stic ? 25 : 0));//弹窗位置偏下25 let obj = { boxLeft: x, boxTop: y + 18 } return obj; } /** * @param {拖动元素/清除拖动事件监听} type add:添加事件监听 del:移除事件监听 * @param {展开元素id} addDom */ let width = '',//屏幕宽度 height = '', //屏幕高度 dragWrapper = '',//拖拽元素 mouseX = 0,//鼠标距离页面左侧 mouseY = 0,//鼠标距离页面上部 dragX = 0,//鼠标可拖拽到左边的最大距离(元素定位左侧距离) dragY = 0,//鼠标可拖拽到上边的最大距离(元素定位上边距离) isDrag = false,//元素是否处于拖拽中 addPart = null;//展开区域,这个展开的宽度应当是固定宽度了 /** * * @param {事件对象} event * @param {被拖动的元素} dragModalWrap * @param {可拖动的区域} dragModalTitle */ function handleMove(event) { let wrap = $("#" + dragWrapper); //被拖拽的元素 let dragDes = $("#" + addPart); //展開区域 let page = getPageCoordinate(event, '0');//获取鼠标位置 let maxDragX = 0, dragDesWidth = 0; let wrapHeight = wrap[0].offsetHeight;//直接用.height()获取的高度不准确 let wrapWidth = wrap[0].offsetWidth; let maxDragY = height - wrapHeight; //最大可拖拽y方向距离 if (dragDes[0]) { //存在就有类似治疗方案的弹窗,最大可推拽x方向距离 dragDesWidth = dragDes[0].offsetWidth//展开元素的宽度 maxDragX = width - wrapWidth - dragDesWidth } else { maxDragX = width - wrapWidth } if (isDrag) { dragX = page.boxLeft - mouseX //鼠标可拖拽到左边的最大距离 dragY = page.boxTop - mouseY //鼠标可拖拽到上边的最大距离 if (dragX < 300) { //不能超出左边界 dragX = 300 } if (dragY < 100) { //不能超出上边界 dragY = 100 } if (dragDes[0]) { if (width - dragX - dragDesWidth < wrapWidth) { //不能超出右边界 dragX = maxDragX } } else { if (width - dragX < wrapWidth) { //不能超出右边界 dragX = maxDragX } } if (height - dragY < wrapHeight) { //不能超出下边界 dragY = maxDragY } // isMove = true wrap.css({ left: dragX + 'px', marginLeft: 0 + 'px', marginTop: 0 + 'px', top: dragY + 'px', bottom: 'auto', right: 'inherit', }) } } /** * 鼠标弹起弹窗不在跟随鼠标移动 */ function handleUp() { isDrag = false; return } export default { //判断字符串是否能转成json isJsonStr(str) { if (typeof str === 'string') { try { const myStr = str.replace(/^\s*/, ''); const obj = JSON.parse(str); if (myStr[0] === '{') { return true; } else { return false; } } catch (e) { return false; } } }, tranformDate(time, str, flag = '-') { if (!time) { return time; } const year = time.getFullYear(); const month = time.getMonth() + 1; const day = time.getDate(); return year + flag + (month > 9 ? month : '0' + month) + flag + (day > 9 ? day : '0' + day) + str; }, //获取两个时间间隔天数 getTimeRangeDay(timeArr) { if (!timeArr || timeArr.length == 0) { return null; } return (new Date(timeArr[1]) - new Date(timeArr[0])) / (1000 * 60 * 60 * 24); }, //导出接口返回流下载 downloadExportedData(data, fileName) { var blob = new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8' } ); //application/vnd.openxmlformats-officedocument.spreadsheetml.sheet这里表示xlsx类型 var downloadElement = document.createElement('a'); var href = window.URL.createObjectURL(blob); //创建下载的链接 downloadElement.href = href; downloadElement.download = fileName; //下载后文件名 document.body.appendChild(downloadElement); downloadElement.click(); //点击下载 document.body.removeChild(downloadElement); //下载完成移除元素 window.URL.revokeObjectURL(href); }, emailReg: /^([a-zA-Z0-9_\.-]+)@([\da-zA-Z\.-]+)\.([a-z\.]{2,6})$/, // pswReg: /^(?![0-9]+$)(?![a-zA-Z]+$)/, pswReg: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z\W_]{6,16}$/,//与后台保持一致 phoneReg: new RegExp(/^((13|14|15|16|17|18|19)\d{9})$/), url: /[a-zA-z]+:\/\/[^\s]*/, getDateStr(string, str) { var str_before = string.split(str)[0]; var str_after = string.split(str)[1]; }, exportCondition(time) { const rangeDay = this.getTimeRangeDay(time); if (!time || time.length == 0) { return '请先选择导出时间'; } if (rangeDay > 30) { return '目前只能导出30天内数据,请重新筛选时间'; } return true; }, /** * * @param {arr} 被操作的数组 * @param {val} 需要剔除或者判断的值 * @param {type} 是剔除(1)还是判断(2)是否存在,不存在返回[] * @param {des} 1数組元素是对象 * */ filterArr(arr, val, type, des) { //数组剔除指定元素 if (type == 1) { if (des) { return arr.filter(item => item.id != val) //判断id } else { return arr.filter(item => item != val) //判断值 } } else { let tmp = arr.filter(item => JSON.stringify(item) == JSON.stringify(val)) //判读是否存在 if (JSON.stringify(tmp) == '[]') { return false; } else { return true; } } }, /** * * @param {dataArr} 右侧选中的数据二维数组 * @param {tmpArrAdd} 既往史自动生成的组合标签的id存储 * @param {type} 填写单类型 */ dataRecombination(dataArr, type, tmpArrAdd) { // console.log(11111,tmpArrAdd,dataArr) let tmpArr = []; for (let i = 0; i < dataArr.length; i++) { let tmpData = dataArr[i]; let mapping = { "sonQuestion": "", "position": 0, //默认值,传0 "formPosition": 1, // 填写单显示位置(0:左, 1:上) "exclusionType": 1, //互斥:1 "text": "", //如果有文本内容,上面的值都置空 "symptomType": 0, //0:默认值 1:主症状特有 2:伴随症状特有 } let sonQuestionMap = { //目前只在既往史中用到,同层数据置空 "id": "", "questionMappings": [] } if (type == 6 && tmpData.length > 0) {//既往史 let sonMappingArr = []; for (let j = 0; j < tmpData.length; j++) { //多个标签 let sonMappingObj = {}; if (i == 0) { mapping.formPosition = 1; mapping.exclusionType = 1; mapping.sonQuestion = tmpData[j]; } else if (i == 1) { mapping.formPosition = 0; mapping.exclusionType = 0; mapping.sonQuestion = tmpData[j]; } else { mapping.formPosition = 0; mapping.exclusionType = 0; mapping.sonQuestion = tmpArrAdd[i][0] || ''; //既往史新增标签的id sonMappingObj.sonQuestion = tmpData[j]; //{sonQuestion:18} sonQuestionMap.id = tmpArrAdd[i][0] || ''; //{sonQuestion:18} sonQuestionMap.questionMappings = sonMappingArr; //{id:"",[{sonQuestion:18},{sonQuestion:18}]} mapping.questionMappingSon = sonQuestionMap; } sonMappingArr.push(sonMappingObj); //[{sonQuestion:18},{sonQuestion:19}] } tmpArr.push(mapping) } else if (type == 2 && tmpData.length > 0) {//杂音 if (i == 0) { mapping.formPosition = 1; mapping.exclusionType = 1; } else { mapping.formPosition = 0; mapping.exclusionType = 0; } mapping.sonQuestion = tmpData[0]; //{sonQuestion:18} tmpArr.push(mapping) } else if (type == 4 || type == 3 || type == 7) { //横铺展开(如咳嗽) mapping.formPosition = 0; mapping.exclusionType = 0; mapping.symptomType = dataArr[i].symptomType if (dataArr[i].type) { if (dataArr[i].type === 'input') { if (dataArr[i].text) { //过滤掉输入框未输入内容项 mapping.text = dataArr[i].text tmpArr.push(mapping) } } else { mapping.sonQuestion = dataArr[i].id tmpArr.push(mapping) } } } else if (type == 11) { //推送症状类型(添加症状) mapping.formPosition = 0; mapping.exclusionType = 0; mapping.sonQuestion = dataArr[i].id tmpArr.push(mapping) } } return tmpArr; }, /** * 单选数据转换提交 * **/ simpleOptionData(data) { let arr = []; data.map((it, i) => { let code = ''; let abnormal = 0 if (it.isError) { abnormal = 1; } if (it.isNone) { code = '2'; } if (it.isBan) { code = '1'; } if (it.name) { arr.push({ name: it.name, defaultSelect: it.defaultSelect ? '1' : '0', code, abnormal, remark: '单选项-' + it.name }); } }); return arr; }, /** *将提交的参数转换成对应的组件form中的key * */ transformKeys(data, tagFlag) { //tagFlag:独立标签还是标签组 (2是标签组) const maps = { "controlType": 'region2', //控件类型(0:默认值 1:下拉单选 2:下拉多选 6:文本框 7:数字键盘文本框 99:联合推送) // "tagType": 'region2',(这个注释掉,不要解开了!!!!) "id": "id", //新增id置空 "type": 'region1', //标签归属 "tagName": 'region3', //系统名称 "name": 'region4', //界面名称 "joint": 'region5', //标签间的连接符 "subType": 'region6', //0:可以,1:不可以(当项目检索) "sexType": 'region7', //1:男,2:女,3:通用 "ageBegin": 'region8', //最小年龄 "ageEnd": 'region9', //最大年龄 "copyType": 'region10', //是否复制主标签 "showAdd": 'region11', //是否复制当前模块 "itemType": 'region12', "disType": 'region13', "labelPrefix": 'prefix', //前缀 "labelSuffix": 'suffix', //后缀 "maxValue": 'maxNormalVal', //前缀 "minValue": 'minNormalVal', //后缀 "specFlag": 'specFlag', //标记状态(0:没有标记,1:主诉高亮,2:诱因记录) "selFlag": 'selFlag', }; if (tagFlag == 2) { maps["tagType"] = 'region2' } let obj = {}; for (let it in maps) { obj[maps[it]] = typeof data[it] == 'number' ? data[it] + '' : data[it]; } return obj; }, /** * 模板数据提交转化函数 */ orderTemplateData(data) { let tmpArr = []; for (let i = 0; i < data.length; i++) { let obj = { "flag": '', "questionId": '', "relationModule": '', "text": "" }; if (data[i].type == 'sub') { //这是子模板 obj.relationModule = parseInt(data[i].id) } else if (data[i].type == 'input') { //这个是输入框文字 if (data[i].text) { //去掉空输入框 obj.text = data[i].text } } else { //这个是标签 obj.questionId = data[i].id } obj.flag = data[i].flag || '' tmpArr.push(obj) } return tmpArr; }, /*返回n个row的数组 *n:Number * row:Object * orderName:编号字段名称,默认orderNo */ getInitRow(row, n, orderName) { let arr = []; let obj = {}; for (let i = 0; i < n; i++) { obj = Object.assign({}, row); obj[orderName || 'orderNo'] = i; arr.push(obj); } return arr; }, /** * 预问诊-字段转换 * * **/ transPretreatKeys(org, isDpt) { let maps = { name: 'region4', description: 'region5', itemType: 'region12', sexType: 'region7', ageBegin: 'region8', ageEnd: 'region9', tagName: 'region3', //tagType:isDpt?'':'region2', //controlType:isDpt?'region2':'', type: 'region1', url: 'region13', specFlag: 'specFlag', required: 'required', explains: 'explains', flag: 'flag' }; isDpt ? maps.controlType = 'region2' : maps.tagType = 'region2'; let obj = {}; for (let i in org) { if (maps[i]) { obj[maps[i]] = org[i] + '' === 'null' ? '' : org[i] + ''; } } return obj; }, //获取图片名称 getImgName(url) { const arr = url.split("/"); return arr[arr.length - 1]; }, dragBox(dragWrap, dragTop, type, addDom, img) { let drag = $("#" + dragTop); //拖拽区域 let wrap = $("#" + dragWrap); //被拖拽的元素 width = getWindowInnerWidth(); height = getWindowInnerHeight(); addPart = addDom || null; dragWrapper = dragWrap; if (type === 'del') { $(document).off('mousemove', handleMove) $(document).off('mouseup', handleUp) } else { drag.on('mousedown', function (event) { let lenHeight = wrap.height() if (img) { $("#preImg").css("height", (lenHeight) + 'px') $("#dragModalWrap").css("height", (lenHeight) + 'px') } let page = getPageCoordinate(event, '0'); mouseX = page.boxLeft - wrap.offset().left; //鼠标到拖拽元素的左边界的距离 mouseY = page.boxTop - wrap.offset().top; //鼠标到拖拽元素的上边界的距离 isDrag = true }) $(document).on('mousemove', handleMove) $(document).on('mouseup', handleUp) } }, getCurrentPage(currentChange, total, pageSize) { const currentPage = currentChange > Math.ceil(total / pageSize) ? Math.ceil(total / pageSize) : currentChange return currentPage; }, formatObj(data, key) { let obj = {}; data.map((it) => { obj[it[key]] = it.subMenuList; }); return obj; }, delNullObj(arr) { return arr.filter((it) => it !== null); }, importExcel(){ } }