Browse Source

Merge branch 'milestone-20250913-现金管理' into zhangrenyuan/feature-20250917134308-现金管理

lihui/feature-20250915101448-现金管理
zhangrenyuan 3 weeks ago
parent
commit
3bf91fe3d5
  1. 2
      package.json
  2. 105
      src/router/index.js
  3. 5
      src/utils/menuTreePermission.js
  4. 9
      src/utils/menuUtils.js
  5. 257
      src/views/audit/bean/beanAudit.vue
  6. 20
      src/views/audit/gold/audit.vue
  7. 105
      src/views/audit/gold/rechargeAudit.vue
  8. 178
      src/views/audit/gold/refundAudit.vue
  9. 16
      src/views/consume/bean/beanConsume.vue
  10. 10
      src/views/consume/gold/coinConsume.vue
  11. 234
      src/views/history/history.vue
  12. 119
      src/views/history/newHistory.vue
  13. 117
      src/views/history/oldHistory.vue
  14. 28
      src/views/managerecharge/rate.vue
  15. 33
      src/views/permissions/permissions.vue
  16. 78
      src/views/permissions/rolePermission.vue
  17. 73
      src/views/permissions/userPermission.vue
  18. 12
      src/views/recharge/bean/beanRecharge.vue
  19. 8
      src/views/recharge/gold/coinRecharge.vue
  20. 9
      src/views/refund/gold/addCoinRefund.vue
  21. 726
      src/views/refund/gold/addNewCoinRefund.vue
  22. 12
      src/views/refund/gold/coinRefund.vue
  23. 27
      src/views/refund/gold/coinRefundDetail.vue
  24. 9
      src/views/usergold/bean/userbean.vue
  25. 8
      src/views/usergold/gold/clientCount.vue
  26. 22
      src/views/usergold/gold/clientCountBalance.vue
  27. 53
      src/views/usergold/gold/clientCountDetail.vue

2
package.json

