Files
hamid.zarghami1@gmail.com e644edbd65 transfer project in github
2024-05-12 15:29:27 +03:30

266 lines
7.9 KiB
Vue

<template>
<div>
<CustomSubHeader>
<CBreadcrumb class="border-0 mb-0">{{ title }}</CBreadcrumb>
<!-- <CButton size="sm" color="success" :to="{name: 'admin-foods-food',params:{food: 'new'}}" class="mr-auto">افزودن</CButton>-->
</CustomSubHeader>
<CCard v-if="hasPermission('super-admin')">
<CCardBody>
<CRow>
<CCol col="12" sm="6">
<CCallout color="info">
<small class="text-muted">تعداد مشتری ها</small><br>
<strong class="h4">{{ customers.length }}</strong>
</CCallout>
</CCol>
<CCol col="12" sm="6">
<CCallout color="danger">
<small class="text-muted">تعداد سفارشات</small><br>
<strong class="h4">{{ orders.length }}</strong>
</CCallout>
</CCol>
</CRow>
</CCardBody>
</CCard>
<CCol v-if="hasPermission('super-admin')">
<CRow>
<CCol sm="6">
<CCard>
<CCardHeader>
<strong>
<span>تعداد مشتریان بر اساس شغل</span>
</strong>
</CCardHeader>
<CCardBody>
<canvas id="myChart" width="400" height="400"></canvas>
</CCardBody>
</CCard>
</CCol>
</CRow>
</CCol>
<CCard v-if="hasPermission('super-admin')">
<CCardHeader>
<strong>
<span>لیست تخفیف های ویژه امروز مورخ: </span>
<span>{{ jDate(Date.now()) }}</span>
</strong>
</CCardHeader>
<CCardBody>
<el-table
:data="offFoods"
style="width: 100%">
<el-table-column
type="index"
label="#">
</el-table-column>
<el-table-column
label="عکس"
width="">
<template slot-scope="scope">
<img v-if="scope.row.image" :src="scope.row.image" alt="" style="width: 100px;">
<i v-else class="fal fa-image-polaroid" style="font-size: 115px;"></i>
</template>
</el-table-column>
<el-table-column
prop="name"
label="نام"
width="">
</el-table-column>
<el-table-column
label="قیمت"
width="">
<template slot-scope="scope">
<span class="text-success" v-if="scope.row.price">{{ scope.row.price.toLocaleString() + ' ريال ' }}</span>
<span class="text-danger" v-else>بدون قیمت</span>
</template>
</el-table-column>
<el-table-column
label="قیمت با تخفیف"
width="">
<template slot-scope="scope">
<span v-if="scope.row.static_discount">{{ (scope.row.price - (scope.row.price / 100) * scope.row.static_discount).toLocaleString() + ' ريال ' }}</span>
<span v-else class="text-danger">{{ scope.row.price.toLocaleString() + ' ريال ' }}</span>
</template>
</el-table-column>
<el-table-column
label="تعداد موجود"
width="">
<template slot-scope="scope">
<span class="text-success" v-if="scope.row.stock">{{ scope.row.stock }}</span>
<span class="text-danger" v-else>اتمام موجودی</span>
</template>
</el-table-column>
<el-table-column
label="درصد تخفیف"
width="">
<template slot-scope="scope">
<span class="text-success" v-if="scope.row.static_discount">{{ scope.row.static_discount + '%' }}</span>
</template>
</el-table-column>
<el-table-column
label="دسته بندی"
width="">
<template slot-scope="scope">
{{ getFoodCategoryName(scope.row.category) }}
</template>
</el-table-column>
<el-table-column
label="مشاهده"
width="75"
align="center">
<template slot-scope="scope">
<CButton color="success" variant="outline" :key="scope.row._id" :to="{name: 'admin-foods-food',params: {food: scope.row._id}}">
<i class="far fa-eye"></i>
</CButton>
</template>
</el-table-column>
</el-table>
</CCardBody>
</CCard>
</div>
</template>
<script>
import moment from "moment-jalaali"
import login from "@/pages/admin/login";
export default {
data() {
return {
title: 'داشبورد',
list_title: 'لیست',
foodCategories: null,
foods: null,
idToken: '',
permissionGranted: false,
customers : null,
orders : null
}
},
computed: {
offFoods() {
return this.foods.filter(item => item.static_discount)
},
branchId(){
return this.$store?.state?.admin?.branchId
}
},
methods: {
jDate(date) {
return moment(date).format("jYYYY/jMM/jDD")
},
getFoodCategoryName(id) {
return this.foodCategories.filter(item => item._id === id)[0].name
},
hasPermission(permission) {
if (this.$auth.loggedIn) return this.$auth.user.permissions.includes(permission)
else return false
},
},
head() {
return {
title: this.title
}
},
async mounted() {
await Notification.requestPermission()
const typePermission = await Notification.permission
this.permissionGranted = typePermission === 'granted'
const getAdmin = this.$auth.$state.user
if (typePermission === 'granted') {
if (getAdmin) {
this.idToken = await this.$fire.messaging.getToken()
await this.$axios.post('/api/admin/addFcmToken', {
fcmToken: this.idToken
})
}
}
if (this.hasPermission('super-admin')){
const counts = {};
this.customers.forEach(function (x) { counts[x.job] = (counts[x.job] || 0) + 1; });
let keys = Object.keys(counts).map(item => item === 'undefined' ? 'نامشخص' : item);
let values = Object.values(counts).map(item => item === 'undefined' ? 'نامشخص' : item);
const CHART_COLORS = {
red: 'rgb(255, 99, 132)',
orange: 'rgb(255, 159, 64)',
yellow: 'rgb(255, 205, 86)',
green: 'rgb(75, 192, 192)',
blue: 'rgb(54, 162, 235)',
purple: 'rgb(153, 102, 255)',
grey: 'rgb(201, 203, 207)'
};
const ctx = document.getElementById('myChart');
const myChart = new Chart(ctx, {
type: 'pie',
data: {
labels: keys,
datasets: [{
// label: '# of Votes',
data: values,
backgroundColor: Object.values(CHART_COLORS),
borderWidth: 1
}]
},
options: {
responsive: true,
scales: {
y: {
beginAtZero: true
}
}
}
});
}
},
layout: 'admin',
async asyncData({$axios, error , redirect , route}) {
try {
const branchId = route?.params?.branch
const requests = [
$axios.get(`/api/public/foodCategories/getAll/${branchId}`),
$axios.get(`/api/public/foods/getAll/${branchId}`,{progress: false}),
$axios.get(`/api/admin/users/forReport/${branchId}`,{progress: false}),
$axios.get(`/api/admin/order/forReport/${branchId}`,{progress: false})
];
const fetch = await Promise.all(requests);
const [foodCategories, foods, customers, orders] = fetch;
return {
foodCategories: foodCategories.data,
foods: foods.data,
customers: customers.data,
orders: orders.data
}
} catch (e) {
if (e?.response?.status === 401) {
redirect('/admin/login')
} else {
error({
status: 500,
message: "مشکلی در گرفتن اطلاعات بوجود آمده است",
});
}
}
}
}
</script>