Merge branch 'test'
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2024-09-06 21:39:40 +08:00
9 changed files with 5127 additions and 1713 deletions

6388
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -68,7 +68,7 @@ const tabs = [
const count = ref(tabs.map((item) => item.messages).flat().length) const count = ref(tabs.map((item) => item.messages).flat().length)
watch(activeTab, (v) => { watch(activeTab, (v) => {
if (count === 0) return if (count.value === 0) return
const tabIndex = tabs.findIndex((item) => item.name === v) const tabIndex = tabs.findIndex((item) => item.name === v)
count.value -= tabs[tabIndex].messages.length count.value -= tabs[tabIndex].messages.length
if (count.value < 0) count.value = 0 if (count.value < 0) count.value = 0

View File

@@ -173,6 +173,17 @@
:min="0" :min="0"
/> />
</n-form-item-gi> </n-form-item-gi>
<n-form-item-gi :span="20" label="商品抵扣比例" path="discount">
<n-input-number
v-model:value="nowRow.discount"
clearable
placeholder="请输入抵扣比例...."
:min="0"
:precision="0"
>
<template #suffix>%</template>
</n-input-number>
</n-form-item-gi>
<n-form-item-gi :span="20" label="豆子过期时间" path="expiration"> <n-form-item-gi :span="20" label="豆子过期时间" path="expiration">
<n-input-number <n-input-number
v-model:value="nowRow.expiration" v-model:value="nowRow.expiration"
@@ -323,6 +334,12 @@ const rules = {
message: '请输入分佣比例', message: '请输入分佣比例',
trigger: 'blur', trigger: 'blur',
}, },
discount: {
required: true,
type: 'number',
message: '请输入抵扣比例',
trigger: 'blur',
},
} }
const nowRow = ref({}) const nowRow = ref({})
@@ -426,6 +443,21 @@ const columns = ref([
key: 'number', key: 'number',
align: 'center', align: 'center',
}, },
{
title: '抵扣后价格(元)',
key: 'discount_price',
align: 'center',
},
{
title: '积分抵扣(元)',
key: 'exchange',
align: 'center',
},
{
title: '抵扣比例(%',
key: 'discount',
align: 'center',
},
{ {
title: '商品库存', title: '商品库存',
key: 'stock', key: 'stock',

View File

@@ -7,4 +7,8 @@ export default {
getYdata: (data) => request.post('/store/amount/withdraw', data), getYdata: (data) => request.post('/store/amount/withdraw', data),
ydataEdit: (data) => request.post('/store/amount/withdraw/edit', data), ydataEdit: (data) => request.post('/store/amount/withdraw/edit', data),
// 溯源统计
suyuanData: (data) => request.post('/pulse/count', data),
// 获取游戏大厅
getGameData: (data) => request.post('/game/list', data),
} }

View File

@@ -8,7 +8,7 @@
<n-number-animation <n-number-animation
ref="numberAnimationInstRef" ref="numberAnimationInstRef"
:from="0" :from="0"
:to="cardData.total / 100" :to="cardData.total"
:precision="2" :precision="2"
/> />
</n-statistic> </n-statistic>
@@ -28,18 +28,14 @@
<n-number-animation <n-number-animation
ref="numberAnimationInstRef" ref="numberAnimationInstRef"
:from="0" :from="0"
:to="cardData.service / 100" :to="cardData.service"
:precision="2" :precision="2"
/> />
</n-statistic> </n-statistic>
</n-card> </n-card>
<n-card ml-10 w-400> <n-card ml-10 w-400>
<n-statistic label="已审核金额" tabular-nums> <n-statistic label="已审核金额" tabular-nums>
<n-number-animation <n-number-animation ref="numberAnimationInstRef" :from="0" :to="cardData.count" />
ref="numberAnimationInstRef"
:from="0"
:to="cardData.count / 100"
/>
</n-statistic> </n-statistic>
</n-card> </n-card>
</div> </div>
@@ -205,7 +201,7 @@ const columns = ref([
align: 'center', align: 'center',
}, },
{ {
title: '上次留存积分', title: '上次留存余额',
key: 'balance', key: 'balance',
align: 'center', align: 'center',
}, },

View File

@@ -0,0 +1,279 @@
<template>
<CommonPage show-footer :title="$route.title">
<n-grid class="mb-10" x-gap="12">
<n-gi :span="24">
<div flex>
<n-card w-250>
<n-statistic label="总赢积分" tabular-nums>
<n-number-animation ref="numberAnimationInstRef" :from="0" :to="cardData.win" />
</n-statistic>
</n-card>
<n-card ml-10 w-250>
<n-statistic label="总豆子" tabular-nums>
<n-number-animation ref="numberAnimationInstRef" :from="0" :to="cardData.pulse" />
</n-statistic>
</n-card>
</div>
</n-gi>
<n-gi :span="12">
<div mt-10 flex items-center>
<div w-100>筛选条件:</div>
<n-input-group>
<n-select
v-model:value="queryParams.selectKey"
:style="{ width: '30rem' }"
:options="selectOptions"
placeholder="请选择"
/>
<n-input v-model:value="queryParams.word" :style="{ width: '50rem' }" />
</n-input-group>
</div>
</n-gi>
<n-gi :span="24">
<div mt-10 flex items-center>
<div mr-10>游戏名称:</div>
<n-select
v-model:value="queryParams.hall_id"
w-250
:options="gamelist"
placeholder="请选择游戏"
/>
</div>
</n-gi>
<n-gi :span="24" mt-10>
<div>
<span>豆子状态</span>
<n-radio-group v-model:value="queryParams.Status">
<n-radio-button
v-for="song in songs"
:key="song.value"
:value="song.value"
:label="song.label"
/>
</n-radio-group>
</div>
</n-gi>
<n-gi :span="24" mt-10>
<div>
<span>活动赠送</span>
<n-radio-group v-model:value="queryParams.Type">
<n-radio-button
v-for="song in songs1"
:key="song.value"
:value="song.value"
:label="song.label"
/>
</n-radio-group>
</div>
</n-gi>
<n-gi :span="24">
<div mt-10 flex items-center>
<div>时间筛选</div>
<n-date-picker
v-model:formatted-value="queryParams.time"
value-format="yyyy-MM-dd HH:mm:ss"
type="datetimerange"
clearable
/>
</div>
</n-gi>
<n-gi span="24" mt-10 flex items-center>
<n-button type="primary" @click="getList">查询</n-button>
<n-button ml-10 @click="clear">重置</n-button>
</n-gi>
</n-grid>
<n-data-table
class="mt-10"
:loading="loading"
:columns="columns"
:data="data"
:pagination="pagination"
:bordered="false"
remote
/>
</CommonPage>
</template>
<script setup>
import api from './api'
import dayjs from 'dayjs'
const queryParams = ref({})
const cardData = ref({})
const selectOptions = [
{
label: '商家电话',
value: 0,
},
{
label: '用户电话',
value: 1,
},
]
const songs = ref([
{
value: 1,
label: '未使用',
},
{
value: 3,
label: '用户赢',
},
{
value: 4,
label: '用户输',
},
{
value: 5,
label: '已过期',
},
])
const gamelist = ref([])
const songs1 = ref([
{
value: 5,
label: '注册赠送',
},
{
value: 6,
label: '签到赠送',
},
{
value: 7,
label: '平台赠送',
},
])
const loading = ref(false)
const columns = ref([
{
title: '游戏名称',
align: 'center',
slot: 'game_name',
render: (row) => {
const res = gamelist.value.find((item) => item.value === row.hall_id)
return h('span', null, {
default: () => res?.label || '',
})
},
},
{
title: '订单ID',
align: 'center',
key: 'order_id',
},
{
title: '期数',
align: 'center',
key: 'periods',
},
{
title: '投注豆子',
align: 'center',
key: 'number',
},
{
title: '赢积分',
align: 'center',
key: 'integral',
},
{
title: '用户电话',
align: 'center',
key: 'user_phone',
},
{
title: '商户电话',
align: 'center',
key: 'merchant_phone',
},
{
title: '投注时间',
align: 'center',
key: 'add_time',
},
{
title: '过期时间',
align: 'center',
slot: 'expire',
render: (row) => {
return h('span', null, {
default: () => dayjs(row.expire).format('YYYY-MM-DD HH:mm:ss'),
})
},
},
])
const data = ref([])
const pagination = ref({
page: 1,
pageSize: 10,
itemCount: 0,
onChange: (page) => {
pagination.value.page = page
getList()
},
})
onMounted(() => {
getList()
getGameList()
})
const getGameList = async () => {
const res = await api.getGameData({ pageSize: 9999999, pageNum: 1 })
gamelist.value = res.data.data.map((item) => ({ value: item.ID, label: item.name }))
}
const getList = async () => {
loading.value = true
const query_data = {
...queryParams.value,
StartTime: queryParams.value.time?.[0] || '',
EndTime: queryParams.value.time?.[1] || '',
}
switch (queryParams.value.selectKey) {
case 0:
query_data['merchant_phone'] = queryParams.value.word
break
case 1:
query_data['user_phone'] = queryParams.value.word
break
}
delete query_data.time
delete query_data.word
const res = await api.suyuanData({
pageNum: pagination.value.page,
pageSize: pagination.value.pageSize,
...query_data,
})
data.value = res.data.result || []
pagination.value.itemCount = res.data.count
cardData.value.win = res.data.win
cardData.value.pulse = res.data.pulse
loading.value = false
}
const clear = () => {
queryParams.value = {
word: '',
selectKey: null,
Status: '',
time: null,
Type: '',
hall_id: '',
}
getList()
}
</script>
<style lang="scss" scoped></style>

View File

@@ -45,11 +45,11 @@
<n-radio-button <n-radio-button
v-for="song in [ v-for="song in [
{ {
label: '微信', label: '微信支付',
value: 1, value: 1,
}, },
{ {
label: '积分', label: '平台积分',
value: 2, value: 2,
}, },
{ {
@@ -98,13 +98,14 @@
</n-col> </n-col>
</n-row> </n-row>
<n-data-table <n-data-table
ref="dataTableRef"
class="mt-5" class="mt-5"
:loading="loading" :loading="loading"
:columns="columns" :columns="columns"
:data="data" :data="data"
:pagination="pagination" :pagination="pagination"
:bordered="false" :bordered="false"
:scroll-x="1800" :scroll-x="2000"
remote remote
/> />
</CommonPage> </CommonPage>
@@ -244,10 +245,20 @@ const columns = ref([
key: 'count', key: 'count',
}, },
{ {
title: '订单总价', title: '订单金额',
align: 'center', align: 'center',
slot: 'number', slot: 'number',
render: (row) => h('span', row.pay_type === 1 ? `${row.price}元` : `${row.exchange}积分`), render: (row) => h('span', `${row.price}元`),
},
{
title: '抵扣后价格(元)',
key: 'discount_price',
align: 'center',
},
{
title: '积分抵扣',
key: 'exchange',
align: 'center',
}, },
{ {
title: '支付方式', title: '支付方式',
@@ -325,8 +336,13 @@ const pagination = ref({
onMounted(() => { onMounted(() => {
getList() getList()
}) })
const dataTableRef = ref(null)
const exportTable = () => { const exportTable = () => {
// console.log(dataTableRef.value)
// dataTableRef.value?.downloadCsv({
// fileName: new Date().getTime() + '.csv',
// keepOriginalData: false,
// })
// 将数据转换为工作簿 // 将数据转换为工作簿
const worksheet = XLSX.utils.json_to_sheet(data.value) const worksheet = XLSX.utils.json_to_sheet(data.value)
const workbook = XLSX.utils.book_new() const workbook = XLSX.utils.book_new()

View File

@@ -0,0 +1,7 @@
<template>
<CommonPage show-footer :title="$route.title"></CommonPage>
</template>
<script setup></script>
<style lang="scss" scoped></style>

View File

@@ -3,21 +3,21 @@
<n-grid class="mb-10" x-gap="12"> <n-grid class="mb-10" x-gap="12">
<n-gi :span="24"> <n-gi :span="24">
<div flex> <div flex>
<n-card w-250> <!-- <n-card w-250>
<n-statistic label="用户总赢积分" tabular-nums> <n-statistic label="用户总赢积分" tabular-nums>
<n-number-animation ref="numberAnimationInstRef" :from="0" :to="cardData.win" /> <n-number-animation ref="numberAnimationInstRef" :from="0" :to="cardData.win" />
</n-statistic> </n-statistic>
</n-card> </n-card> -->
<n-card ml-10 w-250> <n-card w-250>
<n-statistic label="用户积分(留存)" tabular-nums> <n-statistic label="用户积分(留存)" tabular-nums>
<n-number-animation ref="numberAnimationInstRef" :from="0" :to="cardData.integral" /> <n-number-animation ref="numberAnimationInstRef" :from="0" :to="cardData.integral" />
</n-statistic> </n-statistic>
</n-card> </n-card>
<n-card ml-10 w-250> <!-- <n-card ml-10 w-250>
<n-statistic label="总豆子" tabular-nums> <n-statistic label="总豆子" tabular-nums>
<n-number-animation ref="numberAnimationInstRef" :from="0" :to="cardData.pulse" /> <n-number-animation ref="numberAnimationInstRef" :from="0" :to="cardData.pulse" />
</n-statistic> </n-statistic>
</n-card> </n-card> -->
<n-card ml-10 w-250> <n-card ml-10 w-250>
<n-statistic label="今日新增用户" tabular-nums> <n-statistic label="今日新增用户" tabular-nums>
<n-number-animation <n-number-animation
@@ -27,7 +27,7 @@
/> />
</n-statistic> </n-statistic>
</n-card> </n-card>
<n-card ml-10 w-250> <!-- <n-card ml-10 w-250>
<n-statistic label="用户总流水(元)" tabular-nums> <n-statistic label="用户总流水(元)" tabular-nums>
<n-number-animation <n-number-animation
ref="numberAnimationInstRef" ref="numberAnimationInstRef"
@@ -36,8 +36,8 @@
:precision="2" :precision="2"
/> />
</n-statistic> </n-statistic>
</n-card> </n-card> -->
<n-card ml-10 w-250> <!-- <n-card ml-10 w-250>
<n-statistic label="总佣金(积分)" tabular-nums> <n-statistic label="总佣金(积分)" tabular-nums>
<n-number-animation <n-number-animation
ref="numberAnimationInstRef" ref="numberAnimationInstRef"
@@ -46,7 +46,7 @@
:precision="2" :precision="2"
/> />
</n-statistic> </n-statistic>
</n-card> </n-card> -->
<n-card ml-10 w-250> <n-card ml-10 w-250>
<n-statistic label="平台总用户" tabular-nums> <n-statistic label="平台总用户" tabular-nums>
<n-number-animation <n-number-animation
@@ -58,7 +58,7 @@
</n-card> </n-card>
</div> </div>
</n-gi> </n-gi>
<n-gi span="12" mt-10 flex items-center> <n-gi :span="12" mt-10 flex items-center>
<span w-100>筛选条件:</span> <span w-100>筛选条件:</span>
<n-input-group> <n-input-group>
<n-select <n-select
@@ -70,7 +70,7 @@
<n-input v-model:value="queryParams.word" :style="{ width: '30%' }" /> <n-input v-model:value="queryParams.word" :style="{ width: '30%' }" />
</n-input-group> </n-input-group>
</n-gi> </n-gi>
<n-gi :span="24" mt-10> <!-- <n-gi :span="24" mt-10>
<div> <div>
<span>筛选状态</span> <span>筛选状态</span>
<n-radio-group v-model:value="queryParams.status"> <n-radio-group v-model:value="queryParams.status">
@@ -95,8 +95,8 @@
/> />
</n-radio-group> </n-radio-group>
</div> </div>
</n-gi> </n-gi> -->
<n-gi :span="10"> <n-gi :span="24">
<div mt-10 flex items-center> <div mt-10 flex items-center>
<span w-100>时间筛选</span> <span w-100>时间筛选</span>
<n-date-picker <n-date-picker
@@ -279,40 +279,6 @@ const cardData = ref({
win: 0, win: 0,
}) })
const songs = ref([
{
value: 1,
label: '未使用',
},
{
value: 3,
label: '用户赢',
},
{
value: 4,
label: '用户输',
},
{
value: 5,
label: '已过期',
},
])
const songs1 = ref([
{
value: 5,
label: '注册赠送',
},
{
value: 6,
label: '签到赠送',
},
{
value: 7,
label: '主动赠送',
},
])
const selectOptions = [ const selectOptions = [
{ {
label: '用户昵称', label: '用户昵称',
@@ -364,20 +330,20 @@ const columns = ref([
sorter: true, sorter: true,
sortOrder: false, sortOrder: false,
}, },
{ // {
title: '赢积分', // title: '赢积分',
align: 'center', // align: 'center',
key: 'win', // key: 'win',
sorter: true, // sorter: true,
sortOrder: false, // sortOrder: false,
}, // },
{ // {
title: '用户豆子', // title: '用户豆子',
align: 'center', // align: 'center',
key: 'pulse', // key: 'pulse',
sorter: true, // sorter: true,
sortOrder: false, // sortOrder: false,
}, // },
{ {
title: '用户状态', title: '用户状态',
align: 'center', align: 'center',