@ -8,7 +8,7 @@
"dev": "vite --host 0.0.0.0", "dev": "vite --host 0.0.0.0",
"build:test": "vite build --mode test", "build:test": "vite build --mode test",
"build:prod": "vite build --mode production", "build:prod": "vite build --mode production",
"preview": "vite preview",
"prev` iew": "vite preview",
"serve": "vite - service serve --host 0.0.0.0 --port 8080" "serve": "vite - service serve --host 0.0.0.0 --port 8080"
}, },
"dependencies": { "dependencies": {

105
src/router/index.js

@ -25,19 +25,20 @@ const routes = [
path: 'workbench', path: 'workbench',
name: "workbench", name: "workbench",
component: () => import("../views/workspace/index.vue"), component: () => import("../views/workspace/index.vue"),
meta: { permissionId: 10 } // 对应"工作台展示"id=10
meta: { permissionId: 13 } //
}, },
//金币管理
{ {
path: '/goldManage', path: '/goldManage',
name: 'goldManage', name: 'goldManage',
meta:{permissionId:3},
children: [ children: [
// 审核 // 审核
{ {
path: '/audit', path: '/audit',
name: "audit", name: "audit",
component: () => import("../views/audit/gold/audit.vue"), component: () => import("../views/audit/gold/audit.vue"),
meta: { permissionId: 40 },
meta: { permissionId: 14 },
// redirect: '/index', // redirect: '/index',
children: [ children: [
// 充值审核 // 充值审核
@ -45,21 +46,30 @@ const routes = [
path: 'rechargeAudit', path: 'rechargeAudit',
name: "rechargeAudit", name: "rechargeAudit",
component: () => import("../views/audit/gold/rechargeAudit.vue"), component: () => import("../views/audit/gold/rechargeAudit.vue"),
meta: { permissionId: [11, 12] } // 对应"查看充值审核"id=11、"充值审批"id=12
meta: { permissionId: [28,30,31,32,33,34,35] } // 对应"查看充值审核"id=11、"充值审批"id=12
}, },
// 退款审核 // 退款审核
{ {
path: 'refundAudit', path: 'refundAudit',
name: "refundAudit", name: "refundAudit",
component: () => import("../views/audit/gold/refundAudit.vue"), component: () => import("../views/audit/gold/refundAudit.vue"),
meta: { permissionId: [13, 14] } // 对应"查看退款审核"id=13、"退款审批"id=14
meta: { permissionId: [29,36,37,38,39,40,41] } // 对应"查看退款审核"id=13、"退款审批"id=14
}, },
] ]
}, { }, {
path: 'beanAudit',
path: '/beanAudit',
name: "beanAudit", name: "beanAudit",
component: () => import("../views/audit/bean/beanAudit.vue"), component: () => import("../views/audit/bean/beanAudit.vue"),
meta: { permissionId: [54, 55] }
meta: { permissionId: 15 },
children: [
// 充值审核
{
path: 'addbeanAudit',
name: "addbeanAudit",
component: () => import("../views/audit/bean/beanAudit.vue"),
meta: { permissionId: [42,43,44,45,46,47] } // 对应"查看充值审核"id=11、"充值审批"id=12
},
]
}, },
@ -69,21 +79,21 @@ const routes = [
name: "coinConsume", name: "coinConsume",
component: () => import("../views/consume/gold/coinConsume.vue"), component: () => import("../views/consume/gold/coinConsume.vue"),
// redirect: '/coinConsume/add', // redirect: '/coinConsume/add',
meta: { permissionId: 6 },
meta: { permissionId: 19 },
children: [ children: [
// 金币新增消耗 // 金币新增消耗
{ {
path: 'add', path: 'add',
name: "addCoinConsume", name: "addCoinConsume",
component: () => import("../views/consume/gold/addCoinConsume.vue"), component: () => import("../views/consume/gold/addCoinConsume.vue"),
meta: { permissionId: 19 } // 对应"提交金币消耗"id=19
meta: { permissionId: 55 } // 对应"提交金币消耗"id=19
}, },
// 金币消耗明细详情 // 金币消耗明细详情
{ {
path: 'detail', path: 'detail',
name: "coinConsumeDetail", name: "coinConsumeDetail",
component: () => import("../views/consume/gold/coinConsumeDetail.vue"), component: () => import("../views/consume/gold/coinConsumeDetail.vue"),
meta: { permissionId: 20 } // 对应"查看金币消耗明细"id=20
meta: { permissionId: 56 } // 对应"查看金币消耗明细"id=20
} }
] ]
}, },
@ -92,35 +102,35 @@ const routes = [
path: '/beanConsume', path: '/beanConsume',
name: "beanConsume", name: "beanConsume",
component: () => import("../views/consume/bean/beanConsume.vue"), component: () => import("../views/consume/bean/beanConsume.vue"),
meta: { permissionId: 42 },
meta: { permissionId: 20 },
children: [ children: [
// 金豆新增消耗 // 金豆新增消耗
{ {
path: 'add', path: 'add',
name: "addBeanConsume", name: "addBeanConsume",
component: () => import("../views/consume/bean/addBeanConsume.vue"), component: () => import("../views/consume/bean/addBeanConsume.vue"),
meta: { permissionId: 49 } // 对应"提交金豆消耗"id=49
meta: { permissionId: 57 } // 对应"提交金豆消耗"id=49
}, },
// 直播 // 直播
{ {
path: 'live', path: 'live',
name: "liveStream", name: "liveStream",
component: () => import("../views/consume/bean/liveStream.vue"), component: () => import("../views/consume/bean/liveStream.vue"),
meta: { permissionId: 50 } // 对应"直播"id=50
meta: { permissionId: 58 } // 对应"直播"id=50
}, },
// 铁粉 // 铁粉
{ {
path: 'fan', path: 'fan',
name: "dieHardFan", name: "dieHardFan",
component: () => import("../views/consume/bean/dieHardFan.vue"), component: () => import("../views/consume/bean/dieHardFan.vue"),
meta: { permissionId: 51 } // 对应"铁粉"id=51
meta: { permissionId: 59 } // 对应"铁粉"id=51
}, },
// 文章视频 // 文章视频
{ {
path: 'article', path: 'article',
name: "articleVideo", name: "articleVideo",
component: () => import("../views/consume/bean/articleVideo.vue"), component: () => import("../views/consume/bean/articleVideo.vue"),
meta: { permissionId: 52 } // 对应"文章视频"id=52
meta: { permissionId: 60 } // 对应"文章视频"id=52
} }
] ]
@ -131,13 +141,14 @@ const routes = [
path: '/rate', path: '/rate',
name: "rate", name: "rate",
component: () => import("../views/managerecharge/rate.vue"), component: () => import("../views/managerecharge/rate.vue"),
meta: { permissionId: [15, 16] } // 对应"汇率查看"id=15、"汇率修改"id=16
meta: { permissionId: [16,48,49] } // 对应"汇率查看"id=15、"汇率修改"id=16
}, },
// 金币充值 // 金币充值
{ {
path: '/coinRecharge', path: '/coinRecharge',
name: "coinRecharge", name: "coinRecharge",
component: () => import("../views/recharge/gold/coinRecharge.vue"), component: () => import("../views/recharge/gold/coinRecharge.vue"),
meta: { permissionId: 17 },
// redirect: '/coinRecharge/add', // redirect: '/coinRecharge/add',
children: [ children: [
// 金币新增充值 // 金币新增充值
@ -145,14 +156,14 @@ const routes = [
path: 'add', path: 'add',
name: "addCoinRecharge", name: "addCoinRecharge",
component: () => import("../views/recharge/gold/addCoinRecharge.vue"), component: () => import("../views/recharge/gold/addCoinRecharge.vue"),
meta: { permissionId: 17 } // 对应"提交金币充值"id=17
meta: { permissionId: 50 } // 对应"提交金币充值"id=17
}, },
// 金币充值明细详情 // 金币充值明细详情
{ {
path: 'detail', path: 'detail',
name: "coinRechargeDetail", name: "coinRechargeDetail",
component: () => import("../views/recharge/gold/coinRechargeDetail.vue"), component: () => import("../views/recharge/gold/coinRechargeDetail.vue"),
meta: { permissionId: 18 } // 对应"查看金币充值明细"id=18
meta: { permissionId: 51 } // 对应"查看金币充值明细"id=18
} }
] ]
}, },
@ -163,58 +174,52 @@ const routes = [
name: "beanRecharge", name: "beanRecharge",
component: () => import("../views/recharge/bean/beanRecharge.vue"), component: () => import("../views/recharge/bean/beanRecharge.vue"),
// redirect: '/coinRecharge/add', // redirect: '/coinRecharge/add',
meta: { permissionId: 18 },
children: [ children: [
// 金豆新增充值 // 金豆新增充值
{ {
path: 'add', path: 'add',
name: "addBeanRecharge", name: "addBeanRecharge",
component: () => import("../views/recharge/bean/addBeanRecharge.vue"), component: () => import("../views/recharge/bean/addBeanRecharge.vue"),
meta: { permissionId: 46 } // 对应"提交金豆充值"id=46
meta: { permissionId: 52 } // 对应"提交金豆充值"id=46
}, },
// 金豆系统充值 // 金豆系统充值
{ {
path: 'system', path: 'system',
name: "beanSystemRecharge", name: "beanSystemRecharge",
component: () => import("../views/recharge/bean/beanSystemRecharge.vue"), component: () => import("../views/recharge/bean/beanSystemRecharge.vue"),
meta: { permissionId: 47 } // 对应"查看金豆系统充值明细"id=47
meta: { permissionId: 53 } // 对应"查看金豆系统充值明细"id=47
}, },
// 金豆线上充值 // 金豆线上充值
{ {
path: 'online', path: 'online',
name: "beanOnlineRecharge", name: "beanOnlineRecharge",
component: () => import("../views/recharge/bean/beanOnlineRecharge.vue"), component: () => import("../views/recharge/bean/beanOnlineRecharge.vue"),
meta: { permissionId: 48 } // 对应"查看金豆线上充值明细"id=48
meta: { permissionId: 54 } // 对应"查看金豆线上充值明细"id=48
} }
] ]
}, },
// 金币退款
// 金币退款
{ {
path: '/coinRefund', path: '/coinRefund',
name: "coinRefund", name: "coinRefund",
component: () => import("../views/refund/gold/coinRefund.vue"), component: () => import("../views/refund/gold/coinRefund.vue"),
// redirect: '/coinRefund/add',
meta: { permissionId: 7 },
meta: { permissionId: 9 },
children: [ children: [
// 金币新增退款 // 金币新增退款
{ {
path: 'add', path: 'add',
name: "addCoinRefund", name: "addCoinRefund",
component: () => import("../views/refund/gold/addCoinRefund.vue"), component: () => import("../views/refund/gold/addCoinRefund.vue"),
meta: { permissionId: 21 } // 对应"提交金币退款"id=21
meta: { permissionId: 61 }
}, },
// 金币退款明细详情 // 金币退款明细详情
{ {
path: 'detail', path: 'detail',
name: "coinRefundDetail", name: "coinRefundDetail",
component: () => import("../views/refund/gold/coinRefundDetail.vue"), component: () => import("../views/refund/gold/coinRefundDetail.vue"),
meta: { permissionId: 22 } // 对应"查看金币退款明细"id=22
},
{
path: 'addRefund',
name: "addNewCoinRefund",
component: () => import("../views/refund/gold/addNewCoinRefund.vue"),
meta: { permissionId: 58 }
meta: { permissionId: 62 }
} }
] ]
}, },
@ -224,27 +229,26 @@ const routes = [
path: '/usergold', path: '/usergold',
name: "usergold", name: "usergold",
component: () => import("../views/usergold/gold/clientCount.vue"), component: () => import("../views/usergold/gold/clientCount.vue"),
// redirect: '/usergold/detail',
meta: { permissionId: 8 },
meta: { permissionId: 10 },
children: [ children: [
// 金币明细 // 金币明细
{ {
path: 'detail', path: 'detail',
name: "clientCountDetail", name: "clientCountDetail",
component: () => import("../views/usergold/gold/clientCountDetail.vue"), component: () => import("../views/usergold/gold/clientCountDetail.vue"),
meta: { permissionId: 23 } // 对应"查看金币明细"id=23
meta: { permissionId: 63 }
}, },
// 金币余额 // 金币余额
{ {
path: 'balance', path: 'balance',
name: "clientCountBalance", name: "clientCountBalance",
component: () => import("../views/usergold/gold/clientCountBalance.vue"), component: () => import("../views/usergold/gold/clientCountBalance.vue"),
meta: { permissionId: 24 } // 对应"查看金币余额"id=24
meta: { permissionId: 64 }
}, },
] ]
}, },
{ {
path: 'userbean',
path: '/userbean',
name: "userbean", name: "userbean",
component: () => import("../views/usergold/bean/userbean.vue"), component: () => import("../views/usergold/bean/userbean.vue"),
meta: { permissionId: 45 } meta: { permissionId: 45 }
@ -253,7 +257,21 @@ const routes = [
path: '/history', path: '/history',
name: "history", name: "history",
component: () => import("../views/history/history.vue"), component: () => import("../views/history/history.vue"),
meta: { permissionId: [56, 57] }
meta: { permissionId: 12 },
children: [
{
path: 'newHistory',
name: "newHistory",
component: () => import("../views/history/newHistory.vue"),
meta: { permissionId: 26 }
},
{
path: 'oldHistory',
name: "oldHistory",
component: () => import("../views/history/oldHistory.vue"),
meta: { permissionId: 27 }
}
]
}, },
// 权限管理 // 权限管理
@ -261,24 +279,24 @@ const routes = [
path: '/permissions', path: '/permissions',
name: "permissions", name: "permissions",
component: () => import("../views/permissions/permissions.vue"), component: () => import("../views/permissions/permissions.vue"),
meta: { permissionId: 9 },
meta: { permissionId: 11 },
children: [ children: [
// 用户权限 // 用户权限
{ {
path: 'userPermission', path: 'userPermission',
name: "userPermission", name: "userPermission",
component: () => import("../views/permissions/userPermission.vue"), component: () => import("../views/permissions/userPermission.vue"),
meta: { permissionId: 25 }
meta: { permissionId: 24 }
}, },
// 角色权限 // 角色权限
{ {
path: 'rolePermission', path: 'rolePermission',
name: "rolePermission", name: "rolePermission",
component: () => import("../views/permissions/rolePermission.vue"), component: () => import("../views/permissions/rolePermission.vue"),
meta: { permissionId: 30 }
},
meta: { permissionId: 25 }
}
] ]
},
}
] ]
}, },
{ {
@ -368,6 +386,7 @@ router.beforeEach(async (to, from, next) => {
// 拿权限id // 拿权限id
userPermissionIds = getAllPermissionIds(menuTree.value) userPermissionIds = getAllPermissionIds(menuTree.value)
console.log("userPermissionIds",userPermissionIds)
// 2.4 权限验证(逻辑不变) // 2.4 权限验证(逻辑不变)
console.log('to.meta:', to.meta) console.log('to.meta:', to.meta)

5
src/utils/menuTreePermission.js

@ -50,7 +50,7 @@ export const permissionMapping = {
refundWaitReject:41, // 退款审核等待驳回 refundWaitReject:41, // 退款审核等待驳回
beanWait:42, // 金豆审核待审核 beanWait:42, // 金豆审核待审核
beanWaitThough:43, // 金豆审核已通过
beanThrough:43, // 金豆审核已通过
beanReject:44, // 金豆审核已驳回 beanReject:44, // 金豆审核已驳回
beanWaitShow:45, // 金豆审核待审核查看 beanWaitShow:45, // 金豆审核待审核查看
beanWaitThough:46, // 金豆审核通过 beanWaitThough:46, // 金豆审核通过
@ -83,8 +83,9 @@ export const permissionMapping = {
editUserInfo:67, // 编辑用户信息 editUserInfo:67, // 编辑用户信息
updateUserInfo:68, // 重置密码 updateUserInfo:68, // 重置密码
deleteUserInfo:69, // 删除用户信息 deleteUserInfo:69, // 删除用户信息
changeStatus:70, // 启用禁用用户
roleManageShow:70, // 查看角色信息
roleManageShow:73, // 查看角色信息
addRoleInfo:71, // 新增角色信息 addRoleInfo:71, // 新增角色信息
editRoleInfo:72, // 编辑角色信息 editRoleInfo:72, // 编辑角色信息
} }

9
src/utils/menuUtils.js

@ -50,7 +50,7 @@ export const getRoutePath = (menu) => {
'金币审核': '/audit', '金币审核': '/audit',
'金豆审核': '/beanAudit', '金豆审核': '/beanAudit',
'汇率管理': '/rate',
'现金汇率': '/rate',
'金币充值': '/coinRecharge', '金币充值': '/coinRecharge',
@ -64,13 +64,20 @@ export const getRoutePath = (menu) => {
// '金豆退款': '/beanRefund', // '金豆退款': '/beanRefund',
'历史数据查询': '/history', '历史数据查询': '/history',
'金币查询(新)': '/history/newHistory',
'金币查询(旧)': '/history/oldHistory',
'权限管理': '/permissions', '权限管理': '/permissions',
'用户管理': '/permissions/userPermission',
'角色管理': '/permissions/rolePermission',
'金币客户账户明细': '/usergold', '金币客户账户明细': '/usergold',
'金豆客户账户明细': '/userbean', '金豆客户账户明细': '/userbean',
'用户管理': '/permissions/userPermission',
'角色管理': '/permissions/rolePermission',
}; };
// 未匹配的菜单默认使用id作为路由(可根据实际需求调整) // 未匹配的菜单默认使用id作为路由(可根据实际需求调整)

257
src/views/audit/bean/beanAudit.vue

@ -22,11 +22,11 @@
</el-col> </el-col>
</el-card> </el-card>
<el-card>
<el-card >
<el-tabs v-model="checkTab" type="card" @tab-click="handleClick"> <el-tabs v-model="checkTab" type="card" @tab-click="handleClick">
<el-tab-pane label="待审核" name="pending"></el-tab-pane>
<el-tab-pane label="已通过" name="pass"></el-tab-pane>
<el-tab-pane label="已驳回" name="reject"></el-tab-pane>
<el-tab-pane label="待审核" name="pending" v-if="hasbeanWait&&hasbeanWaitShow"></el-tab-pane>
<el-tab-pane label="已通过" name="pass" v-if="hasbeanThrough"></el-tab-pane>
<el-tab-pane label="已驳回" name="reject" v-if="hasbeanReject"></el-tab-pane>
</el-tabs> </el-tabs>
<div> <div>
@ -61,12 +61,12 @@
{{ row.auditTime ? moment(row.auditTime).format('YYYY-MM-DD HH:mm:ss') : '--' }} {{ row.auditTime ? moment(row.auditTime).format('YYYY-MM-DD HH:mm:ss') : '--' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="checkTab === 'pending'" fixed="right" prop="operation" label="操作" width="400px">
<el-table-column v-if="checkTab === 'pending' &&(hasbeanWaitThough||hasbeanWaitReject)" fixed="right" prop="operation" label="操作" width="400px">
<template #default="scope"> <template #default="scope">
<div class="operation"> <div class="operation">
<el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)"> <el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)">
<template #reference> <template #reference>
<el-button :disabled="clicked || cancelClicked" type="primary" text>
<el-button v-if="hasbeanWaitThough" :disabled="clicked || cancelClicked" type="primary" text>
通过 通过
</el-button> </el-button>
</template> </template>
@ -77,7 +77,7 @@
</el-button> </el-button>
</template> </template>
</el-popconfirm> </el-popconfirm>
<el-button :disabled="clicked || cancelClicked" type="primary" text @click="showRejectDialog(scope.row)">
<el-button v-if="hasbeanWaitReject" :disabled="clicked || cancelClicked" type="primary" text @click="showRejectDialog(scope.row)">
驳回 驳回
</el-button> </el-button>
</div> </div>
@ -111,13 +111,13 @@ import moment from 'moment'
import { useAdminStore } from "@/store/index.js"; import { useAdminStore } from "@/store/index.js";
import { storeToRefs } from "pinia"; import { storeToRefs } from "pinia";
import _ from 'lodash' import _ from 'lodash'
import { permissionMapping, hasMenuPermission } from "@/utils/menuTreePermission.js"
const defaultTime = [ const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1, 23, 59, 59), new Date(2000, 2, 1, 23, 59, 59),
] ]
const adminStore = useAdminStore(); const adminStore = useAdminStore();
const { adminData, menuTree } = storeToRefs(adminStore); const { adminData, menuTree } = storeToRefs(adminStore);
import { permissionMapping, findMenuById } from "@/utils/menuTreePermission.js"
import dayjs from "dayjs"; import dayjs from "dayjs";
const tableData = ref([]) const tableData = ref([])
@ -132,6 +132,25 @@ const reason = ref('')
const rejectRow = ref({ const rejectRow = ref({
id: null id: null
})// })//
//
const hasbeanWait = ref(false) // beanWait:42
const hasbeanThrough = ref(false) // beanThrough:43
const hasbeanReject = ref(false) // beanReject:44
const hasbeanWaitShow = ref(false) // beanWaitShow:45
const hasbeanWaitThough = ref(false) // beanWaitThough:46
const hasbeanWaitReject = ref(false) // beanWaitReject:47
//
const initPermissions = async() => {
if (!menuTree.value || !menuTree.value.length) return;
hasbeanWait.value = hasMenuPermission(menuTree.value, permissionMapping.beanWait);
hasbeanThrough.value = hasMenuPermission(menuTree.value, permissionMapping.beanThrough);
hasbeanReject.value = hasMenuPermission(menuTree.value, permissionMapping.beanReject);
hasbeanWaitShow.value = hasMenuPermission(menuTree.value, permissionMapping.beanWaitShow);
hasbeanWaitThough.value = hasMenuPermission(menuTree.value, permissionMapping.beanWaitThough);
hasbeanWaitReject.value = hasMenuPermission(menuTree.value, permissionMapping.beanWaitReject);
};
const clicked = ref(false) const clicked = ref(false)
// //
const STATUS = { const STATUS = {
@ -192,131 +211,129 @@ const handleSearch = async function () {
await getStats() await getStats()
} }
const get = async function () { const get = async function () {
if (findMenuById(menuTree.value, permissionMapping.View_Golden_Bean_Recharge_Audit)) {
try {
if (dateRange.value && dateRange.value.length === 2) {
if (checkTab.value === 'pending') {
searchForm.value.createStartTime = moment(dateRange.value[0]).format('YYYY-MM-DD HH:mm:ss')
searchForm.value.createEndTime = moment(dateRange.value[1]).format('YYYY-MM-DD HH:mm:ss')
} else {
searchForm.value.auditStartTime = moment(dateRange.value[0]).format('YYYY-MM-DD HH:mm:ss')
searchForm.value.auditEndTime = moment(dateRange.value[1]).format('YYYY-MM-DD HH:mm:ss')
}
if (!hasbeanWaitShow) {
ElMessage.error('暂无权限')
return
}
try {
if (dateRange.value && dateRange.value.length === 2) {
if (checkTab.value === 'pending') {
searchForm.value.createStartTime = moment(dateRange.value[0]).format('YYYY-MM-DD HH:mm:ss')
searchForm.value.createEndTime = moment(dateRange.value[1]).format('YYYY-MM-DD HH:mm:ss')
} else { } else {
searchForm.value.createStartTime = ''
searchForm.value.createEndTime = ''
}
if(checkTab.value === 'pending'){
sortField.value = 'createTime'
sortOrder.value = 'desc'
}else{
sortField.value = 'auditTime'
sortOrder.value = 'desc'
}
const params = {
pageNum: pagination.value.pageNum,//
pageSize: pagination.value.pageSize,//
beanAuditInfo: {
jwcode: searchForm.value.jwcode,
status: searchForm.value.status,
market: searchForm.value.market,
createStartTime: searchForm.value.createStartTime,
createEndTime: searchForm.value.createEndTime,
auditStartTime: searchForm.value.auditStartTime,
auditEndTime: searchForm.value.auditEndTime,
sortField: sortField.value,
sortOrder: sortOrder.value
}
searchForm.value.auditStartTime = moment(dateRange.value[0]).format('YYYY-MM-DD HH:mm:ss')
searchForm.value.auditEndTime = moment(dateRange.value[1]).format('YYYY-MM-DD HH:mm:ss')
} }
console.log('看看传给后端的参数:', params)
const res = await API({ url: '/beanAudit/selectBy', data: params })
tableData.value = res.data.list || []
} catch (error) {
console.error('获取数据失败', error)
} else {
searchForm.value.createStartTime = ''
searchForm.value.createEndTime = ''
} }
} else {
ElMessage.error('无此权限')
}
}
const getStats = async () => {
if (findMenuById(menuTree.value, permissionMapping.View_Golden_Bean_Recharge_Audit)) {
try {
const params = {
if (checkTab.value === 'pending') {
sortField.value = 'createTime'
sortOrder.value = 'desc'
} else {
sortField.value = 'auditTime'
sortOrder.value = 'desc'
}
const params = {
pageNum: pagination.value.pageNum,//
pageSize: pagination.value.pageSize,//
beanAuditInfo: {
jwcode: searchForm.value.jwcode, jwcode: searchForm.value.jwcode,
status: searchForm.value.status, status: searchForm.value.status,
market: searchForm.value.market, market: searchForm.value.market,
createStartTime: searchForm.value.createStartTime, createStartTime: searchForm.value.createStartTime,
createEndTime: searchForm.value.createEndTime, createEndTime: searchForm.value.createEndTime,
auditStartTime: searchForm.value.auditStartTime, auditStartTime: searchForm.value.auditStartTime,
auditEndTime: searchForm.value.auditEndTime
auditEndTime: searchForm.value.auditEndTime,
sortField: sortField.value,
sortOrder: sortOrder.value
} }
const res = await API({
url: '/beanAudit/statsBean',
data: params
})
stats.value.num = res.data.num
stats.value.permanentBean = res.data.permanentBean
stats.value.freeBean = res.data.freeBean
stats.value.beanNum = res.data.beanNum
console.log('see see stats和搜索对象', stats.value, params)
} catch (error) {
console.log('请求失败', error)
} }
} else {
ElMessage.error('无此权限')
console.log('看看传给后端的参数:', params)
const res = await API({ url: '/beanAudit/selectBy', data: params })
tableData.value = res.data.list || []
} catch (error) {
console.error('获取数据失败', error)
}
}
const getStats = async () => {
if (!hasbeanWaitShow) {
ElMessage.error('暂无权限')
return
}
try {
const params = {
jwcode: searchForm.value.jwcode,
status: searchForm.value.status,
market: searchForm.value.market,
createStartTime: searchForm.value.createStartTime,
createEndTime: searchForm.value.createEndTime,
auditStartTime: searchForm.value.auditStartTime,
auditEndTime: searchForm.value.auditEndTime
}
const res = await API({
url: '/beanAudit/statsBean',
data: params
})
stats.value.num = res.data.num
stats.value.permanentBean = res.data.permanentBean
stats.value.freeBean = res.data.freeBean
stats.value.beanNum = res.data.beanNum
console.log('see see stats和搜索对象', stats.value, params)
} catch (error) {
console.log('请求失败', error)
} }
} }
// //
const handleApprove = async (row) => { const handleApprove = async (row) => {
if (!hasbeanWaitThough) {
ElMessage.error('暂无权限')
return
}
clicked.value = true clicked.value = true
if (findMenuById(menuTree.value, permissionMapping.Golden_Bean_Recharge_Approval)) {
try {
const params = {
id: row.id,
auditName: adminData.value.adminName
}
await API({ url: '/beanAudit/status1', data: params })
ElMessage.success('审核通过成功')
await get()
clicked.value = false
await getStats()
} catch (error) {
console.error('审核通过失败', error)
ElMessage.error('操作失败')
try {
const params = {
id: row.id,
auditName: adminData.value.adminName
} }
} else {
ElMessage.error('无此权限')
await API({ url: '/beanAudit/status1', data: params })
ElMessage.success('审核通过成功')
await get()
clicked.value = false clicked.value = false
await getStats()
} catch (error) {
console.error('审核通过失败', error)
ElMessage.error('操作失败')
} }
} }
// //
const handleReject = async () => { const handleReject = async () => {
if (!hasbeanWaitReject) {
ElMessage.error('暂无权限')
return
}
cancelClicked.value = true cancelClicked.value = true
if (findMenuById(menuTree.value, permissionMapping.Golden_Bean_Recharge_Approval)) {
if (!reason.value.trim()) {
ElMessage.warning('请输入驳回理由')
return
}
try {
const params = {
id: rejectRow.value.id,
auditName: adminData.value.adminName,
reason: reason.value
}
await API({ url: '/beanAudit/status2', data: params })
ElMessage.success('驳回成功')
rejectVisible.value = false
await get()
cancelClicked.value = false
await getStats()
} catch (error) {
console.error('驳回失败', error)
ElMessage.error('操作失败')
if (!reason.value.trim()) {
ElMessage.warning('请输入驳回理由')
return
}
try {
const params = {
id: rejectRow.value.id,
auditName: adminData.value.adminName,
reason: reason.value
} }
} else {
ElMessage.error('无此权限')
await API({ url: '/beanAudit/status2', data: params })
ElMessage.success('驳回成功')
rejectVisible.value = false
await get()
cancelClicked.value = false cancelClicked.value = false
await getStats()
} catch (error) {
console.error('驳回失败', error)
ElMessage.error('操作失败')
} }
} }
const getToday = async function () { const getToday = async function () {
@ -370,10 +387,22 @@ const resetSearch = async function () {
const handleClick = async function (tab) { const handleClick = async function (tab) {
checkTab.value = tab.props.name checkTab.value = tab.props.name
if (tab.props.name === 'pending') { if (tab.props.name === 'pending') {
if (!hasbeanWait) {
ElMessage.error('暂无权限')
return
}
adminWait() adminWait()
} else if (tab.props.name === 'pass') { } else if (tab.props.name === 'pass') {
if (!hasbeanThrough) {
ElMessage.error('暂无权限')
return
}
adminPass() adminPass()
} else if (tab.props.name === 'reject') { } else if (tab.props.name === 'reject') {
if (!hasbeanReject) {
ElMessage.error('暂无权限')
return
}
adminReject() adminReject()
} }
} }
@ -429,6 +458,10 @@ const throttledHandleApprove = _.throttle(handleApprove, 5000, {
trailing: false trailing: false
}) })
const showRejectDialog = (row) => { const showRejectDialog = (row) => {
if (!hasbeanWaitReject) {
ElMessage.error('暂无权限')
return
}
rejectRow.value.id = row.id rejectRow.value.id = row.id
reason.value = '' reason.value = ''
rejectVisible.value = true rejectVisible.value = true
@ -467,6 +500,14 @@ const trimJwCode = () => {
} }
} }
onMounted(async () => { onMounted(async () => {
await initPermissions()
if(hasbeanWaitShow.value){
searchForm.value.status = 0
}else if(hasbeanThrough.value){
searchForm.value.status = 1
}else if(hasbeanReject){
searchForm.value.status = 2
}
getmarkets() getmarkets()
await get() await get()
await getStats() await getStats()

20
src/views/audit/gold/audit.vue

@ -3,11 +3,11 @@
<div style="height:4vh;width:82vw;"> <div style="height:4vh;width:82vw;">
<el-button-group> <el-button-group>
<el-button :type="activeTab === 'rechargeAudit' ? 'primary' : 'default'" @click="navigateTo('rechargeAudit')" <el-button :type="activeTab === 'rechargeAudit' ? 'primary' : 'default'" @click="navigateTo('rechargeAudit')"
:disabled="!hasRecharge">
v-if="hasRecharge">
充值审核 充值审核
</el-button> </el-button>
<el-button :type="activeTab === 'refundAudit' ? 'primary' : 'default'" @click="navigateTo('refundAudit')" <el-button :type="activeTab === 'refundAudit' ? 'primary' : 'default'" @click="navigateTo('refundAudit')"
:disabled="!hasRefund">
v-if="hasRefund">
退款审核 退款审核
</el-button> </el-button>
</el-button-group> </el-button-group>
@ -22,6 +22,7 @@ import { useRouter, useRoute } from 'vue-router';
import { storeToRefs } from 'pinia'; import { storeToRefs } from 'pinia';
import { useAdminStore } from '@/store/index.js'; import { useAdminStore } from '@/store/index.js';
import { hasMenuPermission, permissionMapping } from "@/utils/menuTreePermission.js"; import { hasMenuPermission, permissionMapping } from "@/utils/menuTreePermission.js";
import { ElMessage } from 'element-plus';
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
@ -33,6 +34,17 @@ const hasRecharge = ref(false);
const hasRefund = ref(false); const hasRefund = ref(false);
// //
const navigateTo = (name) => { const navigateTo = (name) => {
if(name == 'rechargeAudit'){
if(!hasRecharge){
ElMessage.error('您暂无充值审核操作权限')
return;
}
}else if(name = 'refundAudit'){
if(!hasRefund){
ElMessage.error('您暂无退款审核操作权限')
return;
}
}
activeTab.value = name; activeTab.value = name;
router.push({ name }); router.push({ name });
}; };
@ -42,8 +54,8 @@ const navigateTo = (name) => {
const initPermissions = () => { const initPermissions = () => {
if (!menuTree.value || !menuTree.value.length) return; if (!menuTree.value || !menuTree.value.length) return;
hasRecharge.value = hasMenuPermission(menuTree.value, permissionMapping.Recharge_Audit);
hasRefund.value = hasMenuPermission(menuTree.value, permissionMapping.Refund_Audit);
hasRecharge.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeAudit);
hasRefund.value = hasMenuPermission(menuTree.value, permissionMapping.refundAudit);
}; };
// //

105
src/views/audit/gold/rechargeAudit.vue

@ -42,16 +42,16 @@
</div> </div>
<div class="selectRow" style="justify-content: flex-start;"> <div class="selectRow" style="justify-content: flex-start;">
<el-button @click="resetSearch" type="success">重置</el-button> <el-button @click="resetSearch" type="success">重置</el-button>
<el-button @click="handleSearch" type="primary">查询</el-button>
<el-button @click="handleSearch" type="primary">查询</el-button>
</div> </div>
</div> </div>
</el-col> </el-col>
</el-card> </el-card>
<el-card> <el-card>
<el-tabs v-model="activeName" type="card" @tab-click="handleClick"> <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
<el-tab-pane label="待审核" name="wait"></el-tab-pane>
<el-tab-pane label="已通过" name="pass"></el-tab-pane>
<el-tab-pane label="已驳回" name="reject"></el-tab-pane>
<el-tab-pane label="待审核" name="wait" v-if="hasrechargeWait&&hasrechargeWaitShow"></el-tab-pane>
<el-tab-pane label="已通过" name="pass" v-if="hasrechargeThrough"></el-tab-pane>
<el-tab-pane label="已驳回" name="reject" v-if="hasrechargeReject"></el-tab-pane>
<div> <div>
<!-- 总条数{{ format3(stats.totalNum) }}&nbsp;&nbsp;&nbsp;&nbsp;--> <!-- 总条数{{ format3(stats.totalNum) }}&nbsp;&nbsp;&nbsp;&nbsp;-->
@ -119,12 +119,12 @@
{{ moment(scope.row.auditTime).format('YYYY-MM-DD HH:mm:ss') }} {{ moment(scope.row.auditTime).format('YYYY-MM-DD HH:mm:ss') }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="activeName === 'wait'" fixed="right" prop="operation" label="操作" width="150px">
<el-table-column v-if="activeName === 'wait'&&(hasrechargeWaitThough||hasrechargeWaitReject)&&hasrechargeWaitShow" fixed="right" prop="operation" label="操作" width="150px">
<template #default="scope"> <template #default="scope">
<div class="operation"> <div class="operation">
<el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)"> <el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)">
<template #reference> <template #reference>
<el-button :disabled="clicked || cancelClicked" type="primary" text>
<el-button v-if="hasrechargeWaitThough" :disabled="clicked || cancelClicked" type="primary" text>
通过 通过
</el-button> </el-button>
</template> </template>
@ -135,7 +135,7 @@
</el-button> </el-button>
</template> </template>
</el-popconfirm> </el-popconfirm>
<el-button :disabled="clicked || cancelClicked" type="primary" text @click="showRejectDialog(scope.row)">
<el-button v-if="hasrechargeWaitReject" :disabled="clicked || cancelClicked" type="primary" text @click="showRejectDialog(scope.row)">
驳回 驳回
</el-button> </el-button>
</div> </div>
@ -176,9 +176,31 @@ import { storeToRefs } from "pinia";
const adminStore = useAdminStore(); const adminStore = useAdminStore();
const { adminData, menuTree } = storeToRefs(adminStore); const { adminData, menuTree } = storeToRefs(adminStore);
import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js"
import { permissionMapping, hasMenuPermission } from "@/utils/menuTreePermission.js"
import dayjs from "dayjs"; import dayjs from "dayjs";
//
const hasrechargeThrough = ref(false) //
const hasrechargeReject = ref(false) //
const hasrechargeWait = ref(false) //
const hasrechargeWaitShow = ref(false) //
const hasrechargeWaitThough = ref(false) //
const hasrechargeWaitReject = ref(false) //
//
const initPermissions = async() => {
if (!menuTree.value || !menuTree.value.length) return;
hasrechargeThrough.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeThrough);
hasrechargeReject.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeReject);
hasrechargeWait.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeWait);
hasrechargeWaitShow.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeWaitShow);
hasrechargeWaitThough.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeWaitThough);
hasrechargeWaitReject.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeWaitReject);
console.log(hasrechargeWaitThough.value)
console.log(hasrechargeWaitReject.value)
};
const defaultTime = [ const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1, 23, 59, 59), new Date(2000, 2, 1, 23, 59, 59),
@ -214,13 +236,16 @@ const rechargeAudit = ref({
startTime: "", // startTime: "", //
endTime: "", // endTime: "", //
market: "", // market: "", //
auditStatus: "0",
auditStatus: '0',
}) })
// //
const getObj = ref({ const getObj = ref({
pageNum: 1, pageNum: 1,
pageSize: 50 pageSize: 50
}) })
// //
const payModel = [ const payModel = [
{ {
@ -282,6 +307,11 @@ const rules = reactive({
}) })
// //
const getRecharge = async function (val) { const getRecharge = async function (val) {
if (!hasrechargeWaitShow) {
ElMessage.error('暂无权限')
return
}
try { try {
if (getTime.value && getTime.value.length === 2) { if (getTime.value && getTime.value.length === 2) {
rechargeAudit.value.startTime = formatTime(getTime.value[0]) rechargeAudit.value.startTime = formatTime(getTime.value[0])
@ -320,9 +350,13 @@ const getRecharge = async function (val) {
} catch (error) { } catch (error) {
console.log('请求失败', error) console.log('请求失败', error)
} }
} }
const getStats = async () => { const getStats = async () => {
if (!hasrechargeWaitShow) {
return
}
try { try {
const params = { const params = {
pageNum: getObj.value.pageNum, pageNum: getObj.value.pageNum,
@ -446,10 +480,24 @@ const adminReject = async function () {
const handleClick = function (tab, event) { const handleClick = function (tab, event) {
activeName.value = tab.props.name activeName.value = tab.props.name
if (tab.props.name === 'wait') { if (tab.props.name === 'wait') {
adminWait()
if(!hasrechargeWait){
ElMessage.error('暂无权限')
return
}
if(hasrechargeWaitShow){
adminWait()
}
} else if (tab.props.name === 'pass') { } else if (tab.props.name === 'pass') {
if(!hasrechargeThrough){
ElMessage.error('暂无权限')
return
}
adminPass() adminPass()
} else if (tab.props.name === 'reject') { } else if (tab.props.name === 'reject') {
if(!hasrechargeReject){
ElMessage.error('暂无权限')
return
}
adminReject() adminReject()
} }
} }
@ -477,8 +525,11 @@ const handlePagination = (type, val) => {
const clicked = ref(false); const clicked = ref(false);
// //
const handleApprove = async (row) => { const handleApprove = async (row) => {
if(!hasrechargeWaitThough){
ElMessage.error('暂无权限')
return
}
clicked.value = true clicked.value = true
if (findMenuById(menuTree.value, permissionMapping.Recharge_Approval)) {
try { try {
const params = { const params = {
orderCode: row.orderCode, orderCode: row.orderCode,
@ -495,27 +546,27 @@ const handleApprove = async (row) => {
console.error('审核通过失败', error) console.error('审核通过失败', error)
ElMessage.error('操作失败') ElMessage.error('操作失败')
} }
} else {
clicked.value = false
ElMessage.error('无权限')
}
} }
const showRejectDialog = (row) => { const showRejectDialog = (row) => {
if(!hasrechargeWaitReject){
ElMessage.error('暂无权限')
return
}
currentRecord.value = row currentRecord.value = row
rejectReason.value = '' rejectReason.value = ''
if (findMenuById(menuTree.value, permissionMapping.Recharge_Approval)) {
rejectDialogVisible.value = true
} else {
ElMessage.error('无权限')
}
rejectDialogVisible.value = true
} }
// //
const cancelClicked = ref(false) const cancelClicked = ref(false)
// //
const handleReject = async () => { const handleReject = async () => {
if(!hasrechargeWaitReject){
ElMessage.error('暂无权限')
return
}
cancelClicked.value = true cancelClicked.value = true
if (findMenuById(menuTree.value, permissionMapping.Recharge_Approval)) {
if (!rejectReason.value.trim()) { if (!rejectReason.value.trim()) {
ElMessage.warning('请输入驳回理由') ElMessage.warning('请输入驳回理由')
@ -539,10 +590,6 @@ const handleReject = async () => {
console.error('驳回操作失败', error) console.error('驳回操作失败', error)
ElMessage.error('操作失败') ElMessage.error('操作失败')
} }
} else {
ElMessage.error('无权限')
cancelClicked.value = false
}
} }
// //
const handleSortChange = (column) => { const handleSortChange = (column) => {
@ -652,6 +699,14 @@ const cancelClick = () => {
const formatTime = (val) => val ? moment(val).format('YYYY-MM-DD HH:mm:ss') : '' const formatTime = (val) => val ? moment(val).format('YYYY-MM-DD HH:mm:ss') : ''
// //
onMounted(async function () { onMounted(async function () {
await initPermissions()
if(hasrechargeWaitShow.value){
rechargeAudit.value.auditStatus = '0'
}else if(hasrechargeThrough.value){
rechargeAudit.value.auditStatus = '1'
}else if(hasrechargeReject){
rechargeAudit.value.auditStatus = '2'
}
await getActivity() await getActivity()
await getMarket() await getMarket()
await getRecharge() await getRecharge()

178
src/views/audit/gold/refundAudit.vue

@ -21,13 +21,13 @@
</div> </div>
<div class="selectRow"> <div class="selectRow">
<el-text class="text" size="large">所属地区</el-text> <el-text class="text" size="large">所属地区</el-text>
<el-cascader class="selectContent" style="width: 12vw;" v-model="selectedMarketPath" :options="market" placeholder="请选择所属地区"
clearable @change="handleMarketChange" />
<el-cascader class="selectContent" style="width: 12vw;" v-model="selectedMarketPath" :options="market"
placeholder="请选择所属地区" clearable @change="handleMarketChange" />
</div> </div>
</div> </div>
</el-col> </el-col>
<el-col> <el-col>
<div class="select">
<div class="select">
<div class="selectRow" style="width: 36vw;"> <div class="selectRow" style="width: 36vw;">
<el-text class="text" size="large"> <el-text class="text" size="large">
{{ activeName === 'wait' ? '提交时间:' : '审核时间:' }} {{ activeName === 'wait' ? '提交时间:' : '审核时间:' }}
@ -43,17 +43,17 @@
</div> </div>
<div class="selectRow" style="justify-content: flex-start;"> <div class="selectRow" style="justify-content: flex-start;">
<el-button @click="resetSearch" type="success">重置</el-button> <el-button @click="resetSearch" type="success">重置</el-button>
<el-button @click="handleSearch" type="primary">查询</el-button>
<el-button @click="handleSearch" type="primary">查询</el-button>
</div> </div>
</div> </div>
</el-col> </el-col>
</el-card> </el-card>
<el-card>
<el-card >
<el-tabs v-model="activeName" type="card" @tab-click="handleClick"> <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
<el-tab-pane label="待审核" name="wait"></el-tab-pane>
<el-tab-pane label="已通过" name="pass"></el-tab-pane>
<el-tab-pane label="已驳回" name="reject"></el-tab-pane>
<el-tab-pane label="待审核" name="wait" v-if="hasrefundWait&&hasrefundWaitShow"></el-tab-pane>
<el-tab-pane label="已通过" name="pass" v-if="hasrefundThrough"></el-tab-pane>
<el-tab-pane label="已驳回" name="reject" v-if="hasrefundReject"></el-tab-pane>
</el-tabs> </el-tabs>
<div> <div>
@ -118,12 +118,13 @@
{{ row.auditTime ? moment(row.auditTime).format('YYYY-MM-DD HH:mm:ss') : '--' }} {{ row.auditTime ? moment(row.auditTime).format('YYYY-MM-DD HH:mm:ss') : '--' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="checkTab === 'pending'" fixed="right" prop="operation" label="操作" width="150px">
<el-table-column v-if="checkTab === 'pending' && (hasrefundWaitThough || hasrefundWaitReject)&&hasrefundWaitShow" fixed="right"
prop="operation" label="操作" width="150px">
<template #default="scope"> <template #default="scope">
<div class="operation"> <div class="operation">
<el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)"> <el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)">
<template #reference> <template #reference>
<el-button :disabled="clicked || cancelClicked" type="primary" text>
<el-button v-if="hasrefundWaitThough" :disabled="clicked || cancelClicked" type="primary" text>
通过 通过
</el-button> </el-button>
</template> </template>
@ -134,7 +135,8 @@
</el-button> </el-button>
</template> </template>
</el-popconfirm> </el-popconfirm>
<el-button :disabled="clicked || cancelClicked" type="primary" text @click="showRejectDialog(scope.row)">
<el-button v-if="hasrefundWaitReject" :disabled="clicked || cancelClicked" type="primary" text
@click="showRejectDialog(scope.row)">
驳回 驳回
</el-button> </el-button>
</div> </div>
@ -169,9 +171,8 @@ import API from '@/util/http.js'
import moment from 'moment' import moment from 'moment'
import { useAdminStore } from "@/store/index.js"; import { useAdminStore } from "@/store/index.js";
import { storeToRefs } from "pinia"; import { storeToRefs } from "pinia";
import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js"
import dayjs from "dayjs"; import dayjs from "dayjs";
import { permissionMapping, hasMenuPermission } from "@/utils/menuTreePermission.js"
const adminStore = useAdminStore(); const adminStore = useAdminStore();
const { adminData, menuTree } = storeToRefs(adminStore); const { adminData, menuTree } = storeToRefs(adminStore);
const defaultTime = [ const defaultTime = [
@ -232,6 +233,28 @@ const activeName = ref('wait')
const sortField = ref('') const sortField = ref('')
const sortOrder = ref('') const sortOrder = ref('')
const market = ref("") const market = ref("")
//退
const hasrefundThrough = ref(false) // 退
const hasrefundReject = ref(false) // 退
const hasrefundWait = ref(false) // 退
const hasrefundWaitShow = ref(false) // 退
const hasrefundWaitThough = ref(false) // 退
const hasrefundWaitReject = ref(false) // 退
//
const initPermissions = async() => {
if (!menuTree.value || !menuTree.value.length) return;
// 退
hasrefundThrough.value = hasMenuPermission(menuTree.value, permissionMapping.refundThrough);
hasrefundReject.value = hasMenuPermission(menuTree.value, permissionMapping.refundReject);
hasrefundWait.value = hasMenuPermission(menuTree.value, permissionMapping.refundWait);
hasrefundWaitShow.value = hasMenuPermission(menuTree.value, permissionMapping.refundWaitShow);
hasrefundWaitThough.value = hasMenuPermission(menuTree.value, permissionMapping.refundWaitThough);
hasrefundWaitReject.value = hasMenuPermission(menuTree.value, permissionMapping.refundWaitReject);
console.log('退款权限赋值完成');
};
// //
const handleSortChange = (column) => { const handleSortChange = (column) => {
if (column.prop === 'sumGold') { if (column.prop === 'sumGold') {
@ -256,6 +279,10 @@ const handleSortChange = (column) => {
} }
// //
const showRejectDialog = (row) => { const showRejectDialog = (row) => {
if (!hasrefundWaitReject) {
ElMessage.error('暂无权限')
return
}
scopeValue.value = row scopeValue.value = row
rejectReason.value = '' rejectReason.value = ''
rejectDialogVisible.value = true rejectDialogVisible.value = true
@ -272,6 +299,10 @@ const getRefundGoods = async () => {
// //
const get = async function (val) { const get = async function (val) {
if (!hasrefundWaitShow) {
ElMessage.error('暂无权限')
return
}
try { try {
if (typeof val === 'number') { if (typeof val === 'number') {
pagination.value.pageNum = val pagination.value.pageNum = val
@ -319,65 +350,67 @@ const get = async function (val) {
const clicked = ref(false); const clicked = ref(false);
// //
const handleApprove = async (row) => { const handleApprove = async (row) => {
if (!hasrefundWaitThough) {
ElMessage.error('暂无权限')
return
}
clicked.value = true clicked.value = true
if (findMenuById(menuTree.value, permissionMapping.Refund_Approval)) {
try {
const params = {
orderCode: row.orderCode,
auditId: adminData.value.id,
action: 1,// action1,2
rejectReason: ''
}
await API({ url: '/audit/audit', data: params })
ElMessage.success('审核通过成功')
await get()
clicked.value = false
await getStats()
} catch (error) {
console.error('审核通过失败', error)
ElMessage.error('操作失败')
try {
const params = {
orderCode: row.orderCode,
auditId: adminData.value.id,
action: 1,// action1,2
rejectReason: ''
} }
} else {
ElMessage.warning('没有权限')
await API({ url: '/audit/audit', data: params })
ElMessage.success('审核通过成功')
await get()
clicked.value = false clicked.value = false
await getStats()
} catch (error) {
console.error('审核通过失败', error)
ElMessage.error('操作失败')
} }
} }
// //
const cancelClicked = ref(false) const cancelClicked = ref(false)
// //
const handleReject = async () => { const handleReject = async () => {
if (!hasrefundWaitReject) {
ElMessage.error('暂无权限')
return
}
cancelClicked.value = true cancelClicked.value = true
if (findMenuById(menuTree.value, permissionMapping.Refund_Approval)) {
if (!rejectReason.value.trim()) {
ElMessage.warning('请输入驳回理由')
return
}
try {
const params = {
orderCode: scopeValue.value.orderCode,
auditId: adminData.value.id,
action: 2,
rejectReason: rejectReason.value
}
await API({ url: '/audit/audit', data: params })
ElMessage.success('驳回成功')
rejectDialogVisible.value = false
await get()
cancelClicked.value = false
await getStats()
console.log('看看驳回参数', params)
} catch (error) {
console.error('驳回失败', error)
ElMessage.error('操作失败')
if (!rejectReason.value.trim()) {
ElMessage.warning('请输入驳回理由')
return
}
try {
const params = {
orderCode: scopeValue.value.orderCode,
auditId: adminData.value.id,
action: 2,
rejectReason: rejectReason.value
} }
} else {
ElMessage.warning('没有权限')
await API({ url: '/audit/audit', data: params })
ElMessage.success('驳回成功')
rejectDialogVisible.value = false
await get()
cancelClicked.value = false cancelClicked.value = false
await getStats()
console.log('看看驳回参数', params)
} catch (error) {
console.error('驳回失败', error)
ElMessage.error('操作失败')
} }
} }
const getStats = async () => { const getStats = async () => {
if (!hasrefundWaitShow) {
return
}
try { try {
const params = { const params = {
pageNum: pagination.value.pageNum, pageNum: pagination.value.pageNum,
@ -473,26 +506,27 @@ const get7Days = function () {
const handleClick = function (tab, event) { const handleClick = function (tab, event) {
activeName.value = tab.props.name activeName.value = tab.props.name
if (tab.props.name === 'wait') { if (tab.props.name === 'wait') {
console.log(hasrefundWait.value);
if (!hasrefundWait) {
ElMessage.error('暂无权限')
return
}
adminWait() adminWait()
} else if (tab.props.name === 'pass') { } else if (tab.props.name === 'pass') {
if (!hasrefundThrough.value) {
ElMessage.error('暂无权限')
return
}
adminPass() adminPass()
} else if (tab.props.name === 'reject') { } else if (tab.props.name === 'reject') {
if (!hasrefundReject) {
ElMessage.error('暂无权限')
return
}
adminReject() adminReject()
} }
} }
//
const getCurrentStatus = () => {
switch (activeName.value) {
case 'wait':
return STATUS.PENDING
case 'pass':
return STATUS.APPROVED
case 'reject':
return STATUS.REJECTED
default:
return ''
}
}
// //
const adminWait = async function () { const adminWait = async function () {
checkTab.value = 'pending' checkTab.value = 'pending'
@ -580,6 +614,14 @@ const handleCurrentChange = function (val) {
get() get()
} }
onMounted(async () => { onMounted(async () => {
await initPermissions()
if(hasrefundWaitShow.value){
searchForm.value.auditStatus = '0'
}else if(hasrefundThrough.value){
searchForm.value.auditStatus = '1'
}else if(hasrefundReject){
searchForm.value.auditStatus = '2'
}
getRefundGoods() getRefundGoods()
await getMarket() await getMarket()
await get() await get()

16
src/views/consume/bean/beanConsume.vue

@ -4,7 +4,7 @@
<el-button <el-button
:type="activeTab === 'addBeanConsume' ? 'primary' : 'default'" :type="activeTab === 'addBeanConsume' ? 'primary' : 'default'"
@click="navigateTo('addBeanConsume')" @click="navigateTo('addBeanConsume')"
:disabled="!hasAdd"
v-if="hasAdd"
style="width: 120px;" style="width: 120px;"
> >
新增消耗 新增消耗
@ -12,7 +12,7 @@
<el-button <el-button
:type="activeTab === 'liveStream' ? 'primary' : 'default'" :type="activeTab === 'liveStream' ? 'primary' : 'default'"
@click="navigateTo('liveStream')" @click="navigateTo('liveStream')"
:disabled="!hasLive"
v-if="hasLive"
style="width: 120px;" style="width: 120px;"
> >
直播 直播
@ -20,7 +20,7 @@
<el-button <el-button
:type="activeTab === 'dieHardFan' ? 'primary' : 'default'" :type="activeTab === 'dieHardFan' ? 'primary' : 'default'"
@click="navigateTo('dieHardFan')" @click="navigateTo('dieHardFan')"
:disabled="!hasFan"
v-if="hasFan"
style="width: 120px;" style="width: 120px;"
> >
铁粉 铁粉
@ -28,7 +28,7 @@
<el-button <el-button
:type="activeTab === 'articleVideo' ? 'primary' : 'default'" :type="activeTab === 'articleVideo' ? 'primary' : 'default'"
@click="navigateTo('articleVideo')" @click="navigateTo('articleVideo')"
:disabled="!hasArticleVideo"
v-if="hasArticleVideo"
style="width: 120px;" style="width: 120px;"
> >
文章/视频 文章/视频
@ -68,10 +68,10 @@ const navigateTo = (name) => {
const initPermissions = () => { const initPermissions = () => {
if (!menuTree.value || !menuTree.value.length) return; if (!menuTree.value || !menuTree.value.length) return;
hasAdd.value = hasMenuPermission(menuTree.value, permissionMapping.Submit_Golden_Bean_Consumption);
hasLive.value = hasMenuPermission(menuTree.value, permissionMapping.View_Golden_Bean_Live_Consumption_Details);
hasFan.value = hasMenuPermission(menuTree.value, permissionMapping.View_Golden_Bean_Fan_Consumption_Details);
hasArticleVideo.value = hasMenuPermission(menuTree.value, permissionMapping.View_Golden_Bean_Article_Video_Consumption_Details);
hasAdd.value = hasMenuPermission(menuTree.value, permissionMapping.addBeanConsume);
hasLive.value = hasMenuPermission(menuTree.value, permissionMapping.beanZBDetail);
hasFan.value = hasMenuPermission(menuTree.value, permissionMapping.beanTFDetail);
hasArticleVideo.value = hasMenuPermission(menuTree.value, permissionMapping.beanSPWZDetail);
}; };
// //

10
src/views/consume/gold/coinConsume.vue

@ -3,11 +3,11 @@
<div class="fatherTop"> <div class="fatherTop">
<el-button-group> <el-button-group>
<el-button :type="activeTab === 'coinConsumeDetail' ? 'primary' : 'default'" <el-button :type="activeTab === 'coinConsumeDetail' ? 'primary' : 'default'"
@click="navigateTo('coinConsumeDetail')" :disabled="!hasDetail">
@click="navigateTo('coinConsumeDetail')" v-if="hasDetail">
金币消耗明细 金币消耗明细
</el-button> </el-button>
<el-button :type="activeTab === 'addCoinConsume' ? 'primary' : 'default'" @click="navigateTo('addCoinConsume')" <el-button :type="activeTab === 'addCoinConsume' ? 'primary' : 'default'" @click="navigateTo('addCoinConsume')"
:disabled="!hasAdd">
v-if="hasAdd">
新增消耗 新增消耗
</el-button> </el-button>
</el-button-group> </el-button-group>
@ -42,8 +42,8 @@ const navigateTo = (name) => {
// //
const initPermissions = () => { const initPermissions = () => {
if (!menuTree.value || !menuTree.value.length) return; if (!menuTree.value || !menuTree.value.length) return;
hasAdd.value = hasMenuPermission(menuTree.value, permissionMapping.Submit_Gold_Coin_Consumption);
hasDetail.value = hasMenuPermission(menuTree.value, permissionMapping.View_Gold_Coin_Consumption_Details);
hasAdd.value = hasMenuPermission(menuTree.value, permissionMapping.addCoinConsume);
hasDetail.value = hasMenuPermission(menuTree.value, permissionMapping.coinConsumeDetail);
}; };
// //
@ -51,7 +51,7 @@ const getDefaultAuditRoute = () => {
initPermissions(); initPermissions();
if (hasDetail.value) return 'coinConsumeDetail'; if (hasDetail.value) return 'coinConsumeDetail';
if (hasAdd.value) return 'addCoinConsume'; if (hasAdd.value) return 'addCoinConsume';
return 'addCoinConsume';
return 'coinConsumeDetail';
}; };
// //

234
src/views/history/history.vue

@ -1,179 +1,71 @@
<template> <template>
<el-tabs v-model="activeName" type="card" @tab-click="handleClick">
<el-tab-pane label="金币查询(新)" name="new"></el-tab-pane>
<el-tab-pane label="金币查询(旧)" name="old"></el-tab-pane>
</el-tabs>
<el-card>
<el-text size="large">姓名</el-text>
<el-input v-model="searchObj.name" placeholder="请输入姓名" style="width: 12vw;margin-right:1vw"
clearable></el-input>
<router-view></router-view>
</template>
<el-text size="large">精网号</el-text>
<el-input v-model="searchObj.jwcode" placeholder="请输入精网号" style="width: 12vw;margin-right:1vw"
clearable></el-input>
<script setup>
import {onMounted, ref, watch} from 'vue';
import {useRoute, useRouter} from 'vue-router';
import {storeToRefs} from "pinia";
import {useAdminStore} from "@/store/index.js";
import {hasMenuPermission, permissionMapping} from "@/utils/menuTreePermission.js";
<el-text size="large" style="width: 80px">更新时间</el-text>
<el-date-picker v-model="dateRange" type="datetimerange" :default-time="defaultTime" range-separator=""
start-placeholder="开始时间" end-placeholder="结束时间" style="width: 25vw;margin-right:1vw" />
const router = useRouter();
const route = useRoute();
const adminStore = useAdminStore();
const {menuTree} = storeToRefs(adminStore);
<el-button type="success" @click="resetSearch">重置</el-button>
<el-button type="primary" v-if="activeName == 'new'" @click="get">查询</el-button>
<el-button type="primary" v-else-if="activeName == 'old'" @click="getOld">查询</el-button>
</el-card>
const activeTab = ref('');
const hasNew = ref(false);
const hasOld = ref(false);
//
const navigateTo = (name) => {
activeTab.value = name;
router.push({name});
};
<el-card style="margin-top:10px" v-show="tableData.length > 0">
<el-table :data="tableData" style="width: 82vw;height:60vh">
<el-table-column type="index" label="序号" width="100" header-align="center" align="center">
<template #default="scope">
{{ scope.$index + 1 + (pagination.pageNum - 1) * pagination.pageSize }}
</template>
</el-table-column>
<el-table-column prop="name" label="客户姓名" width="180" show-overflow-tooltip />
<el-table-column prop="jwcode" label="精网号" width="180" header-align="center" align="center" />
<el-table-column prop="num" label="数量" width="180" header-align="center" align="center" />
<el-table-column prop="updateType" show-overflow-tooltip label="更新类型" width="180" align="center" />
<el-table-column v-if="activeName === 'new'" prop="freeGold" label="免费金币" width="180" align="center" />
<el-table-column v-if="activeName === 'new'" prop="permanentGold" label="永久金币" width="180" align="center" />
<el-table-column v-if="activeName === 'new'" prop="taskGold" label="任务金币" width="180" align="center" />
<el-table-column prop="operator" label="操作人" width="180" />
<el-table-column prop="createTime" label="更新时间" width="200" header-align="center" align="center" />
<el-table-column prop="remark" label="备注" show-overflow-tooltip width="200" align="center" />
</el-table>
<el-pagination background style="margin-top:20px" v-model:current-page="pagination.pageNum"
v-model:page-size="pagination.pageSize" layout="total, sizes, prev, pager, next, jumper"
:total="pagination.total" @size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
</el-card>
</template>
<script setup>
import { onMounted, ref } from 'vue'
import { ElMessage } from 'element-plus'
import API from '@/util/http.js'
import moment from 'moment'
import { useAdminStore } from "@/store/index.js"
import { storeToRefs } from "pinia"
import dayjs from 'dayjs'
const adminStore = useAdminStore()
const { adminData, menuTree } = storeToRefs(adminStore)
import { permissionMapping, findMenuById } from "@/utils/menuTreePermission.js"
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1, 23, 59, 59),
]
const activeName = ref('new')
const handleClick = function (tab) {
activeName.value = tab.props.name
if (tab.props.name === 'new') {
resetSearch()
pagination.value.pageNum = 1
tableData.value = []
console.log('新的');
} else if (tab.props.name === 'old') {
resetSearch()
pagination.value.pageNum = 1
console.log('旧的');
tableData.value = []
}
}
const tableData = ref([])
const dateRange = ref([])
const searchObj = ref({
name: '',
jwcode: ''
})
const pagination = ref({
pageNum: 1,
pageSize: 50,
total: 0
})
//
const getOld = async function () {
if (findMenuById(menuTree.value, permissionMapping.History_Query)) {
try {
if ((searchObj.value.name || searchObj.value.jwcode) && activeName.value == 'old') {
const startTime = dateRange.value && dateRange.value[0] ? moment(dateRange.value[0]).format('YYYY-MM-DD HH:mm:ss') : ""
const endTime = dateRange.value && dateRange.value[1] ? moment(dateRange.value[1]).format('YYYY-MM-DD HH:mm:ss') : ""
const res = await API({
url: '/history/getOldHistoryRecord',
data: {
...searchObj.value,
startTime: startTime,
endTime: endTime,
pageNum: pagination.value.pageNum,
pageSize: pagination.value.pageSize,
}
})
if (res.code == 200) {
ElMessage.success('查询成功')
tableData.value = res.data.list
console.log('tableData.value', res.data.list);
pagination.value.total = res.data.total
}
} else {
ElMessage.error('请输入姓名或精网号')
return
}
} catch (e) {
ElMessage.error(e.message)
}
}
}
//
const get = async function () {
if (findMenuById(menuTree.value, permissionMapping.History_Query)) {
try {
if ((searchObj.value.name || searchObj.value.jwcode) && activeName.value == 'new') {
const startTime = dateRange.value && dateRange.value[0] ? moment(dateRange.value[0]).format('YYYY-MM-DD HH:mm:ss') : ""
const endTime = dateRange.value && dateRange.value[1] ? moment(dateRange.value[1]).format('YYYY-MM-DD HH:mm:ss') : ""
const res = await API({
url: '/history/getNewHistoryRecord',
data: {
...searchObj.value,
startTime: startTime,
endTime: endTime,
pageNum: pagination.value.pageNum,
pageSize: pagination.value.pageSize,
}
})
if (res.code == 200) {
ElMessage.success('查询成功')
tableData.value = res.data.list
console.log('tableData.value', res.data.list)
pagination.value.total = res.data.total
}
} else {
ElMessage.error('请输入姓名或精网号')
return
}
} catch (e) {
ElMessage.error(e.message)
}
}
}
const resetSearch = function () {
searchObj.value = {
name: '',
jwcode: ''
}
dateRange.value = []
}
const handlePageSizeChange = function (val) {
pagination.value.pageSize = val
if (activeName.value == 'new') {
get()
} else if (activeName.value == 'old') {
getOld()
}
}
const handleCurrentChange = function (val) {
pagination.value.pageNum = val
if (activeName.value == 'new') {
get()
} else if (activeName.value == 'old') {
getOld()
//
const initPermissions = () => {
if (!menuTree.value || !menuTree.value.length) return
hasNew.value = hasMenuPermission(menuTree.value, permissionMapping.newCoinSelect)
hasOld.value = hasMenuPermission(menuTree.value, permissionMapping.oldCoinSelect)
}
//
const getDefaultAuditRoute = () => {
initPermissions()
if (hasNew.value) return 'newHistory'
if (hasOld.value) return 'oldHistory'
return 'newHistory'
};
//
watch(() => route.name, (newName) => {
initPermissions()
if (newName === 'newHistory' || newName === 'oldHistory') {
activeTab.value = newName;
} else if (newName === 'history') {
// 访 /history
const defaultRoute = getDefaultAuditRoute();
navigateTo(defaultRoute);
} }
}
</script>
});
<style scoped></style>
//
onMounted(() => {
initPermissions()
console.log('============================',hasNew.value,hasOld.value)
if (route.name === 'history') {
const defaultRoute = getDefaultAuditRoute();
navigateTo(defaultRoute);
} else {
//
if (route.name === 'newHistory' || route.name === 'oldHistory') {
activeTab.value = route.name;
}
}
});
</script>
<style>
</style>

119
src/views/history/newHistory.vue

@ -0,0 +1,119 @@
<template>
<el-card>
<el-text size="large">姓名</el-text>
<el-input v-model="searchObj.name" placeholder="请输入姓名" style="width: 12vw;margin-right:1vw"
clearable></el-input>
<el-text size="large">精网号</el-text>
<el-input v-model="searchObj.jwcode" placeholder="请输入精网号" style="width: 12vw;margin-right:1vw"
clearable></el-input>
<el-text size="large" style="width: 80px">更新时间</el-text>
<el-date-picker v-model="dateRange" type="datetimerange" :default-time="defaultTime" range-separator=""
start-placeholder="开始时间" end-placeholder="结束时间" style="width: 25vw;margin-right:1vw" />
<el-button type="success" @click="resetSearch">重置</el-button>
<el-button type="primary" @click="get">查询</el-button>
</el-card>
<el-card style="margin-top:10px" v-show="tableData.length > 0">
<el-table :data="tableData" style="width: 82vw;height:60vh">
<el-table-column type="index" label="序号" width="100" header-align="center" align="center">
<template #default="scope">
{{ scope.$index + 1 + (pagination.pageNum - 1) * pagination.pageSize }}
</template>
</el-table-column>
<el-table-column prop="name" label="客户姓名" width="180" show-overflow-tooltip />
<el-table-column prop="jwcode" label="精网号" width="180" header-align="center" align="center" />
<el-table-column prop="num" label="数量" width="180" header-align="center" align="center" />
<el-table-column prop="updateType" show-overflow-tooltip label="更新类型" width="180" align="center" />
<el-table-column prop="freeGold" label="免费金币" width="180" align="center" />
<el-table-column prop="permanentGold" label="永久金币" width="180" align="center" />
<el-table-column prop="taskGold" label="任务金币" width="180" align="center" />
<el-table-column prop="operator" label="操作人" width="180" />
<el-table-column prop="createTime" label="更新时间" width="200" header-align="center" align="center" />
<el-table-column prop="remark" label="备注" show-overflow-tooltip width="200" align="center" />
</el-table>
<el-pagination background style="margin-top:20px" v-model:current-page="pagination.pageNum"
v-model:page-size="pagination.pageSize" layout="total, sizes, prev, pager, next, jumper"
:total="pagination.total" @size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
</el-card>
</template>
<script setup>
import { onMounted, ref } from 'vue'
import { ElMessage } from 'element-plus'
import API from '@/util/http.js'
import moment from 'moment'
import { useAdminStore } from "@/store/index.js"
import { storeToRefs } from "pinia"
import dayjs from 'dayjs'
const adminStore = useAdminStore()
const { adminData, menuTree } = storeToRefs(adminStore)
import { permissionMapping, findMenuById } from "@/utils/menuTreePermission.js"
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1, 23, 59, 59),
]
const tableData = ref([])
const dateRange = ref([])
const searchObj = ref({
name: '',
jwcode: ''
})
const pagination = ref({
pageNum: 1,
pageSize: 50,
total: 0
})
//
const get = async function () {
try {
if (searchObj.value.name || searchObj.value.jwcode) {
const startTime = dateRange.value && dateRange.value[0] ? moment(dateRange.value[0]).format('YYYY-MM-DD HH:mm:ss') : ""
const endTime = dateRange.value && dateRange.value[1] ? moment(dateRange.value[1]).format('YYYY-MM-DD HH:mm:ss') : ""
const res = await API({
url: '/history/getNewHistoryRecord',
data: {
...searchObj.value,
startTime: startTime,
endTime: endTime,
pageNum: pagination.value.pageNum,
pageSize: pagination.value.pageSize,
}
})
if (res.code == 200) {
ElMessage.success('查询成功')
tableData.value = res.data.list
console.log('tableData.value', res.data.list)
pagination.value.total = res.data.total
}
} else {
ElMessage.error('请输入姓名或精网号')
return
}
} catch (e) {
ElMessage.error(e.message)
}
}
const resetSearch = function () {
searchObj.value = {
name: '',
jwcode: ''
}
dateRange.value = []
}
const handlePageSizeChange = function (val) {
pagination.value.pageSize = val
get()
}
const handleCurrentChange = function (val) {
pagination.value.pageNum = val
get()
}
</script>
<style scoped></style>

117
src/views/history/oldHistory.vue

@ -0,0 +1,117 @@
<template>
<el-card>
<el-text size="large">姓名</el-text>
<el-input v-model="searchObj.name" placeholder="请输入姓名" style="width: 12vw;margin-right:1vw"
clearable></el-input>
<el-text size="large">精网号</el-text>
<el-input v-model="searchObj.jwcode" placeholder="请输入精网号" style="width: 12vw;margin-right:1vw"
clearable></el-input>
<el-text size="large" style="width: 80px">更新时间</el-text>
<el-date-picker v-model="dateRange" type="datetimerange" :default-time="defaultTime" range-separator=""
start-placeholder="开始时间" end-placeholder="结束时间" style="width: 25vw;margin-right:1vw" />
<el-button type="success" @click="resetSearch">重置</el-button>
<el-button type="primary" @click="getOld">查询</el-button>
</el-card>
<el-card style="margin-top:10px" v-show="tableData.length > 0">
<el-table :data="tableData" style="width: 82vw;height:60vh">
<el-table-column type="index" label="序号" width="100" header-align="center" align="center">
<template #default="scope">
{{ scope.$index + 1 + (pagination.pageNum - 1) * pagination.pageSize }}
</template>
</el-table-column>
<el-table-column prop="name" label="客户姓名" width="180" show-overflow-tooltip />
<el-table-column prop="jwcode" label="精网号" width="180" header-align="center" align="center" />
<el-table-column prop="num" label="数量" width="180" header-align="center" align="center" />
<el-table-column prop="updateType" show-overflow-tooltip label="更新类型" width="180" align="center" />
<el-table-column prop="operator" label="操作人" width="180" />
<el-table-column prop="createTime" label="更新时间" width="200" header-align="center" align="center" />
<el-table-column prop="remark" label="备注" show-overflow-tooltip width="200" align="center" />
</el-table>
<el-pagination background style="margin-top:20px" v-model:current-page="pagination.pageNum"
v-model:page-size="pagination.pageSize" layout="total, sizes, prev, pager, next, jumper"
:total="pagination.total" @size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
</el-card>
</template>
<script setup>
import { onMounted, ref } from 'vue'
import { ElMessage } from 'element-plus'
import API from '@/util/http.js'
import moment from 'moment'
import { useAdminStore } from "@/store/index.js"
import { storeToRefs } from "pinia"
import dayjs from 'dayjs'
const adminStore = useAdminStore()
const { adminData, menuTree } = storeToRefs(adminStore)
import { permissionMapping, findMenuById } from "@/utils/menuTreePermission.js"
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1, 23, 59, 59),
]
const tableData = ref([])
const dateRange = ref([])
const searchObj = ref({
name: '',
jwcode: ''
})
const pagination = ref({
pageNum: 1,
pageSize: 50,
total: 0
})
//
const getOld = async function () {
try {
if (searchObj.value.name || searchObj.value.jwcode) {
const startTime = dateRange.value && dateRange.value[0] ? moment(dateRange.value[0]).format('YYYY-MM-DD HH:mm:ss') : ""
const endTime = dateRange.value && dateRange.value[1] ? moment(dateRange.value[1]).format('YYYY-MM-DD HH:mm:ss') : ""
const res = await API({
url: '/history/getOldHistoryRecord',
data: {
...searchObj.value,
startTime: startTime,
endTime: endTime,
pageNum: pagination.value.pageNum,
pageSize: pagination.value.pageSize,
}
})
if (res.code == 200) {
ElMessage.success('查询成功')
tableData.value = res.data.list
console.log('tableData.value', res.data.list);
pagination.value.total = res.data.total
}
} else {
ElMessage.error('请输入姓名或精网号')
return
}
} catch (e) {
ElMessage.error(e.message)
}
}
const resetSearch = function () {
searchObj.value = {
name: '',
jwcode: ''
}
dateRange.value = []
}
const handlePageSizeChange = function (val) {
pagination.value.pageSize = val
getOld()
}
const handleCurrentChange = function (val) {
pagination.value.pageNum = val
getOld()
}
</script>
<style scoped></style>

28
src/views/managerecharge/rate.vue

@ -4,7 +4,7 @@ import { ElMessage, ElMessageBox } from 'element-plus'
import request from '@/util/http' import request from '@/util/http'
import { useAdminStore } from "@/store/index.js"; import { useAdminStore } from "@/store/index.js";
import { storeToRefs } from "pinia"; import { storeToRefs } from "pinia";
import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js"
import { permissionMapping, hasMenuPermission } from "@/utils/menuTreePermission.js"
const adminStore = useAdminStore() const adminStore = useAdminStore()
const { adminData, menuTree } = storeToRefs(adminStore) const { adminData, menuTree } = storeToRefs(adminStore)
const regeEdit = ref(false) const regeEdit = ref(false)
@ -121,11 +121,22 @@ const getEditData = async function (row) {
console.log('请求失败', error) console.log('请求失败', error)
} }
} }
const editRole = ref(true)
editRole.value = findMenuById(menuTree.value, permissionMapping.Exchange_Rate_Modification)
const hasrateShow = ref(false)
const hasrateEdit = ref(false)
//
const initPermissions = () => {
if (!menuTree.value || !menuTree.value.length) return;
hasrateShow.value = hasMenuPermission(menuTree.value, permissionMapping.rateShow);
hasrateEdit.value = hasMenuPermission(menuTree.value, permissionMapping.rateEdit);
};
// //
const editRate = async function () { const editRate = async function () {
if (findMenuById(menuTree.value, permissionMapping.Exchange_Rate_Modification)) {
if(!hasrateEdit){
ElMessage.error('暂无权限')
return
}
// //
rateEdit.value.num = parseFloat(rateEdit.value.num); rateEdit.value.num = parseFloat(rateEdit.value.num);
try { try {
@ -139,9 +150,7 @@ const editRate = async function () {
} catch (error) { } catch (error) {
console.log('请求失败', error) console.log('请求失败', error)
} }
} else {
ElMessage.error('没有权限')
}
} }
// //
const edit = () => { const edit = () => {
@ -237,12 +246,13 @@ function handleInput(value) {
return value return value
} }
onMounted(async function () { onMounted(async function () {
initPermissions()
await getAllRate() await getAllRate()
}) })
</script> </script>
<template> <template>
<el-card style="width:82vw;height:85vh">
<el-card style="width:82vw;height:85vh" v-if="hasrateShow">
<el-table :data="tableData" v-if="(tableData.flag = 1)"> <el-table :data="tableData" v-if="(tableData.flag = 1)">
<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">
@ -265,7 +275,7 @@ onMounted(async function () {
<span>{{ formatDate(scope.row.updateTime) }}</span> <span>{{ formatDate(scope.row.updateTime) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" :span="3" v-if="editRole">
<el-table-column v-if="hasrateEdit" label="操作" :span="3">
<template #default="scope"> <template #default="scope">
<el-button type="text" @click="() => { <el-button type="text" @click="() => {
regeEdit = true regeEdit = true

33
src/views/permissions/permissions.vue

@ -1,19 +1,5 @@
<template> <template>
<div class="father">
<el-button-group>
<el-button :type="activeTab === 'userPermission' ? 'primary' : 'default'" @click="navigateTo('userPermission')"
:disabled="!hasDetail">
用户管理
</el-button>
<el-button :type="activeTab === 'rolePermission' ? 'primary' : 'default'" @click="navigateTo('rolePermission')"
:disabled="!hasBalance">
角色管理
</el-button>
</el-button-group>
</div>
<div>
<router-view></router-view> <router-view></router-view>
</div>
</template> </template>
<script setup> <script setup>
@ -28,8 +14,8 @@ const adminStore = useAdminStore();
const { menuTree } = storeToRefs(adminStore); const { menuTree } = storeToRefs(adminStore);
const activeTab = ref(''); const activeTab = ref('');
const hasDetail = ref(false);
const hasBalance = ref(false);
const hasUser = ref(false);
const hasRole = ref(false);
// //
const navigateTo = (name) => { const navigateTo = (name) => {
activeTab.value = name; activeTab.value = name;
@ -41,15 +27,16 @@ const navigateTo = (name) => {
const initPermissions = () => { const initPermissions = () => {
if (!menuTree.value || !menuTree.value.length) return; if (!menuTree.value || !menuTree.value.length) return;
hasDetail.value = hasMenuPermission(menuTree.value, permissionMapping.View_Permission);
hasBalance.value = hasMenuPermission(menuTree.value, permissionMapping.View_Role);
hasUser.value = hasMenuPermission(menuTree.value, permissionMapping.userManage);
hasRole.value = hasMenuPermission(menuTree.value, permissionMapping.roleManage);
console.log('====================================', hasUser.value, hasRole.value)
}; };
// //
const getDefaultAuditRoute = () => { const getDefaultAuditRoute = () => {
initPermissions(); initPermissions();
if (hasDetail.value) return 'userPermission';
if (hasBalance.value) return 'rolePermission';
if (hasUser.value) return 'userPermission';
if (hasRole.value) return 'rolePermission';
return 'userPermission'; return 'userPermission';
}; };
@ -79,9 +66,3 @@ onMounted(() => {
} }
}); });
</script> </script>
<style>
.father{
width:82vw;
height:4vh;
}
</style>

78
src/views/permissions/rolePermission.vue

@ -39,18 +39,12 @@ const addRole = ref({
market: '' market: ''
}) })
const addRoleMarket = ref([]) const addRoleMarket = ref([])
const viewRole = ref([])
const getRolePermission = async function () {
const result = await request({
url: '/menu/tree',
data: {
"id": adminData.value.roleId
}
})
viewRole.value = collectIds(result.data)
console.log('result111', viewRole.value);
}
const getRoleList = async function (val) { const getRoleList = async function (val) {
if(!findMenuById(menuTree.value, permissionMapping.roleManageShow)){
ElMessage.error('无此权限')
return
}
try { try {
if (typeof val === 'number') { if (typeof val === 'number') {
getObj.value.pageNum = val getObj.value.pageNum = val
@ -178,6 +172,10 @@ function processTreeData(data) {
} }
const handleAddRole = async function () { const handleAddRole = async function () {
if(!findMenuById(menuTree.value, permissionMapping.addRoleInfo)){
ElMessage.error('无此权限')
return
}
try { try {
await new Promise((resolve, reject) => { await new Promise((resolve, reject) => {
Ref.value.validate((valid) => { Ref.value.validate((valid) => {
@ -242,23 +240,10 @@ const getLists = async function () {
data: { id: roleId } data: { id: roleId }
}) })
data.value = res.data data.value = res.data
// let originalData = res.data.filter(item => item.id !== 9);
//
// data.value = filterGoldenBeanMenus(originalData);
// data.value = data.value.filter(item => item.id !== 9);
data.value = data.value.filter(item => item.id !== 9);
data.value = filterPermission(data.value)
console.log('看看data', data.value) console.log('看看data', data.value)
console.log('parentID:', addRole.value.parentId, 'roleId:', roleId) console.log('parentID:', addRole.value.parentId, 'roleId:', roleId)
/* // 根据地区过滤金豆菜单
if (addRole.value.market !== '总部') {
//
originalData = filterGoldenBeanMenus(originalData);
}
data.value = originalData; // */
if (addRole.value.parentId && addRole.value.parentId !== 2) { if (addRole.value.parentId && addRole.value.parentId !== 2) {
const result = await API({ const result = await API({
url: '/general/roleMarket', url: '/general/roleMarket',
@ -292,11 +277,15 @@ const getLists = async function () {
// //
const goldenBeanMenuIds = new Set([ const goldenBeanMenuIds = new Set([
43, 55, 54, // ->
41, 47, 46, 48, // ->
42, 50, 49, 52, 51, // ->
45, 53 // ->
permissionMapping.beanAudit,
permissionMapping.beanRecharge,
permissionMapping.beanConsume,
permissionMapping.beanDetail
]) ])
// 15,43,44,45,46,47,//
// 18,52,53,54,//
// 20,57,58,59,60,//
// 23//
const filterGoldenBeanMenus = (tree) => { const filterGoldenBeanMenus = (tree) => {
return tree return tree
.filter(item => { .filter(item => {
@ -311,6 +300,18 @@ const filterGoldenBeanMenus = (tree) => {
return true return true
}) })
} }
// (????????)
const filterPermission = (tree) => {
return tree.filter(item =>{
if(item.id === permissionMapping.permissionManage){
return false
}
else if(item.children && item.children.length > 0){
item.children = filterPermission(item.children)
}
return true
})
}
// //
const handleEditRolePermissionCheck = (checkedNodes, checkedInfo) => { const handleEditRolePermissionCheck = (checkedNodes, checkedInfo) => {
const { checkedKeys, checkedNodes: allCheckedNodes } = checkedInfo const { checkedKeys, checkedNodes: allCheckedNodes } = checkedInfo
@ -438,8 +439,8 @@ const permissionEditRoleInit = async function (row) {
data: { id: roleId } data: { id: roleId }
}); });
data.value = res.data; data.value = res.data;
data.value = data.value.filter(item => item.id !== 9);
data.value = filterGoldenBeanMenus(data.value);
data.value = filterPermission(data.value)
//data.value = filterGoldenBeanMenus(data.value);
// id // id
if (row.tree && row.tree.length > 0) { if (row.tree && row.tree.length > 0) {
@ -467,6 +468,10 @@ const permissionEditRoleInit = async function (row) {
// //
const permissionEditRole = async function () { const permissionEditRole = async function () {
if(!findMenuById(menuTree.value, permissionMapping.editRoleInfo)){
ElMessage.error('无此权限')
return
}
try { try {
await new Promise((resolve, reject) => { await new Promise((resolve, reject) => {
Ref.value.validate((valid) => { Ref.value.validate((valid) => {
@ -569,11 +574,12 @@ const Rolerules = reactive({
const throttledHandleAddRole = _.throttle(handleAddRole, 5000, { const throttledHandleAddRole = _.throttle(handleAddRole, 5000, {
trailing: false trailing: false
}) })
const canLook = findMenuById(menuTree.value,permissionMapping.roleManageShow)
const canAdd = findMenuById(menuTree.value, permissionMapping.addRoleInfo)
const canEdit = findMenuById(menuTree.value, permissionMapping.editRoleInfo)
// //
onMounted(async function () { onMounted(async function () {
await getRoleList() await getRoleList()
await getRolePermission()
await getRoleArea() await getRoleArea()
}) })
@ -586,14 +592,14 @@ onMounted(async function () {
<el-input v-model="role.name" style="width: 240px" placeholder="请输入角色名称" clearable /> <el-input v-model="role.name" style="width: 240px" placeholder="请输入角色名称" clearable />
<div style="margin-left: auto;"> <div style="margin-left: auto;">
<el-button type="success" @click="reset()">重置</el-button> <el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="searchRole()">查询</el-button>
<el-button type="primary" @click="searchRole()" :disabled="!canLook" v-if="canLook">查询</el-button>
</div> </div>
</div> </div>
</el-card> </el-card>
<el-card> <el-card>
<div class="add-item"> <div class="add-item">
<el-button style="color: #048efb; border: 1px solid #048efb" @click="permissionAddInit()">新增角色</el-button>
<el-button style="color: #048efb; border: 1px solid #048efb" @click="permissionAddInit()" :disabled="!canAdd" v-if="canAdd">新增角色</el-button>
</div> </div>
<div> <div>
<el-table :data="roleData" style="width: 100%" show-overflow-tooltip> <el-table :data="roleData" style="width: 100%" show-overflow-tooltip>
@ -620,7 +626,7 @@ onMounted(async function () {
</el-table-column> </el-table-column>
<el-table-column prop="operation" label="操作" width="200px"> <el-table-column prop="operation" label="操作" width="200px">
<template #default="scope"> <template #default="scope">
<el-button type="warning" text @click="permissionEditRoleInit(scope.row)" :disabled="(scope.row.id === 2)|| (scope.row.id === 1)">
<el-button type="warning" text @click="permissionEditRoleInit(scope.row)" :disabled="(scope.row.id === 2)|| (scope.row.id === 1) || !canEdit" v-if="canEdit">
编辑 编辑
</el-button> </el-button>
</template> </template>

73
src/views/permissions/userPermission.vue

@ -5,6 +5,12 @@ import { InfoFilled } from '@element-plus/icons-vue'
import _ from 'lodash' import _ from 'lodash'
import request from '@/util/http' import request from '@/util/http'
import API from '@/util/http' import API from '@/util/http'
import { useAdminStore } from "@/store/index.js"
import { storeToRefs } from "pinia"
import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js"
const adminStore = useAdminStore()
const { adminData, menuTree } = storeToRefs(adminStore)
// //
const tableData = ref([]) const tableData = ref([])
const total = ref(100) const total = ref(100)
@ -97,20 +103,6 @@ const addAdmin = ref({
machineId: '', machineId: '',
remark: '' remark: ''
}) })
//
const adminData = ref({})
// todo
const getAdminData = async function () {
try {
const result = await API({ url: '/admin/userinfo', data: {} })
adminData.value = result
// console.log('', result)
console.log('管理员用户信息', adminData.value)
} catch (error) {
console.log('请求失败', error)
}
}
// //
const permissionEditObj = ref({ const permissionEditObj = ref({
checkedKeys: [], checkedKeys: [],
@ -204,7 +196,6 @@ const getRoleArea = async function () {
console.log('请求失败', error) console.log('请求失败', error)
} }
} }
// //
const marketsTree = ref([]) const marketsTree = ref([])
const getArea = async function () { const getArea = async function () {
@ -275,6 +266,10 @@ const userAddInit = function () {
// //
const permissionAdd = async function () { const permissionAdd = async function () {
if (!findMenuById(menuTree.value, permissionMapping.addUserInfo)) {
ElMessage.error('无此权限')
return
}
try { try {
await new Promise((resolve, reject) => { await new Promise((resolve, reject) => {
Ref.value.validate((valid) => { Ref.value.validate((valid) => {
@ -327,7 +322,6 @@ const Ref = ref(null)
// //
const permissionList = ref([]) const permissionList = ref([])
const getRoles = async function () { const getRoles = async function () {
try { try {
const res = await API({ url: '/role/selectAll' }) const res = await API({ url: '/role/selectAll' })
@ -341,8 +335,6 @@ const getRoles = async function () {
console.error('获取权限列表失败:', error) console.error('获取权限列表失败:', error)
} }
} }
// //
const openUserEditVisible = function () { const openUserEditVisible = function () {
userEditVisible.value = true userEditVisible.value = true
@ -504,6 +496,10 @@ const editAdminRules = {
}; };
// //
const permissionEdit = async function () { const permissionEdit = async function () {
if (!findMenuById(menuTree.value, permissionMapping.editUserInfo)) {
ElMessage.error('无此权限')
return
}
let { adminName: userName, roleName: oldRole, roleId: newRoleId } = permissionEditObj.value; let { adminName: userName, roleName: oldRole, roleId: newRoleId } = permissionEditObj.value;
if (oldRole == null) { if (oldRole == null) {
oldRole = '暂未分配角色' oldRole = '暂未分配角色'
@ -576,6 +572,10 @@ const del = function (row) {
} }
// //
const delConfirm = async function () { const delConfirm = async function () {
if (!findMenuById(menuTree.value, permissionMapping.deleteUserInfo)) {
ElMessage.error('无此权限')
return
}
try { try {
const result = await request({ const result = await request({
url: '/permission/deleteAdmin', url: '/permission/deleteAdmin',
@ -594,6 +594,10 @@ const delConfirm = async function () {
} }
// //
const editStatus = async function (row) { const editStatus = async function (row) {
if (!findMenuById(menuTree.value, permissionMapping.changeStatus)) {
ElMessage.error('无此权限')
return
}
const { id, account, targetStatus, ...restRow } = currentStatusRow.value const { id, account, targetStatus, ...restRow } = currentStatusRow.value
try { try {
@ -783,6 +787,10 @@ const resetPassword = function (row) {
// //
const confirmResetPassword = async function () { const confirmResetPassword = async function () {
if (!findMenuById(menuTree.value, permissionMapping.updateUserInfo)) {
ElMessage.error('无此权限')
return
}
console.log('adminData', adminData.value) console.log('adminData', adminData.value)
// markets // markets
if (typeof adminData.value.markets === 'string' && adminData.value.markets) { if (typeof adminData.value.markets === 'string' && adminData.value.markets) {
@ -883,16 +891,21 @@ const throttledPermissionEdit = _.throttle(permissionEdit, 5000, {
const throttledPermissionAdd = _.throttle(permissionAdd, 5000, { const throttledPermissionAdd = _.throttle(permissionAdd, 5000, {
trailing: false trailing: false
}) })
const canLook = findMenuById(menuTree.value, permissionMapping.userManageShow)//
const canAdd = findMenuById(menuTree.value, permissionMapping.addUserInfo)
const canEdit = findMenuById(menuTree.value, permissionMapping.editUserInfo)
const canReset = findMenuById(menuTree.value, permissionMapping.updateUserInfo)
const canDel = findMenuById(menuTree.value, permissionMapping.deleteUserInfo)
const change = findMenuById(menuTree.value, permissionMapping.changeStatus)
// //
onMounted(async function () { onMounted(async function () {
await getAdminData()
await getPermission() await getPermission()
await getArea() await getArea()
await getStore() await getStore()
await getRoles() await getRoles()
await getRoleArea() await getRoleArea()
})
console.log('看看权限', canAdd, canEdit, canReset, canDel, change)
})
</script> </script>
<template> <template>
@ -918,14 +931,14 @@ onMounted(async function () {
<div class="head-card-btn"> <div class="head-card-btn">
<el-button type="success" @click="reset()">重置</el-button> <el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="search()">查询</el-button>
<el-button type="primary" @click="search()" v-if="canLook">查询</el-button>
</div> </div>
</div> </div>
</el-card> </el-card>
<el-card> <el-card>
<!-- 展示表单 --> <!-- 展示表单 -->
<div class="add-item"> <div class="add-item">
<el-button style="color: #048efb; border: 1px solid #048efb" @click="userAddInit()">新增用户</el-button>
<el-button style="color: #048efb; border: 1px solid #048efb" :disabled="!canAdd" v-if="canAdd" @click="userAddInit()">新增用户</el-button>
</div> </div>
<div> <div>
@ -947,17 +960,17 @@ onMounted(async function () {
<el-table-column prop="remark" label="备注" /> <el-table-column prop="remark" label="备注" />
<el-table-column prop="operation" label="操作" width="280px"> <el-table-column prop="operation" label="操作" width="280px">
<template #default="scope"> <template #default="scope">
<el-button type="warning" text @click="resetPassword(scope.row)">
<el-button type="warning" text :disabled="!canReset" @click="resetPassword(scope.row)" v-if="canReset">
重置密码 重置密码
</el-button> </el-button>
<el-button type="primary" text @click="permissionEditInit(scope.row)"
:disabled="scope.row.adminStatus === 0 || scope.row.account === adminData.account">
<el-button type="primary" text @click="permissionEditInit(scope.row)" v-if="canEdit"
:disabled="!canEdit || scope.row.adminStatus === 0 || scope.row.account === adminData.account">
修改权限 修改权限
</el-button> </el-button>
<el-popconfirm title="确定将此用户删除吗?" @confirm="delConfirm"> <el-popconfirm title="确定将此用户删除吗?" @confirm="delConfirm">
<template #reference> <template #reference>
<el-button type="danger" text @click="del(scope.row)"
:disabled="scope.row.adminStatus === 0 || scope.row.account === adminData.account">
<el-button type="danger" text @click="del(scope.row)" v-if="canDel"
:disabled="!canDel ||scope.row.adminStatus === 0 || scope.row.account === adminData.account">
删除 删除
</el-button> </el-button>
</template> </template>
@ -972,8 +985,8 @@ onMounted(async function () {
</el-table-column> </el-table-column>
<el-table-column prop="adminStatus" label="状态"> <el-table-column prop="adminStatus" label="状态">
<template #default="scope"> <template #default="scope">
<el-switch :model-value="scope.row.adminStatus" :active-value="1" :inactive-value="0" size="large"
:disabled="scope.row.account === adminData.account || statusLoading[scope.row.id]"
<el-switch :model-value="scope.row.adminStatus" :active-value="1" :inactive-value="0" size="large" v-if="change"
:disabled="!change || scope.row.account === adminData.account || statusLoading[scope.row.id]"
@change="(targetStatus) => showStatusConfirm(scope.row, targetStatus)" style=" @change="(targetStatus) => showStatusConfirm(scope.row, targetStatus)" style="
--el-switch-on-color: #13ce66; --el-switch-on-color: #13ce66;
--el-switch-off-color: #ff4949; --el-switch-off-color: #ff4949;

12
src/views/recharge/bean/beanRecharge.vue

@ -2,15 +2,15 @@
<div class="father"> <div class="father">
<el-button-group> <el-button-group>
<el-button :type="activeTab === 'addBeanRecharge' ? 'primary' : 'default'" @click="navigateTo('addBeanRecharge')" <el-button :type="activeTab === 'addBeanRecharge' ? 'primary' : 'default'" @click="navigateTo('addBeanRecharge')"
:disabled="!hasAdd" style="width: 6.5vw">
v-if="hasAdd" style="width: 6.5vw">
新增充值 新增充值
</el-button> </el-button>
<el-button :type="activeTab === 'beanSystemRecharge' ? 'primary' : 'default'" <el-button :type="activeTab === 'beanSystemRecharge' ? 'primary' : 'default'"
@click="navigateTo('beanSystemRecharge')" :disabled="!hasSystem" style="width: 6.5vw;">
@click="navigateTo('beanSystemRecharge')" v-if="hasSystem" style="width: 6.5vw;">
系统充值 系统充值
</el-button> </el-button>
<el-button :type="activeTab === 'beanOnlineRecharge' ? 'primary' : 'default'" <el-button :type="activeTab === 'beanOnlineRecharge' ? 'primary' : 'default'"
@click="navigateTo('beanOnlineRecharge')" :disabled="!hasOnline" style="width: 6.5vw;">
@click="navigateTo('beanOnlineRecharge')" v-if="hasOnline" style="width: 6.5vw;">
线上充值 线上充值
</el-button> </el-button>
</el-button-group> </el-button-group>
@ -46,9 +46,9 @@ const navigateTo = (name) => {
const initPermissions = () => { const initPermissions = () => {
if (!menuTree.value || !menuTree.value.length) return; if (!menuTree.value || !menuTree.value.length) return;
hasAdd.value = hasMenuPermission(menuTree.value, permissionMapping.Submit_Golden_Bean_Recharge);
hasSystem.value = hasMenuPermission(menuTree.value, permissionMapping.View_Golden_Bean_System_Recharge_Details);
hasOnline.value = hasMenuPermission(menuTree.value, permissionMapping.View_Golden_Bean_Online_Recharge_Details);
hasAdd.value = hasMenuPermission(menuTree.value, permissionMapping.addBeanRecharge);
hasSystem.value = hasMenuPermission(menuTree.value, permissionMapping.beanSystemRecharge);
hasOnline.value = hasMenuPermission(menuTree.value, permissionMapping.beanOnlineRecharge);
}; };
// //

8
src/views/recharge/gold/coinRecharge.vue

@ -2,11 +2,11 @@
<div style="height:4vh;"> <div style="height:4vh;">
<el-button-group> <el-button-group>
<el-button :type="activeTab === 'coinRechargeDetail' ? 'primary' : 'default'" <el-button :type="activeTab === 'coinRechargeDetail' ? 'primary' : 'default'"
@click="navigateTo('coinRechargeDetail')" :disabled="!hasDetail">
@click="navigateTo('coinRechargeDetail')" v-if="hasDetail">
金币充值明细 金币充值明细
</el-button> </el-button>
<el-button :type="activeTab === 'addCoinRecharge' ? 'primary' : 'default'" @click="navigateTo('addCoinRecharge')" <el-button :type="activeTab === 'addCoinRecharge' ? 'primary' : 'default'" @click="navigateTo('addCoinRecharge')"
:disabled="!hasAdd">
v-if="hasAdd">
新增充值 新增充值
</el-button> </el-button>
</el-button-group> </el-button-group>
@ -40,8 +40,8 @@ const navigateTo = (name) => {
const initPermissions = () => { const initPermissions = () => {
if (!menuTree.value || !menuTree.value.length) return; if (!menuTree.value || !menuTree.value.length) return;
hasAdd.value = hasMenuPermission(menuTree.value, permissionMapping.Submit_Gold_Coin_Recharge);
hasDetail.value = hasMenuPermission(menuTree.value, permissionMapping.View_Gold_Coin_Recharge_Details);
hasAdd.value = hasMenuPermission(menuTree.value, permissionMapping.addCoinRecharge);
hasDetail.value = hasMenuPermission(menuTree.value, permissionMapping.coinRechargeDetail);
}; };
// //

9
src/views/refund/gold/addCoinRefund.vue

@ -111,6 +111,11 @@ const getRefund = async function () {
} }
// 退 // 退
const add = async function () { const add = async function () {
//
if (!findMenuById(menuTree.value, permissionMapping.addCoinRefund)) {
ElMessage.error('无此权限')
return
}
try { try {
if (addRefund.value.refundType === '商品退款') { if (addRefund.value.refundType === '商品退款') {
addRefund.value.type = 1 addRefund.value.type = 1
@ -408,7 +413,7 @@ const calculatedRechargeGoods = computed(() => {
const taskGold = addRefund.value.taskGold === '' ? 0 : +addRefund.value.taskGold; const taskGold = addRefund.value.taskGold === '' ? 0 : +addRefund.value.taskGold;
return Number((permanentGold + freeGold + taskGold).toFixed(2)); return Number((permanentGold + freeGold + taskGold).toFixed(2));
}) })
const canAdd = findMenuById(menuTree.value,permissionMapping.addCoinRefund)
watch(calculatedRechargeGoods, (newVal) => { watch(calculatedRechargeGoods, (newVal) => {
addRefund.value.sumGold = newVal addRefund.value.sumGold = newVal
}) })
@ -497,7 +502,7 @@ onMounted(() =>{
</div> </div>
<el-button type="success" @click="cancel()" style="margin-left: 200px">重置</el-button> <el-button type="success" @click="cancel()" style="margin-left: 200px">重置</el-button>
<el-button type="primary" :disabled="addDisabled" @click="addBefore"> 提交</el-button>
<el-button type="primary" :disabled="addDisabled" @click="addBefore" v-if="canAdd"> 提交</el-button>
</el-form> </el-form>
</div> </div>
</div> </div>

726
src/views/refund/gold/addNewCoinRefund.vue

@ -1,726 +0,0 @@
<script setup>
import {onMounted, reactive, ref, watch} from "vue";
import {ElMessage} from "element-plus";
import moment from "moment";
import request from "@/util/http.js";
import Cookies from 'js-cookie';
import {useAdminStore} from "@/store/index.js";
import {storeToRefs} from "pinia";
import {WarnTriangleFilled} from "@element-plus/icons-vue";
import dayjs from "dayjs";
const adminStore = useAdminStore();
const { adminData, menuTree } = storeToRefs(adminStore);
const addDisabled = ref(false);
const user = ref({
jwcode: null,
name: "",
market: "",
historySumGold: null,
historyPermanentGold: null,
historyFreeGold: null,
historyTaskGold: null,
rechargeNum: null,
consumeNum: null,
firstRecharge: "",
nowPermanentGold: null,
nowFreeJune: null,
nowTaskGold: null,
nowFreeDecember: null,
nowFreeGold: null,
nowSumGold: null
});
const addConsume = ref({
jwcode: null,
goodsName: "金币退款",
sumGold: null,
freeGold: null,
permanentGold: null,
taskGold: null,
remark: "",
refundModel: null,
adminId: adminData.value.id,
adminName: adminData.value.adminName
});
const Ref = ref(null);
const rules = reactive({
jwcode: [
{ required: true, message: "请输入精网号", trigger: "blur" },
],
remark: [
{ required: true, message: "请输入备注", trigger: "blur" },
],
permanentGold: [
{ required: true, message: "请输入永久金币数", trigger: "blur" },
{
validator: (rule, value, callback) => {
if (value === null || value === undefined || !Number.isInteger(value) || value < 0) {
callback(new Error("永久金币必须为非负整数"));
} else {
callback();
}
},
trigger: "blur"
}
],
freeGold: [
{ required: true, message: "请输入免费金币数", trigger: "blur" },
{
validator: (rule, value, callback) => {
if (value === null || value === undefined || !Number.isInteger(value) || value < 0) {
callback(new Error("免费金币必须为非负整数"));
} else {
callback();
}
},
trigger: "blur"
}
],
taskGold: [
{ required: true, message: "请输入任务金币数", trigger: "blur" },
{
validator: (rule, value, callback) => {
if (value === null || value === undefined || !Number.isInteger(value) || value < 0) {
callback(new Error("任务金币必须为非负整数"));
} else {
callback();
}
},
trigger: "blur"
}
],
sumGold: [
{
validator: (rule, value, callback) => {
if ((value || 0) <= 0) {
callback(new Error("三类金币总数必须大于0"));
} else {
callback();
}
},
trigger: "blur"
}
]
});
// watch
watch(
() => [addConsume.value.freeGold, addConsume.value.permanentGold, addConsume.value.taskGold],
([free, permanent, task]) => {
const sum = (parseInt(free) || 0) + (parseInt(permanent) || 0) + (parseInt(task) || 0);
addConsume.value.sumGold = sum;
},
{ deep: true }
);
// sumGold > 0
function validateInputToFreeGold() {
if (!user.value.jwcode) {
ElMessage.warning("请先查询用户信息");
resetForm()
return false;
}
const { freeGold, permanentGold, taskGold, sumGold } = addConsume.value;
if(freeGold > user.value.nowFreeGold){
ElMessage.warning("该用户免费金币不足,请重新输入!");
addConsume.value.freeGold = null;
return
}
return true;
}
// sumGold > 0
function validateInputToPermanentGold() {
if (!user.value.jwcode) {
ElMessage.warning("请先查询用户信息");
resetForm()
return false;
}
const { freeGold, permanentGold, taskGold, sumGold } = addConsume.value;
if(permanentGold > user.value.nowPermanentGold){
ElMessage.warning("该用户永久金币不足,请重新输入!");
addConsume.value.permanentGold = null;
return
}
return true;
}
// sumGold > 0
function validateInputToTaskGold() {
if (!user.value.jwcode) {
ElMessage.warning("请先查询用户信息");
resetForm()
return false;
}
const { freeGold, permanentGold, taskGold, sumGold } = addConsume.value;
if(taskGold > user.value.nowTaskGold){
ElMessage.warning("该用户任务金币不足,请重新输入!");
addConsume.value.taskGold = null;
return
}
return true;
}
// sumGold > 0
function validateInputTOSumGold() {
if (!user.value.jwcode) {
ElMessage.warning("请先查询用户信息");
resetForm()
return false;
}
const { freeGold, permanentGold, taskGold, sumGold } = addConsume.value;
if (sumGold <= 0) {
ElMessage.warning("三类金币总数必须大于0");
resetForm()
return false;
}
return true;
}
//
const ConsumeDialogVisible = ref(false);
//
const ConsumeDialogVisiblehandleClose = () => {
ConsumeDialogVisible.value = false;
//
resetForm()
user.value = {}
};
``
// 使cookie
const ConsumeDialogVisibleContinue = () => {
ConsumeDialogVisible.value = false;
add();
};
const ConsumeDialogVisibleCancel = () => {
ConsumeDialogVisible.value = false
resetForm()
user.value = {}
};
//
//
const FirstConsumeDialogVisible = ref(false);
//
const FirstConsumeDialogVisiblehandleClose = () => {
FirstConsumeDialogVisible.value = false;
//
resetForm()
user.value = {}
};
//
const FirstConsumeDialogVisibleContinue = () => {
FirstConsumeDialogVisible.value = false;
add();
};
const FirstConsumeDialogVisibleCancel = () => {
FirstConsumeDialogVisible.value = false
resetForm()
user.value = {}
};
//
const goods = ref([]);
// cookie key
const WriteCookies = ref(null)
// cookie value
const WriteCookiesTime = ref(null)
// cookie key
const ReadCookies = ref(null)
// cookie value
const ReadCookiesTime = ref(null)
//
const add = async function () {
addDisabled.value = true;
try {
const result = await request({
url: "/consume/addRefund",
data: {
jwcode: addConsume.value.jwcode,
adminId: adminData.value.id,
sumGold: addConsume.value.sumGold *100 ,
freeGold: addConsume.value.freeGold *100 ,
taskGold: addConsume.value.taskGold *100 ,
permanentGold: addConsume.value.permanentGold *100 ,
remark: addConsume.value.remark,
adminName: adminData.value.adminName
}
});
// jwcode
// jwcode:permanentGold:freeGold
WriteCookies.value = `coinRefund:${addConsume.value.jwcode}:${addConsume.value.goodsName}`
//value
WriteCookiesTime.value = dayjs().format("YYYY-MM-DD HH:mm:ss");
// cookies,jwcodekeyvaluejwcode1
Cookies.set(WriteCookies.value, WriteCookiesTime.value, {
expires:
1, path: '/'
});
addDisabled.value = false;
if (result.code === 200) {
ElMessage.success("添加成功");
resetForm();
} else {
ElMessage.error(result.msg || "添加失败");
}
} catch (err) {
console.error(err);
ElMessage.error("添加失败,请检查网络");
addDisabled.value = false;
}
};
//
function resetForm() {
Ref.value.resetFields();
addConsume.value.sumGold = null;
addConsume.value.freeGold = null;
addConsume.value.permanentGold = null;
addConsume.value.taskGold = null;
addConsume.value.sumGold = null;
addConsume.value.remark = "";
addConsume.value.jwcode = null;
user.value = {
jwcode: null,
name: "",
market: "",
historySumGold: null,
historyPermanentGold: null,
historyFreeGold: null,
historyTaskGold: null,
rechargeNum: null,
consumeNum: null,
firstRecharge: "",
nowPermanentGold: null,
nowFreeJune: null,
nowTaskGold: null,
nowFreeDecember: null,
nowFreeGold: null,
nowSumGold: null
};
}
//
const getGoods = async function () {
try {
const result = await request({ url: "https://api.homilychart.com/live_mall/api/product/all" });
goods.value = result.data.map(item => ({ id: item.id, label: item.name, value: item.name }));
} catch (err) {
console.error(err);
}
}
//
const addBefore = () => {
Ref.value.validate(async (valid) => {
// cookie
if (!valid) {
ElMessage({
type: 'error',
message: '请检查输入内容'
});
return;
}
// sumGold > 0
if (!validateInputTOSumGold()) return;
ReadCookies.value = `coinRefund:${addConsume.value.jwcode}:${addConsume.value.goodsName}`
// cookie
const cookie = Cookies.get(ReadCookies.value)
console.log("cookie++++++++++++++++++++++", cookie)
console.log("time", WriteCookiesTime.value)
//
ReadCookiesTime.value = moment(cookie).format('YYYY-MM-DD HH:mm:ss')
console.log("cookie========", cookie)
if (cookie) {
ConsumeDialogVisible.value = true;
} else {
FirstConsumeDialogVisible.value = true;
}
});
};
//
const getUser = async function (jwcode) {
if (!jwcode || !/^\d{1,9}$/.test(jwcode)) {
ElMessage.warning("精网号不能为空或格式不正确");
return;
}
try {
const result = await request({ url: "/user/selectUser", data: { jwcode } });
if (result.code === 200 && result.data) {
user.value = { ...result.data };
ElMessage.success("查询成功");
} else {
ElMessage.warning(result.msg || "用户不存在");
}
} catch (err) {
console.error(err);
ElMessage.error("查询失败,请检查网络或精网号");
}
};
onMounted(async function () {
await getGoods();
});
</script>
<template>
<div class="father1">
<div class="left">
<el-form :model="addConsume" ref="Ref" :rules="rules" style="min-width: 420px;" class="add-form"
label-width="auto" label-position="right">
<el-form-item prop="jwcode" label="精网号" style="margin-top: 50px">
<el-input v-model="addConsume.jwcode" style="width: 200px;" />
<el-button type="primary" @click="getUser(addConsume.jwcode)" style="margin-left: 20px">查询
</el-button>
</el-form-item>
<el-form-item prop="goodsName" label="商品名称" >
<el-input v-model="addConsume.goodsName" disabled style="width: 120px" />
</el-form-item>
<!-- 三类金币可编辑 -->
<el-form-item prop="permanentGold" label="永久金币">
<el-input v-model.number="addConsume.permanentGold" style="width: 120px" @input="validateInputToPermanentGold()"/>
<p>&nbsp;&nbsp;</p>
</el-form-item>
<el-form-item prop="freeGold" label="免费金币">
<el-input v-model.number="addConsume.freeGold" style="width: 120px" @input="validateInputToFreeGold()" />
<p>&nbsp;&nbsp;</p>
</el-form-item>
<el-form-item prop="taskGold" label="任务金币">
<el-input v-model.number="addConsume.taskGold" style="width: 120px" @input="validateInputToTaskGold()" />
<p>&nbsp;&nbsp;</p>
</el-form-item>
<el-form-item prop="sumGold" label="消耗金币总数">
<el-input v-model.number="addConsume.sumGold" style="width: 120px" disabled />
</el-form-item>
<el-form-item prop="remark" label="备注">
<el-input v-model="addConsume.remark" style="width: 250px" :rows="4" maxlength="100" show-word-limit
type="textarea" />
</el-form-item>
<el-button type="success" @click="resetForm()" style="margin-left: 200px;margin-top:10px">重置</el-button>
<el-button type="primary" :disabled="addDisabled" @click="addBefore" style="margin-top:10px"> 提交</el-button>
</el-form>
</div>
<div class="right">
<!-- 客户信息栏 -->
<el-card v-if="user.jwcode" style="width: 800px; float: right" class="customer-info">
<el-form :model="user" label-width="auto" 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="9">
<el-form-item label="姓名">
<p>{{ user.name }}</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.nowSumGold !== undefined">{{
user.nowSumGold
}}</span>
</el-form-item>
<!-- 金币详情独立显示 -->
<el-form-item style="margin-top: -23px"> <!-- 负边距减少间距 -->
<span style="color: #b1b1b1; margin-left: 0px" v-if="user.nowPermanentGold !== undefined">(永久金币:{{
user.nowPermanentGold
}};
免费金币:{{ user.nowFreeGold }};
任务金币:{{ user.nowTaskGold }})</span>
</el-form-item>
</el-col>
</el-row>
<!-- 第二行精网号 + 当前金币独立行 -->
<el-row>
<el-col :span="9">
<el-form-item label="精网号">
<p>{{ user.jwcode }}</p>
</el-form-item>
</el-col>
<el-col :span="14">
<el-form-item label="消费次数">
<p style="color: #2fa1ff">{{ user.consumeNum }} </p>
</el-form-item>
<el-form-item style="margin-top: -23px"> <!-- 负边距减少间距 -->
<p style="font-size: small; color: #b1b1b1">(仅统计2025-01-01后的数据)</p>
</el-form-item>
</el-col>
</el-row>
<!-- 第三行首次充值日期 + 充值次数 -->
<!-- <el-row >
<el-col :span="9">
<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-row> -->
<!-- 第四行消费次数 + 所属门店 -->
<el-row>
<el-col :span="9">
<el-form-item label="所属门店">
<p>{{ user.market }}</p>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<el-dialog v-model="FirstConsumeDialogVisible" title="操作确认" :before-close="FirstConsumeDialogVisiblehandleClose"
:close-on-click-modal="false" width="480px">
<!-- 内容整体居中且收窄 -->
<div class="confirm-body">
<!-- 用户信息 -->
<div>
<div class="field-label">用户信息</div>
<el-input :model-value="user.jwcode + (user.name ? '' + user.name + '' : '')" disabled />
</div>
<!-- 活动名称 -->
<div class="field">
<div class="field-label">商品名称</div>
<el-input v-model="addConsume.goodsName" disabled />
</div>
<!--金币总数 -->
<div class="field">
<div class="field-label">金币总数</div>
<el-input v-model="addConsume.sumGold" disabled />
</div>
<!-- 金币详细信息同一行左右排列 -->
<el-row :gutter="20" class="coins-row">
<el-col :span="8">
<div class="field">
<div class="field-label">永久金币</div>
<el-input v-model="addConsume.permanentGold" disabled />
</div>
</el-col>
<el-col :span="8">
<div class="field">
<div class="field-label">免费金币</div>
<el-input v-model="addConsume.freeGold" disabled />
</div>
</el-col>
<el-col :span="8">
<div class="field">
<div class="field-label">任务金币</div>
<el-input v-model="addConsume.taskGold" disabled />
</div>
</el-col>
</el-row>
<div class="field">
<div class="field-label">备注</div>
<el-input v-model="addConsume.remark" disabled />
</div>
</div>
<!-- 底部按钮居中 -->
<template #footer>
<div class="dialog-footer-center">
<el-button @click="FirstConsumeDialogVisibleCancel"> </el-button>
<el-button type="primary" @click="FirstConsumeDialogVisibleContinue">确认退款</el-button>
</div>
</template>
</el-dialog>
<el-dialog v-model="ConsumeDialogVisible" title="操作确认" :before-close="ConsumeDialogVisiblehandleClose"
:close-on-click-modal="false" width="480px">
<!-- 内容整体居中且收窄 -->
<div class="confirm-body">
<!-- 用户信息 -->
<div>
<div class="field-label">用户信息</div>
<el-input :model-value="user.jwcode + (user.name ? '' + user.name + '' : '')" disabled />
</div>
<!-- 活动名称 -->
<div class="field">
<div class="field-label">商品名称</div>
<el-input v-model="addConsume.goodsName" disabled />
</div>
<!--金币总数 -->
<div class="field">
<div class="field-label">金币总数</div>
<el-input v-model="addConsume.sumGold" disabled />
</div>
<!-- 金币详细信息同一行左右排列 -->
<el-row :gutter="20" class="coins-row">
<el-col :span="8">
<div class="field">
<div class="field-label">永久金币</div>
<el-input v-model="addConsume.permanentGold" disabled />
</div>
</el-col>
<el-col :span="8">
<div class="field">
<div class="field-label">免费金币</div>
<el-input v-model="addConsume.freeGold" disabled />
</div>
</el-col>
<el-col :span="8">
<div class="field">
<div class="field-label">任务金币</div>
<el-input v-model="addConsume.taskGold" disabled />
</div>
</el-col>
</el-row>
<!-- 风险提示 -->
<div style="display: flex; align-items: center; margin-top: 20px;">
<el-icon :size="24" color="#FFD700">
<WarnTriangleFilled />
</el-icon>
<p>重复购买风险提示</p>
</div>
<!-- 记录 + 虚线分隔 -->
<div>
<el-divider border-style="dashed" />
<p>检测到该用户近期有相似退款记录</p>
· {{ ReadCookiesTime }} 退款 {{ addConsume.goodsName }}(操作人: {{ adminData.adminName }})
</div>
<div style="margin-top: 10px">
<p>是否继续操作</p>
</div>
</div>
<!-- 底部按钮居中 -->
<template #footer>
<div class="dialog-footer-center">
<el-button @click="ConsumeDialogVisibleCancel"> </el-button>
<el-button type="primary" @click="ConsumeDialogVisibleContinue">确认退款</el-button>
</div>
</template>
</el-dialog>
</div>
</div>
</template>
<style scoped lang="scss">
p {
margin: 0px;
}
/* 上传图片的格式 */
.avatar-uploader .avatar {
width: 50px;
height: 50px;
display: block;
}
.add-form {
width: 400px;
float: left;
}
/* 标题居中 */
.el-dialog__header {
text-align: center;
}
.confirm-body {
width: 350px;
margin: 0 auto;
}
/* 字段块与标签样式 */
.field {
margin-bottom: 14px;
}
.field-label {
font-size: 14px;
color: #606266;
margin-bottom: 6px;
}
/* 金币行紧凑 */
.coins-row .field {
margin-bottom: 0;
}
/* 底部按钮居中 */
.dialog-footer-center {
display: flex;
justify-content: center;
gap: 12px;
}
.father1 {
width: 82vw;
height: 80vh;
display: flex;
.left {
width: 500px;
float: left;
display: flex;
}
.right {
flex: 1;
height: 50vh;
display: flex;
align-items: center;
.customer-info {
width: 300px;
margin-left: 20px;
display: flex;
justify-content: center;
align-items: center;
}
}
}
</style>

12
src/views/refund/gold/coinRefund.vue

@ -3,12 +3,12 @@
<!-- 这里放置标签切换的按钮 --> <!-- 这里放置标签切换的按钮 -->
<el-button-group> <el-button-group>
<el-button :type="activeTab === 'coinRefundDetail' ? 'primary' : 'default'" <el-button :type="activeTab === 'coinRefundDetail' ? 'primary' : 'default'"
@click="navigateTo('coinRefundDetail')" :disabled="!hasDetail">
@click="navigateTo('coinRefundDetail')" :disabled="!hasDetail" v-if="hasDetail">
金币退款明细 金币退款明细
</el-button> </el-button>
<!-- 切换后状态显示 primary 样式否则是默认样式 --> <!-- 切换后状态显示 primary 样式否则是默认样式 -->
<el-button :type="activeTab === 'addCoinRefund' ? 'primary' : 'default'" @click="navigateTo('addCoinRefund')" <el-button :type="activeTab === 'addCoinRefund' ? 'primary' : 'default'" @click="navigateTo('addCoinRefund')"
:disabled="!hasAdd">
:disabled="!hasAdd" v-if="hasAdd">
新增退款 新增退款
</el-button> </el-button>
</el-button-group> </el-button-group>
@ -45,8 +45,8 @@ const navigateTo = (name) => {
const initPermissions = () => { const initPermissions = () => {
if (!menuTree.value || !menuTree.value.length) return; if (!menuTree.value || !menuTree.value.length) return;
hasAdd.value = hasMenuPermission(menuTree.value, permissionMapping.Submit_Gold_Coin_Refund);
hasDetail.value = hasMenuPermission(menuTree.value, permissionMapping.View_Gold_Coin_Refund_Details);
hasAdd.value = hasMenuPermission(menuTree.value, permissionMapping.addCoinRefund);
hasDetail.value = hasMenuPermission(menuTree.value, permissionMapping.coinRefundDetail);
}; };
// //
@ -54,7 +54,7 @@ const getDefaultAuditRoute = () => {
initPermissions(); initPermissions();
if (hasDetail.value) return 'coinRefundDetail'; if (hasDetail.value) return 'coinRefundDetail';
if (hasAdd.value) return 'addCoinRefund'; if (hasAdd.value) return 'addCoinRefund';
return 'addCoinRefund';
return 'coinRefundDetail';
}; };
// //
@ -77,7 +77,7 @@ onMounted(() => {
navigateTo(defaultRoute); navigateTo(defaultRoute);
} else { } else {
// //
if (route.name === 'addCoinRefund' || route.name === 'coinRefundDetail') {
if (route.name === 'coinRefundDetail' || route.name === 'addCoinRefund') {
activeTab.value = route.name; activeTab.value = route.name;
} }
} }

27
src/views/refund/gold/coinRefundDetail.vue

@ -6,10 +6,15 @@ import moment from 'moment'
import API from '@/util/http.js' import API from '@/util/http.js'
import request from '@/util/http.js' import request from '@/util/http.js'
import { reverseMarketMapping } from "@/utils/marketMap.js"; import { reverseMarketMapping } from "@/utils/marketMap.js";
import { useAdminStore } from "@/store/index.js";
import { storeToRefs } from "pinia";
import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js"
import dayjs from "dayjs"; import dayjs from "dayjs";
const adminStore = useAdminStore();
const { adminData, menuTree } = storeToRefs(adminStore);
const showEmployeeData = ref(false) const showEmployeeData = ref(false)
const canLook = findMenuById(menuTree.value,permissionMapping.coinRefundDetail)
const defaultTime = [ const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 0, 0, 0),
@ -48,18 +53,6 @@ const activeTimeRange = ref('')
const handleDatePickerChange = () => { const handleDatePickerChange = () => {
activeTimeRange.value = '' activeTimeRange.value = ''
} }
const adminData = ref({})
const getAdminData = async function () {
try {
const result = await API({ url: '/admin/userinfo', data: {} })
adminData.value = result
console.log('请求成功', result)
console.log('用户信息', adminData.value)
} catch (error) {
console.log('请求失败', error)
}
}
// //
const tableData = ref([]) const tableData = ref([])
// ====================================== // ======================================
@ -121,6 +114,10 @@ const getRefundTypes = async function () {
// ============================================================== // ==============================================================
// //
const getSelectBy = async function (val) { const getSelectBy = async function (val) {
if (!findMenuById(menuTree.value, permissionMapping.coinRefundDetail)) {
ElMessage.error('无此权限')
return
}
try { try {
// //
if (typeof val === 'number') { if (typeof val === 'number') {
@ -312,7 +309,7 @@ const getGoods = async function () {
// //
onMounted(async function () { onMounted(async function () {
await getAdminData()
console.log('=======',adminData.value)
await getSelectBy() await getSelectBy()
await getMarket() await getMarket()
await getRefundTypes() await getRefundTypes()
@ -547,7 +544,7 @@ const getMarket = async function () {
</el-button> </el-button>
<el-button type="success" @click="reset()">重置</el-button> <el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="search()">查询</el-button>
<el-button type="primary" @click="search()" v-if="canLook">查询</el-button>
<el-button type="primary" @click="exportExcel">导出Excel</el-button> <el-button type="primary" @click="exportExcel">导出Excel</el-button>
<el-button type="primary" @click="openExportList">查看导出列表</el-button> <el-button type="primary" @click="openExportList">查看导出列表</el-button>
</div> </div>

9
src/views/usergold/bean/userbean.vue

@ -74,7 +74,6 @@ const pagination = ref({
total: 0 total: 0
}) })
const get = async function () { const get = async function () {
if(findMenuById(menuTree.value, permissionMapping.View_Golden_Bean_Balance)){
try { try {
trim() trim()
if(searchObj.value.jwcode){ if(searchObj.value.jwcode){
@ -105,12 +104,9 @@ const get = async function () {
} catch (error) { } catch (error) {
console.log(error) console.log(error)
} }
}else{
ElMessage.error('无此权限')
}
} }
const getStats = async () => { const getStats = async () => {
if (findMenuById(menuTree.value, permissionMapping.View_Golden_Bean_Balance)) {
try { try {
const params = { const params = {
beanUser:{ beanUser:{
@ -131,10 +127,7 @@ const getStats = async () => {
} catch (error) { } catch (error) {
console.log('请求失败', error) console.log('请求失败', error)
} }
}else{
ElMessage.error('无此权限')
} }
}
const handleSortChange = (column) => { const handleSortChange = (column) => {
if (column.prop === 'beanNum') { if (column.prop === 'beanNum') {
searchObj.value.sortField = 'jinbi' searchObj.value.sortField = 'jinbi'

8
src/views/usergold/gold/clientCount.vue

@ -6,14 +6,14 @@
<el-button <el-button
:type="activeTab === 'clientCountDetail' ? 'primary' : 'default'" :type="activeTab === 'clientCountDetail' ? 'primary' : 'default'"
@click="navigateTo('clientCountDetail')" @click="navigateTo('clientCountDetail')"
:disabled="!hasDetail"
:disabled="!hasDetail" v-if="hasDetail"
> >
金币明细 金币明细
</el-button> </el-button>
<el-button <el-button
:type="activeTab === 'clientCountBalance' ? 'primary' : 'default'" :type="activeTab === 'clientCountBalance' ? 'primary' : 'default'"
@click="navigateTo('clientCountBalance')" @click="navigateTo('clientCountBalance')"
:disabled="!hasBalance"
:disabled="!hasBalance" v-if="hasBalance"
> >
金币余额 金币余额
</el-button> </el-button>
@ -51,8 +51,8 @@ const navigateTo = (name) => {
const initPermissions = () => { const initPermissions = () => {
if (!menuTree.value || !menuTree.value.length) return; if (!menuTree.value || !menuTree.value.length) return;
hasDetail.value = hasMenuPermission(menuTree.value, permissionMapping.View_Gold_Coin_Details);
hasBalance.value = hasMenuPermission(menuTree.value, permissionMapping.View_Gold_Coin_Balance);
hasDetail.value = hasMenuPermission(menuTree.value, permissionMapping.coinCustomerDetail);
hasBalance.value = hasMenuPermission(menuTree.value, permissionMapping.coinCustomerMoney);
}; };
// //

22
src/views/usergold/gold/clientCountBalance.vue

@ -1,5 +1,10 @@
<script setup> <script setup>
// //
import { useAdminStore } from "@/store/index.js"
import { storeToRefs } from "pinia"
import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js"
const adminStore = useAdminStore()
const { adminData, menuTree } = storeToRefs(adminStore)
import {onMounted, ref} from 'vue' import {onMounted, ref} from 'vue'
import {ElMessage} from 'element-plus' import {ElMessage} from 'element-plus'
import moment from 'moment' import moment from 'moment'
@ -11,19 +16,7 @@ const showEmployeeData = ref(false)
// //
//
const adminData = ref({})
const dialogVisible = ref(false) const dialogVisible = ref(false)
const getAdminData = async function () {
try {
const result = await API({url: '/admin/userinfo', data: {}})
adminData.value = result
// console.log('', result)
console.log('管理员用户信息', adminData.value)
} catch (error) {
console.log('请求失败', error)
}
}
// //
const isLoadingmarket = ref(false); const isLoadingmarket = ref(false);
@ -72,6 +65,10 @@ const sortOrder = ref('')
// =========================================================================== // ===========================================================================
// //
const get = async function (val) { const get = async function (val) {
if(!findMenuById(menuTree.value, permissionMapping.coinCustomerMoney)){
ElMessage.error('无此权限')
return
}
try { try {
// //
if (typeof val === 'number') { if (typeof val === 'number') {
@ -228,7 +225,6 @@ const handleSortChange = (column) => {
// //
onMounted(async function () { onMounted(async function () {
await getAdminData()
await get() await get()
await getMarket() await getMarket()
await getExportList() await getExportList()

53
src/views/usergold/gold/clientCountDetail.vue

@ -6,7 +6,11 @@ import moment from 'moment'
import API from '@/util/http.js' import API from '@/util/http.js'
import {reverseMarketMapping} from "../../../utils/marketMap.js"; import {reverseMarketMapping} from "../../../utils/marketMap.js";
import dayjs from "dayjs"; import dayjs from "dayjs";
import { useAdminStore } from "@/store/index.js"
import { storeToRefs } from "pinia"
import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js"
const adminStore = useAdminStore()
const { adminData, menuTree } = storeToRefs(adminStore)
// //
const showEmployeeData = ref(false) const showEmployeeData = ref(false)
@ -29,18 +33,6 @@ const totalTaskGold = ref(0)
const totalGoldTotal = ref(0) const totalGoldTotal = ref(0)
// //
const adminData = ref({})
const getAdminData = async function () {
try {
const result = await API({url: '/admin/userinfo', data: {}})
adminData.value = result
console.log('请求成功', result)
console.log('管理员用户信息', adminData.value)
} catch (error) {
console.log('请求失败', error)
}
}
// goldDetail jwcode // goldDetail jwcode
const trimJwCode = () => { const trimJwCode = () => {
if (goldDetail.value.jwcode) { if (goldDetail.value.jwcode) {
@ -128,6 +120,10 @@ const getObj = ref({
// =========================================================================== // ===========================================================================
// //
const get = async function (val) { const get = async function (val) {
if(!findMenuById(menuTree.value, permissionMapping.coinCustomerDetail)){
ElMessage.error('无此权限')
return
}
try { try {
// //
if (typeof val === 'number') { if (typeof val === 'number') {
@ -174,18 +170,6 @@ const get = async function (val) {
console.log('响应数据', result) console.log('响应数据', result)
tableData.value = result.data.list tableData.value = result.data.list
total.value = result.data.total total.value = result.data.total
//
// permanentGold.value = tableData.value.reduce((total, row) => {
// return total + (Number(row.permanentGold) || 0);
// }, 0);
// taskGold.value = tableData.value.reduce((total, row) => {
// return total + (Number(row.taskGold) || 0);
// }, 0);
//6+12
const totalResult = await API({ const totalResult = await API({
url: '/goldDetail/getTotal', url: '/goldDetail/getTotal',
method: 'post', method: 'post',
@ -278,28 +262,12 @@ const get7Days = function () {
search() search()
} }
// //
// const sumGoldTotal = computed(() => {
// return tableData.value.reduce((total, row) => {
// return total + (Number(row.sumGold) || 0);
// }, 0);
// });
// 6+12 // 6+12
const calculateFreeGold = (row) => { const calculateFreeGold = (row) => {
const freeJune = row.freeJune || 0; const freeJune = row.freeJune || 0;
const freeDecember = row.freeDecember || 0; const freeDecember = row.freeDecember || 0;
return (freeJune + freeDecember); return (freeJune + freeDecember);
};
//
// const totalFreeGold = computed(() => {
// return tableData.value.reduce((total, row) => {
// return total + calculateFreeGold(row);
// }, 0);
// });
}
// //
const sortField = ref('') const sortField = ref('')
const sortOrder = ref('') const sortOrder = ref('')
@ -355,7 +323,6 @@ const handleCurrentChange = function (val) {
// //
onMounted(async function () { onMounted(async function () {
await getAdminData()
await get() await get()
await getMarket() await getMarket()

Loading…
Cancel
Save