完善接口

This commit is contained in:
wangxiaowei
2025-12-19 21:30:26 +08:00
parent 09c86fa8ca
commit efc0d6fbd2
10 changed files with 351 additions and 139 deletions

View File

@ -99,12 +99,6 @@ export function getTeaSpecialistOrderPackageDetail(group_id: number) {
/** /**
* 套餐列表 * 套餐列表
*/ */
export interface IGetStoreOrderListParams {
page: number
size: number
status: number
}
export function getTeaSpecialistOrderPackageList(data) { export function getTeaSpecialistOrderPackageList(data) {
return http.Post<any>('/storeapi/Group/groupLists', data) return http.Post<any>('/storeapi/Group/groupLists', data)
} }

View File

@ -1,5 +1,12 @@
import { http } from '@/http/alova' import { http } from '@/http/alova'
/**
* 首页统计数据
*/
export function getStoreStatistics(store_id: number) {
return http.Post<any>('/storeapi/user/checkMoth', { store_id })
}
/** /**
* 获取门店列表 * 获取门店列表
*/ */
@ -169,3 +176,45 @@ export interface IGetStoreMemberListParams {
export function getStoreMemberList(data: IGetStoreMemberListParams) { export function getStoreMemberList(data: IGetStoreMemberListParams) {
return http.Post<any>('/storeapi/user/checkStoreUserList', data) return http.Post<any>('/storeapi/user/checkStoreUserList', data)
} }
/**
* 门店用户详情
*/
export function getStoreMemberDetails(store_id: number, user_id: number) {
return http.Post<any>('/storeapi/user/checkStoreUserDetails', { store_id, user_id })
}
/**
* 编辑门店用户备注
*/
export function editStoreMemberMark(id: number, remark: string) {
return http.Post('/storeapi/user/editStoreUserRemark', { id, remark })
}
/**
* 门店会员流水明细
*/
export interface IGetStoreMemberTransactionListParams {
page: number
size: number
store_id: number
user_id: number
}
export function getStoreMemberTransactionList(data: IGetStoreMemberTransactionListParams) {
return http.Post<any>('/storeapi/user/checkStoreUserBuyList', data)
}
/**
* 财务管理收入明细列表
*/
export interface IGetStoreIncomeListParams {
page: number
size: number
times?: string
store_id: number
}
export function getStoreIncomeList(data: IGetStoreIncomeListParams) {
return http.Post<any>('/storeapi/user/checkStoreAccountList', data)
}

View File

@ -11,7 +11,6 @@ export function getUserInfo() {
return http.Post<IUserResult>('/storeapi/user/info') return http.Post<IUserResult>('/storeapi/user/info')
} }
/** /**
* 修改用户信息 * 修改用户信息
*/ */

View File

@ -15,54 +15,55 @@
<view class="mt-38rpx"> <view class="mt-38rpx">
<view class=""> <view class="">
<view class="mx-48rpx flex items-center"> <view class="mx-48rpx flex items-center">
<view class="rounded-4rpx w-60rpx text-center text-[#40AE36] border-2rpx border-solid border-[#40AE36] text-22rpx pb-4rpx">团购</view> <view class="rounded-4rpx w-60rpx text-center text-[#40AE36] border-2rpx border-solid border-[#40AE36] text-22rpx pb-4rpx" v-if="isGroupBuy">团购</view>
<!-- <view class="rounded-4rpx w-60rpx text-center text-[#FF5951] border-2rpx border-solid border-[#FF5951] text-22rpx pb-4rpx">直营</view> --> <view class="rounded-4rpx w-60rpx text-center text-[#FF5951] border-2rpx border-solid border-[#FF5951] text-22rpx pb-4rpx" v-if="isDirectSale">直营</view>
<view class="w-600rpx line-2 ml-20rpx font-bold text-30rpx text-[#303133] leading-42rpx text-left">榻榻米双人包间惬意茶室商务洽谈会议室这是里团购名称</view> <view class="w-600rpx line-2 ml-20rpx font-bold text-30rpx text-[#303133] leading-42rpx text-left">{{ bill?.room?.title }}{{ bill?.order?.group?.title || '' }}</view>
</view> </view>
</view> </view>
<view class="mt-30rpx text-40rpx text-[#303133] leading-56rpx text-center"> <view class="mt-30rpx text-40rpx text-[#303133] leading-56rpx text-center">
<text class="font-bold">+</text>128.00 <text class="font-bold">+</text>{{ bill.amount }}
</view> </view>
<view class="flex items-center flex items-center justify-center mt-16rpx"> <view class="flex items-center flex items-center justify-center mt-16rpx">
<wd-img width="28rpx" height="28rpx" :src="`${OSS}images/store/finance/image2.png`" mode="aspectFit" /> <wd-img width="28rpx" height="28rpx" :src="`${OSS}images/store/finance/image2.png`" mode="aspectFit" />
<view class="text-26rpx text-[#606266] leading-36rpx ml-12rpx">核销成功</view> <view class="text-26rpx text-[#606266] leading-36rpx ml-12rpx" v-if="isGroupBuy">核销成功</view>
<view class="text-26rpx text-[#606266] leading-36rpx ml-12rpx" v-if="isDirectSale">结算成功</view>
</view> </view>
<view class="mx-28rpx mt-72rpx"> <view class="mx-28rpx mt-72rpx">
<!-- 这一块内容是在直营店才显示 --> <!-- 这一块内容是在直营店才显示 -->
<!-- <view> <view v-if="isDirectSale">
<view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx"> <view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx">
<view>预定门店</view> <view>预定门店</view>
<view>茶址.24小时智能茶室(中新店)</view> <view>{{ bill?.store?.name }}</view>
</view> </view>
<view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx"> <view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx">
<view>预约时间</view> <view>预约时间</view>
<view>2025-03-18 09:00-12:00</view> <view>{{ bill?.order?.update_dtime }}</view>
</view> </view>
<view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx"> <view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx">
<view>预约时长</view> <view>预约时长</view>
<view>3小时</view> <view>{{ bill?.order?.hours }}小时</view>
</view> </view>
<view class="mt-20rpx"> <view class="mt-20rpx">
<wd-gap height="2rpx" bg-color="#E5E5E5"></wd-gap> <wd-gap height="2rpx" bg-color="#E5E5E5"></wd-gap>
</view> </view>
</view> --> </view>
<!-- 直营和团购都显示 --> <!-- 直营和团购都显示 -->
<view> <view>
<view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx"> <view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx">
<view>总收入</view> <view>总收入</view>
<view>148.00</view> <view>{{ bill?.order?.order_amount }}</view>
</view> </view>
<view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx"> <view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx">
<view>优惠券</view> <view>优惠券</view>
<view>-20</view> <view>-{{ bill?.order?.coupon_price }}</view>
</view> </view>
<view class="mt-20rpx"> <view class="mt-20rpx">
@ -74,46 +75,46 @@
<view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx"> <view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx">
<view>订单编号</view> <view>订单编号</view>
<view> <view>
<text>7327328627526903</text> <text>{{ bill?.order?.order_sn }}</text>
<wd-divider vertical /> <wd-divider vertical />
<text class="text-[#4C9F44]" @click="copy('7327328627526903')">复制</text> <text class="text-[#4C9F44]" @click="copy(bill?.order?.order_sn)">复制</text>
</view> </view>
</view> </view>
<!-- 直营显示 --> <!-- 直营显示 -->
<!-- <view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx"> <view v-if="isDirectSale" class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx">
<view>交易方式</view> <view>交易方式</view>
<view>微信支付</view> <view>{{ bill?.order?.pay_way_title }}</view>
</view> --> </view>
<view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx"> <view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx">
<view>创建时间</view> <view>创建时间</view>
<view>2025-05-16 12:20:26</view> <view>{{ bill?.order?.dtime }}</view>
</view> </view>
<!-- 团购显示 --> <!-- 团购显示 -->
<view> <view v-if="isGroupBuy">
<view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx"> <view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx">
<view>验券时间</view> <view>验券时间</view>
<view>2025-05-16 12:20:26</view> <view>{{ bill?.order?.group?.yanquan_dtime }}</view>
</view> </view>
<view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx"> <view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx">
<view>验券门店</view> <view>验券门店</view>
<view>茶址.24小时智能茶室(中新店)</view> <view>{{ bill?.store?.name }}</view>
</view> </view>
<view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx"> <view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx">
<view>券号</view> <view>券号</view>
<view>8408669398</view> <view>{{ bill?.order?.group?.qr_sn }}</view>
</view> </view>
</view> </view>
<!-- 直营显示 --> <!-- 直营显示 -->
<!-- <view class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx"> <view v-if="isDirectSale" class="text-28rpx leading-40rpx text-[#606266] flex items-center justify-between mt-22rpx">
<view>付款时间</view> <view>付款时间</view>
<view>2025-08-16 12:20:26</view> <view>{{ bill?.order?.dtime }}</view>
</view> --> </view>
</view> </view>
</view> </view>
</view> </view>
@ -123,11 +124,28 @@
<script lang="ts" setup> <script lang="ts" setup>
import { toTimes, copy } from '@/utils/tools' import { toTimes, copy } from '@/utils/tools'
import { getUserTransactionDetailsInfo } from '@/api/user'
const OSS = inject('OSS') const OSS = inject('OSS')
const bill = ref<any>({})
onLoad((args) => { onLoad(async (args) => {
const id = Number(args.id) || 0
if (id) {
const res = await getUserTransactionDetailsInfo(id)
bill.value = res.details
}
}) })
// 团购
const isGroupBuy = computed(() => {
return bill.value.change_type === 4
})
// 直营
const isDirectSale = computed(() => {
return bill.value.change_type === 1 || bill.value.change_type === 2
})
</script> </script>
<style lang="scss"> <style lang="scss">

View File

@ -17,20 +17,20 @@
<wd-img width="692rpx" height="334rpx" :src="`${OSS}images/store/finance/image1.png`" mode="aspectFit" /> <wd-img width="692rpx" height="334rpx" :src="`${OSS}images/store/finance/image1.png`" mode="aspectFit" />
<view class="absolute top-50rpx left-40rpx"> <view class="absolute top-50rpx left-40rpx">
<view class="font-400 text-26rpx text-[#B4CEFF] leading-36rpx">经营资产</view> <view class="font-400 text-26rpx text-[#B4CEFF] leading-36rpx">经营资产</view>
<view class="mt-20rpx font-bold text-36rpx text-[#fff] leading-34rpx">5,662.46</view> <view class="mt-20rpx font-bold text-36rpx text-[#fff] leading-34rpx">{{ userFinance.total_amount }}</view>
</view> </view>
<view class="flex items-center justify-around w-100% absolute bottom-40rpx left-0 px-40rpx"> <view class="flex items-center justify-around w-100% absolute bottom-40rpx left-0 px-40rpx">
<view class="flex flex-col items-center justify-start"> <view class="flex flex-col items-center justify-start">
<view class="font-400 text-24rpx text-[#606266] text-34rpx">已提现</view> <view class="font-400 text-24rpx text-[#606266] text-34rpx">已提现</view>
<view class="font-bold text-32rpx text-[#303133] leading-34rpx mt-14rpx">3,662.46</view> <view class="font-bold text-32rpx text-[#303133] leading-34rpx mt-14rpx">{{ userFinance.total_reflect_amount }}</view>
</view> </view>
<view class="h-98rpx"> <view class="h-98rpx">
<wd-divider vertical color="#EAEEF2" custom-class="!h-98rpx"></wd-divider> <wd-divider vertical color="#EAEEF2" custom-class="!h-98rpx"></wd-divider>
</view> </view>
<view class="flex flex-col items-center justify-start"> <view class="flex flex-col items-center justify-start">
<view class="font-400 text-24rpx text-[#606266] text-34rpx">待提现</view> <view class="font-400 text-24rpx text-[#606266] text-34rpx">待提现</view>
<view class="font-bold text-32rpx text-[#303133] leading-34rpx mt-14rpx">3,662.46</view> <view class="font-bold text-32rpx text-[#303133] leading-34rpx mt-14rpx">{{ userFinance.user_money }}</view>
</view> </view>
</view> </view>
</view> </view>
@ -38,41 +38,35 @@
<view class="mx-30rpx"> <view class="mx-30rpx">
<view class="flex items-center"> <view class="flex items-center">
<view class="font-bold text-[#303133] datetime-picker"> <view class="font-bold text-[#303133] datetime-picker">
<!-- <text class="text-44rpx">8</text>
<text class="text-32rpx"></text> -->
<wd-datetime-picker v-model="value" :maxDate="Date.now()" type="year-month" @confirm="Finance.handleConfirmDate"></wd-datetime-picker> <wd-datetime-picker v-model="value" :maxDate="Date.now()" type="year-month" @confirm="Finance.handleConfirmDate"></wd-datetime-picker>
</view> </view>
<!-- <view class="mt-16rpx">
<wd-icon name="fill-arrow-down" size="40rpx" color="#BFC2CC"></wd-icon>
</view> -->
</view> </view>
<view class="font-400 text-24rpx text-[#606266] leading-34rpx"> <view class="font-400 text-24rpx text-[#606266] leading-34rpx">
收入¥5,562.46 收入¥{{ allPrice }}
</view> </view>
<view class="mt-20rpx"> <view class="mt-20rpx">
<mescroll-body ref="mescrollItem0" @init="mescrollInit" @down="downCallback" @up="Finance.upCallback" :down="downOption" :up="upOption"> <mescroll-body ref="mescrollItem0" @init="mescrollInit" @down="downCallback" @up="Finance.upCallback" :down="downOption" :up="upOption">
<view class="bg-white rounded-16rpx px-16rpx py-28rpx" @click="router.navigateTo(`/bundle/finance/detail`)"> <view class="bg-white rounded-16rpx px-16rpx py-28rpx mb-20rpx" v-for="item in list" :key="item.id" @click="router.navigateTo(`/bundle/finance/detail?id=${item.id}`)">
<view class="flex items-center justify-between"> <view class="flex items-center justify-between">
<view class="line-1 w-480rpx font-bold text-30rpx text-[#303133] leading-42rpx">榻榻米双人包间惬意茶室商务...</view> <view class="line-1 w-480rpx font-bold text-30rpx text-[#303133] leading-42rpx">{{ item?.room?.title }}{{ item?.group?.title || '' }}</view>
<view class="flex items-center"> <view class="flex items-center">
<view class="text-[#FF5951] font-bold text-30rpx leading-42rpx">+ 181.35</view> <view class="text-[#FF5951] font-bold text-30rpx leading-42rpx">+ {{ item.amount }}</view>
<wd-icon name="arrow-right" size="26rpx" color="#666"></wd-icon> <wd-icon name="arrow-right" size="26rpx" color="#666"></wd-icon>
</view> </view>
</view> </view>
<view class="mt-12rpx"> <view class="mt-12rpx">
<view class="flex items-center"> <view class="flex items-center">
<view class="rounded-4rpx w-60rpx text-center text-[#40AE36] border-2rpx border-solid border-[#40AE36] text-22rpx pb-4rpx">团购</view> <view class="rounded-4rpx w-60rpx text-center text-[#40AE36] border-2rpx border-solid border-[#40AE36] text-22rpx pb-4rpx" v-if="item.change_type == 4">团购</view>
<!-- <view class="rounded-4rpx w-60rpx text-center text-[#FF5951] border-2rpx border-solid border-[#FF5951] text-22rpx pb-4rpx">直营</view> --> <view class="rounded-4rpx w-60rpx text-center text-[#FF5951] border-2rpx border-solid border-[#FF5951] text-22rpx pb-4rpx" v-if="item.change_type == 1 || item.change_type == 2">直营</view>
<view class="text-24rpx text-[#606266] leading-34rpx ml-10rpx">上海.茶址24小时智能茶室中新店</view> <view class="text-24rpx text-[#606266] leading-34rpx ml-10rpx">{{ item?.store?.name }}</view>
</view> </view>
</view> </view>
<view class="mt-14rpx text-24rpx text-[#909399] leading-34rpx"> <view class="mt-14rpx text-24rpx text-[#909399] leading-34rpx">
核销时间2025-08-05 19:09:52 核销时间{{ item.update_time }}
</view> </view>
</view> </view>
</mescroll-body> </mescroll-body>
@ -87,9 +81,13 @@
import { router } from '@/utils/tools' import { router } from '@/utils/tools'
import { onPageScroll, onReachBottom } from '@dcloudio/uni-app' import { onPageScroll, onReachBottom } from '@dcloudio/uni-app'
import useMescroll from "@/uni_modules/mescroll-uni/hooks/useMescroll.js" import useMescroll from "@/uni_modules/mescroll-uni/hooks/useMescroll.js"
import { getStoreIncomeList } from '@/api/store'
import { useStoreStore } from '@/store'
import { getUserInfo } from '@/api/user'
const OSS = inject('OSS') const OSS = inject('OSS')
const navbarHeight = inject('navbarHeight') const navbarHeight = inject('navbarHeight')
const useStore = useStoreStore()
// mescroll相关 // mescroll相关
const { mescrollInit, downCallback, getMescroll } = useMescroll(onPageScroll, onReachBottom) // 调用mescroll的hook const { mescrollInit, downCallback, getMescroll } = useMescroll(onPageScroll, onReachBottom) // 调用mescroll的hook
@ -101,37 +99,67 @@
textNoMore: '~ 已经到底啦 ~', //无更多数据的提示 textNoMore: '~ 已经到底啦 ~', //无更多数据的提示
} }
const list = ref<Array<any>>([]) // 茶艺师列表 const list = ref<Array<any>>([]) // 茶艺师列表
const userFinance = ref<any>({})
const allPrice = ref<number>(0)
// 日期过滤 // 日期过滤
const value = ref<number>(Date.now()) const value = ref<number>(Date.now())
onLoad((args) => { onLoad(async (args) => {
await Finance.handleGetFinanceData()
}) })
const Finance = { const Finance = {
// 上拉加载的回调: 其中num:当前页 从1开始, size:每页数据条数,默认10 /**
upCallback: (mescroll) => { * 初始化财务数据
*/
// getTeaSpecialistOrderList(filter).then((res) => { handleGetFinanceData: async () => {
// const curPageData = res.list || [] // 当前页数据 try {
// if(mescroll.num == 1) list.value = [] // 第一页需手动制空列表 const res = await getUserInfo()
// list.value = list.value.concat(curPageData) //追加新数据 userFinance.value = res
// mescroll.endSuccess(curPageData.length, Boolean(res.more)) } catch(e) {
// }).catch(() => { }
mescroll.endErr() // 请求失败, 结束加载
// })
},
// 确认日期-
handleConfirmDate: (date: {value: number}) => {
const d = new Date(date.value)
console.log("🚀 ~ d:", d)
const year = d.getFullYear()
const month = d.getMonth() + 1
console.log(`${year}${month}`);
}, },
upCallback: (mescroll) => {
const filter = {
page: mescroll.num,
size: mescroll.size,
store_id: useStore.defaultStore.id,
times: Finance.handleFormatDate(value.value)
}
getStoreIncomeList(filter).then((res) => {
console.log("🚀 ~ res:", res)
const curPageData = res.list || [] // 当前页数据
if(mescroll.num == 1) list.value = [] // 第一页需手动制空列表
list.value = list.value.concat(curPageData) //追加新数据
allPrice.value = res.all_price || 0
mescroll.endSuccess(curPageData.length, Boolean(res.more))
}).catch(() => {
mescroll.endErr() // 请求失败, 结束加载
})
},
/**
* 确认日期
* @param date
*/
handleConfirmDate: (date: {value: number}) => {
list.value = []
getMescroll().resetUpScroll();
},
/**
* 格式化时间
*/
handleFormatDate: (timestamp: number) => {
const d = new Date(timestamp)
const year = d.getFullYear()
const month = d.getMonth() + 1
const monthStr = month < 10 ? `0${month}` : `${month}`
return `${year}-${monthStr}`
}
} }
</script> </script>

