From c8f020d72e4712d367986ab7a12241d9287958f7 Mon Sep 17 00:00:00 2001 From: ylj20011123 Date: Wed, 20 Aug 2025 11:48:20 +0800 Subject: [PATCH] first commit --- .../attendanceStatus/attendanceStatistics.vue | 11 + pages/attendanceStatus/index.vue | 4 +- pages/attendanceStatus/roster.vue | 15 +- pages/index/index.vue | 504 ++++++++++++------ pages/userCenter/components/userList.vue | 37 +- pages/userCenter/userCenter.vue | 12 +- 6 files changed, 380 insertions(+), 203 deletions(-) diff --git a/pages/attendanceStatus/attendanceStatistics.vue b/pages/attendanceStatus/attendanceStatistics.vue index 1fa656f..340d5e8 100644 --- a/pages/attendanceStatus/attendanceStatistics.vue +++ b/pages/attendanceStatus/attendanceStatistics.vue @@ -15,6 +15,8 @@ {{ serviceInfo.SERVERPART_NAME ? serviceInfo.SERVERPART_NAME : '请选择服务区' }} +

{{ serviceInfo.SPREGIONTYPE_NAME ? serviceInfo.SPREGIONTYPE_NAME : '' }} +

@@ -489,6 +491,15 @@ export default { color: #160002; } + .area { + font-size: 12px; + font-family: PingFangSC-Regular, PingFang SC; + font-weight: 400; + color: #786B6C; + line-height: 40px; + margin-left: 4px; + } + .rightArrow { width: 12px; height: 12px; diff --git a/pages/attendanceStatus/index.vue b/pages/attendanceStatus/index.vue index 832c5f3..e48b8d6 100644 --- a/pages/attendanceStatus/index.vue +++ b/pages/attendanceStatus/index.vue @@ -14,6 +14,8 @@ {{ serviceInfo.SERVERPART_NAME ? serviceInfo.SERVERPART_NAME : '' }} +

{{ serviceInfo.SPREGIONTYPE_NAME ? serviceInfo.SPREGIONTYPE_NAME : '' }} +

@@ -120,7 +122,7 @@ {{ selectTab === 1 ? "👥 当前在岗人员" : selectTab === 2 ? "📋 请假人员列表" : selectTab === 3 ? "👑 值班经理信息" : "" - }} + }} diff --git a/pages/attendanceStatus/roster.vue b/pages/attendanceStatus/roster.vue index 63cf732..4156dc6 100644 --- a/pages/attendanceStatus/roster.vue +++ b/pages/attendanceStatus/roster.vue @@ -13,6 +13,8 @@ {{ serviceInfo.SERVERPART_NAME ? serviceInfo.SERVERPART_NAME : '' }} +

{{ serviceInfo.SPREGIONTYPE_NAME ? serviceInfo.SPREGIONTYPE_NAME : '' }} +

