Browse Source

fix:充值审核-筛选条件改变时合计数不变,充值审核-审核通过或驳回后合计数不能及时刷新 添加金币消耗卡片问题

milestone-20250623-金币前端
lihui 7 hours ago
parent
commit
f64fc6118f
  1. 122
      src/views/audit/rechargeAudit.vue
  2. 22
      src/views/consume/addCoinConsume.vue

122
src/views/audit/rechargeAudit.vue

@ -6,25 +6,25 @@
<el-row style="margin-bottom: 5px"> <el-row style="margin-bottom: 5px">
<el-col :span="6"> <el-col :span="6">
<el-text size="large">精网号</el-text> <el-text size="large">精网号</el-text>
<el-input v-model="rechargeAudit.jwcode" placeholder="请输入精网号" style="width: 240px" clearable />
<el-input v-model="rechargeAudit.jwcode" placeholder="请输入精网号" style="width: 240px" clearable/>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-text size="large">活动名称</el-text> <el-text size="large">活动名称</el-text>
<el-select v-model="rechargeAudit.activity" placeholder="请选择活动名称" style="width: 240px" clearable> <el-select v-model="rechargeAudit.activity" placeholder="请选择活动名称" style="width: 240px" clearable>
<el-option v-for="item in activity" :key="item" :label="item" :value="item" />
<el-option v-for="item in activity" :key="item" :label="item" :value="item"/>
</el-select> </el-select>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-text size="large">充值方式</el-text> <el-text size="large">充值方式</el-text>
<el-select v-model="rechargeAudit.payModel" placeholder="请选择充值方式" style="width: 240px" clearable> <el-select v-model="rechargeAudit.payModel" placeholder="请选择充值方式" style="width: 240px" clearable>
<el-option v-for="item in payModel" :key="item.value" :label="item.label" :value="item.value" />
<el-option v-for="item in payModel" :key="item.value" :label="item.label" :value="item.value"/>
</el-select> </el-select>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<div class="head-card-element"> <div class="head-card-element">
<el-text size="large">所属地区</el-text> <el-text size="large">所属地区</el-text>
<el-select v-model="rechargeAudit.market" placeholder="请选择所属地区" style="width: 240px" clearable> <el-select v-model="rechargeAudit.market" placeholder="请选择所属地区" style="width: 240px" clearable>
<el-option v-for="item in market" :key="item" :label="item" :value="item" />
<el-option v-for="item in market" :key="item" :label="item" :value="item"/>
</el-select> </el-select>
</div> </div>
</el-col> </el-col>
@ -35,7 +35,7 @@
<div class="time-group"> <div class="time-group">
<el-text size="large">充值时间</el-text> <el-text size="large">充值时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间" <el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="width: 400px" />
end-placeholder="结束时间" style="width: 400px"/>
<el-button @click="getToday()" style="margin-left: 10px"> </el-button> <el-button @click="getToday()" style="margin-left: 10px"> </el-button>
<el-button @click="getYesterday()" style="margin-left: 10px"> </el-button> <el-button @click="getYesterday()" style="margin-left: 10px"> </el-button>
<el-button @click="get7Days()" style="margin-left: 10px"> 近7天</el-button> <el-button @click="get7Days()" style="margin-left: 10px"> 近7天</el-button>
@ -47,7 +47,7 @@
</el-col> </el-col>
</el-row> </el-row>
</el-card> </el-card>
</el-col> </el-col>
@ -65,23 +65,23 @@
退款总金币数{{ (stats.permanentGolds + stats.freeGolds + stats.taskGolds).toFixed(2) }}金币&nbsp;&nbsp;&nbsp;&nbsp; 退款总金币数{{ (stats.permanentGolds + stats.freeGolds + stats.taskGolds).toFixed(2) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ stats.permanentGolds.toFixed(2) }}金币&nbsp;&nbsp;&nbsp;&nbsp; 永久金币{{ stats.permanentGolds.toFixed(2) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ stats.freeGolds.toFixed(2) }}金币&nbsp;&nbsp;&nbsp;&nbsp; 免费金币{{ stats.freeGolds.toFixed(2) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
<!-- 任务金币{{ stats.taskGolds.toFixed(2) }}金币-->
<!-- 任务金币{{ stats.taskGolds.toFixed(2) }}金币-->
</div> </div>
</el-tabs> </el-tabs>
<!--表格--> <!--表格-->
<div style="height: 540px; overflow-y: auto"> <div style="height: 540px; overflow-y: auto">
<el-table :data="tableData" style="width: 100%" height="540px" @sort-change="handleSortChange" <el-table :data="tableData" style="width: 100%" height="540px" @sort-change="handleSortChange"
:row-style="{ height: '50px' }">
:row-style="{ height: '50px' }">
<el-table-column type="index" label="序号" width="100px" fixed="left"> <el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope"> <template #default="scope">
<span>{{ scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize }}</span> <span>{{ scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column fixed="left" prop="name" label="姓名" width="150px" />
<el-table-column fixed="left" prop="jwcode" label="精网号" width="110px" />
<el-table-column prop="market" label="所属地区" width="100px" />
<el-table-column prop="activity" label="活动名称" width="100px" show-overflow-tooltip />
<el-table-column fixed="left" prop="name" label="姓名" width="150px"/>
<el-table-column fixed="left" prop="jwcode" label="精网号" width="110px"/>
<el-table-column prop="market" label="所属地区" width="100px"/>
<el-table-column prop="activity" label="活动名称" width="100px" show-overflow-tooltip/>
<el-table-column prop="money" label="充值金额" sortable="custom" width="110px"> <el-table-column prop="money" label="充值金额" sortable="custom" width="110px">
<template #default="scope">{{ scope.row.permanentGold / 100 }}</template> <template #default="scope">{{ scope.row.permanentGold / 100 }}</template>
</el-table-column> </el-table-column>
@ -91,9 +91,9 @@
<el-table-column prop="freeGold" label="免费金币" sortable="custom" width="110px"> <el-table-column prop="freeGold" label="免费金币" sortable="custom" width="110px">
<template #default="scope">{{ (scope.row.freeGold) / 100 }}</template> <template #default="scope">{{ (scope.row.freeGold) / 100 }}</template>
</el-table-column> </el-table-column>
<el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip />
<el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip/>
<el-table-column prop="payModel" label="支付方式" width="110px" />
<el-table-column prop="payModel" label="支付方式" width="110px"/>
<el-table-column prop="voucher" label="支付凭证" width="110px"> <el-table-column prop="voucher" label="支付凭证" width="110px">
<template #default="scope"> <template #default="scope">
<div v-if="scope.row.voucher" style="cursor: pointer;" @click="previewImage(scope.row.voucher)"> <div v-if="scope.row.voucher" style="cursor: pointer;" @click="previewImage(scope.row.voucher)">
@ -102,10 +102,10 @@
<div v-else>--</div> <div v-else>--</div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="adminName" label="提交人" width="100px" />
<el-table-column prop="adminName" label="提交人" width="100px"/>
<el-table-column prop="rejectReason" v-if="activeName === 'reject'" label="驳回理由" width="200px" <el-table-column prop="rejectReason" v-if="activeName === 'reject'" label="驳回理由" width="200px"
show-overflow-tooltip />
<el-table-column v-if="activeName !== 'wait'" prop="auditName" label="审核人" width="100px" />
show-overflow-tooltip/>
<el-table-column v-if="activeName !== 'wait'" prop="auditName" label="审核人" width="100px"/>
<el-table-column prop="payTime" sortable="custom" label="付款时间" width="200px"> <el-table-column prop="payTime" sortable="custom" label="付款时间" width="200px">
<template #default="scope"> <template #default="scope">
{{ moment(scope.row.payTime).format('YYYY-MM-DD HH:mm:ss') }} {{ moment(scope.row.payTime).format('YYYY-MM-DD HH:mm:ss') }}
@ -127,13 +127,13 @@
<el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)"> <el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)">
<template #reference> <template #reference>
<el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2" type="primary" <el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2" type="primary"
text>
text>
通过 通过
</el-button> </el-button>
</template> </template>
</el-popconfirm> </el-popconfirm>
<el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2" type="primary" text <el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2" type="primary" text
@click="showRejectDialog(scope.row)">
@click="showRejectDialog(scope.row)">
驳回 驳回
</el-button> </el-button>
</div> </div>
@ -144,9 +144,9 @@
<div class="pagination"> <div class="pagination">
<el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]" <el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper" :total="total"
@size-change="handlePagination('size', $event)"
@current-change="handlePagination('page', $event)"></el-pagination>
layout="total, sizes, prev, pager, next, jumper" :total="total"
@size-change="handlePagination('size', $event)"
@current-change="handlePagination('page', $event)"></el-pagination>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
@ -156,7 +156,7 @@
<el-form> <el-form>
<el-form-item label="驳回理由"> <el-form-item label="驳回理由">
<el-input v-model="rejectReason" type="textarea" :rows="4" placeholder="请输入驳回理由" maxlength="200" <el-input v-model="rejectReason" type="textarea" :rows="4" placeholder="请输入驳回理由" maxlength="200"
show-word-limit />
show-word-limit/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
@ -169,8 +169,8 @@
</template> </template>
<script setup> <script setup>
import { computed, onMounted, reactive, ref } from 'vue'
import { ElMessage } from 'element-plus'
import {computed, onMounted, reactive, ref} from 'vue'
import {ElMessage} from 'element-plus'
import request from '@/util/http' import request from '@/util/http'
import moment from 'moment' import moment from 'moment'
import API from '@/util/http' import API from '@/util/http'
@ -287,7 +287,7 @@ const sortOrder = ref('')
// //
const rules = reactive({ const rules = reactive({
rejectReason: [{ required: true, message: '请输入驳回理由', trigger: 'blur' }]
rejectReason: [{required: true, message: '请输入驳回理由', trigger: 'blur'}]
}) })
const getAdminData = async function () { const getAdminData = async function () {
@ -341,6 +341,7 @@ const getRecharge = async function (val) {
console.log('请求失败', error) console.log('请求失败', error)
} }
} }
const getStats = async () => { const getStats = async () => {
try { try {
const params = { const params = {
@ -357,7 +358,7 @@ const getStats = async () => {
stats.value.permanentGolds = res.permanentGolds / 100 stats.value.permanentGolds = res.permanentGolds / 100
stats.value.freeGolds = res.freeGolds / 100 stats.value.freeGolds = res.freeGolds / 100
stats.value.taskGolds = res.taskGolds / 100 stats.value.taskGolds = res.taskGolds / 100
console.log('see see stats和搜索对象', stats.value,params)
console.log('see see stats和搜索对象', stats.value, params)
} catch (error) { } catch (error) {
console.log('请求失败', error) console.log('请求失败', error)
} }
@ -367,6 +368,7 @@ const handleSearch = function () {
trimJwCode(); trimJwCode();
getObj.value.pageNum = 1 getObj.value.pageNum = 1
getRecharge() getRecharge()
getStats()
} }
// //
@ -382,24 +384,26 @@ const resetSearch = function () {
} }
getTime.value = [] getTime.value = []
getRecharge() getRecharge()
getStats()
} }
// //
const getToday = function () { const getToday = function () {
const today = new Date() const today = new Date()
const startTime = new Date( const startTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
today.getFullYear(),
today.getMonth(),
today.getDate()
) )
const endTime = new Date( const endTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
) )
getTime.value = [startTime, endTime] getTime.value = [startTime, endTime]
console.log('getTime', getTime.value) console.log('getTime', getTime.value)
getRecharge() getRecharge()
getStats()
} }
// //
@ -407,36 +411,38 @@ const getYesterday = function () {
const yesterday = new Date() const yesterday = new Date()
yesterday.setDate(yesterday.getDate() - 1) yesterday.setDate(yesterday.getDate() - 1)
const startTime = new Date( const startTime = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
) )
const endTime = new Date( const endTime = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
) )
getTime.value = [startTime, endTime] getTime.value = [startTime, endTime]
console.log('getTime', getTime.value) console.log('getTime', getTime.value)
getRecharge() getRecharge()
getStats()
} }
// 7 // 7
const get7Days = function () { const get7Days = function () {
const today = new Date() const today = new Date()
const startTime = new Date( const startTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
) )
const endTime = new Date( const endTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
) )
getTime.value = [startTime, endTime] getTime.value = [startTime, endTime]
console.log('getTime', getTime.value) console.log('getTime', getTime.value)
getRecharge() getRecharge()
getStats()
} }
// //
@ -511,6 +517,7 @@ const handlePagination = (type, val) => {
getObj.value.pageNum = val getObj.value.pageNum = val
} }
getRecharge() getRecharge()
getStats()
} }
// //
@ -518,13 +525,14 @@ const handleApprove = async (row) => {
try { try {
const params = { const params = {
orderCode: row.orderCode, orderCode: row.orderCode,
auditId: 1, // todo ID
auditId: adminData.value.id,
action: 1, action: 1,
rejectReason: '' rejectReason: ''
} }
await request({ url: '/audit/audit', data: params })
await request({url: '/audit/audit', data: params})
ElMessage.success('审核通过成功') ElMessage.success('审核通过成功')
getRecharge()
await getRecharge()
await getStats()
} catch (error) { } catch (error) {
console.error('审核通过失败', error) console.error('审核通过失败', error)
ElMessage.error('操作失败') ElMessage.error('操作失败')
@ -547,16 +555,17 @@ const handleReject = async () => {
try { try {
const params = { const params = {
orderCode: currentRecord.value.orderCode, orderCode: currentRecord.value.orderCode,
auditId: 1, // todo ID
auditId: adminData.value.id,
action: 2, action: 2,
rejectReason: rejectReason.value rejectReason: rejectReason.value
} }
await request({ url: '/audit/audit', data: params })
await request({url: '/audit/audit', data: params})
ElMessage.success('驳回操作成功') ElMessage.success('驳回操作成功')
rejectDialogVisible.value = false rejectDialogVisible.value = false
getRecharge()
await getRecharge()
await getStats()
} catch (error) { } catch (error) {
console.error('驳回操作失败', error) console.error('驳回操作失败', error)
ElMessage.error('操作失败') ElMessage.error('操作失败')
@ -570,19 +579,20 @@ const handleSortChange = (column) => {
if (column.prop === 'money') { if (column.prop === 'money') {
sortField.value = 'permanent_gold' sortField.value = 'permanent_gold'
}else if (column.prop === 'permanentGold') {
} else if (column.prop === 'permanentGold') {
sortField.value = 'permanent_gold' sortField.value = 'permanent_gold'
}else if (column.prop === 'freeGold') {
} else if (column.prop === 'freeGold') {
sortField.value = 'free_gold' sortField.value = 'free_gold'
} else if (column.prop === 'createTime') { } else if (column.prop === 'createTime') {
sortField.value = 'create_time' sortField.value = 'create_time'
}else if (column.prop === 'payTime') {
} else if (column.prop === 'payTime') {
sortField.value = 'pay_time' sortField.value = 'pay_time'
}else if (column.prop === 'auditTime') {
} else if (column.prop === 'auditTime') {
sortField.value = 'audit_time' sortField.value = 'audit_time'
} }
sortOrder.value = column.order === 'ascending' ? 'asc' : 'desc' sortOrder.value = column.order === 'ascending' ? 'asc' : 'desc'
getRecharge() getRecharge()
getStats()
} }
// //
const previewImage = (imageUrl) => { const previewImage = (imageUrl) => {
@ -615,7 +625,7 @@ const previewImage = (imageUrl) => {
// //
onMounted(async function () { onMounted(async function () {
// await getAdminData()
await getAdminData()
await getActivity() await getActivity()
await getMarket() await getMarket()
await getRecharge() await getRecharge()

22
src/views/consume/addCoinConsume.vue

@ -68,6 +68,11 @@ const rules = reactive({
goodsName: [{required: true, message: "请选择消费商品", trigger: "change"}], // change goodsName: [{required: true, message: "请选择消费商品", trigger: "change"}], // change
sumGold: [ sumGold: [
{required: true, message: "消费金币总数不能为空", trigger: "blur"}, {required: true, message: "消费金币总数不能为空", trigger: "blur"},
{
pattern: /^\d+(\.\d{1})?$/,
message: "只能输入最多一个小数点的数字",
trigger: "blur"
}
], ],
}); });
// //
@ -98,12 +103,12 @@ const getAdminData = async function () {
function validateInput() { function validateInput() {
const sumGold = parseFloat(addConsume.value.sumGold); const sumGold = parseFloat(addConsume.value.sumGold);
trimJwCode(); trimJwCode();
if (user.value.jwcode == null) { if (user.value.jwcode == null) {
ElMessage.error("请先查询用户信息"); ElMessage.error("请先查询用户信息");
addConsume.value.sumGold = null; addConsume.value.sumGold = null;
return false; return false;
} }
// //
if (user.value.jwcode && (isNaN(sumGold) || sumGold <= 0)) { if (user.value.jwcode && (isNaN(sumGold) || sumGold <= 0)) {
ElMessage.error("消费金币总数必须是大于0的数字"); ElMessage.error("消费金币总数必须是大于0的数字");
@ -112,6 +117,7 @@ function validateInput() {
return false; return false;
} }
// //
const totalAvailableGold = (user.value.nowSumGold) const totalAvailableGold = (user.value.nowSumGold)
if (user.value.jwcode && sumGold > totalAvailableGold) { if (user.value.jwcode && sumGold > totalAvailableGold) {
@ -138,19 +144,19 @@ function calculateCoins(sumGold) {
// //
if (nowFreeGold > 0) { if (nowFreeGold > 0) {
freeUsed = Math.min(parseFloat(nowFreeGold.toFixed(2)), remaining);
remaining = parseFloat((remaining - freeUsed).toFixed(2));
freeUsed = Math.min(parseFloat(nowFreeGold.toFixed(4)), remaining);
remaining = parseFloat((remaining - freeUsed).toFixed(4));
} }
// //
if (remaining > 0 && nowPermanentGold > 0) { if (remaining > 0 && nowPermanentGold > 0) {
permanentUsed = Math.min(parseFloat(nowPermanentGold.toFixed(2)), remaining);
remaining = parseFloat((remaining - permanentUsed).toFixed(2));
permanentUsed = Math.min(parseFloat(nowPermanentGold.toFixed(4)), remaining);
remaining = parseFloat((remaining - permanentUsed).toFixed(4));
} }
// //
if (remaining > 0 && nowTaskGold > 0) { if (remaining > 0 && nowTaskGold > 0) {
taskUsed = parseFloat(remaining.toFixed(2));
taskUsed = parseFloat(remaining.toFixed(4));
} }
// //
@ -422,7 +428,7 @@ onMounted(async function () {
</div> </div>
<el-form-item prop="allGold" label="消费金币总数">
<el-form-item prop="sumGold" label="消费金币总数">
<el-input <el-input
v-model="addConsume.sumGold" v-model="addConsume.sumGold"
style="width: 100px" style="width: 100px"
@ -517,7 +523,7 @@ onMounted(async function () {
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="14"> <el-col :span="14">
<el-form-item label="当前金币总数" style="width: 500px">
<el-form-item label="当前金币总数" style="width: 600px">
<span <span
style="color: #2fa1ff; margin-right: 5px" style="color: #2fa1ff; margin-right: 5px"
v-if="user.nowSumGold !== undefined" v-if="user.nowSumGold !== undefined"

Loading…
Cancel
Save