5 Commits
fb076705f4
...
2939348502
Author | SHA1 | Message | Date |
---|---|---|---|
|
2939348502 |
金豆增加充值页面的开发
|
1 month ago |
|
b28983900e |
金豆增加充值页面的开发
|
1 month ago |
|
43b0f76e21 |
封装工作台代码
|
1 month ago |
|
afc6726c41 |
Merge branch 'zln1' of http://39.101.133.168:8807/yanjiaqing/gold_vue into zln1
|
1 month ago |
|
1be305a252 |
修改明细字段
|
1 month ago |
14 changed files with 1996 additions and 161 deletions
-
593gold-system/package-lock.json
-
2gold-system/package.json
-
15gold-system/src/main.ts
-
6gold-system/src/router/index.js
-
12gold-system/src/store/area.js
-
174gold-system/src/views/goldBeen/addGoldenBeen.vue
-
495gold-system/src/views/goldBeen/goldenBeenBalance.vue
-
532gold-system/src/views/goldBeen/goldenBeenDetail.vue
-
145gold-system/src/views/index.vue
-
2gold-system/src/views/recharge/allRecharge.vue
-
172gold-system/src/views/workspace/index.vue
-
3gold-system/tsconfig.app.json
-
3gold-system/tsconfig.json
-
3gold-system/tsconfig.node.json
@ -0,0 +1,12 @@ |
|||
import { defineStore } from 'pinia' |
|||
|
|||
export const useAreaStore = defineStore('area', { |
|||
state: () => ({ |
|||
currentArea: '全部', |
|||
}), |
|||
actions: { |
|||
updateArea(newVal) { |
|||
this.currentArea = newVal |
|||
}, |
|||
}, |
|||
}) |
@ -0,0 +1,174 @@ |
|||
<template> |
|||
<div class="add-goldenbeen"> |
|||
<div>新增充值</div> |
|||
<div class="add-box"> |
|||
<el-form |
|||
:model="beenObj" |
|||
ref="Ref" |
|||
:rules="rules" |
|||
label-width="auto" |
|||
style="max-width: 600px" |
|||
class="add-form" |
|||
> |
|||
<el-form-item prop="jwcode" label="精网号"> |
|||
<el-input v-model="beenObj.jwcode" style="width: 220px" /> |
|||
<el-button |
|||
type="primary" |
|||
@click="beenObj.jwcode" |
|||
style="margin-left: 20px" |
|||
>查询</el-button |
|||
> |
|||
</el-form-item> |
|||
<el-form-item prop="type" label="充值类型"> |
|||
<el-radio-group v-model="beenObj.type"> |
|||
<el-radio value="0">增加</el-radio> |
|||
<el-radio label="1">减少</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
<div style="display: flex"> |
|||
<el-form-item prop="payBeean" label="付费金豆"> |
|||
<el-input v-model="beenObj.payBeean" style="width: 50px" /> |
|||
</el-form-item> |
|||
<el-form-item prop="freeBeean" label="免费金豆"> |
|||
<el-input v-model="beenObj.freeBeean" style="width: 50px" /> |
|||
</el-form-item> |
|||
</div> |
|||
|
|||
<el-form-item prop="remark" label="备注"> |
|||
<el-input |
|||
v-model="beenObj.remark" |
|||
style="width: 300px" |
|||
:rows="2" |
|||
maxlength="100" |
|||
show-word-limit |
|||
type="textarea" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item prop="submitter" label="提交人"> |
|||
<el-input |
|||
style="width: 300px" |
|||
:value="beenObj.submitter" |
|||
disabled |
|||
placeholder="提交人姓名" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item> |
|||
<div class="btn-group"> |
|||
<el-button @click="deleteRecharge">重置</el-button> |
|||
<el-button type="primary" @click="addBean"> 提交 </el-button> |
|||
</div> |
|||
</el-form-item> |
|||
</el-form> |
|||
<!-- 客户信息栏 --> |
|||
<el-card> |
|||
<el-text size="large" style="margin-left: 20px">客户信息</el-text> |
|||
<div class="custom-box"> |
|||
<el-text>姓名:{{ user.name }}</el-text> |
|||
<el-text>当前付费金豆:</el-text> |
|||
<el-text>精网号:{{ user.jwcode }}</el-text> |
|||
<el-text>当前免费金豆:</el-text> |
|||
<el-text>负责客服:</el-text> |
|||
<el-text>消费次数:</el-text> |
|||
<el-text>所属门店</el-text> |
|||
</div> |
|||
</el-card> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
<script setup> |
|||
import { reactive, ref } from 'vue' |
|||
import API from '@/util/http' |
|||
const beenObj = ref({ |
|||
jwcode: '', |
|||
remark: '', |
|||
submitter: '', |
|||
type: '0', |
|||
payBeean: 0, |
|||
freeBeean: 0 |
|||
}) |
|||
const user = reactive({}) |
|||
const adminData = reactive({}) |
|||
const rules = ref({ |
|||
jwcode: [{ required: true, message: '请输入精网号', trigger: 'blur' }], |
|||
remark: [{ required: true, message: '请输入备注', trigger: 'blur' }], |
|||
submitter: [{ required: true, message: '请输入提交人', trigger: 'blur' }], |
|||
type: [{ required: true, message: '请选择充值类型', trigger: 'change' }], |
|||
payBeean: [{ required: true, message: '请输入付费金豆', trigger: 'blur' }], |
|||
freeBeean: [{ required: true, message: '请输入免费金豆', trigger: 'blur' }] |
|||
}) |
|||
const addBean = () => { |
|||
// 提交表单 |
|||
bean.value.validate((valid) => { |
|||
if (valid) { |
|||
// 处理表单提交逻辑 |
|||
console.log('表单提交成功', beenObj.value) |
|||
} else { |
|||
console.log('表单验证失败') |
|||
return false |
|||
} |
|||
}) |
|||
} |
|||
|
|||
const getUser = async function (jwcode) { |
|||
try { |
|||
// 发送POST请求 |
|||
const result = await API({ |
|||
url: '/recharge/user', |
|||
data: { |
|||
jwcode: jwcode, |
|||
area: adminData.area |
|||
} |
|||
}) |
|||
if (result.code === 0) { |
|||
ElMessage.error(result.msg) |
|||
} else { |
|||
user = result.data |
|||
user.A = |
|||
Number(user.pendingRechargeTimes) + Number(user.pendingSpendTimes) |
|||
ElMessage.success(result.msg) |
|||
} |
|||
} catch (error) { |
|||
console.log('请求失败', error) |
|||
ElMessage.error('查询失败,请检查精网号是否正确') |
|||
} |
|||
} |
|||
const getAdminData = async function () { |
|||
try { |
|||
const result = await API({ |
|||
url: '/admin/userinfo', |
|||
data: {} |
|||
}) |
|||
adminData = result |
|||
} catch (error) { |
|||
console.log('请求失败', error) |
|||
} |
|||
} |
|||
getAdminData() |
|||
</script> |
|||
<style scoped> |
|||
.add-box { |
|||
display: flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
column-gap: 50px; |
|||
} |
|||
.btn-group { |
|||
display: flex; |
|||
justify-content: flex-end; |
|||
width: 100%; |
|||
} |
|||
.custom-box { |
|||
padding: 20px; |
|||
display: flex; |
|||
flex-wrap: wrap; |
|||
align-items: center; |
|||
row-gap: 20px; |
|||
box-sizing: border-box; |
|||
.el-text { |
|||
width: 200px; |
|||
} |
|||
} |
|||
.el-card { |
|||
width: 500px; |
|||
} |
|||
</style> |
@ -0,0 +1,495 @@ |
|||
<template> |
|||
<div class="filter-box"> |
|||
<el-form> |
|||
<el-form-item label="精网号"> |
|||
<el-input |
|||
v-model="detailY.jwcode" |
|||
placeholder="请输入精网号" |
|||
style="width: 220px" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="地区"> |
|||
<el-select |
|||
v-model="detailY.area" |
|||
placeholder="请选择所属地区" |
|||
style="width: 240px" |
|||
clearable |
|||
> |
|||
<el-option |
|||
v-for="item in area" |
|||
:key="item.value" |
|||
:label="item.label" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
</el-form> |
|||
</div> |
|||
<div class="table-box"> |
|||
<p>金豆总数:充值金豆总数:合计新币数</p> |
|||
<el-table |
|||
:data="tableData" |
|||
style="width: 100%" |
|||
:default-sort="{ prop: 'createTime', order: 'descending' }" |
|||
height="584px" |
|||
> |
|||
<el-table-column type="index" label="序号" width="100px" fixed="left"> |
|||
<template #default="scope"> |
|||
<span>{{ |
|||
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize |
|||
}}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column fixed="left" prop="username" label="姓名" width="150" /> |
|||
<el-table-column fixed="left" prop="jwcode" label="精网号" width="120" /> |
|||
<el-table-column prop="area" label="所属地区" width="120" /> |
|||
<el-table-column prop="type" label="类型" width="110"> |
|||
<!-- 模板内容 --> |
|||
<template #default="scope"> |
|||
<span v-if="scope.row.updateType == 1"> |
|||
<span>消费</span> |
|||
</span> |
|||
<span v-if="scope.row.updateType == 0"> |
|||
<span>充值</span> |
|||
</span> |
|||
<span v-if="scope.row.updateType == 2"> |
|||
<span>退款</span> |
|||
</span> |
|||
<span v-if="scope.row.updateType == 3"> |
|||
<span>其他</span> |
|||
</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="order" label="订单号" width="120" /> |
|||
<el-table-column prop="been" label="金豆数量" width="120"> |
|||
<template #default="scope"> |
|||
<span>{{ scope.row.gold / 100 }}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="paybeen" label="付费金豆" width="120"> |
|||
<template #default="scope"> |
|||
<span>{{ scope.row.paybeen / 100 }}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="freebeen" label="免费金豆" width="120"> |
|||
<template #default="scope"> |
|||
<span>{{ scope.row.freebeen / 100 }}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="count" label="金额"></el-table-column> |
|||
<el-table-column prop="consumePlatform" label="充值平台" width="140"> |
|||
<template #default="scope"> |
|||
<!-- 使用非严格相等比较 --> |
|||
<span v-if="scope.row.consumePlatform == 0">初始化金币</span> |
|||
<span v-if="scope.row.consumePlatform == 1">ERP系统</span> |
|||
<span v-if="scope.row.consumePlatform == 3">Homily Link</span> |
|||
<span v-if="scope.row.consumePlatform == 2">Homily Chart</span> |
|||
<span v-if="scope.row.consumePlatform == 4">金币系统</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="notes" label="备注" width="210"></el-table-column> |
|||
<el-table-column |
|||
prop="createTime" |
|||
sortable="“custom”" |
|||
label="充值时间" |
|||
width="210" |
|||
show-overflow-tooltip |
|||
> |
|||
<template #default="scope"> |
|||
<span>{{ |
|||
moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') |
|||
}}</span> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<!-- 分页 --> |
|||
<div class="pagination"> |
|||
<el-pagination |
|||
background |
|||
:page-size="getObj.pageSize" |
|||
layout="slot" |
|||
:total="total" |
|||
> |
|||
<div>共{{ total }}条,每页</div> |
|||
<el-select |
|||
v-model="getObj.pageSize" |
|||
class="page-size" |
|||
@change="get()" |
|||
style="width: 80px" |
|||
> |
|||
<el-option |
|||
v-for="item in [5, 10, 20, 50, 100]" |
|||
:key="item" |
|||
:label="item" |
|||
:value="item" |
|||
></el-option> |
|||
</el-select> |
|||
<div>条</div> |
|||
</el-pagination> |
|||
<el-pagination |
|||
background |
|||
layout="prev, pager, next,slot" |
|||
:page-size="getObj.pageSize" |
|||
:total="total" |
|||
:current-page="getObj.pageNum" |
|||
@current-change="get" |
|||
> |
|||
<div>跳至</div> |
|||
<el-input |
|||
v-model="getObj.pageNum" |
|||
style="width: 40px" |
|||
@change="checkNumber" |
|||
/> |
|||
<div>页</div> |
|||
</el-pagination> |
|||
</div> |
|||
</div> |
|||
|
|||
<!-- 这是导出excel的弹窗 --> |
|||
<el-dialog |
|||
v-model="getPutEX" |
|||
title="请选择导出条件" |
|||
width="500" |
|||
:close-on-click-modal="false" |
|||
> |
|||
<template #footer> |
|||
<el-form |
|||
v-loading="loading" |
|||
ref="ruleFormRef" |
|||
style="max-width: 600px" |
|||
:model="putExcel" |
|||
:rules="rules" |
|||
label-width="auto" |
|||
class="demo-ruleForm" |
|||
:size="formSize" |
|||
status-icon |
|||
> |
|||
<el-form-item prop="activityName" label="精网号:"> |
|||
<el-input |
|||
v-model="putExcel.jwcode" |
|||
placeholder="请输入精网号" |
|||
style="width: 220px" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="所属地区:" |
|||
><el-select |
|||
v-model="putExcel.area" |
|||
placeholder="请选择所属地区" |
|||
style="width: 240px" |
|||
clearable |
|||
> |
|||
<el-option |
|||
v-for="item in area" |
|||
:key="item.value" |
|||
:label="item.label" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item label="更新时间:"> |
|||
<el-radio-group v-model="TimeGet"> |
|||
<el-radio value="1" @click="getT()">今天</el-radio> |
|||
<el-radio value="3" @click="get3()">近三天</el-radio> |
|||
<el-radio value="7" @click="get7()">近一周</el-radio> |
|||
<el-radio value="30" @click="get30()">近一个月</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
<el-button |
|||
type="primary" |
|||
size="small" |
|||
style="margin-left: 10px" |
|||
@click="areyour()" |
|||
>确定</el-button |
|||
> |
|||
</el-form> |
|||
</template> |
|||
</el-dialog> |
|||
<el-dialog |
|||
v-model="areyouright" |
|||
title="" |
|||
width="500" |
|||
:close-on-click-modal="false" |
|||
> |
|||
<el-button type="success" @click="exportExcel()">导出</el-button> |
|||
</el-dialog> |
|||
</template> |
|||
<script setup> |
|||
import { ref, onMounted, reactive, computed } from 'vue' |
|||
import { ElMessage, ElMessageBox } from 'element-plus' |
|||
import moment from 'moment' |
|||
import API from '@/util/http' |
|||
import * as XLSX from 'xlsx' |
|||
//这是获取用户信息的接口 |
|||
const adminData = ref({}) |
|||
// 充值明细表格 |
|||
const tableData = ref([]) |
|||
//分页总条目 |
|||
const total = ref(100) |
|||
//搜索表单数据 |
|||
const detailY = ref({}) |
|||
//初始化 |
|||
const get = async function (val) { |
|||
try { |
|||
// 地区赋值 |
|||
if (adminData.value.area === '泰国') { |
|||
detailY.value.areas = ['泰国', '越南'] |
|||
} else if (adminData.value.area !== '总部') { |
|||
detailY.value.area = adminData.value.area |
|||
} |
|||
// 搜索参数页码赋值 |
|||
if (typeof val === 'number') { |
|||
getObj.value.pageNum = val |
|||
} |
|||
// 搜索参数时间赋值 |
|||
if (getTime.value != null) { |
|||
if (getTime.value.startDate != '' && getTime.value.endDate != '') { |
|||
detailY.value.startDate = getTime.value[0] |
|||
detailY.value.endDate = getTime.value[1] |
|||
} |
|||
} else { |
|||
detailY.value.startDate = '' |
|||
detailY.value.endDate = '' |
|||
} |
|||
// 添加排序字段和排序方式到请求参数 |
|||
detailY.value.sortField = sortField.value |
|||
detailY.value.sortOrder = sortOrder.value |
|||
console.log('搜索参数', getObj.value) |
|||
// 发送POST请求 |
|||
const result = await API({ |
|||
url: '/detailY', |
|||
method: 'post', |
|||
data: { ...getObj.value, detailY: { ...detailY.value } } |
|||
}) |
|||
tableData.value = result.data.list |
|||
console.log('tableData', tableData.value) |
|||
total.value = result.data.total |
|||
console.log('total', total.value) |
|||
} catch (error) { |
|||
console.log('请求失败', error) |
|||
// 在这里可以处理错误逻辑,比如显示错误提示等 |
|||
} |
|||
} |
|||
// 搜索 |
|||
const search = function () {} |
|||
// 重置 |
|||
const reset = function () {} |
|||
|
|||
// 验证跳转输入框的数字是否合法 |
|||
const checkNumber = function () { |
|||
if (typeof parseInt(getObj.value.pageNum) === 'number') { |
|||
console.log('总共有多少页' + Math.ceil(total.value / getObj.value.pageSize)) |
|||
if ( |
|||
getObj.value.pageNum > 0 && |
|||
getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize) |
|||
) { |
|||
getObj.value.pageNum = parseInt(getObj.value.pageNum) |
|||
console.log('输入的数字合法') |
|||
get() |
|||
} else { |
|||
//提示 |
|||
ElMessage({ |
|||
type: 'error', |
|||
message: '请检查输入内容' |
|||
}) |
|||
} |
|||
} else { |
|||
//提示 |
|||
ElMessage({ |
|||
type: 'error', |
|||
message: '请检查输入内容' |
|||
}) |
|||
} |
|||
} |
|||
|
|||
// 挂载 |
|||
onMounted(async function () { |
|||
await getAdminData() |
|||
await get() |
|||
}) |
|||
|
|||
// 这是导出excel表格的方法 |
|||
// 导出Excel的方法 |
|||
// 定义字段映射 |
|||
const json_fields = (row) => { |
|||
return [ |
|||
row.jwcode, // 姓名 |
|||
row.area, // 精网号 |
|||
row.platform, // 所属地区 |
|||
row.consumePlatform, // 平台信息 |
|||
row.gold, // 更新数量 |
|||
row.rechargeCoin, // 免费金币 |
|||
row.freeCoin, // 永久金币 |
|||
row.taskCoin, // 任务金币 |
|||
row.createAdmin, // 提交人 |
|||
row.createTime, |
|||
row.name, |
|||
row.id |
|||
] |
|||
} |
|||
|
|||
const headers = [ |
|||
'精网号', |
|||
'地区', |
|||
'平台信息', |
|||
'数量', |
|||
'更新类型', |
|||
'永久金币', |
|||
'免费金币', |
|||
'任务金币', |
|||
'提交人', |
|||
'更新时间', |
|||
'用户名', |
|||
'id' |
|||
] |
|||
const exportExcel = () => { |
|||
// 先将 json_fields 应用到数据上 |
|||
const data = excelInfo.value.map(json_fields) |
|||
const ws = XLSX.utils.aoa_to_sheet(data) |
|||
// 添加表头到工作表 |
|||
XLSX.utils.sheet_add_aoa(ws, [headers], { origin: 'A1' }) |
|||
const wb = XLSX.utils.book_new() |
|||
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1') |
|||
XLSX.writeFile(wb, '客户金币明细.xlsx') |
|||
} |
|||
const today = new Date() |
|||
const startDate = new Date( |
|||
today.getFullYear(), |
|||
today.getMonth(), |
|||
today.getDate() |
|||
) |
|||
const endDate = new Date( |
|||
today.getFullYear(), |
|||
today.getMonth(), |
|||
today.getDate() + 1 |
|||
) |
|||
const putExcel = ref({ |
|||
startDate: startDate, |
|||
endDate: endDate |
|||
}) |
|||
const excelInfo = ref({}) |
|||
const loading = ref(false) |
|||
const areyour = async function () { |
|||
try { |
|||
loading.value = true |
|||
const result = await API({ |
|||
url: '/detailY/searchAll', |
|||
method: 'post', |
|||
data: { ...putExcel.value } |
|||
}) |
|||
excelInfo.value = result.data |
|||
|
|||
// 处理 excelInfo 中的数据 |
|||
if (Array.isArray(excelInfo.value)) { |
|||
excelInfo.value.forEach((item) => { |
|||
if (item.rechargeCoin) { |
|||
item.rechargeCoin = item.rechargeCoin / 100 |
|||
} |
|||
if (item.freeCoin) { |
|||
item.freeCoin = item.freeCoin / 100 |
|||
} |
|||
if (item.taskCoin) { |
|||
item.taskCoin = item.taskCoin / 100 |
|||
} |
|||
}) |
|||
} |
|||
|
|||
areyouright.value = true |
|||
ElMessage({ |
|||
type: 'success', |
|||
message: '查询成功' |
|||
}) |
|||
loading.value = false |
|||
} catch (error) { |
|||
console.log('请求失败', error) |
|||
loading.value = false |
|||
} |
|||
} |
|||
|
|||
const areyouright = ref(false) |
|||
|
|||
//选地区 |
|||
const area = [ |
|||
{ |
|||
value: '马来西亚', |
|||
label: '马来西亚' |
|||
}, |
|||
{ |
|||
value: '新加坡', |
|||
label: '新加坡' |
|||
}, |
|||
{ |
|||
value: '香港', |
|||
label: '香港' |
|||
}, |
|||
{ |
|||
value: '泰国', |
|||
label: '泰国' |
|||
}, |
|||
{ |
|||
value: '加拿大', |
|||
label: '加拿大' |
|||
}, |
|||
{ |
|||
value: '越南HCM', |
|||
label: '越南HCM' |
|||
} |
|||
] |
|||
//选消费平台 |
|||
const platform = [ |
|||
{ |
|||
value: '4', |
|||
label: '金币系统' |
|||
}, |
|||
|
|||
{ |
|||
value: '1', |
|||
label: 'ERP系统' |
|||
}, |
|||
{ |
|||
value: '2', |
|||
label: 'Homily Chart' |
|||
}, |
|||
{ |
|||
value: '3', |
|||
label: 'Homily Link' |
|||
}, |
|||
{ |
|||
value: '0', |
|||
label: '初始化金币' |
|||
} |
|||
] |
|||
const TimeGet = ref('1') |
|||
</script> |
|||
<style scoped lang="scss"> |
|||
.filter-box { |
|||
width: 100%; |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
padding: 20px; |
|||
padding-bottom: 0px; |
|||
box-sizing: border-box; |
|||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); |
|||
margin-bottom: 20px; |
|||
border-radius: 5px; |
|||
.el-form { |
|||
display: flex; |
|||
flex-wrap: wrap; |
|||
row-gap: 20px; |
|||
column-gap: 20px; |
|||
} |
|||
} |
|||
.table-box { |
|||
width: 100%; |
|||
padding: 20px; |
|||
box-sizing: border-box; |
|||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); |
|||
border-radius: 5px; |
|||
} |
|||
.pagination { |
|||
display: flex; |
|||
align-items: center; |
|||
margin-top: 20px; |
|||
} |
|||
</style> |
@ -0,0 +1,532 @@ |
|||
<template> |
|||
<div class="filter-box"> |
|||
<el-form> |
|||
<el-form-item label="精网号"> |
|||
<el-input |
|||
v-model="detailY.jwcode" |
|||
placeholder="请输入精网号" |
|||
style="width: 220px" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="地区"> |
|||
<el-select |
|||
v-model="detailY.area" |
|||
placeholder="请选择所属地区" |
|||
style="width: 240px" |
|||
clearable |
|||
> |
|||
<el-option |
|||
v-for="item in area" |
|||
:key="item.value" |
|||
:label="item.label" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
<el-form-item label="订单号"> |
|||
<el-input |
|||
v-model="detailY.order" |
|||
placeholder="请输入订单号" |
|||
style="width: 220px" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="充值平台"> |
|||
<el-select |
|||
v-model="detailY.platform" |
|||
placeholder="请选择充值平台" |
|||
style="width: 240px" |
|||
clearable |
|||
> |
|||
<el-option |
|||
v-for="item in area" |
|||
:key="item.value" |
|||
:label="item.label" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
<el-form-item label="充值时间"> |
|||
<el-date-picker |
|||
v-model="detailY.createTime" |
|||
type="daterange" |
|||
start-placeholder="开始日期" |
|||
end-placeholder="结束日期" |
|||
value-format="yyyy-MM-dd HH:mm:ss" |
|||
style="width: 240px" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item> |
|||
<el-button type="primary" @click="search">查询</el-button> |
|||
<el-button type="success" @click="reset">重置</el-button> |
|||
<el-button type="info">导出excel</el-button> |
|||
</el-form-item> |
|||
</el-form> |
|||
</div> |
|||
<div class="table-box"> |
|||
<p>金豆总数:充值金豆总数:合计新币数</p> |
|||
<el-table |
|||
:data="tableData" |
|||
style="width: 100%" |
|||
:default-sort="{ prop: 'createTime', order: 'descending' }" |
|||
height="584px" |
|||
> |
|||
<el-table-column type="index" label="序号" width="100px" fixed="left"> |
|||
<template #default="scope"> |
|||
<span>{{ |
|||
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize |
|||
}}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column fixed="left" prop="username" label="姓名" width="150" /> |
|||
<el-table-column fixed="left" prop="jwcode" label="精网号" width="120" /> |
|||
<el-table-column prop="area" label="所属地区" width="120" /> |
|||
<el-table-column prop="type" label="类型" width="110"> |
|||
<!-- 模板内容 --> |
|||
<template #default="scope"> |
|||
<span v-if="scope.row.updateType == 1"> |
|||
<span>消费</span> |
|||
</span> |
|||
<span v-if="scope.row.updateType == 0"> |
|||
<span>充值</span> |
|||
</span> |
|||
<span v-if="scope.row.updateType == 2"> |
|||
<span>退款</span> |
|||
</span> |
|||
<span v-if="scope.row.updateType == 3"> |
|||
<span>其他</span> |
|||
</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="order" label="订单号" width="120" /> |
|||
<el-table-column prop="been" label="金豆数量" width="120"> |
|||
<template #default="scope"> |
|||
<span>{{ scope.row.gold / 100 }}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="paybeen" label="付费金豆" width="120"> |
|||
<template #default="scope"> |
|||
<span>{{ scope.row.paybeen / 100 }}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="freebeen" label="免费金豆" width="120"> |
|||
<template #default="scope"> |
|||
<span>{{ scope.row.freebeen / 100 }}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="count" label="金额"></el-table-column> |
|||
<el-table-column prop="consumePlatform" label="充值平台" width="140"> |
|||
<template #default="scope"> |
|||
<!-- 使用非严格相等比较 --> |
|||
<span v-if="scope.row.consumePlatform == 0">初始化金币</span> |
|||
<span v-if="scope.row.consumePlatform == 1">ERP系统</span> |
|||
<span v-if="scope.row.consumePlatform == 3">Homily Link</span> |
|||
<span v-if="scope.row.consumePlatform == 2">Homily Chart</span> |
|||
<span v-if="scope.row.consumePlatform == 4">金币系统</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="notes" label="备注" width="210"></el-table-column> |
|||
<el-table-column |
|||
prop="createTime" |
|||
sortable="“custom”" |
|||
label="充值时间" |
|||
width="210" |
|||
show-overflow-tooltip |
|||
> |
|||
<template #default="scope"> |
|||
<span>{{ |
|||
moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') |
|||
}}</span> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<!-- 分页 --> |
|||
<div class="pagination"> |
|||
<el-pagination |
|||
background |
|||
:page-size="getObj.pageSize" |
|||
layout="slot" |
|||
:total="total" |
|||
> |
|||
<div>共{{ total }}条,每页</div> |
|||
<el-select |
|||
v-model="getObj.pageSize" |
|||
class="page-size" |
|||
@change="get()" |
|||
style="width: 80px" |
|||
> |
|||
<el-option |
|||
v-for="item in [5, 10, 20, 50, 100]" |
|||
:key="item" |
|||
:label="item" |
|||
:value="item" |
|||
></el-option> |
|||
</el-select> |
|||
<div>条</div> |
|||
</el-pagination> |
|||
<el-pagination |
|||
background |
|||
layout="prev, pager, next,slot" |
|||
:page-size="getObj.pageSize" |
|||
:total="total" |
|||
:current-page="getObj.pageNum" |
|||
@current-change="get" |
|||
> |
|||
<div>跳至</div> |
|||
<el-input |
|||
v-model="getObj.pageNum" |
|||
style="width: 40px" |
|||
@change="checkNumber" |
|||
/> |
|||
<div>页</div> |
|||
</el-pagination> |
|||
</div> |
|||
</div> |
|||
|
|||
<!-- 这是导出excel的弹窗 --> |
|||
<el-dialog |
|||
v-model="getPutEX" |
|||
title="请选择导出条件" |
|||
width="500" |
|||
:close-on-click-modal="false" |
|||
> |
|||
<template #footer> |
|||
<el-form |
|||
v-loading="loading" |
|||
ref="ruleFormRef" |
|||
style="max-width: 600px" |
|||
:model="putExcel" |
|||
:rules="rules" |
|||
label-width="auto" |
|||
class="demo-ruleForm" |
|||
:size="formSize" |
|||
status-icon |
|||
> |
|||
<el-form-item prop="activityName" label="精网号:"> |
|||
<el-input |
|||
v-model="putExcel.jwcode" |
|||
placeholder="请输入精网号" |
|||
style="width: 220px" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="所属地区:" |
|||
><el-select |
|||
v-model="putExcel.area" |
|||
placeholder="请选择所属地区" |
|||
style="width: 240px" |
|||
clearable |
|||
> |
|||
<el-option |
|||
v-for="item in area" |
|||
:key="item.value" |
|||
:label="item.label" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<el-form-item label="更新时间:"> |
|||
<el-radio-group v-model="TimeGet"> |
|||
<el-radio value="1" @click="getT()">今天</el-radio> |
|||
<el-radio value="3" @click="get3()">近三天</el-radio> |
|||
<el-radio value="7" @click="get7()">近一周</el-radio> |
|||
<el-radio value="30" @click="get30()">近一个月</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
<el-button |
|||
type="primary" |
|||
size="small" |
|||
style="margin-left: 10px" |
|||
@click="areyour()" |
|||
>确定</el-button |
|||
> |
|||
</el-form> |
|||
</template> |
|||
</el-dialog> |
|||
<el-dialog |
|||
v-model="areyouright" |
|||
title="" |
|||
width="500" |
|||
:close-on-click-modal="false" |
|||
> |
|||
<el-button type="success" @click="exportExcel()">导出</el-button> |
|||
</el-dialog> |
|||
</template> |
|||
<script setup> |
|||
import { ref, onMounted, reactive, computed } from 'vue' |
|||
import { ElMessage, ElMessageBox } from 'element-plus' |
|||
import moment from 'moment' |
|||
import API from '@/util/http' |
|||
import * as XLSX from 'xlsx' |
|||
//这是获取用户信息的接口 |
|||
const adminData = ref({}) |
|||
// 充值明细表格 |
|||
const tableData = ref([]) |
|||
//分页总条目 |
|||
const total = ref(100) |
|||
//搜索表单数据 |
|||
const detailY = ref({}) |
|||
//初始化 |
|||
const get = async function (val) { |
|||
try { |
|||
// 地区赋值 |
|||
if (adminData.value.area === '泰国') { |
|||
detailY.value.areas = ['泰国', '越南'] |
|||
} else if (adminData.value.area !== '总部') { |
|||
detailY.value.area = adminData.value.area |
|||
} |
|||
// 搜索参数页码赋值 |
|||
if (typeof val === 'number') { |
|||
getObj.value.pageNum = val |
|||
} |
|||
// 搜索参数时间赋值 |
|||
if (getTime.value != null) { |
|||
if (getTime.value.startDate != '' && getTime.value.endDate != '') { |
|||
detailY.value.startDate = getTime.value[0] |
|||
detailY.value.endDate = getTime.value[1] |
|||
} |
|||
} else { |
|||
detailY.value.startDate = '' |
|||
detailY.value.endDate = '' |
|||
} |
|||
// 添加排序字段和排序方式到请求参数 |
|||
detailY.value.sortField = sortField.value |
|||
detailY.value.sortOrder = sortOrder.value |
|||
console.log('搜索参数', getObj.value) |
|||
// 发送POST请求 |
|||
const result = await API({ |
|||
url: '/detailY', |
|||
method: 'post', |
|||
data: { ...getObj.value, detailY: { ...detailY.value } } |
|||
}) |
|||
tableData.value = result.data.list |
|||
console.log('tableData', tableData.value) |
|||
total.value = result.data.total |
|||
console.log('total', total.value) |
|||
} catch (error) { |
|||
console.log('请求失败', error) |
|||
// 在这里可以处理错误逻辑,比如显示错误提示等 |
|||
} |
|||
} |
|||
// 搜索 |
|||
const search = function () {} |
|||
// 重置 |
|||
const reset = function () {} |
|||
|
|||
// 验证跳转输入框的数字是否合法 |
|||
const checkNumber = function () { |
|||
if (typeof parseInt(getObj.value.pageNum) === 'number') { |
|||
console.log('总共有多少页' + Math.ceil(total.value / getObj.value.pageSize)) |
|||
if ( |
|||
getObj.value.pageNum > 0 && |
|||
getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize) |
|||
) { |
|||
getObj.value.pageNum = parseInt(getObj.value.pageNum) |
|||
console.log('输入的数字合法') |
|||
get() |
|||
} else { |
|||
//提示 |
|||
ElMessage({ |
|||
type: 'error', |
|||
message: '请检查输入内容' |
|||
}) |
|||
} |
|||
} else { |
|||
//提示 |
|||
ElMessage({ |
|||
type: 'error', |
|||
message: '请检查输入内容' |
|||
}) |
|||
} |
|||
} |
|||
|
|||
// 挂载 |
|||
onMounted(async function () { |
|||
await getAdminData() |
|||
await get() |
|||
}) |
|||
|
|||
// 这是导出excel表格的方法 |
|||
// 导出Excel的方法 |
|||
// 定义字段映射 |
|||
const json_fields = (row) => { |
|||
return [ |
|||
row.jwcode, // 姓名 |
|||
row.area, // 精网号 |
|||
row.platform, // 所属地区 |
|||
row.consumePlatform, // 平台信息 |
|||
row.gold, // 更新数量 |
|||
row.rechargeCoin, // 免费金币 |
|||
row.freeCoin, // 永久金币 |
|||
row.taskCoin, // 任务金币 |
|||
row.createAdmin, // 提交人 |
|||
row.createTime, |
|||
row.name, |
|||
row.id |
|||
] |
|||
} |
|||
|
|||
const headers = [ |
|||
'精网号', |
|||
'地区', |
|||
'平台信息', |
|||
'数量', |
|||
'更新类型', |
|||
'永久金币', |
|||
'免费金币', |
|||
'任务金币', |
|||
'提交人', |
|||
'更新时间', |
|||
'用户名', |
|||
'id' |
|||
] |
|||
const exportExcel = () => { |
|||
// 先将 json_fields 应用到数据上 |
|||
const data = excelInfo.value.map(json_fields) |
|||
const ws = XLSX.utils.aoa_to_sheet(data) |
|||
// 添加表头到工作表 |
|||
XLSX.utils.sheet_add_aoa(ws, [headers], { origin: 'A1' }) |
|||
const wb = XLSX.utils.book_new() |
|||
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1') |
|||
XLSX.writeFile(wb, '客户金币明细.xlsx') |
|||
} |
|||
const today = new Date() |
|||
const startDate = new Date( |
|||
today.getFullYear(), |
|||
today.getMonth(), |
|||
today.getDate() |
|||
) |
|||
const endDate = new Date( |
|||
today.getFullYear(), |
|||
today.getMonth(), |
|||
today.getDate() + 1 |
|||
) |
|||
const putExcel = ref({ |
|||
startDate: startDate, |
|||
endDate: endDate |
|||
}) |
|||
const excelInfo = ref({}) |
|||
const loading = ref(false) |
|||
const areyour = async function () { |
|||
try { |
|||
loading.value = true |
|||
const result = await API({ |
|||
url: '/detailY/searchAll', |
|||
method: 'post', |
|||
data: { ...putExcel.value } |
|||
}) |
|||
excelInfo.value = result.data |
|||
|
|||
// 处理 excelInfo 中的数据 |
|||
if (Array.isArray(excelInfo.value)) { |
|||
excelInfo.value.forEach((item) => { |
|||
if (item.rechargeCoin) { |
|||
item.rechargeCoin = item.rechargeCoin / 100 |
|||
} |
|||
if (item.freeCoin) { |
|||
item.freeCoin = item.freeCoin / 100 |
|||
} |
|||
if (item.taskCoin) { |
|||
item.taskCoin = item.taskCoin / 100 |
|||
} |
|||
}) |
|||
} |
|||
|
|||
areyouright.value = true |
|||
ElMessage({ |
|||
type: 'success', |
|||
message: '查询成功' |
|||
}) |
|||
loading.value = false |
|||
} catch (error) { |
|||
console.log('请求失败', error) |
|||
loading.value = false |
|||
} |
|||
} |
|||
|
|||
const areyouright = ref(false) |
|||
|
|||
//选地区 |
|||
const area = [ |
|||
{ |
|||
value: '马来西亚', |
|||
label: '马来西亚' |
|||
}, |
|||
{ |
|||
value: '新加坡', |
|||
label: '新加坡' |
|||
}, |
|||
{ |
|||
value: '香港', |
|||
label: '香港' |
|||
}, |
|||
{ |
|||
value: '泰国', |
|||
label: '泰国' |
|||
}, |
|||
{ |
|||
value: '加拿大', |
|||
label: '加拿大' |
|||
}, |
|||
{ |
|||
value: '越南HCM', |
|||
label: '越南HCM' |
|||
} |
|||
] |
|||
//选消费平台 |
|||
const platform = [ |
|||
{ |
|||
value: '4', |
|||
label: '金币系统' |
|||
}, |
|||
|
|||
{ |
|||
value: '1', |
|||
label: 'ERP系统' |
|||
}, |
|||
{ |
|||
value: '2', |
|||
label: 'Homily Chart' |
|||
}, |
|||
{ |
|||
value: '3', |
|||
label: 'Homily Link' |
|||
}, |
|||
{ |
|||
value: '0', |
|||
label: '初始化金币' |
|||
} |
|||
] |
|||
const TimeGet = ref('1') |
|||
</script> |
|||
<style scoped lang="scss"> |
|||
.filter-box { |
|||
width: 100%; |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
padding: 20px; |
|||
padding-bottom: 0px; |
|||
box-sizing: border-box; |
|||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); |
|||
margin-bottom: 20px; |
|||
border-radius: 5px; |
|||
.el-form { |
|||
display: flex; |
|||
flex-wrap: wrap; |
|||
row-gap: 20px; |
|||
column-gap: 20px; |
|||
} |
|||
} |
|||
.table-box { |
|||
width: 100%; |
|||
padding: 20px; |
|||
box-sizing: border-box; |
|||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); |
|||
border-radius: 5px; |
|||
} |
|||
.pagination { |
|||
display: flex; |
|||
align-items: center; |
|||
margin-top: 20px; |
|||
} |
|||
</style> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue