Files
shangfutong-ui/jeepay-ui-uapp-agent/pages/devWorkbench/devWorkbench.vue
2024-05-23 14:39:33 +08:00

726 lines
18 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<navigationTitle :postion="false" :title="'工作台'"></navigationTitle>
<view class="content">
<view class="head">
<view class="head-image">
<image :src="vdata.userImg"></image>
</view>
<view class="head-rignt">
<view class="head-text">
<text class="head-title">{{ vdata.userName }}</text>
<text class="head-id">ID{{ vdata.userId }}</text>
</view>
<view class="head-set" @tap="goSetAccount">
<image :src="imageInfo.setting"></image>
</view>
</view>
</view>
<view class="title">
<text>管理工具</text>
</view>
<view class="entrances-body">
<view class="entrances" :class="{ 'grid-box': vdata.isList === false }">
<view class="entrance-box" @tap="toPage('applicationManagement')">
<view class="left">
<image :src="imageInfo.apply"></image>
<text>进件管理</text>
</view>
<view class="right">
<image :src="imageInfo.arrowGray"></image>
</view>
<!-- <view class="border"></view> -->
<view class="grid-border"></view>
</view>
<view class="entrance-box" @tap="toPage('merchantManagement')">
<view class="left">
<image :src="imageInfo.merchant"></image>
<text>商户管理</text>
</view>
<view class="right">
<image :src="imageInfo.arrowGray"></image>
</view>
<!-- <view class="border"></view> -->
<view class="grid-border"></view>
</view>
<view class="entrance-box" @tap="toPage('setUp')">
<view class="left">
<image :src="imageInfo.setUp"></image>
<text>设置</text>
</view>
<view class="right" style="border-bottom: none">
<image :src="imageInfo.arrowGray"></image>
</view>
</view>
</view>
</view>
<view class="title">
<text>数据统计</text>
</view>
<view class="header animation-close" :style="{ height: vdata.isA ? '230rpx' : '110rpx' }">
<view class="date-filter">
<view
class="date"
:class="vdata.selectFlge == item.index ? 'select' : ''"
v-for="(item, index) in vdata.selectList"
:key="index"
@click="onSelsct(index)"
>
<text>{{ item.text }}</text>
</view>
<view class="close" @click="onClose">
<image :class="vdata.isA ? 'animation' : ''" src="../../static/indexImg/down.png" mode=""></image>
</view>
</view>
<view class="time-picker">
<xp-picker @confirm="confirm" mode="ymdhi" :startTime="vdata.startDate">{{ vdata.startDate }}</xp-picker>
<text></text>
<xp-picker @confirm="confirmEnd" mode="ymdhi" :startTime="vdata.endDate">{{ vdata.endDate }}</xp-picker>
</view>
</view>
<view class="statistics" style="margin-top: 20rpx; background-color: #262e4d">
<view class="amount">
<text>收款金额</text>
</view>
<view class="money">
<text>{{ (indexData.payAmount / 100).toFixed(2) }}</text>
</view>
<view class="other">
<view class="deal-amount">
<text>收款笔数</text>
<text style="color: #ffffff; font-size: 28rpx">{{ indexData.payCount }}</text>
</view>
<view class="refund">
<text>退款金额</text>
<text style="color: #ffffff; font-size: 28rpx">{{ (indexData.refundAmount / 100).toFixed(2) }}</text>
</view>
<view class="refund-amount">
<text>退款笔数</text>
<text style="color: #ffffff; font-size: 28rpx">{{ indexData.refundCount }}</text>
</view>
</view>
</view>
<view class="statistics" style="background-color: #3981ff; border-radius: 0 0 20rpx 20rpx">
<view class="amount">
<text>商户总数</text>
</view>
<view class="money" style="color: #ffffff">
<text>{{ vdata.mchCount.mchAllCount }}</text>
</view>
<view class="other">
<view class="deal-amount">
<text>新增商户数</text>
<text style="color: #ffffff; font-size: 28rpx">{{ vdata.mchCount.mchTodayAddCount }}</text>
</view>
<view class="refund">
<text>入网商户数</text>
<text style="color: #ffffff; font-size: 28rpx">{{ vdata.mchCount.mchOnNetCount }}</text>
</view>
<view class="refund-amount">
<text>新增入网商户数</text>
<text style="color: #ffffff; font-size: 28rpx">{{ vdata.mchCount.mchOnNetNewCount }}</text>
</view>
</view>
</view>
<view class="footer"> </view>
</view>
</template>
<script setup>
import { ref, reactive } from "vue"
import { $statistics, $payIfDefines, $getUserInfo, $getPayDayCount, $getPayConfigIfcodes } from "@/http/apiManager.js"
import { onLoad, onBackPress, onShow } from "@dcloudio/uni-app"
import { intNum } from "@/util/intNumber.js"
import { getDay } from "@/util/timeInterval.js"
import navigationTitle from "@/components/jeepayNavigationTitle/jeepayNavigationTitle.vue"
const baseImage = ref("/static/iconImg/")
const blanceInfo = ref({})
const imageInfo = reactive({
setting: baseImage.value + "setting.svg",
close: baseImage.value + "icon-close.svg",
eyeClose: baseImage.value + "eye-close.svg",
list: baseImage.value + "grid.svg",
arrow: baseImage.value + "arrow-right.svg",
arrowGray: baseImage.value + "arrow-right-gray.svg",
apply: "/static/navImg/nav-jinjian.svg",
merchant: "/static/navImg/nav-shangdian.svg",
setUp: "/static/iconImg/setting.svg",
mch: baseImage.value + "store.svg",
})
const indexData = ref({})
const otherData = ref({})
const vdata = reactive({
amount: 0,
isPassword: true,
isList: false,
mchAllCount: 0,
mchTodayAddCount: 0,
userImg: "",
userName: "",
userId: "",
isA: false, //动画
isS: false,
selectFlge: 0, //时间选择框标志符
startDate: "", //开始时间
endDate: "", //结束时间
selectList: [
{ index: 0, value: "today", text: "今天" },
{ index: 1, value: "yesterday", text: "昨天" },
{ index: 2, value: "week", text: "近7天" },
{ index: 3, value: "mounth", text: "近30天" },
{ index: 4, value: "customer", text: "自定义" },
],
searchObj: {
isApp: true,
queryDateRange: "today",
},
staticObj: {
isApp: true,
queryDateRange: "today",
countType: 1,
agentNo: "",
},
mchCount: {},
})
const withdrawalPopup = ref()
onLoad(() => {
vdata.startDate = `${getDay(0, "-")} 00:00`
vdata.endDate = `${getDay(0, "-")} 23:59`
})
onShow(() => {
$getUserInfo().then(({ bizData }) => {
vdata.userImg = bizData.avatarUrl
vdata.userName = bizData.realname
vdata.userId = bizData.sysUserId
})
getStatistics(vdata.staticObj)
})
const getStatistics = (staticObj) => {
$statistics(staticObj).then(({ bizData }) => {
otherData.value = bizData
vdata.mchCount = bizData.mchCount
vdata.orderCount = bizData.orderCount
vdata.agentCount = bizData.agentCount
indexData.value = bizData.orderCount
})
}
const onSelsct = (index) => {
vdata.selectFlge = index
switch (index) {
case 0:
vdata.startDate = `${getDay(0, "-")} 00:00`
vdata.endDate = `${getDay(0, "-")} 23:59`
vdata.staticObj.queryDateRange = "today"
getStatistics(vdata.staticObj)
break
case 1:
vdata.startDate = `${getDay(-1, "-")} 00:00`
vdata.endDate = `${getDay(-1, "-")} 23:59`
vdata.staticObj.queryDateRange = "yesterday"
getStatistics(vdata.staticObj)
break
case 2:
vdata.startDate = `${getDay(-7, "-")} 00:00`
vdata.endDate = `${getDay(0, "-")} 23:59`
vdata.staticObj.queryDateRange = "near2now_7"
getStatistics(vdata.staticObj)
break
case 3:
vdata.startDate = `${getDay(-30, "-")} 00:00`
vdata.endDate = `${getDay(0, "-")} 23:59`
vdata.staticObj.queryDateRange = "near2now_30"
getStatistics(vdata.staticObj)
break
case 4:
if (!vdata.isA) {
vdata.isA = true
}
vdata.startDate = `${getDay(0, "-")} 00:00`
vdata.endDate = `${getDay(0, "-")} 23:59`
break
}
}
//时间选择器确定
const confirm = (e) => {
vdata.startDate = e.value
vdata.selectFlge = 4
// vdata.staticObj.queryDateRange = `customDate_${vdata.startDate}:00_${vdata.endDate}:59`
// getStatistics(vdata.staticObj)
}
const confirmEnd = (e) => {
vdata.endDate = e.value
vdata.selectFlge = 4
vdata.staticObj.queryDateRange = `customDate_${vdata.startDate}:00_${vdata.endDate}:59`
getStatistics(vdata.staticObj)
}
const onClose = () => {
vdata.isA = !vdata.isA
}
function toPage(path) {
if (path === "applicationManagement") {
// 获取进件列表的颜色 和 icon,给下一个页面用,因为异步请求的原因,所以在这里进行处理
let iconList = ref([])
$getPayConfigIfcodes("CURRENT", "agentApplyment", "").then(({ bizData }) => {
bizData.forEach((item) => {
iconList.value.push([item.bgColor, item.ifCode, item.icon])
})
uni.navigateTo({
url: `/pageApply/applyList?iconList=${JSON.stringify(iconList.value)}`,
})
})
return
}
uni.navigateTo({
url: `../../pageWork/${path}/${path}`,
})
}
let isShowSun = ref(false)
// 切换函数 睁眼闭眼 与 管理工具排列
function switchButton(sign) {
if (sign === "eye") {
vdata.isPassword = !vdata.isPassword
if (!vdata.isPassword) {
isShowSun.value = true
imageInfo.eyeClose = "../../static/workImg/eye-open.svg"
} else {
isShowSun.value = false
imageInfo.eyeClose = "../../static/workImg/eye-close.svg"
}
} else if (sign === "format") {
vdata.isList = !vdata.isList
if (!vdata.isList) {
imageInfo.list = "../../static/workImg/grid.svg"
} else {
imageInfo.list = "../../static/workImg/list.svg"
}
}
}
function toTabPage(path) {
uni.switchTab({
url: `../${path}/${path}`,
})
}
function goSetAccount() {
uni.navigateTo({
url: "../../pageWork/setUp/setUp",
})
}
</script>
<style>
page {
background: #f5f6fc;
}
</style>
<style lang="scss" scoped>
.content {
.animation-close {
transition: height 0.5s;
}
.animation {
transform: rotate(-180deg);
}
.select {
padding: 10rpx 10rpx;
border-radius: 10rpx;
background: rgba(57, 129, 255, 0.1);
font-weight: 500;
color: #3981ff;
}
box-sizing: border-box;
// padding: 0 50rpx;
image {
display: block;
}
.head,
.banner-box,
.title,
.entrances-body {
box-sizing: border-box;
padding: 0 50rpx;
}
.head {
display: flex;
width: 100%;
height: 90rpx;
margin: 30rpx 0 50rpx 0;
.head-image {
width: 90rpx;
height: 90rpx;
border-radius: 20rpx;
overflow: hidden;
//margin-right: 10rpx;
flex-shrink: 0;
image {
width: 100%;
height: 100%;
}
}
.head-rignt {
display: flex;
width: 100%;
justify-content: space-between;
align-items: center;
margin-left: 10rpx;
.head-text {
display: flex;
flex-direction: column;
.head-title {
font-size: 30rpx;
font-weight: 700;
color: #292f46;
}
.head-id {
font-size: 22rpx;
color: #adacb3;
}
}
.head-set {
width: 40rpx;
height: 40rpx;
image {
width: 100%;
height: 100%;
}
}
}
}
.light {
background: #3981ff !important;
}
.title {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
height: 40rpx;
margin: 50rpx 0 30rpx 10rpx;
text {
font-size: 28rpx;
font-weight: 700;
}
image {
width: 40rpx;
height: 40rpx;
}
}
.grid-box {
/* 九宫格 */
display: flex;
flex-wrap: wrap;
.entrance-box {
position: relative;
width: 33.33% !important;
height: 200rpx !important;
box-sizing: border-box !important;
justify-content: center !important;
align-items: center !important;
.left {
flex-direction: column !important;
image {
margin: 0 auto 22rpx auto !important;
}
}
.right {
image {
display: none !important;
}
}
.grid-border {
display: block !important;
position: absolute;
right: 0;
width: 2rpx;
height: 200rpx;
background: #f0f1f7;
}
}
}
.entrances {
border-radius: 20rpx;
overflow: hidden;
.entrance-box {
display: flex;
justify-content: space-between;
padding-left: 30rpx;
height: 110rpx;
background: #fff;
position: relative;
.left {
display: flex;
align-items: center;
image {
margin-right: 20rpx;
width: 50rpx;
height: 50rpx;
}
text {
color: #797b80;
font-size: 27rpx;
font-weight: 500;
}
}
.right {
display: flex;
align-items: center;
justify-content: flex-end;
padding-right: 30rpx;
image {
width: 40rpx;
height: 40rpx;
}
}
.border {
position: absolute;
bottom: 0;
right: 0;
width: 550rpx;
height: 2rpx;
background: #f0f1f7;
}
.grid-border {
display: none;
}
}
}
.roll-links {
width: 100%;
height: 650rpx;
.swiper {
width: 100%;
height: 500rpx;
position: relative;
box-sizing: border-box;
.position-item {
position: absolute;
left: -160rpx;
top: 0;
}
.first-item,
.second-item,
.more {
position: relative;
border-radius: 20rpx;
height: 500rpx;
overflow: hidden;
image {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.swiper-text-box {
position: relative;
width: 100%;
height: 100%;
z-index: 9;
box-sizing: border-box;
padding: 50rpx 0 0 50rpx;
.swiper-text {
display: flex;
flex-direction: column;
margin-bottom: 40rpx;
.swiper-title {
display: block;
color: rgba(255, 255, 255, 0.5);
font-size: 25rpx;
margin-bottom: 15rpx;
}
.swiper-amount {
font-size: 40rpx;
font-weight: 700;
color: #ffffff;
}
}
}
}
.first-item {
width: 500rpx;
margin-left: 50rpx;
}
.second-item {
width: 570rpx;
display: flex;
image {
width: 325rpx;
border-radius: 20rpx;
}
.more {
width: 330rpx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background: #fff;
text {
color: #797b80;
}
}
}
}
}
.header {
box-sizing: border-box;
//height: 335rpx;
width: 650rpx;
background-color: #ffffff;
border-radius: 20rpx;
margin: 20rpx auto;
margin-bottom: 0;
overflow: hidden;
.date-filter {
box-sizing: border-box;
height: 90rpx;
width: 100%;
// background-color: #18BC37;
//border-bottom: 2rpx solid #FAFBFC;
display: flex;
justify-content: space-between;
align-items: center;
padding-left: 20rpx;
padding-right: 20rpx;
padding-top: 20rpx;
// padding-bottom: 20rpx;
.date {
//width: 92rpx;
//height: 53rpx;
display: flex;
justify-content: center;
align-items: center;
padding: 10rpx 10rpx;
}
.close {
height: 60rpx;
width: 60rpx;
// background-color: #007AFF;
//transform: rotate(180deg);
image {
height: 60rpx;
width: 60rpx;
transition: transform 0.5s;
}
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
}
}
.time-picker {
box-sizing: border-box;
width: 610rpx;
height: 72rpx;
border-radius: 10rpx;
background: #f5f6fc;
margin: 36rpx auto;
display: flex;
justify-content: space-between;
align-items: center;
padding-left: 20rpx;
padding-right: 20rpx;
font-size: 25rpx;
overflow: hidden;
}
}
.statistics {
box-sizing: border-box;
overflow: hidden;
width: 650rpx;
height: 368rpx;
border-radius: 20rpx;
background: #3981ff;
border-radius: 20rpx 20rpx 0 0;
margin: 0 auto;
display: flex;
flex-direction: column;
padding: 50rpx 35rpx 50rpx 35rpx;
.amount {
height: 40rpx;
font-weight: 500;
font-size: 23rpx;
color: rgba(255, 255, 255, 0.6);
}
.money {
// background-color: #18BC37;
display: flex;
align-items: center;
font-weight: bold;
font-size: 70rpx;
color: #fff;
padding: 10rpx 0 50rpx 0;
}
.other {
height: 100rpx;
width: 100%;
// background-color: #18BC37;
display: flex;
justify-content: space-between;
.deal-amount {
height: 85%;
width: 30%;
//background: #555500;
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: flex-start;
font-weight: 500;
font-size: 23rpx;
color: rgba(255, 255, 255, 0.6);
}
.refund {
@extend .deal-amount;
}
.refund-amount {
@extend .deal-amount;
}
}
}
.footer {
height: 1rpx;
width: 100%;
margin-top: 30rpx;
}
}
</style>