View File

@ -14,23 +14,23 @@
<view class="mt-28rpx mx-32rpx"> <view class="mt-28rpx mx-32rpx">
<mescroll-body ref="mescrollItem0" @init="mescrollInit" @down="downCallback" @up="BillDetail.upCallback" :down="downOption" :up="upOption"> <mescroll-body ref="mescrollItem0" @init="mescrollInit" @down="downCallback" @up="BillDetail.upCallback" :down="downOption" :up="upOption">
<view class="bg-white rounded-16rpx py-28rpx mb-20rpx"> <view class="bg-white rounded-16rpx py-28rpx mb-20rpx" v-for="item in list" :key="item.id">
<view class="flex items-center"> <view class="flex items-center">
<view class="w-8rpx h-32rpx bg-[#4C9F44] mr-22rpx"></view> <view class="w-8rpx h-32rpx bg-[#4C9F44] mr-22rpx"></view>
<view class="font-bold text-28rpx leading-40rpx text-[#303133]">订单号1744601722882174</view> <view class="font-bold text-28rpx leading-40rpx text-[#303133]">订单号{{ item.sn }}</view>
</view> </view>
<view class="mx-18rpx mt-16rpx mb-22rpx"> <view class="mx-18rpx mt-16rpx mb-22rpx">
<wd-gap height="2rpx" bg-color="#E5E5E5"></wd-gap> <wd-gap height="2rpx" bg-color="#E5E5E5"></wd-gap>
</view> </view>
<view class="flex items-center justify-between px-18rpx"> <view class="flex items-center justify-between px-18rpx">
<view class="font-400 text-28rpx text-[#606266] leading-40rpx"> <view class="font-400 text-28rpx text-[#606266] leading-40rpx">
<view class="mb-16rpx">门店茶址24小时-碧云店</view> <view class="mb-16rpx">门店{{ item.store_name }}</view>
<view class="mb-16rpx">类型包间预定</view> <view class="mb-16rpx">类型{{ BillDetail.handleTypeText(item.change_type) }}</view>
<view class="mb-16rpx">支付方式平台余额</view> <view class="mb-16rpx">支付方式{{ item.pay_way_title }}</view>
<view>支付时间2025-04-14 11:35</view> <view>支付时间{{ item.create_time }}</view>
</view> </view>
<view class="text-right"> <view class="text-right">
<price-format weight="bold" color="#303133" :first-size="44" :second-size="44" :subscript-size="28" :price="23.02"></price-format> <price-format weight="bold" color="#303133" :first-size="44" :second-size="44" :subscript-size="28" :price="item.amount"></price-format>
<view class="mt-6rpx font-400 text-28rpx leading-40rpx text-[#303133]">金额</view> <view class="mt-6rpx font-400 text-28rpx leading-40rpx text-[#303133]">金额</view>
</view> </view>
</view> </view>
@ -42,27 +42,36 @@
<script lang="ts" setup> <script lang="ts" setup>
import { toTimes, copy } from '@/utils/tools'
import { router } from '@/utils/tools'
import { onPageScroll, onReachBottom } from '@dcloudio/uni-app' import { onPageScroll, onReachBottom } from '@dcloudio/uni-app'
import useMescroll from "@/uni_modules/mescroll-uni/hooks/useMescroll.js" import useMescroll from "@/uni_modules/mescroll-uni/hooks/useMescroll.js"
import { useStoreStore } from '@/store'
import { getStoreMemberTransactionList } from '@/api/store'
const useStore = useStoreStore()
// mescroll // mescroll
const { mescrollInit, downCallback, getMescroll } = useMescroll(onPageScroll, onReachBottom) // 调用mescroll的hook const { mescrollInit, downCallback, getMescroll } = useMescroll(onPageScroll, onReachBottom) // 调用mescroll的hook
const downOption = { const downOption = {
auto: true auto: false
} }
const upOption = { const upOption = {
auto: true, auto: false,
textNoMore: '~ 已经到底啦 ~', //无更多数据的提示 textNoMore: '~ 已经到底啦 ~', //无更多数据的提示
} }
const list = ref<Array<any>>([]) // 茶室列表 const list = ref<Array<any>>([])
const userId = ref<number>(0) // 用户ID
const OSS = inject('OSS')
const mark = ref<string>('')
onLoad((args) => { onLoad((args) => {
userId.value = Number(args.userId) || 0
if (userId.value) {
upOption.auto = true
downOption.auto = true
const mescroll = getMescroll()
if (mescroll) {
mescroll.resetUpScroll()
}
}
}) })
const BillDetail = { const BillDetail = {
@ -71,22 +80,42 @@
* @param mescroll * @param mescroll
*/ */
upCallback: (mescroll) => { upCallback: (mescroll) => {
const filter = {
page: mescroll.num,
size: mescroll.size,
store_id: useStore.defaultStore.id,
user_id: userId.value,
}
// 需要留一下数据为空的时候显示的空数据图标内容 // 需要留一下数据为空的时候显示的空数据图标内容
// getTeaRoomOrderList(filter).then((res) => { getStoreMemberTransactionList(filter).then((res) => {
// const curPageData = res.list || [] // 当前页数据 console.log("🚀 ~ res:", res)
// if(mescroll.num == 1) list.value = [] // 第一页需手动制空列表 const curPageData = res.list || [] // 当前页数据
// list.value = list.value.concat(curPageData) //追加新数据 if(mescroll.num == 1) list.value = [] // 第一页需手动制空列表
// mescroll.endSuccess(curPageData.length, Boolean(res.more)) list.value = list.value.concat(curPageData) //追加新数据
// }).catch(() => { mescroll.endSuccess(curPageData.length, Boolean(res.more))
}).catch(() => {
mescroll.endErr() // 请求失败, 结束加载 mescroll.endErr() // 请求失败, 结束加载
// }) })
}, },
// 打电话 /**
handleCall: (phone) => { * 类型
uni.makePhoneCall({ */
phoneNumber: phone handleTypeText: (type: number) => {
}) let text = ''
switch (type) {
case 1:
text = '包间预定'
break;
case 2:
text = '续订'
break;
case 3:
text = '套餐'
break;
}
return text
} }
} }
</script> </script>

