<template> <view class="content"> <view class="search-box"> <!-- mSearch组件 如果使用原样式,删除组件元素--> <mSearch class="mSearch-input-box" :mode="2" button="inside" :placeholder="defaultKeyword" @search="doSearch(false)" @input="changeInp" @confirm="doSearch(false)" v-model="keyword"></mSearch> </view> <view class="search-keyword"> <scroll-view class="keyword-list-box" v-show="isShowKeywordList" scroll-y> <block v-for="(row, index) in keywordList" :key="index"> <view class="keyword-entry" hover-class="keyword-entry-tap"> <view class="keyword-text" @tap.stop="doSearch(row)"> <rich-text :nodes="row.htmlStr"></rich-text> </view> <view class="keyword-img" @tap.stop="doSearch(row)"> <image src="/static/HM-search/back.png"></image> </view> </view> </block> </scroll-view> <scroll-view class="keyword-box" v-show="!isShowKeywordList" scroll-y> <view class="keyword-block" v-if="oldKeywordList.length > 0"> <view class="keyword-list-header"> <view>历史搜索</view> <view> <image @tap="oldDelete" src="/static/HM-search/delete.png"></image> </view> </view> <view class="keyword"> <view v-for="(keyword, index) in oldKeywordList" @tap="changeInp(keyword)" :key="index">{{ keyword }} </view> </view> </view> </scroll-view> </view> </view> </template> <script> //引用mSearch组件,如不需要删除即可 import mSearch from "@/components/mehaotian-search-revision/mehaotian-search-revision.vue"; import { post, webHandle } from "../../http/http.js"; export default { data() { return { type: "", //进入该页面的类型 configName: "", //快速组合名称 id: "", //快速组合id changedept: 0, //是否从列表过来的切换负责科室 hosId: "", defaultKeyword: "", keyword: "", oldKeywordList: [], keywordList: [], isShowKeywordList: false, deptList: [], //送回病房扫码 start code: '', infoDATA: '', patientOrders: '', workData: '', //送回病房扫码 end //送回病房-患者列表 start cid: '', cdept: '', currentItem: '', scrollYY: '', //送回病房-患者列表 end // 设置科室二维码 start uniName: '', queryDept: '', queryDeptId: '', sourceQr: '', qrCode: '', // 设置科室二维码 end // 选择血制品送达科室 start bloodDTO: {}, // 选择血制品送达科室 end timer: null, //定时器 searchText: '', //搜索文本 searchData: [], //搜索结果 //系统设置的科室类型 sysDeptType: 0, }; }, onUnload() { if (this.timer) { clearTimeout(this.timer); this.timer = null; } }, onLoad(options) { console.log(options, 'options'); this.type = options.type; if (this.type == "setDept") { this.configName = options.configName; this.id = options.id; this.changedept = options.changedept; this.getSysDeptType(); } else if (this.type == "sendBack") { this.code = options.code; this.infoDATA = options.infoDATA; this.patientOrders = options.patientOrders; this.workData = options.workData; this.sysDeptType = -1; } else if (this.type == "sendBackPatientList") { this.cid = options.cid; this.cdept = options.cdept; this.currentItem = options.currentItem; this.scrollYY = options.scrollYY; this.sysDeptType = -1; } else if (this.type == "settingCode") { //设置科室二维码 this.uniName = options.uniName; this.queryDept = options.queryDept; this.queryDeptId = options.queryDeptId; this.sourceQr = options.sourceQr; this.qrCode = options.qrCode; this.sysDeptType = -1; } else if (this.type == "pharmacy") { //药房切换科室 this.sysDeptType = 386; } else if (this.type == "bloodSelect") { //选择血制品送达科室 this.bloodDTO = JSON.parse(options.bloodDTO); } else { this.getSysDeptType(); } this.init(); // #ifdef APP-PLUS webHandle("no", "app"); // #endif // #ifdef H5 webHandle("no", "wx"); // #endif }, components: { //引用mSearch组件,如不需要删除即可 mSearch, }, methods: { init() { this.hosId = uni.getStorageSync("userData").user.currentHospital.id; this.loadDefaultKeyword(); this.loadOldKeyword(); }, blur() { uni.hideKeyboard(); }, //加载默认搜索关键字 loadDefaultKeyword() { //定义默认搜索关键字,可以自己实现ajax请求数据再赋值,用户未输入时,以水印方式显示在输入框,直接不输入内容搜索会搜索默认关键字 this.defaultKeyword = "请输入科室名称"; }, //加载历史搜索,自动读取本地Storage loadOldKeyword() { uni.getStorage({ key: "OldKeys", success: (res) => { var OldKeys = JSON.parse(res.data); this.oldKeywordList = OldKeys; }, }); }, //防抖搜索 changeInp(event) { this.searchText = event; clearTimeout(this.timer); this.timer = setTimeout(() => { this.inputChange(event); }, 500) }, //获取系统设置的科室类型baba sysDeptType getSysDeptType() { let postData = { "idx": 0, "sum": 1, systemConfiguration: { keyconfig: "busiViewDeptId" } } post("/simple/data/fetchDataList/systemConfiguration", postData).then((res) => { if (res.status == 200) { this.sysDeptType = res.list[0].valueconfig } }) }, //监听输入 inputChange(event) { //兼容引入组件时传入参数情况 var keyword = event.detail ? event.detail.value : event; if (!keyword) { this.keywordList = []; this.isShowKeywordList = false; return; } this.keyword = keyword; this.isShowKeywordList = true; let postData = { idx: 0, sum: 20, department: { hospital: { id: this.hosId, }, dept: keyword, }, }; if(this.type == 'setDept'){ postData = { idx: 0, sum: 20, department: { cascadeHosId: this.hosId, dept: keyword, }, } } //不是送回病房 if (this.type != "sendBack" && this.type != "sendBackPatientList" && this.type != "settingCode" && this.type != "bloodSelect") { if (this.sysDeptType === 0) { return; } else { postData.department.type = { id: this.sysDeptType } } } // 设置二维码 if(this.type == "settingCode"){ postData = { hosId: this.hosId, searchKey: keyword, } } uni.showLoading({ title: "加载中", }); post(this.type == "settingCode" ? "/dept/queryChangeDept" : "/data/fetchDataList/department", postData).then((res) => { if (res.status == 200 || res.state == 200) { if(this.type == "settingCode"){ let deptList = res.deptList.map(v => ({...v, sign: 'dept'})); let qrList = res.qrList.map(v => ({...v.deptDTO, sign: 'qr', qrId: v.id, name: v.name})); this.searchData.push({ name: keyword, list: deptList.concat(qrList) }); }else{ this.searchData.push({ name: keyword, list: res.list }); } let searchText = this.searchText.detail ? this.searchText.detail.value : this.searchText; let index = this.searchData.findIndex(item => item.name === searchText); this.deptList = index >= 0 ? this.searchData[index].list : []; this.keywordList = this.drawCorrelativeKeyword(this.deptList, keyword); uni.hideLoading(); } else { uni.hideLoading(); uni.showToast({ icon: "none", title: res.msg || "接口获取数据失败!", }); } }); }, //高亮关键字 drawCorrelativeKeyword(keywords, keyword) { var len = keywords.length, keywordArr = []; for (var i = 0; i < len; i++) { var row = keywords[i]; //定义高亮#9f9f9f var html = row.dept.replace( keyword, "<span style='color: #9f9f9f;'>" + keyword + "</span>" ); html = "<div>" + html + (row.sign == 'qr' ? '('+ row.name +')' : '') + (row.sign == 'qr' ? '<span class="red">(配置)</span>' : '') + "</div>"; var tmpObj = { id: row.id, qrId: row.qrId, keyword: row.dept, htmlStr: html, }; keywordArr.push(tmpObj); } return keywordArr; }, //清除历史搜索 oldDelete() { uni.showModal({ content: "确定清除历史搜索记录?", success: (res) => { if (res.confirm) { console.log("用户点击确定"); this.oldKeywordList = []; uni.removeStorage({ key: "OldKeys", }); } else if (res.cancel) { console.log("用户点击取消"); } }, }); }, // 建单并签到-指定科室 buildOrderAndSign(deptDto) { uni.showModal({ title: "提示", content: `您当前选择的科室为【${deptDto.dept}】,请确认是否建单并签到?`, success: (result) => { if (result.confirm) { console.log("用户点击确定"); let postData = { type: 'blood', id: this.bloodDTO.id, applyDept: deptDto.id, }; uni.showLoading({ title: "加载中", mask: true, }); post("/transflow/createOrTakeOrder", postData).then((ress) => { uni.hideLoading(); if (ress.state == 200) { uni.navigateTo({ url: `../scanning_blood_process/scanning_blood_process?orderId=${ress.data.orderId}&bloodDTO=${encodeURIComponent(JSON.stringify(this.bloodDTO))}&scanCount=${ress.data.scanCount}&status=${ress.state}`, }); } else { uni.showToast({ icon: "none", title: ress.msg || "接口获取数据失败!", }); } }); } else if (result.cancel) { console.log("用户点击取消"); } }, }); }, //执行搜索 doSearch(data) { console.log(data); let keyword = keyword === false ? this.keyword : data.keyword; this.keyword = keyword; this.saveKeyword(keyword); //保存为历史 let arr = this.deptList.filter((item) => data.qrId ? (item.qrId === data.qrId) : (item.dept === keyword)); if (arr.length) { let msg = ""; if (this.type == "patientInformationList" || this.type == "inspectList" || this.type == "pharmacy") { msg = "切换科室成功"; uni.showToast({ title: msg, icon: "none", duration: 2000, }); } else if (this.type == "setDept") { msg = "添加科室成功"; uni.showToast({ title: msg, icon: "none", duration: 2000, }); } if (this.type == "patientInformationList") { //患者列表进入 uni.setStorageSync("patientCurrentDept", arr[0]); //科室切换存本地 uni.navigateTo({ url: `../patientInformationList/patientInformationList?id=${arr[0].id}&dept=${arr[0].dept}`, }); } else if (this.type == "inspectList") { //患者列表进入 uni.setStorageSync("patientCurrentDept", arr[0]); //科室切换存本地 uni.navigateTo({ url: `../inspectList/inspectList?id=${arr[0].id}&dept=${arr[0].dept}`, }); } else if (this.type == "bloodSelect") { //血制品建单进入 this.buildOrderAndSign(arr[0]); } else if (this.type == "pharmacy") { //药房进入 uni.navigateTo({ url: `../pharmacy/pharmacy?id=${arr[0].id}&dept=${arr[0].dept}`, }); } else if (this.type == "setDept") { //上班添加科室进入 let obj = uni.getStorageSync("setDepts"); console.log(arr,obj) if (obj) { let i = obj.findIndex((item) => item.id == arr[0].id); if (i < 0) { uni.setStorageSync("setDepts", [arr[0], ...obj]); } } else { uni.setStorageSync("setDepts", [arr[0]]); } uni.navigateTo({ url: `../setDept/setDept?configName=${this.configName}&id=${this.id}&changedept=${this.changedept}`, }); } else if (this.type == "sendBack") { uni.navigateTo({ url: `../scanning_ins/scanning_ins?id=${arr[0].id}&dept=${arr[0].dept}&code=${this.code}&infoDATA=${this.infoDATA}&patientOrders=${this.patientOrders}&workData=${this.workData}`, }); } else if (this.type == "sendBackPatientList") { uni.navigateTo({ url: `../patientInformationList/patientInformationList?did=${arr[0].id}&ddept=${arr[0].dept}¤tItem=${this.currentItem}&id=${this.cid}&dept=${this.cdept}&scrollYY=${this.scrollYY}`, }); } else if (this.type == "settingCode") { if (this.queryDept) { //替换 console.log(arr); uni.navigateTo({ url: `../settingCode/settingCode?destQr=${arr[0].qrId || ''}&name=${arr[0].name || ''}&targetId=${arr[0].id}&targetDept=${arr[0].dept}&uniName=${this.uniName}&queryDept=${this.queryDept}&queryDeptId=${this.queryDeptId}&sourceQr=${this.sourceQr || ''}&qrCode=${this.qrCode}`, }); } else { //设置 uni.navigateTo({ url: `../settingCode/settingCode?qrId=${arr[0].qrId || ''}&targetId=${arr[0].id}&targetDept=${arr[0].dept}&uniName=${this.uniName}&qrCode=${this.qrCode}`, }); } } } }, //保存关键字到历史记录 saveKeyword(keyword) { uni.getStorage({ key: "OldKeys", success: (res) => { var OldKeys = JSON.parse(res.data); var findIndex = OldKeys.indexOf(keyword); if (findIndex == -1) { OldKeys.unshift(keyword); } else { OldKeys.splice(findIndex, 1); OldKeys.unshift(keyword); } //最多10个纪录 OldKeys.length > 10 && OldKeys.pop(); uni.setStorage({ key: "OldKeys", data: JSON.stringify(OldKeys), }); this.oldKeywordList = OldKeys; //更新历史搜索 }, fail: (e) => { var OldKeys = [keyword]; uni.setStorage({ key: "OldKeys", data: JSON.stringify(OldKeys), }); this.oldKeywordList = OldKeys; //更新历史搜索 }, }); }, }, }; </script> <style> view { display: block; } .search-box { width: 95%; background-color: rgb(242, 242, 242); padding: 15upx 2.5%; display: flex; justify-content: space-between; position: sticky; top: 0; } .search-box .mSearch-input-box { width: 100%; } .search-box .input-box { width: 85%; flex-shrink: 1; display: flex; justify-content: center; align-items: center; } .search-box .search-btn { width: 15%; margin: 0 0 0 2%; display: flex; justify-content: center; align-items: center; flex-shrink: 0; font-size: 28upx; color: #fff; background: linear-gradient(to right, #ff9801, #ff570a); border-radius: 60upx; } .search-box .input-box>input { width: 100%; height: 60upx; font-size: 32upx; border: 0; border-radius: 60upx; -webkit-appearance: none; -moz-appearance: none; appearance: none; padding: 0 3%; margin: 0; background-color: #ffffff; } .placeholder-class { color: #9e9e9e; } .search-keyword { width: 100%; background-color: rgb(242, 242, 242); } .keyword-list-box { height: calc(100vh - 110upx); padding-top: 10upx; border-radius: 20upx 20upx 0 0; background-color: #fff; } .keyword-entry-tap { background-color: #eee; } .keyword-entry { width: 94%; height: 80upx; margin: 0 3%; font-size: 30upx; color: #333; display: flex; justify-content: space-between; align-items: center; border-bottom: solid 1upx #e7e7e7; } .keyword-entry image { width: 60upx; height: 60upx; } .keyword-entry .keyword-text, .keyword-entry .keyword-img { height: 80upx; display: flex; align-items: center; } .keyword-entry .keyword-text { width: 90%; } .keyword-entry .keyword-img { width: 10%; justify-content: center; } .keyword-box { height: calc(100vh - 110upx); border-radius: 20upx 20upx 0 0; background-color: #fff; } .keyword-box .keyword-block { padding: 10upx 0; } .keyword-box .keyword-block .keyword-list-header { width: 94%; padding: 10upx 3%; font-size: 27upx; color: #333; display: flex; justify-content: space-between; } .keyword-box .keyword-block .keyword-list-header image { width: 40upx; height: 40upx; } .keyword-box .keyword-block .keyword { width: 94%; padding: 3px 3%; display: flex; flex-flow: wrap; justify-content: flex-start; } .keyword-box .keyword-block .hide-hot-tis { display: flex; justify-content: center; font-size: 28upx; color: #6b6b6b; } .keyword-box .keyword-block .keyword>view { display: flex; justify-content: center; align-items: center; border-radius: 60upx; padding: 0 20upx; margin: 10upx 20upx 10upx 0; height: 60upx; font-size: 28upx; background-color: rgb(242, 242, 242); color: #6b6b6b; } </style>