// ==UserScript== // @name 别样红辅助-大道店 // @namespace https://bbs.tampermonkey.net.cn/ // @version 0.6.3.1 // @description 别样红辅助 // @author EmpyrealTear // @icon data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A4OHhH4WGiIVISEzJIyQo8CMkKPBISEzJhYaIheDh4R////8A////AP///wD///8A////AP///wD///8AqKinZTM0MPMnKCX/KSom/ykqJv8pKib/KSom/ykqJv8xMy/zqKinZf///wD///8A////AP///wD8/PwBaWlnsScoJf8nKCP/NTQu/yYoJf8lJiT/Jygl/ycoJf8lJSL/MDAr/ysrKP9paWex/Pz8Af///wD///8Ah4iGjScoJf8mJyT/LjI0/2lfTf9aU0X/Kywo/yIkIv8mJB7/Nzk3/1NPRf8oKSb/Jygl/4eIho3///8A39/fJCwtKvgnKCX/JiQe/y5CXf9AXIP/ZV1N/2pfS/89OCz/Okld/0xpkf9IRDr/IyUi/ycoJf8oKSb939/fJISEgpEnKCX/Jygl/ycmIv8qMDT/PG+4/zhgmv9TV1r/VGuK/z52xv9LYHv/NTEm/yUmI/8nKCX/Jygl/4SEgpFRUk/NJygl/ycoJf8nKCX/JSMd/zhbjP9Becr/O2+4/z50wf8/cLf/XVxX/zMxKv8iJCL/Jygl/ycoJf9RUk/NNzg26icoJf8nKCX/JSUh/ywoH/8+XIX/QXbD/0B0vv9BdcD/PGms/1pXUf9uYk3/Pjw0/yQlI/8nKCX/Nzg26jc4NuonKCX/JiUg/zEzMv9DYo7/QnfD/0B0vv9Ac7z/QHO9/0B1wv84ZaX/TlVd/3NnUv9OSj//JSYk/zc4NupRUk/NJiYi/ysyOP8+ZJn/P3G6/z5tsP8/cbj/QHS9/0BzvP9CcbT/P3C3/zdnq/9CTl//Qz80/yYnJP9RUk/NhISCkScoJP8oLC3/KS81/yktL/8nKSf/Mktq/0F5yv9IbqP/SklD/yUqLP8qLzL/Jiww/yQlI/8nKCX/hISCkd/f3yQsLSr4Jyck/ycnIv8nJyL/JiUe/yoxNv89cbv/TmOB/zk0J/8kJCD/Jyci/ycnI/8nKCX/LC0q+N/f3yT///8Ah4iGjScoJf8nKCX/Jygl/ycoJf8mJiH/Ol+T/09VWv8pKCL/Jygl/ycoJf8nKCX/Jygl/4eIho3///8A////APz8/AFqa2muJygl/ycoJf8nKCX/JiYh/y89Tv8vMjL/Jicj/ycoJf8nKCX/Jygl/2praa78/PwB////AP///wD///8A////AKiop2UyMzDzKCkm/ygpJv8nJyL/Jygk/ygpJv8oKSb/MjMw86iop2X///8A////AP///wD///8A////AP///wD///8A3+DhH4GChoVBQkjJHBwj8BwcJPBBQkjJgYKGhd/g4R////8A////AP///wD///8A+B8AAPAPAADAAwAAgAEAAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAAgAEAAMADAADwDwAA+B8AAA== // @match *://mn.beyondh.com:8101/* // @require https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js // @require https://scriptcat.org/lib/513/2.1.0/ElementGetter.js // @grant unsafeWindow // @grant GM_setValue // @grant GM_getValue // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @grant GM_setClipboard // ==/UserScript== class DataStore { constructor(key, data) { this.key = key this.defaultData = data if (!GM_getValue(key)) GM_setValue(key, data) } get value() { return GM_getValue(this.key, this.defaultData) } set value(val) { GM_setValue(this.key, val) } Listener(resolve, timeout = 1000) { setInterval(() => resolve(this), timeout) return this } } (function () { 'use strict' const options = { menus: { isShowCleaner: { toStr: (x) => '显示保洁人员:' + (x ? '✓' : '✕') }, // 不发起请求 isAllowUploadFaceImg: { toStr: (x) => '显示上传照片:' + (x ? '✓' : '✕') }, // 不发起请求 isShowDetail: { toStr: (x) => '显示住客信息:' + (x ? '✓' : '✕') }, // 不发起请求 isFilterEx: { toStr: (x) => '细分其他过滤:' + (x ? '✓' : '✕') }, // 不发起请求 isShowCleanStatu: { toStr: (x) => '显示打扫标记:' + (x ? '✓' : '✕') }, // 不发起请求 isDisableCreditType: { toStr: (x) => '仅可用AR和快钱: ' + (x ? '✓' : '✕') }, // 不发起请求 // isShowCleanerCount: { toStr: (x) => '显示保洁统计:' + (x ? '✓' : '✕') }, // 请求在住、今日退房 // isShowDetailContractName: { toStr: (x) => '显示中介明细:' + (x ? '✓' : '✕') }, // 请求在住 // isHighlightBalancenePrice: { toStr: (x) => '高亮余额≠房价:' + (x ? '✓' : '✕') }, // 请求在住、挂账联房 // isShowGuestRecords: { toStr: (x) => '显示客历入住:' + (x ? '✓' : '✕') }, // 请求近一年入住 // isShowFaceImg: { toStr: (x) => '显示住客照片:' + (x ? '✓' : '✕') }, // 请求住客照片 // isShowUnwashedAC: { toStr: (x) => '显示待洗空调:' + (x ? '✓' : '✕') }, // 遍历请求房间备注 }, loads: function () { Object.keys(this.menus).forEach(v => { let val = GM_getValue(v) this.menus[v]['_menu'] = GM_registerMenuCommand(this.menus[v].toStr(val), () => { GM_setValue(v, !val) Object.keys(this.menus).forEach(v => GM_unregisterMenuCommand(this.menus[v]['_menu'])) this.loads() }) }) } } options.loads() const getReactStateNode = (dom) => { let key = Object.keys(dom).find(key => key.startsWith("__reactInternalInstance$")) let internalInstance = dom[key] if (internalInstance == null) return null return internalInstance._debugOwner ?? internalInstance.return ?? internalInstance._currentElement._owner } const sum = (arr) => { if (arr == undefined) return undefined let res = 0 for (let i of arr) res += i return res } const getCleaner = (id) => { if ((id >= 301 && id <= 311) || (id >= 601 && id <= 611)) return '谢' else if ((id >= 401 && id <= 411) || id == 706 || (id >= 708 && id <= 711) || (id >= 808 && id <= 812)) return '钟' else return '段' } const getRoomPriceAndBalance = (arr) => { let price = 0, balance = 0, groupNumber = -1, rooms = [] if (Object.prototype.toString.call(arr) == '[object Array]') { for (let i = 0; i < arr.length; i++) { let res = getRoomPriceAndBalance(arr[i]) price += res.price balance += res.balance groupNumber = res.groupNumber if (res.rooms.length > 0) rooms = [...rooms, ...res.rooms] } } else { // 每日5:49后完成夜审 let prices = arr.DailyPrices?.filter(v => new Date(v.Date).AddDays(1).AddMinutes(60 * 6 - 11) > Date.now()) if (prices != undefined) price += sum(prices.map(v => v.ActualPrice ?? 0)) balance += arr.Balance rooms.push(arr) groupNumber = arr.GroupOrRelationNumber } return { price: Math.round(price * 100) / 100, balance: Math.round(balance * 100) / 100, rooms: rooms, groupNumber: groupNumber } } const ajax = { GET: (url, isAsync = false) => { let res = null $.ajax({ url: url, type: 'GET', xhrFields: { withCredentials: true }, dataType: 'json', async: isAsync, success: (e) => { res = e } }) return res }, POST: (url, data, isAsync = false) => { let res = null $.ajax({ url: url, type: 'POST', xhrFields: { withCredentials: true }, data: JSON.stringify(data), contentType: 'application/json', dataType: 'json', async: isAsync, success: (e) => { res = e } }) return res } } const apis = { GetMixAllRoomDetails: () => { // 获取房态信息 // let res = ajax.GET('https://mn.beyondh.com:8111/api/Room/GetMixAllRoomDetails') // if (res == null) return res // for (let i = 0; i < res.Content.length; i++) { // let id = parseInt(res.Content[i].RoomNumber) // res.Content[i].Cleaner = getCleaner(id) // } // return res }, GetMixSingleRoomOccupationInfo: (id) => { // 获取房间摘要信息 // return ajax.GET(`https://mn.beyondh.com:8111/api/Room/GetMixSingleRoomOccupationInfo?roomNumber=${id}`) }, SearchGuestFolioCheckIn: () => { // 获取住客在住单 // return ajax.GET(`https://mn.beyondh.com:8111/API/GuestFolio/SearchGuestFolio?PageSize=200&PageIndex=1&IsDesc=false&Status%5B%5D=I&IsMeiTuanOrder=false&DateRangeType=RecentWithOneYear`) }, SearchGuestFolioTodayCheckOut: () => { // 获取住客今日离店 // return ajax.GET(`https://mn.beyondh.com:8111/API/GuestFolio/QuickSearchGuestFolio?PageSize=200&PageIndex=1&IsDesc=false&SearchType=TodayDeparture`) }, SearchGuestFolioCheckOut: (keywords, pageIndex = 1, pageSize = 10) => { // 获取住客退房单(不含挂账单) // return ajax.GET(`https://mn.beyondh.com:8111/API/GuestFolio/SearchGuestFolio?PageSize=${pageSize}&PageIndex=${pageIndex}&IsDesc=false&Status%5B%5D=O&Keywords=${keywords}&IsMeiTuanOrder=false&DateRangeType=RecentWithOneYear`) }, GetCustomerForEdit: (id) => { // 获取住客信息 // return ajax.GET(`https://mn.beyondh.com:8111/API/Customer/GetCustomerForEdit?CustomerId=${id}`) }, GetBillStatistics: (billIds) => { // 获取订单收付总额 // return ajax.POST( // `https://mn.beyondh.com:8111/API/Bill/GetBillStatistics`, // Object.prototype.toString.call(billIds) === '[object Array]' ? billIds : [billIds] // ) }, GetCustomerPhoto: (id) => { // 获取住客照片 // return ajax.GET(`https://mn.beyondh.com:8111/API/Customer/GetCustomerPhoto?customerId=${id}`) }, UploadCustomerPhoto: (id, photoBase64) => { // 上传住客照片 // return ajax.POST( // `https://mn.beyondh.com:8111/API/Customer/UploadCustomerPhoto`, { // CustomerId: id, // CustomerPhoto: photoBase64 // }) }, GetCheckinMenuModelMix: (checkinId) => { // return ajax.GET(`https://mn.beyondh.com:8111/API/Checkin/GetCheckinMenuModelMix?checkinId=${checkinId}`) }, GetCheckInList: () => { // let date = new Date() // let checkDate = new Date(new Date().Format('yyyy-MM-dd') + ' 05:49') // let cur = (date < checkDate ? date.AddDays(-1) : date).Format('yyyy-MM-dd') // let params = { // 'SearchType[]': 'Checkin', // 'PageIndex': 1, // 'PageSize': 500, // 'IsDesc': true, // 'BeginCheckinTime': `${cur} 08:00`, // 'EndCheckinTime': `${cur} 23:59` // } // let res = [] // let data // do { // data = ajax.GET('https://mn.beyondh.com:8111/API/GuestFolio/AdvanceSearchGuestFolio?' // + Object.entries(params).map(v => `${encodeURIComponent(v[0])}=${encodeURIComponent(v[1])}`).join('&')) // res.push(...data.Content.Content) // } while (res.length < data.Content.RecordCount) // return res } } unsafeWindow.jQuery = $ unsafeWindow.getReactStateNode = getReactStateNode // unsafeWindow.ajax = ajax // unsafeWindow.apis = apis elmGetter.selector('jquery') var cleanStatus = new DataStore('CleanStatus', {}) const xhrSend = XMLHttpRequest.prototype.send; const CheckinType = { Normal: '正常', Hour2: '2H', Hour4: '4H', Hour8: '8H', Internal: '自用', LongTerm: '长包', Free: '免费' } XMLHttpRequest.prototype.send = function (data) { const xhr = this if (GM_getValue('isShowGuestRecords') && /API\/Customer\/SearchCustomerCheckinsByPost/.test(xhr.url)) { // 修复客历无法显示历史入住记录 // let xhrSendBody = JSON.parse(data) // // let idCardNumber = apis.GetCustomerForEdit(xhrSendBody.CustomerId).Content.IdCardNumber // let props = getReactStateNode(jQuery('div.ant-col-11 > div:nth-child(2)')[0]).return.stateNode.props // let idCardNumber = props.customerDetail.IdCardNumber // let checkouts = apis.SearchGuestFolioCheckOut(idCardNumber, xhrSendBody.PageIndex, xhrSendBody.PageSize) // const getter = Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype, "responseText").get // Object.defineProperty(xhr, "responseText", { // get: () => { // let result = JSON.parse(getter.call(xhr)) // let rows = [] // for (let i of checkouts.Content.Content) { // let detail = i.GuestFolioDetailModels[0] // let bill = undefined // apis.GetBillStatistics([i.BillId]) // rows.push({ // RoomNumber: detail.RoomNumber[0], // 房号 // ArriveTime: i.ArriveTime, // 抵店时间 // DepatureTime: i.DepatureTime, // 离店时间 // Days: i.CheckinTypeId.startsWith('Hour') ? CheckinType[i.CheckinTypeId] : detail.DailyPrices.length, // 天数 // PriceRoomTypeName: `${detail.ControlRoomTypeName}`, // 房型 // FirstDayPrice: detail.FirstDayPrice, // 房价 // DailyPrices: detail.DailyPrices, // 房价 // RoomChargeAmount: bill == undefined ? (i.Contract.Name ?? '散客') : bill.Content?.CreditAmount, // 总房费 // OtherChargeAmount: i.CheckinMemo, // 其他消费 // }) // } // result.Content = { ...checkouts.Content, Content: rows } // return JSON.stringify(result) // }, // }) } else if (GM_getValue('isAllowUploadFaceImg') && /API\/Configure\/UploadFaceImage/.test(xhr.url)) { // 上传住客图片 // let props = getReactStateNode(jQuery('div.ant-col-11 > div:nth-child(2)')[0]).return.stateNode.props // let reader = new FileReader() // reader.readAsDataURL(data) // reader.onload = (e) => apis.UploadCustomerPhoto(props.customerDetail.CustomerId, e.target.result.replace('data:image/jpeg;base64,', '')) // const getter = Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype, "response").get // Object.defineProperty(xhr, "response", { // get: () => { // let result = JSON.parse(getter.call(xhr)) // if (result.Content == false) // result = { Code: 0, Message: "上传完毕", Content: true } // return JSON.stringify(result) // } // }) } if (/AddBillItem/.test(xhr.url) && $('.ant-modal-title').text() == '结账退房') { let xhrSendBody = JSON.parse(data) if (parseFloat(`${xhrSendBody.Amount}`) != 0) { // 防止未清账误点结账 return null } } return xhrSend.apply(xhr, arguments) } const xhrOpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function () { const xhr = this if (/api\/Room\/GetMixAllRoomDetails/.test(arguments[1])) { const getter = Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype, "responseText").get Object.defineProperty(xhr, "responseText", { get: () => { let result = getter.call(xhr) let roomInfo = JSON.parse(result) // let roomSet = {} // let groupSet = {} // let roomDetails = apis.SearchGuestFolioCheckIn().Content.Content // for (let i = 0; i < roomInfo.Content.length; i++) { // let id = parseInt(roomInfo.Content[i].RoomNumber) // roomInfo.Content[i].Cleaner = getCleaner(id) // let guests = roomDetails // .filter(v => v.GuestFolioDetailModels[0].RoomNumber.some(num => num == roomInfo.Content[i].RoomNumber)) // roomInfo.Content[i].Remark = guests.map(v => v.CheckinMemo).join(';') // if (guests.length > 0) { // roomInfo.Content[i].Balance = sum(guests.map(v => v.Balance)) // roomInfo.Content[i].TodayPrice = guests[0].GuestFolioDetailModels[0].FirstDayPrice.ActualPrice // roomInfo.Content[i].DailyPrices = guests[0].GuestFolioDetailModels[0].DailyPrices // } // roomSet[roomInfo.Content[i].RoomNumber] = roomInfo.Content[i] // if (roomInfo.Content[i].GroupOrRelationNumber != -1) { // let groupNumber = roomInfo.Content[i].GroupOrRelationNumber // if (groupNumber in groupSet) { // groupSet[groupNumber].push(roomInfo.Content[i]) // } else { // groupSet[groupNumber] = [roomInfo.Content[i]] // } // } // } // for (let k of Object.keys(groupSet)) { // if (groupSet[k].length == 1) { // let checkinId = groupSet[k][0].CheckinId // let menulist = apis.GetCheckinMenuModelMix(checkinId) // if (menulist?.Content?.MenuItemList?.length > 1) { // // console.log(menulist?.Content?.MenuItemList.filter(v => v.CheckinId != checkinId)) // groupSet[k].push(...(menulist?.Content?.MenuItemList.filter(v => v.CheckinId != checkinId).map(v => ({ ...v, GroupOrRelationNumber: parseInt(k) })) ?? [])) // } // } // } // // console.log(roomSet) // console.log(groupSet) // let cleans = {} // let rooms = roomInfo.Content // // console.log(rooms) // for (let i = 0; i < rooms.length; i++) { // let k = rooms[i].Cleaner // if (!(k in cleans)) // cleans[k] = { today: 0, tomorrow: 0 } // // VD=空脏; VC=空净; V_C=空夜; OOO=维修; OK=已检; OD=住脏; OC=住净; ED=预退; // let actualArriveTime = new Date(rooms[i].ActualArriveTime) // let departureTime = new Date(rooms[i].BenefitDepartureTime) // let targetDate = new Date(new Date().Format('yyyy-MM-dd') + ' 05:49') // if ((rooms[i].CustomerStatus == 'IsEstArrival' || /OD|OC/.test(rooms[i].RoomStatus))) { // 排除30分钟内退房 // if (departureTime < targetDate.AddDays(new Date() <= targetDate ? 0 : 1)) { // // 今日打扫:今日离店 // cleans[k].today += 1 // } else { // if (actualArriveTime < targetDate.AddDays(new Date() <= targetDate ? -1 : 0)) { // // 今日打扫:今日续住 // cleans[k].today += 1 // } // // 明日打扫:N天后预离 // cleans[k].tomorrow += 1 // } // } // } // let roomTodayCheckOutDetails = apis.SearchGuestFolioTodayCheckOut().Content.Content // // console.log(roomTodayCheckOutDetails) // let roomSetTodayCheckOut = {} // for (let i of roomTodayCheckOutDetails) { // let roomId = i.GuestFolioDetailModels[0].RoomNumber[0] // // 排除30分钟内退房 // if (new Date(i.DepatureTime) - new Date(i.ArriveTime) > 30 * 60 * 1000) { // let cleaner = getCleaner(roomId) // if (roomSetTodayCheckOut[i.OccupationId] == null) // roomSetTodayCheckOut[i.OccupationId] = { roomId: roomId, Cleaner: cleaner, detail: [i] } // else // roomSetTodayCheckOut[i.OccupationId].detail.push(i) // } // } // // console.log(roomSetTodayCheckOut) // Object.keys(roomSetTodayCheckOut).forEach(v => { // let k = roomSetTodayCheckOut[v].Cleaner // if (!(k in cleans)) // cleans[k] = { today: 0, tomorrow: 0 } // cleans[k].today += 1 // }) // // 统计需保洁数量 // if (GM_getValue('isShowCleanerCount')) { // jQuery('#cleaner').remove() // let todayClean = Object.keys(cleans).map((v) => `${v} ${cleans[v].today}`).join(', ') // let tomorrowClean = Object.keys(cleans).map((v) => `${v} ${cleans[v].tomorrow}`).join(', ') // jQuery('div>div.small:contains("出租率")').parent().prepend( // `
` // + `今天(${sum(Object.entries(cleans).map(v => v[1].today))}):${todayClean}
` // + `明天(${sum(Object.entries(cleans).map(v => v[1].tomorrow))}):${tomorrowClean}` // + `
` // ) // } elmGetter.each('.room_number_default', (e) => { let roomId = e.text() let id = roomId.replace(/\s\(.+\)/, '') // 添加保洁显示 // if (GM_getValue('isShowCleaner')) { // if (!/[\(\)]/.test(roomId)) // e.text(`${roomId} (${roomSet[roomId].Cleaner})`) // } else { // if (/[\(\)]/.test(roomId)) // e.text(roomId.replace(/\s\(.+\)/, '')) // } // 修改中介小图标 // e.nextAll('.icon_group').each((i, v) => { // elmGetter.get('.iconfont', v).then(elm => { // let name = roomSet[id]?.ContractName // if (name != undefined && /小程序|直客通|赫程/.test(name)) { // if (GM_getValue('isShowDetailContractName')) { // if (/[小直赫介银金钻]/.test(elm.text())) { // let txt = name[0], icon = 'icon_circle' // if (/小程序|直客通/.test(name)) { // let remark = roomSet[id]?.Remark // if (/[银金钻][卡石]/.test(remark)) { // txt = remark.replace(/\n/g, '').replace(/.*([银金钻])[卡石].*/, '$1') // icon = 'icon_circle icon_circle_' + (/直客通/.test(name) ? 'lv' : 'vacant_status') // } // } else if (/赫程/.test(name)) { // txt = '赫' // icon = 'icon_circle icon_circle_xie' // } // elm.parent().attr('class', icon) // elm.text(txt) // } // } else { // if (elm.text() != '介' && !elm.text().includes('抵')) { // elm.parent().attr('class', 'icon_circle') // elm.text('介') // } // } // } // }) // }) // let roomInfo = roomSet[id] // // 高亮余额≠房价 // if (GM_getValue('isHighlightBalancenePrice') && roomInfo.Balance != undefined) { // // 每日5:49后完成夜审 // let cur = getRoomPriceAndBalance(roomInfo) // let grp = roomInfo.GroupOrRelationNumber == -1 ? cur : getRoomPriceAndBalance(groupSet[roomInfo.GroupOrRelationNumber]) // e.parent().css('border', (cur.price > 0 && cur.balance == cur.price) || // (grp.price > 0 && grp.balance == grp.price) || // (/钻[卡石].*免费房/.test(roomInfo.Remark) && grp.price - grp.balance == 149) || // (!/钻[卡石].*免费房/.test(roomInfo.Remark) && (cur.balance == cur.price || grp.price == grp.balance)) // ? '' : '2px dashed #f24e4c') // } else e.parent().css('border', '') // if (GM_getValue('isShowUnwashedAC')) { // $.ajax({ // url: `https://mn.beyondh.com:8111/api/Room/GetMixSingleRoomOccupationInfo?roomNumber=${id}`, // type: 'GET', // xhrFields: { withCredentials: true }, // dataType: 'json', // async: true, // success: (data) => { // let roomRemark = data.Content.RoomRemark // e.parent().find('.room_type').css('font-style', !/待洗空调/.test(roomRemark) ? '' : 'italic') // e.parent().find('.room_type').css('text-decoration', !/待洗空调/.test(roomRemark) ? '' : 'underline') // } // }) // } else { // e.parent().find('.room_type').css('font-style', '') // e.parent().find('.room_type').css('text-decoration', '') // } }) // let iconFilter = $('[owl-ignore="true"][class="row_dl real_time"] > dd[class="filter clear_float"]') // let filters = { // xie: { // name: '赫程', // icon: '', // regex: /^赫/, // isToggle: false // }, // vip: { // name: '会员', // icon: '', // regex: /^[会银金钻]/, // isToggle: false // }, // offline: { // name: '会员', // icon: '', // regex: /^[小直]/, // isToggle: false // }, // other: { // name: '中介', // icon: '', // regex: /^介/, // isToggle: false // }, // } // if (iconFilter.length > 0 && GM_getValue('isFilterEx')) { // let other = iconFilter.find('span:contains("其它")').closest('div') // other.click(e => { // if (other.attr('class') != 'select_tag selected') { // Object.keys(filters).forEach(k => { // let flt = filters[k] // if ($(`#scriptcat_filter_${k}`).length == 0) { // let id = `scriptcat_filter_${k}` // let ele = $(`
${flt.icon}${flt.name}
`) // ele.click((e) => { // flt.isToggle = !flt.isToggle // $('.room_number_default').each((i, v) => { // let roomElement = $(v).closest('[owl-ignore="true"]') // roomElement.css('display', !flt.isToggle || flt.regex.test(roomElement.find('.icon_group').text()) ? '' : 'none') // }) // ele.attr('class', flt.isToggle ? 'select_tag selected' : 'select_tag') // ele.find('[class="iconfont g_icon"]').css('display', flt.isToggle ? '' : 'none') // },) // iconFilter.append(ele) // } // }) // $('[owl-ignore][class$=FloorBreak]').before($('
')) // elmGetter.get('span[style^=color]:contains("清空")').then(div => { // console.log(div) // $(div).click(e => { // $('[id^=scriptcat_filter_][class="select_tag selected"]').click() // $('[id^=scriptcat_filter_]').remove() // $('[class^=script_floorbreak]').remove() // }) // }) // } else { // $('[id^=scriptcat_filter_][class="select_tag selected"]').click() // $('[id^=scriptcat_filter_]').remove() // $('[class^=script_floorbreak]').remove() // } // }) // } if (GM_getValue('isShowCleanStatu')) { let status = cleanStatus.value roomInfo.Content = roomInfo.Content.map(v => { // 非脏房自动清除打扫标志 if (v.RoomStatus == 'VC' || v.RoomStatus == 'OC') { delete status[v.RoomNumber] } return { ...v, CleanStatus: status[v.RoomNumber] } }) cleanStatus.value = status return JSON.stringify(roomInfo) } return result }, }) } else if (GM_getValue('isShowCleanStatu') && /GetMixSingleRoomOccupationInfo/.test(arguments[1])) { // 增加已打扫按钮标记 let roomNumber = arguments[1].split('=')[1] let btn = $(`
`) $('.contextmenu_div_buttons').append(btn) btn.find('button').click((ev) => { let status = cleanStatus.value status[roomNumber] == 'Cleaned' ? (delete status[roomNumber]) : status[roomNumber] = 'Cleaned' cleanStatus.value = status let element = getReactStateNode($('.contextmenu_div')[0]) element.memoizedProps.refreshRealTimeInfos() element.memoizedProps.closeContextMenu() }) } else if (GM_getValue('isAllowUploadFaceImg') && /API\/Checkin\/GetShowUploadFaceImageButton/.test(arguments[1])) { // 显示上传图片按钮 const getter = Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype, "responseText").get Object.defineProperty(xhr, "responseText", { get: () => { let result = JSON.parse(getter.call(xhr)) result.Content = true if (unsafeWindow.pms) { unsafeWindow.pms['noEyes'] = true } return JSON.stringify(result) }, }) // 显示住客照片 const showFaceimg = () => { if (!GM_getValue('isShowFaceImg')) return let elm = document.querySelector('div.ant-col-11 > div:nth-child(2)') let props = getReactStateNode(elm).return.stateNode.props let src = 'data:image/png;base64,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' // if (props.customerDetail.PhotoStatus) // src = apis.GetCustomerPhoto(props.customerDetail.CustomerId).Content if (jQuery('#zjz').length == 0) jQuery('form > div[class=ant-row]').append(jQuery(`
`)) else jQuery('#zjz img').attr('src', src) } // jQuery('div.united_r div[owl-ignore] > div.cell_info').click(() => setTimeout(showFaceimg, 200)) jQuery(document.querySelector('div.ant-col-11 > div:nth-child(2)')).click(e => { let inputLabel = jQuery(e.target).closest('.ant-form-item').find('.ant-form-item-label').text()?.trim() let inputContent = jQuery(e.target).closest('.ant-form-item-control-input-content').text()?.trim() if (`${inputContent}`.length > 0 && `${inputLabel}` == '客人姓名') GM_setClipboard(inputContent) }) // setTimeout(showFaceimg, 300) } else if (/GetCheckinCustomerDetail/.test(arguments[1])) { if (unsafeWindow.pms) { // 修改全局规则为展示隐藏信息 unsafeWindow.pms['noEyes'] = true && !!GM_getValue('isShowDetail') } } else if (/SearchGuestFolio|QuickSearchCustomer|GetMixRoomFuturePreorders|getordermix|Crm\/Customer/.test(arguments[1])) { if (unsafeWindow.pms) { // 在触发查询客单时关闭展示隐藏信息开关,防止未知崩溃 unsafeWindow.pms['noEyes'] = false } } else if (GM_getValue('isDisableCreditType') && /GetCreditTypeName/.test(arguments[1])) { // 仅显示AR帐及快钱支付 const getter = Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype, "responseText").get Object.defineProperty(xhr, "responseText", { get: () => { let result = JSON.parse(getter.call(xhr)) result.Content = result.Content.filter(v => /C9100|C9230/.test(v)) return JSON.stringify(result) }, }) } return xhrOpen.apply(xhr, arguments) } })();