You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
701 lines
18 KiB
701 lines
18 KiB
<script setup>
|
|
import { ref, onMounted, reactive, computed, watch, nextTick } from 'vue'
|
|
import { ElMessage } from 'element-plus'
|
|
import { Plus } from '@element-plus/icons-vue'
|
|
import axios from 'axios'
|
|
import { ElMessageBox } from 'element-plus'
|
|
import API from '@/util/http'
|
|
import moment from 'moment'
|
|
import { range, re } from 'mathjs'
|
|
import { utils, read } from 'xlsx'
|
|
import throttle from 'lodash/throttle'
|
|
// 精网号去空格
|
|
const trimJwCode = () => {
|
|
if (recharge.value.jwcode) {
|
|
recharge.value.jwcode = recharge.value.jwcode.replace(/\s/g, '');
|
|
}
|
|
}
|
|
// 上传图片前的验证函数
|
|
const beforeAvatarUpload = (file) => {
|
|
const isJPG = file.type === 'image/jpeg'
|
|
const isPNG = file.type === 'image/png'
|
|
const isLt2M = file.size / 1024 / 1024 < 2
|
|
|
|
if (!isJPG && !isPNG) {
|
|
ElMessage.error('上传头像图片只能是 JPG 或 PNG 格式!')
|
|
}
|
|
if (!isLt2M) {
|
|
ElMessage.error('上传头像图片大小不能超过 2MB!')
|
|
}
|
|
return (isJPG || isPNG) && isLt2M
|
|
}
|
|
// 这是添加上传图片的接口
|
|
const imageUrl = ref('')
|
|
const voucher = ref('')
|
|
const Rate = ref()
|
|
const adminData = ref({})
|
|
const getAdminData = async function () {
|
|
try {
|
|
const result = await API({
|
|
url: '/admin/userinfo',
|
|
data: {}
|
|
})
|
|
adminData.value = result
|
|
recharge.value.adminId = adminData.value.adminId
|
|
recharge.value.market = adminData.value.market
|
|
console.log('请求成功', result)
|
|
console.log('用户信息', user.value)
|
|
} catch (error) {
|
|
console.log('请求失败', error)
|
|
}
|
|
}
|
|
|
|
// 这是添加充值信息的表单
|
|
const recharge = ref({
|
|
voucher: '',
|
|
rechargeWay: '客服充值',
|
|
freeGold: '',
|
|
money: null,
|
|
permanentGold: '',
|
|
Rate: null,
|
|
rechargeRatio: '',
|
|
rateId: null
|
|
})
|
|
// 这是添加充值信息的接口
|
|
const add = async function () {
|
|
try {
|
|
|
|
const formattedRecharge = { ...recharge.value,
|
|
// 添加固定的 adminId
|
|
adminId: fixedAdminId
|
|
}
|
|
if (formattedRecharge.payTime) {
|
|
// 使用 moment.js 格式化 payTime
|
|
formattedRecharge.payTime = moment(formattedRecharge.payTime).format('YYYY-MM-DD HH:mm:ss')
|
|
}
|
|
|
|
console.log('开始添加充值信息', recharge.value)
|
|
// 发送POST请求
|
|
const result = await API({
|
|
url: 'http://192.168.8.247:8081/recharge/add',
|
|
data: formattedRecharge
|
|
})
|
|
if (result.code === 0) {
|
|
ElMessage.error(result.msg)
|
|
return
|
|
}
|
|
// 将响应结果存储到响应式数据中
|
|
console.log('请求成功', result)
|
|
// 显示成功消息
|
|
ElMessage.success('添加成功')
|
|
// 重置表单
|
|
recharge.value = {}
|
|
recharge.value.adminId = adminData.value.adminId
|
|
recharge.value.market = adminData.value.market
|
|
recharge.value.voucher = ''
|
|
recharge.value.rechargeWay = '客服充值'
|
|
recharge.value.freeGold = ''
|
|
recharge.value.money = null
|
|
recharge.value.permanentGold = ''
|
|
recharge.value.rateId = null
|
|
imageUrl.value = ''
|
|
Rate.value = null
|
|
user.value = {}
|
|
} catch (error) {
|
|
console.log('请求失败', error)
|
|
// 在这里可以处理错误逻辑,比如显示错误提示等
|
|
}
|
|
}
|
|
|
|
//添加充值信息前的按钮点击事件,进行表单验证和用户确认操作
|
|
const addBefore = () => {
|
|
Ref.value.validate(async (valid) => {
|
|
if (valid) {
|
|
if (Rate.value == null || Rate.value == '' || Rate.value == undefined) {
|
|
ElMessage({
|
|
type: 'error',
|
|
message: '请选择币种'
|
|
})
|
|
return
|
|
}
|
|
if(recharge.value.money == null || recharge.value.money == '' || recharge.value.money == undefined){
|
|
ElMessage({
|
|
type: 'error',
|
|
message: '请输入充值金额'
|
|
})
|
|
return
|
|
}
|
|
// 根据选择的货币名称找到对应的 rateId
|
|
const selectedRate = rateName.find(item => item.value === Rate.value)
|
|
if (selectedRate) {
|
|
recharge.value.rateId = selectedRate.rateId
|
|
}
|
|
ElMessageBox.confirm('确认添加?')
|
|
.then(() => {
|
|
add()
|
|
console.log('添加成功')
|
|
})
|
|
.catch(() => {
|
|
console.log('取消添加')
|
|
})
|
|
} else {
|
|
//提示
|
|
ElMessage({
|
|
type: 'error',
|
|
message: '请检查输入内容'
|
|
})
|
|
}
|
|
})
|
|
}
|
|
|
|
// 表单验证
|
|
// 开始时间改变时,重新验证结束时间
|
|
const Ref = ref(null)
|
|
|
|
|
|
const rules = reactive({
|
|
jwcode: [{ required: true, message: '请输入精网号', trigger: 'blur' }],
|
|
activity: [{ required: true, message: '请选择活动名称', trigger: 'blur' }],
|
|
permanentGold: [{ required: true, message: '请输入永久金币数', trigger: 'blur' },
|
|
{validator: (rule, value, callback) => {
|
|
if (value >= 0) {
|
|
callback()
|
|
} else {
|
|
callback(new Error('输入金额至少为0'))
|
|
}}}],
|
|
freeGold: [{required: true, message: '请输入免费金币数', trigger: 'blur' },
|
|
{
|
|
validator: (rule, value, callback) => {
|
|
// 将值转换为数字(可行吗??)
|
|
// 好的不可行
|
|
const numValue = Number(value);
|
|
if (isNaN(numValue)) {
|
|
callback(new Error('请输入有效的数字'));
|
|
} else if (numValue >= 0) {
|
|
callback();
|
|
} else {
|
|
callback(new Error('输入金额至少为 0'));
|
|
}
|
|
},
|
|
trigger: 'blur'
|
|
}
|
|
],
|
|
money: [
|
|
{
|
|
required: true,
|
|
message: '请选择货币名称',
|
|
trigger: 'blur'
|
|
}
|
|
],
|
|
'recharge.money': [
|
|
{
|
|
required: true,
|
|
message: '请输入充值金额',
|
|
trigger: 'blur'
|
|
}
|
|
|
|
],
|
|
payModel: [{ required: true, message: '请选择付款方式', trigger: 'blur' }],
|
|
payTime: [{ required: true, message: '请选择交款时间', trigger: 'blur' }]
|
|
})
|
|
|
|
// 查找客户信息的方法
|
|
const user = ref({})
|
|
const getUser = async function (jwcode) {
|
|
trimJwCode();
|
|
try {
|
|
|
|
// 发送POST请求
|
|
const result = await API({
|
|
url: 'http://192.168.8.247:8081/user/selectUser',
|
|
data: {
|
|
jwcode: recharge.value.jwcode
|
|
}
|
|
})
|
|
console.log('请求成功', result)
|
|
|
|
if (result.code === 0) {
|
|
ElMessage.error(result.msg);
|
|
} else if (result.data === null) {
|
|
ElMessage.error("用户不存在");
|
|
} else {
|
|
user.value = result.data;
|
|
console.log("用户信息", user.value);
|
|
ElMessage.success(result.msg);
|
|
}
|
|
} catch (error) {
|
|
console.log("请求失败", error);
|
|
ElMessage.error("查询失败,请检查精网号是否正确");
|
|
// 在这里可以处理错误逻辑,比如显示错误提示等
|
|
}
|
|
}
|
|
|
|
// 这是查询活动的接口
|
|
const activity = ref([])
|
|
const getActivity = async function () {
|
|
try {
|
|
// 发送POST请求
|
|
const result = await API({
|
|
url: 'http://192.168.8.247:8081/general/activity',
|
|
data: {
|
|
|
|
}
|
|
})
|
|
|
|
// 将响应结果存储到响应式数据中
|
|
console.log('请求成功', result)
|
|
// 存储表格数据
|
|
activity.value = result.data
|
|
console.log('活动信息', activity.value)
|
|
} catch (error) {
|
|
console.log('activity请求失败', error)
|
|
// 在这里可以处理错误逻辑,比如显示错误提示等
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//货币条目
|
|
const rateName = [
|
|
{
|
|
value: 'USD',
|
|
label: 'USD',
|
|
rateId: 1
|
|
},
|
|
{
|
|
value: 'HKD',
|
|
label: 'HKD',
|
|
rateId: 2
|
|
},
|
|
{
|
|
value: 'THB',
|
|
label: 'THB',
|
|
rateId: 3
|
|
},
|
|
{
|
|
value: 'VND',
|
|
label: 'VND',
|
|
rateId: 4
|
|
},
|
|
{
|
|
value: 'CAD',
|
|
label: 'CAD',
|
|
rateId: 5
|
|
},
|
|
{
|
|
value: 'MYR',
|
|
label: 'MYR',
|
|
rateId: 6
|
|
},
|
|
{
|
|
value: 'KRW',
|
|
label: 'KRW',
|
|
rateId: 7
|
|
},
|
|
{
|
|
value: 'JPY',
|
|
label: 'JPY',
|
|
rateId: 8
|
|
},
|
|
{
|
|
value: 'CNY',
|
|
label: 'CNY',
|
|
rateId: 9
|
|
}
|
|
]
|
|
|
|
|
|
// 上传图片成功的回调函数
|
|
const handleAvatarSuccess = (response, uploadFile) => {
|
|
imageUrl.value = URL.createObjectURL(uploadFile.raw)
|
|
console.log('图片上传成功', response, uploadFile)
|
|
recharge.value.voucher = `http://39.101.133.168:8828/hljw/api/aws/upload`
|
|
console.log('图片名称', recharge.value.voucher)
|
|
}
|
|
|
|
//充值方式条目
|
|
const payModel = [
|
|
{
|
|
value: '现金',
|
|
label: '现金'
|
|
},
|
|
{
|
|
value: '支票',
|
|
label: '支票'
|
|
},
|
|
{
|
|
value: '刷卡',
|
|
label: '刷卡'
|
|
},
|
|
{
|
|
value: '其他(各地区电子支付)',
|
|
label: '其他(各地区电子支付)'
|
|
}
|
|
]
|
|
|
|
// //根据活动id获取汇率
|
|
// const getActivityById = async function (row) {
|
|
// try {
|
|
// // 发送POST请求
|
|
// const result = await API({
|
|
// url: '/recharge/activity/select',
|
|
// data: {
|
|
// activity: { activity: row }
|
|
// }
|
|
// })
|
|
// recharge.value.rechargeRatio = result.data[0].rechargeRatio
|
|
// console.log('看看有了吗', recharge.value.rechargeRatio)
|
|
// } catch (error) {
|
|
// console.log('请求失败', error)
|
|
// }
|
|
// }
|
|
function handleActivityChange(value) {
|
|
// 在这里执行你的逻辑,例如获取选中的值
|
|
console.log('选中的值:', value)
|
|
getActivityById(value)
|
|
console.log('看看', recharge.value)
|
|
}
|
|
// 监听 permanentGold 的变化
|
|
// const calculatedFree = computed(() => {
|
|
// const result = recharge.value.permanentGold / recharge.value.rechargeRatio
|
|
// if (isNaN(result) || result < 1 || recharge.value.rechargeRatio == 0) {
|
|
// return 0
|
|
// } else {
|
|
// return Math.trunc(result)
|
|
// }
|
|
// })
|
|
// watch(calculatedFree, (newVal) => {
|
|
// recharge.value.freeGold = newVal
|
|
// })
|
|
// const calculatedRecharge = computed(() => {
|
|
// return recharge.value.permanentGold * Rate.value
|
|
// })
|
|
// watch(calculatedRecharge, (newVal) => {
|
|
// recharge.value.money = newVal
|
|
// })
|
|
//这是重置重置表单的方法
|
|
const deleteRecharge = function () {
|
|
recharge.value = {
|
|
// adminId: adminData.value.adminId,
|
|
adminId: fixedAdminId,
|
|
market: adminData.value.market,
|
|
voucher: '',
|
|
rechargeWay: '客服充值',
|
|
freeGold: Number(),
|
|
money: null,
|
|
permanentGold: Number(),
|
|
rateId: null
|
|
}
|
|
imageUrl.value = ''
|
|
Rate.value = ''
|
|
}
|
|
|
|
|
|
onMounted(async function () {
|
|
await getAdminData()
|
|
// await getCurrency()
|
|
await getActivity()
|
|
|
|
})
|
|
</script>
|
|
|
|
<template>
|
|
<div>
|
|
|
|
<el-form
|
|
:model="recharge"
|
|
ref="Ref"
|
|
:rules="rules"
|
|
label-width="auto"
|
|
style="max-width: 600px"
|
|
class="add-form"
|
|
>
|
|
<el-form-item prop="jwcode" label="精网号">
|
|
<el-input v-model="recharge.jwcode" style="width: 220px" />
|
|
<el-button
|
|
type="primary"
|
|
@click="getUser(recharge.jwcode)"
|
|
style="margin-left: 20px"
|
|
|
|
>查询</el-button
|
|
>
|
|
</el-form-item>
|
|
<el-form-item prop="activity" label="活动名称">
|
|
<el-select
|
|
v-model="recharge.activity"
|
|
placeholder="请选择"
|
|
style="width: 300px"
|
|
@change="handleActivityChange"
|
|
>
|
|
<el-option
|
|
v-for="(item, index) in activity"
|
|
:key="index"
|
|
:label="item"
|
|
:value="item"
|
|
/>
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item prop="permanentGold" label="永久金币">
|
|
<el-input v-model="recharge.permanentGold" style="width: 100px" />
|
|
<p style="margin-right: 20px">个</p>
|
|
<p>免费金币</p>
|
|
<el-input v-model="recharge.freeGold" style="width: 100px" />
|
|
<p>个</p>
|
|
</el-form-item>
|
|
<el-form-item label="充值金额">
|
|
<el-select
|
|
prop="money"
|
|
v-model="Rate"
|
|
placeholder="货币名称"
|
|
style="width: 95px; margin-right: 5px"
|
|
aria-required="true"
|
|
>
|
|
<el-option
|
|
v-for="item in rateName"
|
|
:key="item.value"
|
|
:label="item.label"
|
|
:value="item.value"
|
|
/>
|
|
</el-select>
|
|
<el-input prop="recharge.money" v-model="recharge.money" style="width: 200px" aria-required="true"/>
|
|
</el-form-item>
|
|
<el-form-item prop="payModel" label="收款方式">
|
|
<el-select
|
|
v-model="recharge.payModel"
|
|
placeholder="请选择"
|
|
style="width: 300px"
|
|
>
|
|
<el-option
|
|
v-for="item in payModel"
|
|
:key="item.value"
|
|
:label="item.label"
|
|
:value="item.value"
|
|
/>
|
|
</el-select>
|
|
</el-form-item>
|
|
<el-form-item prop="payTime" label="交款时间">
|
|
<!-- 修改 type 属性为 datetime 以支持时分秒选择 -->
|
|
<el-date-picker
|
|
v-model="recharge.payTime"
|
|
type="datetime"
|
|
style="width: 300px"
|
|
/>
|
|
</el-form-item>
|
|
<el-form-item
|
|
prop="voucher"
|
|
label="交款凭证"
|
|
style="margin-bottom: 5px"
|
|
>
|
|
<el-upload
|
|
action="http://39.101.133.168:8828/hljw/api/aws/upload"
|
|
class="avatar-uploader"
|
|
:show-file-list="false"
|
|
:on-success="handleAvatarSuccess"
|
|
:before-upload="beforeAvatarUpload"
|
|
style="width: 100px; height: 115px"
|
|
>
|
|
<img
|
|
v-if="imageUrl"
|
|
:src="imageUrl"
|
|
class="avatar"
|
|
style="width: 100px; height: 115px"
|
|
/>
|
|
<el-icon
|
|
v-else
|
|
class="avatar-uploader-icon"
|
|
style="width: 100px; height: 100px"
|
|
>
|
|
<Plus />
|
|
</el-icon>
|
|
</el-upload>
|
|
<p style="margin-left: 10px; color: rgb(177, 176, 176)">
|
|
仅支持.jpg .png格式,文件≤1MB
|
|
</p>
|
|
</el-form-item>
|
|
<el-form-item prop="remark" label="备注">
|
|
<el-input
|
|
v-model="recharge.remark"
|
|
style="width: 300px"
|
|
:rows="2"
|
|
maxlength="100"
|
|
show-word-limit
|
|
type="textarea"
|
|
/>
|
|
</el-form-item>
|
|
<el-form-item prop="adminId" label="提交人">
|
|
<el-input
|
|
style="width: 300px"
|
|
:value="adminData.adminId"
|
|
disabled
|
|
placeholder="提交人姓名"
|
|
/>
|
|
</el-form-item>
|
|
<el-button @click="deleteRecharge" style="margin-left: 280px" type="success"
|
|
>重置</el-button
|
|
>
|
|
<el-button type="primary" @click="addBefore"> 提交 </el-button>
|
|
</el-form>
|
|
|
|
<!-- 客户信息栏 -->
|
|
<el-card v-if="user.jwcode"
|
|
style="width: 1200px; float: right"
|
|
class="customer-info"
|
|
width="3000px"
|
|
>
|
|
<el-form
|
|
:model="user"
|
|
label-width="auto"
|
|
style="max-width: 1200px"
|
|
label-position="left"
|
|
>
|
|
<el-text size="large" style="margin-left: 20px">客户信息</el-text>
|
|
<el-row style="margin-top: 20px">
|
|
<el-col :span="10">
|
|
<el-form-item label="姓名:">
|
|
<p>{{ user.name }}</p>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="14">
|
|
<el-form-item label="历史金币总数">
|
|
<!-- 检查 user.historySumGold 是否为有效的数字 -->
|
|
<p style="color: #2fa1ff; margin-right: 5px" v-if="!isNaN(Number(user.historySumGold))">
|
|
{{ Number(user.historySumGold ) }}
|
|
</p>
|
|
<span
|
|
style="display: inline; white-space: nowrap; color: #b1b1b1"
|
|
v-if="user.historyPermanentGold !== undefined"
|
|
>(永久金币:{{ user.historyPermanentGold }};免费金币:{{
|
|
(user.historyFreeGold)
|
|
}};任务金币:{{ user.historyTaskGold }})</span>
|
|
<!-- 如果不是有效的数字,显示默认值 -->
|
|
<p v-else></p>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="10">
|
|
<el-form-item label="精网号">
|
|
<p>{{ user.jwcode }}</p>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="14">
|
|
<el-form-item label="当前金币总数" style="width: 500px">
|
|
<span
|
|
style="color: #2fa1ff; margin-right: 5px"
|
|
v-if="user.nowPermanentGold !== undefined"
|
|
>{{
|
|
(user.nowSumGold)
|
|
}}</span
|
|
>
|
|
<span
|
|
style="display: inline; white-space: nowrap; color: #b1b1b1"
|
|
v-if="user.nowPermanentGold !== undefined"
|
|
>(永久金币:{{ user.nowPermanentGold}};免费金币:{{
|
|
(user.nowFreeGold)
|
|
}};任务金币:{{ user.nowTaskGold }})</span
|
|
>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="10">
|
|
<el-form-item label="首次充值日期">
|
|
<p v-if="user.firstRecharge">
|
|
{{ moment(user.firstRecharge).format('YYYY-MM-DD HH:mm:ss') }}
|
|
</p>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="14">
|
|
<el-form-item label="充值次数">
|
|
<p style="color: #2fa1ff">{{ user.rechargeNum }}</p>
|
|
</el-form-item>
|
|
</el-col>
|
|
<!-- <el-col :span="10">
|
|
<el-form-item label="负责客服">
|
|
<p>{{ adminData.name }}</p>
|
|
</el-form-item>
|
|
</el-col> -->
|
|
<el-col :span="10">
|
|
<el-form-item label="消费次数">
|
|
<p style="color: #2fa1ff">{{ user.consumeNum }}</p>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="10">
|
|
<el-form-item label="所属门店">
|
|
<p>{{ user.market }}</p>
|
|
</el-form-item>
|
|
</el-col>
|
|
<el-col :span="14">
|
|
<!-- <el-form-item label="待审核">
|
|
<p style="color: #2fa1ff">
|
|
{{ user.A }}
|
|
</p>
|
|
</el-form-item> -->
|
|
</el-col>
|
|
</el-row>
|
|
</el-form>
|
|
</el-card>
|
|
|
|
|
|
</div>
|
|
</template>
|
|
|
|
<style scoped>
|
|
p {
|
|
margin: 0px;
|
|
}
|
|
|
|
.batch-btn {
|
|
margin-top: 20px;
|
|
margin-left: auto;
|
|
}
|
|
|
|
.el-form-item {
|
|
margin-left: 50px;
|
|
}
|
|
|
|
/* 上传图片的格式 */
|
|
.avatar-uploader .avatar {
|
|
width: 50px;
|
|
height: 50px;
|
|
display: block;
|
|
}
|
|
</style>
|
|
|
|
<style>
|
|
.error-message {
|
|
color: red;
|
|
font-size: 8px;
|
|
}
|
|
|
|
.is-invalid .el-input__inner {
|
|
border-color: red;
|
|
}
|
|
|
|
.avatar-uploader .el-upload {
|
|
border: 1px dashed var(--el-border-color);
|
|
border-radius: 6px;
|
|
cursor: pointer;
|
|
position: relative;
|
|
overflow: hidden;
|
|
transition: var(--el-transition-duration-fast);
|
|
}
|
|
|
|
.avatar-uploader .el-upload:hover {
|
|
border-color: var(--el-color-primary);
|
|
}
|
|
|
|
.el-icon.avatar-uploader-icon {
|
|
font-size: 28px;
|
|
color: #8c939d;
|
|
width: 50px;
|
|
height: 50px;
|
|
text-align: center;
|
|
}
|
|
|
|
.add-form {
|
|
margin-top: 50px;
|
|
max-width: 50%;
|
|
float: left;
|
|
}
|
|
|
|
.customer-info {
|
|
max-width: 60%;
|
|
}
|
|
</style>
|