View File

@ -16,39 +16,38 @@
<view class="bg-white rounded-16rpx px-28rpx pt-40rpx pb-26rpx"> <view class="bg-white rounded-16rpx px-28rpx pt-40rpx pb-26rpx">
<view> <view>
<view class="flex items-center"> <view class="flex items-center">
<wd-img width="140rpx" height='140rpx' src="https://shchazhi.oss-cn-hangzhou.aliyuncs.com/fronted/icon/icon_avatar.png" :round="true"></wd-img> <wd-img width="140rpx" height='140rpx' :src="user.avatar" :round="true"></wd-img>
<view class="ml-20rpx"> <view class="ml-20rpx">
<view class="flex items-center"> <view class="flex items-center">
<view class="font-bold text-28rpx text-[#303133] leading-40rpx mr-12rpx">用户昵称</view> <view class="font-bold text-28rpx text-[#303133] leading-40rpx mr-12rpx">{{ user.nickname }}</view>
<!-- TODO 如果是vip的话才显示这个皇冠 --> <view v-if="user.member == 1">
<view>
<wd-img width="40rpx" height='40rpx' :src="`${OSS}icon/icon_crown.png`"></wd-img> <wd-img width="40rpx" height='40rpx' :src="`${OSS}icon/icon_crown.png`"></wd-img>
</view> </view>
</view> </view>
<view class="mt-18rpx font-400 text-28rpx text-[#303133] leading-40rpx">手机号18857339563</view> <view class="mt-18rpx font-400 text-28rpx text-[#303133] leading-40rpx">手机号{{ user.mobile }}</view>
</view> </view>
</view> </view>
<!-- TODO VIP显示这块内容 --> <!-- TODO VIP显示这块内容 -->
<view class="relative mt-22rpx"> <view class="relative mt-22rpx" v-if="user.member == 1">
<wd-img width="650rpx" height='70rpx' :src="`${OSS}images/store/user/image1.png`"></wd-img> <wd-img width="650rpx" height='70rpx' :src="`${OSS}images/store/user/image1.png`"></wd-img>
<view class="absolute top-18rpx left-28rpx flex items-center"> <view class="absolute top-18rpx left-28rpx flex items-center">
<wd-img width="40rpx" height='40rpx' :src="`${OSS}icon/icon_vip.png`"></wd-img> <wd-img width="40rpx" height='40rpx' :src="`${OSS}icon/icon_vip.png`"></wd-img>
<view class="font-400 text-24rpx text-[#EECC99] leading-34rpx ml-18rpx">2026.03.06到期</view> <view class="font-400 text-24rpx text-[#EECC99] leading-34rpx ml-18rpx">{{ user.expiration_time }}到期</view>
</view> </view>
</view> </view>
<view class="flex items-center justify-around px-90rpx mt-46rpx"> <view class="flex items-center justify-around px-90rpx mt-46rpx">
<view class="flex flex-col items-center justify-start"> <view class="flex flex-col items-center justify-start">
<view class="font-400 text-24rpx text-[#606266] text-34rpx">平台余额</view> <view class="font-400 text-24rpx text-[#606266] text-34rpx">平台余额</view>
<view class="font-bold text-32rpx text-[#303133] leading-34rpx mt-34rpx">3,1.46</view> <view class="font-bold text-32rpx text-[#303133] leading-34rpx mt-34rpx">{{ user.user_money || 0 }}</view>
</view> </view>
<view class="h-98rpx"> <view class="h-98rpx">
<wd-divider vertical color="#EAEEF2" custom-class="!h-98rpx"></wd-divider> <wd-divider vertical color="#EAEEF2" custom-class="!h-98rpx"></wd-divider>
</view> </view>
<view class="flex flex-col items-center justify-start"> <view class="flex flex-col items-center justify-start">
<view class="font-400 text-24rpx text-[#606266] text-34rpx">门店余额</view> <view class="font-400 text-24rpx text-[#606266] text-34rpx">门店余额</view>
<view class="font-bold text-32rpx text-[#303133] leading-34rpx mt-34rpx">3,662.46</view> <view class="font-bold text-32rpx text-[#303133] leading-34rpx mt-34rpx">{{ user.user_store_money || 0 }}</view>
</view> </view>
</view> </view>
@ -57,10 +56,10 @@
<view class="absolute top-24rpx left-40rpx"> <view class="absolute top-24rpx left-40rpx">
<view class="">消费金额</view> <view class="">消费金额</view>
<view class="mt-22rpx"> <view class="mt-22rpx">
<price-format color="#FF5951" :first-size="34" :second-size="34" :subscript-size="34" :price="23.02"></price-format> <price-format color="#FF5951" :first-size="34" :second-size="34" :subscript-size="34" :price="user.order_amount"></price-format>
</view> </view>
<view <view
@click="router.navigateTo('/bundle/user/bill-detail')" @click="router.navigateTo(`/bundle/user/bill-detail?userId=${user.id}`)"
class="bg-[#3C7FFF] w-124rpx h-48rpx rounded-24rpx text-[#fff] text-center leading-48rpx text-28rpx font-bold mt-12rpx"> class="bg-[#3C7FFF] w-124rpx h-48rpx rounded-24rpx text-[#fff] text-center leading-48rpx text-28rpx font-bold mt-12rpx">
去查看 去查看
</view> </view>
@ -71,7 +70,7 @@
<wd-gap height="2rpx" bg-color="#E5E5E5"></wd-gap> <wd-gap height="2rpx" bg-color="#E5E5E5"></wd-gap>
</view> </view>
<view class="font-400 text-26rpx text-[#9CA3AF] leading-36rpx">注册日期2025-04-23</view> <view class="font-400 text-26rpx text-[#9CA3AF] leading-36rpx">注册日期{{ user.create_time.split(' ')[0] }}</view>
</view> </view>
</view> </view>
@ -88,7 +87,7 @@
custom-textarea-class='!bg-[#F8F9FA] !h-100rpx' :maxlength='30' show-word-limit /> custom-textarea-class='!bg-[#F8F9FA] !h-100rpx' :maxlength='30' show-word-limit />
</view> </view>
<view class="bg-[#4C9F44] rounded-8rpx text-[#fff] w-626rpx h-90rpx text-center leading-90rpx mt-52rpx">修改备注</view> <view class="bg-[#4C9F44] rounded-8rpx text-[#fff] w-626rpx h-90rpx text-center leading-90rpx mt-52rpx" @click="UserDetail.handleEditUserRemark(user.store_user_id)">修改备注</view>
</view> </view>
</view> </view>
</view> </view>
@ -98,20 +97,73 @@
<script lang="ts" setup> <script lang="ts" setup>
import { toTimes, copy } from '@/utils/tools' import { toTimes, copy } from '@/utils/tools'
import { router } from '@/utils/tools' import { router } from '@/utils/tools'
import { getStoreMemberDetails, editStoreMemberMark } from '@/api/store'
import { useStoreStore } from '@/store'
import { toast } from '@/utils/toast'
const OSS = inject('OSS') const OSS = inject('OSS')
const useStore = useStoreStore()
// ID
const id = ref<number>(0)
const mark = ref<string>('') const mark = ref<string>('')
const user = ref<any>({
avatar: '',
nickname: '',
mobile: '',
member: 0,
expiration_time: '',
order_amount: 0,
store_user_id: 0,
create_time: ''
})
onLoad((args) => { onLoad(async (args) => {
id.value = Number(args.id) || 0
await UserDetail.handleGetStoreMemberDetails()
}) })
const UserList = { const UserDetail = {
// 打电话 /**
* 获取用户详情
*/
handleGetStoreMemberDetails: async () => {
const res = await getStoreMemberDetails(useStore.defaultStore.id, id.value)
user.value = res.user || {}
mark.value = res.user?.remark || ''
},
/**
* 打电话
* @param phone
*/
handleCall: (phone) => { handleCall: (phone) => {
uni.makePhoneCall({ uni.makePhoneCall({
phoneNumber: phone phoneNumber: phone
}) })
},
/**
* 修改用户备注
*/
handleEditUserRemark: async (id) => {
if (!mark.value.trim()) {
toast.info('请输入备注内容')
return
}
uni.showLoading({
title: '修改中...'
})
try {
await editStoreMemberMark(id, mark.value)
uni.hideLoading()
toast.info('修改成功')
uni.$emit('refreshUserDetail')
} catch (error) {
uni.hideLoading()
}
} }
} }
</script> </script>