@@ -33,7 +35,7 @@ {{ selectDate ? $util.cutDate(new Date(selectDate), 'YYYY-MM') : "" - }} + }} @@ -107,7 +109,7 @@ - + + @animationfinish="handleChangeSwiper" :disable-programmatic-animation="false" :duration="300" + :easing-function="ease - out"> @@ -25,31 +26,26 @@ - {{ selectIndex === index ? item.month || "-" : "-" }}月对客营收 + {{ selectIndex === index ? currentMonthData.monthText : '-月对客营收' }} /万元 - {{ selectIndex === index - ? topShowData.MonthRevenueModel.CashPayChange || "-" : "-" }} + {{ selectIndex === index ? + currentRevenueData.cashPayChange : '-' }} - {{ topShowData.MonthRevenueModel.addNumber ? - topShowData.MonthRevenueModel.addNumber : "-" }}% + + {{ revenueChangeText }} + 同比 - + {{ subItem.name - }} + }} {{ @@ -103,7 +99,7 @@ : '', }">{{ subItem.addQOQ ? `${subItem.addQOQ}` : "" - }} + }} @@ -120,7 +116,7 @@ - {{ + {{ topShowData && topShowData.MonthRevenueModel && topShowData.MonthRevenueModel.YearRevenueAmount ? $util.getMoney( @@ -129,7 +125,7 @@ ) : "" }} - {{ + {{ topShowData && topShowData.MonthRevenueModel && topShowData.MonthRevenueModel.YearRevenueAdd > 0 ? "增幅" @@ -219,7 +216,7 @@ src="https://eshangtech.com/ShopICO/ahyd-BID/newIndex3/monthIcon.svg" /> {{ $util.handleGetMonthDay(nowDay) - }} + }} /{{ howDay }} @@ -350,6 +347,10 @@ export default { modalRateList: [],// 点击圆环图出现的白色悬浮框的数据 useInfo: {}, isReturn: true, + // 新增缓存相关数据 + monthDataCache: {}, // 月份数据缓存 + loadingMap: {}, // 加载状态映射 + swiperTransition: false, // swiper过渡状态 } }, components: { @@ -359,6 +360,58 @@ export default { }, computed: { ...mapGetters({ user: "getUser" }), + + // 为uniapp小程序兼容性,使用简单的computed属性 + currentMonthData() { + if (this.selectIndex >= 0 && this.monthList[this.selectIndex]) { + return { + month: this.monthList[this.selectIndex].month || "-", + monthText: (this.monthList[this.selectIndex].month || "-") + "月对客营收" + }; + } + return { + month: "-", + monthText: "-月对客营收" + }; + }, + + currentRevenueData() { + if (this.topShowData && this.topShowData.MonthRevenueModel) { + return { + cashPayChange: this.topShowData.MonthRevenueModel.CashPayChange || "-", + addNumber: this.topShowData.MonthRevenueModel.addNumber || 0, + hasData: true + }; + } + return { + cashPayChange: "-", + addNumber: 0, + hasData: false + }; + }, + + // 收益变化颜色样式 + revenueChangeStyle() { + const addNumber = this.currentRevenueData.addNumber; + let color = ''; + if (addNumber > 0) { + color = '#E83944'; + } else if (addNumber < 0) { + color = '#0E9976'; + } + return { color: color }; + }, + + // 收益变化文字 + revenueChangeText() { + const addNumber = this.currentRevenueData.addNumber; + return addNumber ? `${addNumber}%` : "-"; + }, + + // 判断是否有当前月份数据 + hasCurrentMonthData() { + return this.topShowData && this.topShowData.MonthRevenueModel; + } }, watch: { user: { @@ -443,7 +496,7 @@ export default { uni.hideTabBar(); }, onPullDownRefresh: function () { - let _this = this + let _this = this; let userInfo = JSON.parse(JSON.stringify(this.user)); if (userInfo && userInfo.WeChat_UserId && userInfo.AuthorityInfo["89a1f248-2113-4d57-84b1-c2e6edb9e8ee"] === 1) { _this.isReturn = false; @@ -453,7 +506,10 @@ export default { }); } if (!_this.isReturn) { - _this.handleGetOnLoad() + // 下拉刷新时清空缓存,确保数据最新 + _this.monthDataCache = {}; + _this.loadingMap = {}; + _this.handleGetOnLoad(); } uni.stopPullDownRefresh(); }, @@ -461,15 +517,44 @@ export default { // 在onLoad里面调用的 请求整个页面的数据 async handleGetOnLoad() { // 拿到首页的一些基本信息 - this.handleGetIndexInfo() + this.handleGetIndexInfo(); - // 拿到顶部轮播框的数据 - await this.handleGetTopData() + // 并行请求数据,提升加载速度 + const promises = [ + this.handleGetTopData(), + this.handleRealRevenue(), + this.handleGetYNRealData() + ]; - // 实时营收 - this.handleRealRevenue() - // 云南的实时内容 油品、加水、尿素、充电 - this.handleGetYNRealData() + // 预加载相邻月份数据,提升切换体验 + const currentIndex = this.selectIndex; + if (currentIndex > 0) { + promises.push(this.preloadMonthData(currentIndex - 1)); + } + if (currentIndex < this.monthList.length - 1) { + promises.push(this.preloadMonthData(currentIndex + 1)); + } + + await Promise.allSettled(promises); + }, + + // 预加载月份数据 + async preloadMonthData(index) { + if (index < 0 || index >= this.monthList.length) return; + + const monthKey = this.monthList[index]?.realFull; + if (!monthKey || this.monthDataCache[monthKey] || this.loadingMap[monthKey]) { + return; + } + + // 后台预加载,不影响当前显示 + setTimeout(async () => { + try { + await this.handleGetTopData(index); + } catch (error) { + console.log('预加载数据失败:', error); + } + }, 500); }, handleShowYDModal() { this.ydModal = !this.ydModal; @@ -557,154 +642,231 @@ export default { }, // 拿到云南 油水电等数据 async handleGetYNRealData() { - let req = { - serverPartId: "" - } - const res = await request.$webJava("partner/today/data/statistics", req) - console.log('handleGetYNRealDatahandleGetYNRealDatahandleGetYNRealData', res); - let list = res.Result_Data - let result = [] - if (list && list.length > 0) { - list.forEach((item) => { - if (item.dataType === 2000) { - result.push({ - label: `油品`, - value: this.$util.fmoney(item.totalCount), - unit: item.totalCountUnit, - icon: "https://eshangtech.com/cyy_DIB/oilIcon.png" - }) - } else if (item.dataType === 3000) { - result.push({ - label: `加水`, - value: this.$util.fmoney(item.totalCount), - unit: item.totalCountUnit, - icon: "https://eshangtech.com/cyy_DIB/addWaterIcon.png" - }) - } else if (item.dataType === 4000) { - result.push({ - label: `尿素`, - value: this.$util.fmoney(item.totalCount), - unit: item.totalCountUnit, - icon: "https://eshangtech.com/cyy_DIB/ureaIcon.png" - }) - } else if (item.dataType === 5000) { - result.push({ - label: `充电`, - value: this.$util.fmoney(item.totalTicket), - unit: item.totalTicketUnit, - icon: "https://eshangtech.com/cyy_DIB/chargeIcon.png" - }) + try { + let req = { + serverPartId: "" + }; + const res = await request.$webJava("partner/today/data/statistics", req); + console.log('handleGetYNRealDatahandleGetYNRealDatahandleGetYNRealData', res); + let list = res.Result_Data; + let result = []; + + // 数据类型映射配置 + const dataTypeMap = { + 2000: { + label: '油品', + icon: 'https://eshangtech.com/cyy_DIB/oilIcon.png', + valueKey: 'totalCount', + unitKey: 'totalCountUnit' + }, + 3000: { + label: '加水', + icon: 'https://eshangtech.com/cyy_DIB/addWaterIcon.png', + valueKey: 'totalCount', + unitKey: 'totalCountUnit' + }, + 4000: { + label: '尿素', + icon: 'https://eshangtech.com/cyy_DIB/ureaIcon.png', + valueKey: 'totalCount', + unitKey: 'totalCountUnit' + }, + 5000: { + label: '充电', + icon: 'https://eshangtech.com/cyy_DIB/chargeIcon.png', + valueKey: 'totalTicket', + unitKey: 'totalTicketUnit' } - }) + }; + + if (list && list.length > 0) { + list.forEach((item) => { + const config = dataTypeMap[item.dataType]; + if (config) { + result.push({ + label: config.label, + value: this.$util.fmoney(item[config.valueKey]), + unit: item[config.unitKey], + icon: config.icon + }); + } + }); + } + this.otherRealData = result; + } catch (error) { + console.error('获取实时数据失败:', error); + this.otherRealData = []; } - this.otherRealData = result }, // 切换轮播框的方法 async handleChangeSwiper(e) { console.log('e', e); - this.selectIndex = e.target.current - this.topShowData = null - this.moneyRateList = [] - this.profitSharingList = [] - this.modalRateList = [] - await this.handleGetTopData(e.target.current) + const currentIndex = e.target.current; + + // 防抖处理,避免快速切换时重复加载 + if (this.swiperTransition) return; + this.swiperTransition = true; + + this.selectIndex = currentIndex; + + // 检查是否有缓存数据 + const monthKey = this.monthList[currentIndex]?.realFull; + if (this.monthDataCache[monthKey]) { + // 使用缓存数据 + const cachedData = this.monthDataCache[monthKey]; + this.topShowData = cachedData.topShowData; + this.moneyRateList = cachedData.moneyRateList; + this.profitSharingList = cachedData.profitSharingList; + this.modalRateList = cachedData.modalRateList; + } else { + // 清空数据并加载新数据 + this.topShowData = null; + this.moneyRateList = []; + this.profitSharingList = []; + this.modalRateList = []; + await this.handleGetTopData(currentIndex); + } + + // 重置过渡状态 + setTimeout(() => { + this.swiperTransition = false; + }, 100); }, // 实时营收 async handleRealRevenue() { - let req = { - pushProvinceCode: "530000", - StatisticsDate: this.nowDay, - }; - const res = await request.$webGet("CommercialApi/Revenue/GetCurRevenue", req) - // this.currentMoney = res.Result_Data.CurRevenueAmount.toFixed(2); - this.currentMoney = res.Result_Data.CurRevenueAmount.toLocaleString('zh-CN') - + try { + let req = { + pushProvinceCode: "530000", + StatisticsDate: this.nowDay, + }; + const res = await request.$webGet("CommercialApi/Revenue/GetCurRevenue", req); + // this.currentMoney = res.Result_Data.CurRevenueAmount.toFixed(2); + this.currentMoney = res.Result_Data.CurRevenueAmount.toLocaleString('zh-CN'); + } catch (error) { + console.error('获取实时营收数据失败:', error); + this.currentMoney = '暂无数据'; + } }, // 拿到顶部轮播框的数据 async handleGetTopData(index) { - let nowMonth = index ? this.monthList[index] : this.monthList[this.selectIndex] + let nowMonth = index !== undefined ? this.monthList[index] : this.monthList[this.selectIndex]; + const monthKey = nowMonth.realFull; - const req = { - pushProvinceCode: "530000", - StatisticsMonth: nowMonth.realFull, - StatisticsDate: this.lastDay + // 检查是否正在加载,避免重复请求 + if (this.loadingMap[monthKey]) { + return; } - const data = await request.$webGet("CommercialApi/Revenue/GetSummaryRevenueMonth", req) - // 保留接口返回 完全不处理的 - let dataObj = data.Result_Data - // 深拷贝一份 用于处理数据 - let resObj = JSON.parse(JSON.stringify(data.Result_Data)) - console.log('dataObjdataObjdataObj', dataObj); - // 拿到月度对客营收 - resObj.MonthRevenueModel.CashPayChange = this.$util.fmoney(this.$util.getMoney(resObj.MonthRevenueModel.CashPay / 10000), 2); - // 拿到月度对客营收的同比增长 - let addNumber = resObj.MonthRevenueModel.RevenueYOY ? Number((((resObj.MonthRevenueModel.CashPay - resObj.MonthRevenueModel.RevenueYOY) / resObj.MonthRevenueModel.RevenueYOY) * 100).toFixed(2)) : 0; - resObj.MonthRevenueModel.add = addNumber === 0 ? '' : addNumber > 0 ? "+" + addNumber : addNumber - resObj.MonthRevenueModel.addNumber = addNumber - // 拿到年度的对客营收 - resObj.MonthRevenueModel.YearRevenueAddNumber = resObj.MonthRevenueModel.YearRevenueAmount - resObj.MonthRevenueModel.YearRevenueYOY; - resObj.MonthRevenueModel.YearRevenueAdd = resObj.MonthRevenueModel.YearRevenueYOY ? (((resObj.MonthRevenueModel.YearRevenueAmount - resObj.MonthRevenueModel.YearRevenueYOY) / resObj.MonthRevenueModel.YearRevenueYOY) * 100).toFixed(2) : 0; - - // 顶部的 自营、外包 的数据 - let shareList = [{}, {}]; - // 自营、外包 的数据合计 - let sum = 0 - resObj.BusinessTypeList.forEach((item) => { - // 同比 - if (item.data) { - let number = ((item.value - item.data) / item.data) * 100; - if (number > 0) { - item.add = "+" + number.toFixed(2); - } else if (number < 0) { - item.add = number.toFixed(2); - } else { - item.add = null; - } - } - // 环比 - if (item.key) { - let number = ((item.value - item.key) / item.key) * 100; - if (number > 0) { - item.addQOQ = "+" + number.toFixed(2) + "%"; - } else if (number < 0) { - item.addQOQ = number.toFixed(2) + "%"; - } else { - item.addQOQ = null; - } - } - // 分润占比 - if (item.name === "自营") { - shareList[0] = item; - sum += Number(item.value) - } else if (item.name === "外包") { - shareList[1] = item; - sum += Number(item.value) - } - }) - - console.log('sum', sum); - console.log('shareListshareListshareList', shareList); - - - let modalListRate = [] - if (shareList && shareList.length > 0) { - shareList.forEach((item) => { - modalListRate.push((Number(item.value) / sum * 100).toFixed(2)) - }) + // 检查缓存 + if (this.monthDataCache[monthKey]) { + const cachedData = this.monthDataCache[monthKey]; + this.topShowData = cachedData.topShowData; + this.moneyRateList = cachedData.moneyRateList; + this.profitSharingList = cachedData.profitSharingList; + this.modalRateList = cachedData.modalRateList; + return; } - this.modalRateList = modalListRate + // 设置加载状态 + this.loadingMap[monthKey] = true; - this.moneyRateList = [ - Number(shareList[0].value), - Number(shareList[1].value) - ]; - this.profitSharingList = shareList - console.log('profitSharingListprofitSharingListprofitSharingList', this.profitSharingList); - console.log('moneyRateListmoneyRateListmoneyRateList', this.moneyRateList); - console.log('resObjresObjresObjresObjresObj', resObj); - this.topShowData = resObj + try { + const req = { + pushProvinceCode: "530000", + StatisticsMonth: nowMonth.realFull, + StatisticsDate: this.lastDay + }; + const data = await request.$webGet("CommercialApi/Revenue/GetSummaryRevenueMonth", req); + + // 保留接口返回 完全不处理的 + let dataObj = data.Result_Data; + // 深拷贝一份 用于处理数据 + let resObj = JSON.parse(JSON.stringify(data.Result_Data)); + console.log('dataObjdataObjdataObj', dataObj); + // 拿到月度对客营收 + resObj.MonthRevenueModel.CashPayChange = this.$util.fmoney(this.$util.getMoney(resObj.MonthRevenueModel.CashPay / 10000), 2); + // 拿到月度对客营收的同比增长 + let addNumber = resObj.MonthRevenueModel.RevenueYOY ? Number((((resObj.MonthRevenueModel.CashPay - resObj.MonthRevenueModel.RevenueYOY) / resObj.MonthRevenueModel.RevenueYOY) * 100).toFixed(2)) : 0; + resObj.MonthRevenueModel.add = addNumber === 0 ? '' : addNumber > 0 ? "+" + addNumber : addNumber; + resObj.MonthRevenueModel.addNumber = addNumber; + // 拿到年度的对客营收 + resObj.MonthRevenueModel.YearRevenueAddNumber = resObj.MonthRevenueModel.YearRevenueAmount - resObj.MonthRevenueModel.YearRevenueYOY; + resObj.MonthRevenueModel.YearRevenueAdd = resObj.MonthRevenueModel.YearRevenueYOY ? (((resObj.MonthRevenueModel.YearRevenueAmount - resObj.MonthRevenueModel.YearRevenueYOY) / resObj.MonthRevenueModel.YearRevenueYOY) * 100).toFixed(2) : 0; + + // 顶部的 自营、外包 的数据 + let shareList = [{}, {}]; + // 自营、外包 的数据合计 + let sum = 0; + resObj.BusinessTypeList.forEach((item) => { + // 同比 + if (item.data) { + let number = ((item.value - item.data) / item.data) * 100; + if (number > 0) { + item.add = "+" + number.toFixed(2); + } else if (number < 0) { + item.add = number.toFixed(2); + } else { + item.add = null; + } + } + // 环比 + if (item.key) { + let number = ((item.value - item.key) / item.key) * 100; + if (number > 0) { + item.addQOQ = "+" + number.toFixed(2) + "%"; + } else if (number < 0) { + item.addQOQ = number.toFixed(2) + "%"; + } else { + item.addQOQ = null; + } + } + // 分润占比 + if (item.name === "自营") { + shareList[0] = item; + sum += Number(item.value); + } else if (item.name === "外包") { + shareList[1] = item; + sum += Number(item.value); + } + }); + + console.log('sum', sum); + console.log('shareListshareListshareList', shareList); + + let modalListRate = []; + if (shareList && shareList.length > 0) { + shareList.forEach((item) => { + modalListRate.push((Number(item.value) / sum * 100).toFixed(2)); + }); + } + + const moneyRateList = [ + Number(shareList[0].value), + Number(shareList[1].value) + ]; + + // 缓存数据 + this.monthDataCache[monthKey] = { + topShowData: resObj, + moneyRateList: moneyRateList, + profitSharingList: shareList, + modalRateList: modalListRate + }; + + // 设置当前数据 + this.modalRateList = modalListRate; + this.moneyRateList = moneyRateList; + this.profitSharingList = shareList; + console.log('profitSharingListprofitSharingListprofitSharingList', this.profitSharingList); + console.log('moneyRateListmoneyRateListmoneyRateList', this.moneyRateList); + console.log('resObjresObjresObjresObjresObj', resObj); + this.topShowData = resObj; + } catch (error) { + console.error('获取数据失败:', error); + } finally { + // 清除加载状态 + delete this.loadingMap[monthKey]; + } }, // 拿到首页的一些基本信息 handleGetIndexInfo() { @@ -743,7 +905,15 @@ export default { const data = await request.$webGet('CommercialApi/BaseInfo/GetServerpartList', req) console.log('sdjkajdas', data); let list = data.Result_Data.List - uni.setStorageSync('currentService', list[0]) + uni.setStorageSync('currentService', list[0]); + }, + + // uniapp小程序兼容性方法,保留作为备用 + getCurrentMonthText(index) { + if (this.selectIndex === index && this.monthList[index]) { + return (this.monthList[index].month || "-") + "月对客营收"; + } + return "-月对客营收"; } } } diff --git a/pages/userCenter/components/userList.vue b/pages/userCenter/components/userList.vue index 96b0d9f..ccf1146 100644 --- a/pages/userCenter/components/userList.vue +++ b/pages/userCenter/components/userList.vue @@ -43,7 +43,7 @@ {{ item.name }} {{ item.notice - }} + }} @@ -77,20 +77,6 @@ export default { methods: { // 第一行的跳转 handleGoFirst(item) { - if (this.isReturn) { - let _this = this - uni.showModal({ - title: '温馨提示', - content: '请您授权登录后再操作。', - success(res) { - if (res.confirm) { - _this.$util.toNextRoute('redirectTo', '/pages/register/register') - } - } - }) - return - } - if (item.isNotice) { this.$util.toNextRoute('navigateTo', item.homeUrl) } else { @@ -122,17 +108,16 @@ export default { }, // 第四行的跳转 handleGoFourth(item) { - if (this.isReturn) { - let _this = this - uni.showModal({ - title: '温馨提示', - content: '请您授权登录后再操作。', - success(res) { - if (res.confirm) { - _this.$util.toNextRoute('redirectTo', '/pages/register/register') - } - } - }) + //通过权限来判断是否可以点击跳转 + let userInfo = uni.getStorageSync("vuex"); + userInfo = userInfo ? JSON.parse(userInfo) : "" + console.log('userInfouserInfouserInfo', userInfo); + if (!userInfo.userData || !userInfo.userData.WeChat_UserId) { + this.$util.toNextRoute('redirectTo', '/pages/register/register') + } else if (userInfo.userData && userInfo.userData.WeChat_UserId && userInfo.userData.AuthorityInfo["89a1f248-2113-4d57-84b1-c2e6edb9e8ee"] !== 1) { + uni.redirectTo({ + url: `/pages/commercialBI/noData?type=homeIndex`, + }); return } diff --git a/pages/userCenter/userCenter.vue b/pages/userCenter/userCenter.vue index 59bc36d..746ac57 100644 --- a/pages/userCenter/userCenter.vue +++ b/pages/userCenter/userCenter.vue @@ -264,14 +264,12 @@ export default { //通过权限来判断是否可以点击跳转 let userInfo = uni.getStorageSync("vuex"); - if ( - userInfo.userData && - userInfo.userData.WeChat_UserId && - userInfo.userData.AuthorityInfo[ - "89a1f248-2113-4d57-84b1-c2e6edb9e8ee" - ] === 1 - ) { + if (userInfo && userInfo.WeChat_UserId && userInfo.AuthorityInfo["89a1f248-2113-4d57-84b1-c2e6edb9e8ee"] === 1) { this.isReturn = false; + } else if (userInfo && userInfo.WeChat_UserId && userInfo.AuthorityInfo["89a1f248-2113-4d57-84b1-c2e6edb9e8ee"] !== 1) { + uni.redirectTo({ + url: `/pages/commercialBI/noData?type=homeIndex`, + }); }