|
|
@ -5,6 +5,7 @@ import { Plus } from '@element-plus/icons-vue' |
|
|
|
import axios from 'axios' |
|
|
|
import { ElMessageBox } from 'element-plus' |
|
|
|
import API from '@/util/http' |
|
|
|
import { uploadFile } from '@/util/request'; |
|
|
|
import moment from 'moment' |
|
|
|
import { range, re } from 'mathjs' |
|
|
|
import { utils, read } from 'xlsx' |
|
|
@ -22,20 +23,20 @@ const trimJwCode = () => { |
|
|
|
const beforeAvatarUpload = (file) => { |
|
|
|
const isJPG = file.type === 'image/jpeg' |
|
|
|
const isPNG = file.type === 'image/png' |
|
|
|
const isLt2M = file.size / 1024 / 1024 < 2 |
|
|
|
const isLt2M = file.size / 1024 / 1024 < 1 |
|
|
|
|
|
|
|
if (!isJPG && !isPNG) { |
|
|
|
ElMessage.error('上传头像图片只能是 JPG 或 PNG 格式!') |
|
|
|
} |
|
|
|
if (!isLt2M) { |
|
|
|
ElMessage.error('上传头像图片大小不能超过 2MB!') |
|
|
|
ElMessage.error('上传头像图片大小不能超过 1MB!') |
|
|
|
} |
|
|
|
return (isJPG || isPNG) && isLt2M |
|
|
|
} |
|
|
|
// 这是添加上传图片的接口 |
|
|
|
const imageUrl = ref('') |
|
|
|
const voucher = ref('') |
|
|
|
const Rate = ref() |
|
|
|
// const rateName = ref() |
|
|
|
const adminData = ref({}) |
|
|
|
// 获取管理员信息 |
|
|
|
const getAdminData = async function () { |
|
|
@ -63,7 +64,7 @@ const recharge = ref({ |
|
|
|
freeGold: '', |
|
|
|
money: null, |
|
|
|
permanentGold: '', |
|
|
|
Rate: null, |
|
|
|
rateName: null, |
|
|
|
rateId: null, |
|
|
|
payModel: '', // payModel 字段 |
|
|
|
payTime: null, // payTime 字段 |
|
|
@ -117,7 +118,7 @@ const add = async function () { |
|
|
|
recharge.value.permanentGold = '' |
|
|
|
recharge.value.rateId = null |
|
|
|
imageUrl.value = '' |
|
|
|
Rate.value = null |
|
|
|
recharge.value.rateName = null |
|
|
|
user.value = {} |
|
|
|
} catch (error) { |
|
|
|
console.log('请求失败', error) |
|
|
@ -129,7 +130,7 @@ const add = async function () { |
|
|
|
const addBefore = () => { |
|
|
|
Ref.value.validate(async (valid) => { |
|
|
|
if (valid) { |
|
|
|
if (Rate.value == null || Rate.value == '' || Rate.value == undefined) { |
|
|
|
if (recharge.value.rateName == null || recharge.value.rateName == '' || recharge.value.rateName == undefined) { |
|
|
|
ElMessage({ |
|
|
|
type: 'error', |
|
|
|
message: '请选择币种' |
|
|
@ -144,7 +145,7 @@ const addBefore = () => { |
|
|
|
return |
|
|
|
} |
|
|
|
// 根据选择的货币名称找到对应的 rateId |
|
|
|
const selectedRate = rateName.find(item => item.value === Rate.value) |
|
|
|
const selectedRate = rateName.find(item => item.value === recharge.value.rateName) |
|
|
|
if (selectedRate) { |
|
|
|
recharge.value.rateId = selectedRate.rateId |
|
|
|
} |
|
|
@ -174,48 +175,73 @@ 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' }, |
|
|
|
permanentGold: [ |
|
|
|
{ required: true, message: '请输入永久金币数', trigger: 'blur' }, |
|
|
|
{ |
|
|
|
validator: (rule, value, callback) => { |
|
|
|
// 将值转换为数字(可行吗??) |
|
|
|
// 好的不可行 |
|
|
|
// 检查是否包含特殊符号 |
|
|
|
if (/[^0-9.]/.test(value)) { |
|
|
|
callback(new Error('不能包含特殊符号或负数')); |
|
|
|
return; |
|
|
|
} |
|
|
|
const numValue = Number(value); |
|
|
|
if (isNaN(numValue)) { |
|
|
|
callback(new Error('请输入有效的数字')); |
|
|
|
} else if (numValue >= 0) { |
|
|
|
callback(); |
|
|
|
} else if (numValue < 0) { |
|
|
|
callback(new Error('输入金额不能小于0')); |
|
|
|
} else { |
|
|
|
callback(new Error('输入金额至少为 0')); |
|
|
|
callback(); |
|
|
|
} |
|
|
|
}, |
|
|
|
trigger: 'blur' |
|
|
|
} |
|
|
|
], |
|
|
|
money: [ |
|
|
|
freeGold: [ |
|
|
|
{ required: true, message: '请输入免费金币数', trigger: 'blur' }, |
|
|
|
{ |
|
|
|
required: true, |
|
|
|
message: '请选择货币名称', |
|
|
|
validator: (rule, value, callback) => { |
|
|
|
// 检查是否包含特殊符号 |
|
|
|
if (/[^0-9.]/.test(value)) { |
|
|
|
callback(new Error('不能包含特殊符号或负数')); |
|
|
|
return; |
|
|
|
} |
|
|
|
const numValue = Number(value); |
|
|
|
if (isNaN(numValue)) { |
|
|
|
callback(new Error('请输入有效的数字')); |
|
|
|
} else if (numValue < 0) { |
|
|
|
callback(new Error('输入金额必须大于0')); |
|
|
|
} else { |
|
|
|
callback(); |
|
|
|
} |
|
|
|
}, |
|
|
|
trigger: 'blur' |
|
|
|
} |
|
|
|
], |
|
|
|
'recharge.money': [ |
|
|
|
{ |
|
|
|
rateName: [{ |
|
|
|
required: true, |
|
|
|
message: '请选择货币名称', |
|
|
|
trigger: 'blur' |
|
|
|
}], |
|
|
|
|
|
|
|
money: [{ |
|
|
|
required: true, |
|
|
|
message: '请输入充值金额', |
|
|
|
trigger: 'blur' |
|
|
|
}, { |
|
|
|
validator: (rule, value, callback) => { |
|
|
|
if (!value) { |
|
|
|
callback(new Error('请输入充值金额')); |
|
|
|
} else if (value < 0) { |
|
|
|
callback(new Error('金额不能小于0')); |
|
|
|
} else { |
|
|
|
callback(); |
|
|
|
} |
|
|
|
|
|
|
|
], |
|
|
|
}, |
|
|
|
trigger: 'blur' |
|
|
|
}], |
|
|
|
payModel: [{ required: true, message: '请选择付款方式', trigger: 'blur' }], |
|
|
|
payTime: [{ required: true, message: '请选择交款时间', trigger: 'blur' }] |
|
|
|
}) |
|
|
|
}); |
|
|
|
|
|
|
|
// 查找客户信息的方法 |
|
|
|
const user = ref({}) |
|
|
@ -322,12 +348,22 @@ const rateName = [ |
|
|
|
} |
|
|
|
] |
|
|
|
|
|
|
|
|
|
|
|
// 修改上传处理 |
|
|
|
const customUpload = async (options) => { |
|
|
|
try { |
|
|
|
const response = await uploadFile(options.file); |
|
|
|
handleAvatarSuccess(response.data, { raw: options.file }); |
|
|
|
} catch (error) { |
|
|
|
ElMessage.error('上传失败'); |
|
|
|
} |
|
|
|
}; |
|
|
|
// 获取环境变量 |
|
|
|
// const uploadUrl = import.meta.env.VITE_UPLOAD_URL; |
|
|
|
// 上传图片成功的回调函数 |
|
|
|
const handleAvatarSuccess = (response, uploadFile) => { |
|
|
|
imageUrl.value = URL.createObjectURL(uploadFile.raw) |
|
|
|
imageUrl.value = URL.createObjectURL(uploadFile.raw) ; |
|
|
|
console.log('图片上传成功', response, uploadFile) |
|
|
|
recharge.value.voucher = `http://39.101.133.168:8828/hljw/api/aws/upload` |
|
|
|
recharge.value.voucher = import.meta.env.VITE_UPLOAD_URL; |
|
|
|
console.log('图片名称', recharge.value.voucher) |
|
|
|
} |
|
|
|
|
|
|
@ -374,7 +410,7 @@ const deleteRecharge = function () { |
|
|
|
rateId: null |
|
|
|
} |
|
|
|
imageUrl.value = '' |
|
|
|
Rate.value = '' |
|
|
|
recharge.value.rateName = '' |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -431,15 +467,18 @@ onMounted(async function () { |
|
|
|
</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> |
|
|
|
<p>个</p> |
|
|
|
|
|
|
|
</el-form-item> |
|
|
|
<el-form-item prop="freeGold" label="免费金币"> |
|
|
|
|
|
|
|
<el-input v-model="recharge.freeGold" style="width: 100px" /> |
|
|
|
<p>个</p> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item label="充值金额"> |
|
|
|
<!-- <el-form-item label="充值金额"> |
|
|
|
<el-select |
|
|
|
prop="money" |
|
|
|
v-model="Rate" |
|
|
|
prop="moneys" |
|
|
|
v-model="rateName" |
|
|
|
placeholder="货币名称" |
|
|
|
style="width: 95px; margin-right: 5px" |
|
|
|
aria-required="true" |
|
|
@ -451,8 +490,32 @@ onMounted(async function () { |
|
|
|
:value="item.value" |
|
|
|
/> |
|
|
|
</el-select> |
|
|
|
<el-input prop="recharge.money" v-model="recharge.money" style="width: 200px" aria-required="true"/> |
|
|
|
<el-input prop="money" v-model="recharge.money" style="width: 200px" aria-required="true"/> |
|
|
|
</el-form-item> --> |
|
|
|
|
|
|
|
<el-form-item label="充值金额" required> |
|
|
|
<!-- 货币名称 --> |
|
|
|
<el-form-item prop="rateName" style="display: inline-block; margin-left:0;"> |
|
|
|
<el-select |
|
|
|
v-model="recharge.rateName" |
|
|
|
placeholder="货币名称" |
|
|
|
style="width: 100px" |
|
|
|
> |
|
|
|
<el-option |
|
|
|
v-for="item in rateName" |
|
|
|
:key="item.value" |
|
|
|
:label="item.label" |
|
|
|
:value="item.value" |
|
|
|
/> |
|
|
|
</el-select> |
|
|
|
</el-form-item> |
|
|
|
|
|
|
|
<!-- 充值金额 --> |
|
|
|
<el-form-item prop="money" style="display: inline-block; margin-left:10px;"> |
|
|
|
<el-input v-model="recharge.money" style="width: 190px"/> |
|
|
|
</el-form-item> |
|
|
|
</el-form-item> |
|
|
|
|
|
|
|
<el-form-item prop="payModel" label="收款方式"> |
|
|
|
<el-select |
|
|
|
v-model="recharge.payModel" |
|
|
@ -481,10 +544,9 @@ onMounted(async function () { |
|
|
|
style="margin-bottom: 5px" |
|
|
|
> |
|
|
|
<el-upload |
|
|
|
action="http://39.101.133.168:8828/hljw/api/aws/upload" |
|
|
|
:http-request="customUpload" |
|
|
|
class="avatar-uploader" |
|
|
|
:show-file-list="false" |
|
|
|
:on-success="handleAvatarSuccess" |
|
|
|
:before-upload="beforeAvatarUpload" |
|
|
|
style="width: 100px; height: 115px" |
|
|
|
> |
|
|
@ -516,10 +578,10 @@ onMounted(async function () { |
|
|
|
type="textarea" |
|
|
|
/> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item prop="adminId" label="提交人"> |
|
|
|
<el-form-item prop="adminName" label="提交人"> |
|
|
|
<el-input |
|
|
|
style="width: 300px" |
|
|
|
:value="adminData.adminId" |
|
|
|
:value="adminData.adminName" |
|
|
|
disabled |
|
|
|
placeholder="提交人姓名" |
|
|
|
/> |
|
|
@ -531,20 +593,19 @@ onMounted(async function () { |
|
|
|
</el-form> |
|
|
|
|
|
|
|
<!-- 客户信息栏 --> |
|
|
|
<el-card v-if="user.jwcode" |
|
|
|
style="width: 1200px; float: right" |
|
|
|
class="customer-info" |
|
|
|
width="3000px" |
|
|
|
> |
|
|
|
<!-- 客户信息栏 --> |
|
|
|
<el-card v-if="user.jwcode" style="width: 800px; float: right" class="customer-info"> |
|
|
|
<el-form |
|
|
|
:model="user" |
|
|
|
label-width="auto" |
|
|
|
style="max-width: 1200px" |
|
|
|
style="max-width: 1000px" |
|
|
|
label-position="left" |
|
|
|
> |
|
|
|
<el-text size="large" style="margin-left: 20px">客户信息</el-text> |
|
|
|
|
|
|
|
<!-- 第一行:姓名 + 历史金币 --> |
|
|
|
<el-row style="margin-top: 20px"> |
|
|
|
<el-col :span="10"> |
|
|
|
<el-col :span="9"> |
|
|
|
<el-form-item label="姓名:"> |
|
|
|
<p>{{ user.name }}</p> |
|
|
|
</el-form-item> |
|
|
@ -555,17 +616,24 @@ onMounted(async function () { |
|
|
|
<p style="color: #2fa1ff; margin-right: 5px" v-if="!isNaN(Number(user.historySumGold))"> |
|
|
|
{{ Number(user.historySumGold ) /100 }} |
|
|
|
</p> |
|
|
|
|
|
|
|
<!-- 如果不是有效的数字,显示默认值 --> |
|
|
|
<p v-else></p> |
|
|
|
</el-form-item> |
|
|
|
<el-form-item style="margin-top: -23px"> <!-- 负边距减少间距 --> |
|
|
|
<span |
|
|
|
style="display: inline; white-space: nowrap; color: #b1b1b1" |
|
|
|
v-if="user.historyPermanentGold !== undefined" |
|
|
|
>(永久金币:{{ user.historyPermanentGold /100 }};免费金币:{{ |
|
|
|
(user.historyFreeGold) /100 |
|
|
|
}};任务金币:{{ user.historyTaskGold /100}})</span> |
|
|
|
<!-- 如果不是有效的数字,显示默认值 --> |
|
|
|
<p v-else></p> |
|
|
|
</el-form-item> |
|
|
|
</el-col> |
|
|
|
<el-col :span="10"> |
|
|
|
</el-row> |
|
|
|
|
|
|
|
<!-- 第二行:精网号 + 当前金币(独立行) --> |
|
|
|
<el-row style="margin-top:-23px"> |
|
|
|
<el-col :span="9"> |
|
|
|
<el-form-item label="精网号"> |
|
|
|
<p>{{ user.jwcode }}</p> |
|
|
|
</el-form-item> |
|
|
@ -574,21 +642,24 @@ onMounted(async function () { |
|
|
|
<el-form-item label="当前金币总数" style="width: 500px"> |
|
|
|
<span |
|
|
|
style="color: #2fa1ff; margin-right: 5px" |
|
|
|
v-if="user.nowPermanentGold !== undefined" |
|
|
|
>{{ |
|
|
|
(user.nowSumGold) /100 |
|
|
|
}}</span |
|
|
|
> |
|
|
|
v-if="user.nowSumGold !== undefined" |
|
|
|
>{{ user.nowSumGold }}</span> |
|
|
|
</el-form-item> |
|
|
|
<!-- 金币详情独立显示 --> |
|
|
|
<el-form-item style="margin-top: -23px"> <!-- 负边距减少间距 --> |
|
|
|
<span |
|
|
|
style="display: inline; white-space: nowrap; color: #b1b1b1" |
|
|
|
style="color: #b1b1b1; margin-left: 0px" |
|
|
|
v-if="user.nowPermanentGold !== undefined" |
|
|
|
>(永久金币:{{ user.nowPermanentGold /100}};免费金币:{{ |
|
|
|
(user.nowFreeGold) /100 |
|
|
|
}};任务金币:{{ user.nowTaskGold /100}})</span |
|
|
|
> |
|
|
|
>(永久金币:{{ user.nowPermanentGold }}; |
|
|
|
免费金币:{{ user.nowFreeGold }}; |
|
|
|
任务金币:{{ user.nowTaskGold }})</span> |
|
|
|
</el-form-item> |
|
|
|
</el-col> |
|
|
|
<el-col :span="10"> |
|
|
|
</el-row> |
|
|
|
|
|
|
|
<!-- 第三行:首次充值日期 + 充值次数 --> |
|
|
|
<el-row style="margin-top:-23px"> |
|
|
|
<el-col :span="9"> |
|
|
|
<el-form-item label="首次充值日期"> |
|
|
|
<p v-if="user.firstRecharge"> |
|
|
|
{{ moment(user.firstRecharge).format('YYYY-MM-DD HH:mm:ss') }} |
|
|
@ -600,31 +671,23 @@ onMounted(async function () { |
|
|
|
<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-row> |
|
|
|
|
|
|
|
<!-- 第四行:消费次数 + 所属门店 --> |
|
|
|
<el-row> |
|
|
|
<el-col :span="9"> |
|
|
|
<el-form-item label="消费次数"> |
|
|
|
<p style="color: #2fa1ff">{{ user.consumeNum }}</p> |
|
|
|
</el-form-item> |
|
|
|
</el-col> |
|
|
|
<el-col :span="10"> |
|
|
|
<el-col :span="9"> |
|
|
|
<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> |
|
|
|
</el-card> |
|
|
|
|
|
|
|
|
|
|
|
</div> |
|
|
|