View File

@ -14,23 +14,23 @@
<view> <view>
<mescroll-body ref="mescrollItem0" @init="mescrollInit" @down="downCallback" @up="UserList.upCallback" :down="downOption" :up="upOption"> <mescroll-body ref="mescrollItem0" @init="mescrollInit" @down="downCallback" @up="UserList.upCallback" :down="downOption" :up="upOption">
<view class="mb-22rpx"> <view class="mb-22rpx" v-for="item in list" :key="item.id">
<view class="mx-64rpx flex justify-between items-center mb-10rpx"> <view class="mx-64rpx flex justify-between items-center mb-10rpx">
<view class="flex items-center" @click="router.navigateTo('/bundle/user/user-detail')"> <view class="flex items-center" @click="UserList.handleToDetail(item?.user?.id)">
<wd-img width="100rpx" height='100rpx' src="https://shchazhi.oss-cn-hangzhou.aliyuncs.com/fronted/icon/icon_avatar.png" :round="true"></wd-img> <wd-img width="100rpx" height='100rpx' src="https://shchazhi.oss-cn-hangzhou.aliyuncs.com/fronted/icon/icon_avatar.png" :round="true"></wd-img>
<view class="ml-20rpx"> <view class="ml-20rpx">
<view class="flex items-center"> <view class="flex items-center">
<view class="font-bold text-28rpx text-[#303133] leading-40rpx mr-12rpx">用户昵称</view> <view class="font-bold text-28rpx text-[#303133] leading-40rpx mr-12rpx">{{ item?.user?.nickname }}</view>
<!-- TODO 如果是vip的话才显示这个皇冠 --> <!-- TODO 如果是vip的话才显示这个皇冠 -->
<view> <view v-if="item?.user?.member == 1">
<wd-img width="40rpx" height='40rpx' :src="`${OSS}icon/icon_crown.png`"></wd-img> <wd-img width="40rpx" height='40rpx' :src="`${OSS}icon/icon_crown.png`"></wd-img>
</view> </view>
</view> </view>
<view class="mt-14rpx font-400 text-26rpx text-[#303133] leading-36rpx">13525626532</view> <view class="mt-14rpx font-400 text-26rpx text-[#303133] leading-36rpx">{{ item?.user?.mobile }}</view>
<view class="mt-10rpx text-24rpx text-[#F29747] leading-34rpx w-400rpx line-1">这里是备注信息备注信息这里是备注信息备注信息</view> <view class="mt-10rpx text-24rpx text-[#F29747] leading-34rpx w-400rpx line-1">{{ item?.remark }}</view>
</view> </view>
</view> </view>
<view @click="UserList.handleCall"> <view @click="UserList.handleCall(item?.user?.mobile)" class="p-10rpx">
<wd-img width="64rpx" height='64rpx' :src="`${OSS}icon/icon_phone3.png`"></wd-img> <wd-img width="64rpx" height='64rpx' :src="`${OSS}icon/icon_phone3.png`"></wd-img>
</view> </view>
</view> </view>
@ -48,8 +48,13 @@
<script lang="ts" setup> <script lang="ts" setup>
import { router } from '@/utils/tools' import { router } from '@/utils/tools'
import { toTimes, copy } from '@/utils/tools' import { toTimes, copy } from '@/utils/tools'
import { getStoreMemberList } from '@/api/store'
import { onPageScroll, onReachBottom } from '@dcloudio/uni-app' import { onPageScroll, onReachBottom } from '@dcloudio/uni-app'
import useMescroll from "@/uni_modules/mescroll-uni/hooks/useMescroll.js" import useMescroll from "@/uni_modules/mescroll-uni/hooks/useMescroll.js"
import { useStoreStore } from '@/store'
const OSS = inject('OSS')
const useStore = useStoreStore()
// mescroll // mescroll
const { mescrollInit, downCallback, getMescroll } = useMescroll(onPageScroll, onReachBottom) // 调用mescroll的hook const { mescrollInit, downCallback, getMescroll } = useMescroll(onPageScroll, onReachBottom) // 调用mescroll的hook
@ -62,7 +67,6 @@
} }
const list = ref<Array<any>>([]) // 茶室列表 const list = ref<Array<any>>([]) // 茶室列表
const OSS = inject('OSS')
onLoad((args) => { onLoad((args) => {
}) })
@ -74,16 +78,36 @@
*/ */
upCallback: (mescroll) => { upCallback: (mescroll) => {
// 需要留一下数据为空的时候显示的空数据图标内容 // 需要留一下数据为空的时候显示的空数据图标内容
// getTeaRoomOrderList(filter).then((res) => { const filter = {
// const curPageData = res.list || [] // 当前页数据 page: mescroll.num,
// if(mescroll.num == 1) list.value = [] // 第一页需手动制空列表 size: mescroll.size,
// list.value = list.value.concat(curPageData) //追加新数据 store_id: useStore.defaultStore.id,
// mescroll.endSuccess(curPageData.length, Boolean(res.more)) }
// }).catch(() => {
getStoreMemberList(filter).then((res) => {
const curPageData = res.list || [] // 当前页数据
if(mescroll.num == 1) list.value = [] // 第一页需手动制空列表
list.value = list.value.concat(curPageData) //追加新数据
mescroll.endSuccess(curPageData.length, Boolean(res.more))
}).catch(() => {
mescroll.endErr() // 请求失败, 结束加载 mescroll.endErr() // 请求失败, 结束加载
// }) })
}, },
/**
* 跳转用户详情
* @param id
*/
handleToDetail: (id) => {
uni.$on('refreshUserDetail', () => {
uni.$off('refreshUserDetail')
list.value = []
getMescroll().resetUpScroll()
})
router.navigateTo(`/bundle/user/user-detail?id=${id}`)
},
/** /**
* 电话 * 电话
* @param phone * @param phone

View File

@ -30,7 +30,7 @@
<view class="flex flex-col justify-center items-center absolute top-42rpx left-46rpx"> <view class="flex flex-col justify-center items-center absolute top-42rpx left-46rpx">
<view class="font-400 text-26rpx text-[#825F37] leading-36rpx">本月收入</view> <view class="font-400 text-26rpx text-[#825F37] leading-36rpx">本月收入</view>
<view class="mt-42rpx"> <view class="mt-42rpx">
<price-format color="#825F37" :first-size="36" :second-size="36" :subscript-size="24" :price="23.02"></price-format> <price-format color="#825F37" :first-size="36" :second-size="36" :subscript-size="24" :price="statistics.month"></price-format>
</view> </view>
</view> </view>
@ -42,18 +42,18 @@
<view class="flex flex-col justify-center items-center absolute top-42rpx left-208rpx"> <view class="flex flex-col justify-center items-center absolute top-42rpx left-208rpx">
<view class="font-400 text-26rpx text-[#825F37] leading-36rpx">下单金额</view> <view class="font-400 text-26rpx text-[#825F37] leading-36rpx">下单金额</view>
<view class="mt-26rpx"> <view class="mt-26rpx">
<price-format color="#825F37" :first-size="36" :second-size="36" :subscript-size="24" :price="23.02"></price-format> <price-format color="#825F37" :first-size="36" :second-size="36" :subscript-size="24" :price="statistics.today_price"></price-format>
</view> </view>
<view class="font-400 text-24rpx text-[#825F37] leading-34rpx mt-10rpx">昨日223</view> <view class="font-400 text-24rpx text-[#825F37] leading-34rpx mt-10rpx">昨日{{ statistics.yesterday_price }}</view>
</view> </view>
<!-- 核销金额 --> <!-- 核销金额 -->
<view class="flex flex-col justify-center items-center absolute top-42rpx left-368rpx"> <view class="flex flex-col justify-center items-center absolute top-42rpx left-368rpx">
<view class="font-400 text-26rpx text-[#825F37] leading-36rpx">核销金额</view> <view class="font-400 text-26rpx text-[#825F37] leading-36rpx">核销金额</view>
<view class="mt-26rpx"> <view class="mt-26rpx">
<price-format color="#825F37" :first-size="36" :second-size="36" :subscript-size="24" :price="23.02"></price-format> <price-format color="#825F37" :first-size="36" :second-size="36" :subscript-size="24" :price="statistics.yan_price"></price-format>
</view> </view>
<view class="font-400 text-24rpx text-[#825F37] leading-34rpx mt-10rpx">昨日223</view> <view class="font-400 text-24rpx text-[#825F37] leading-34rpx mt-10rpx">昨日{{ statistics.yesterday_yan_price }}</view>
</view> </view>
</view> </view>
@ -125,7 +125,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { router } from '@/utils/tools' import { router } from '@/utils/tools'
import { getStoreList, getStoreDetails } from '@/api/store' import { getStoreList, getStoreDetails, getStoreStatistics } from '@/api/store'
import { useStoreStore } from '@/store' import { useStoreStore } from '@/store'
const OSS = inject('OSS') const OSS = inject('OSS')
@ -154,6 +154,13 @@
index: 0 index: 0
}) })
const store = ref<any>({}) const store = ref<any>({})
const statistics = ref({
month: 0, // 本月数据
today_price: 0, // 今日收入
yan_price: 0, // 验券
yesterday_price: 0, // 昨日收入
yesterday_yan_price: 0 // 昨日验券
})
onShow(() => { onShow(() => {
// 初始化页面数据 // 初始化页面数据
@ -168,6 +175,7 @@
handleInit: async() => { handleInit: async() => {
await Index.handleGetStoreList() await Index.handleGetStoreList()
await Index.handleGetStoreDetails() await Index.handleGetStoreDetails()
await Index.handleGetStoreStatistics()
}, },
/** /**
@ -201,6 +209,16 @@
store.value = storeDetails.details store.value = storeDetails.details
}, },
/**
* 获取门店统计数据
*/
handleGetStoreStatistics: async() => {
if (!defaultStore.value) return
const res = await getStoreStatistics(useStore.defaultStore.id)
statistics.value = res.result
console.log("🚀 ~ statistics:", statistics)
},
/** /**
* 选择扫码验券菜单 * 选择扫码验券菜单
*/ */

View File

@ -125,7 +125,6 @@
router.navigateTo(`/pages/search/search?keywords=${keywords.value}`) router.navigateTo(`/pages/search/search?keywords=${keywords.value}`)
}, },
/** /**
* 重置搜索 * 重置搜索
*/ */
@ -134,8 +133,10 @@
getMescroll().resetUpScroll() getMescroll().resetUpScroll()
}, },
/**
// 切换tab * 切换tab
* @param e
*/
handleChangeTabs: (e: {index: number, name: string}) => { handleChangeTabs: (e: {index: number, name: string}) => {
tab.value = e.name tab.value = e.name
if (e.name === AdminOrderStatusText.Pending) { if (e.name === AdminOrderStatusText.Pending) {