Files
cashier_desktop/src/views/work/index.vue
2025-04-03 16:28:31 +08:00

406 lines
14 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>
<el-drawer size="100%" :with-header="false" direction="btt" v-model="dialogVisible">
<div class="box">
<div class="box_top">
<div class="box_top_left" @click="dialogVisible = false">
<el-icon size="20">
<ArrowLeft />
</el-icon>
<div style="margin-left: 4px;">返回</div>
</div>
<div class="box_top_right" @click="checkRecord">
交班记录
</div>
</div>
<div class="box_content">
<div class="box_content_left">
<div class="box_content_left_top">
<div class="box_content_left_top_item">
<div class="box_content_left_top_item_top">
<div style="color:#ff5252; font-size: 30px;">
{{ infoData.orderCount || 0 }}
</div>
<div style="margin-top: 6px; color: #666;">
总订单
</div>
</div>
<div class="box_content_left_top_item_top">
<div style="color:#ff5252; font-size: 30px;">
{{ formatDecimal(infoData.handAmount || 0) }}
</div>
<div style="margin-top: 6px; color: #666;">
营业额
</div>
</div>
</div>
<div class="box_content_left_top_item">
<div class="box_content_left_top_item_botton">
<div style=" font-size: 20px;">
{{ formatDecimal(infoData.cashAmount || 0) }}
</div>
<div style="margin-top: 6px;">
现金支付
</div>
<!-- <div style="margin-top: 6px;font-size: 14px;">
查看详情
</div> -->
</div>
<div class="box_content_left_top_item_botton">
<div style=" font-size: 20px;">
{{ formatDecimal(infoData.refundAmount || 0) }}
</div>
<div style="margin-top: 6px;">
退款金额
</div>
<!-- <div style="margin-top: 6px;font-size: 14px;">
查看详情
</div> -->
</div>
</div>
</div>
<div class="box_content_left_bottom">
<el-table :data="infoData.detailList" border style="width: 100%;" height="382px">
<el-table-column prop="productName" label="商品名称" />
<el-table-column prop="skuName" label="规格名称" />
<el-table-column prop="num" label="商品数量" />
<el-table-column prop="amount" label="商品金额">
<template v-slot="scope">
{{ formatDecimal(scope.row.amount || 0) }}
</template>
</el-table-column>
</el-table>
</div>
</div>
<div class="box_content_right">
<div class="top">
<div class="box_content_right_tiem">
<div class="box_content_right_tiemleft">
店铺
</div>
<div class="box_content_right_tiemright">
{{ infoData.shopName }}
</div>
</div>
<div class="box_content_right_tiem">
<div class="box_content_right_tiemleft">
上岗时间
</div>
<div class="box_content_right_tiemright">
{{ dayjs(infoData.loginTime).format("YYYY-MM-DD HH:mm:ss") }}
</div>
</div>
<div class="box_content_right_tiem">
<div class="box_content_right_tiemleft">
交班时间
</div>
<div class="box_content_right_tiemright">
{{ dayjs(infoData.handoverTime).format("YYYY-MM-DD HH:mm:ss") }}
</div>
</div>
<!-- <div class="box_content_right_tiem">
<div class="box_content_right_tiemleft">
终端名称
</div>
<div class="box_content_right_tiemright">
{{ infoData.equipment || '无' }}
</div>
</div> -->
<!-- <div class="box_content_right_tiem">
<div class="box_content_right_tiemleft">
备用金
</div>
<div class="box_content_right_tiemright">
{{ infoData.pettyCash || '无' }}
</div>
</div> -->
<div class="box_content_right_tiem">
<div class="box_content_right_tiemleft">
收营员
</div>
<div class="box_content_right_tiemright">
{{ infoData.staffName || '无' }}
</div>
</div>
</div>
<div class="footer">
<div class="is_shop">
<div class="button">
<el-checkbox v-model="isPrint" :true-value="1" :false-value="0" border
label="是否打印商品销售数据" style="width: 100%" />
</div>
</div>
<div class="box_content_right_tiembutton" :loading="loading" @click="exit">
<span v-if="!loading">交班/关班</span>
<span v-else>交班/关班中....</span>
</div>
</div>
</div>
</div>
</div>
</el-drawer>
</template>
<script setup>
import { ref } from 'vue'
import { ElMessage, dayjs } from 'element-plus'
import { handoverTotal, handover, handoverData, handoverNetworkPrint } from '@/api/account.js'
import { useRouter } from "vue-router";
import { useUser } from "@/store/user.js";
import { formatDecimal } from '@/utils/index.js'
import { usePrint } from "@/store/print.js";
import { useGoods } from "@/store/goods.js";
import { staffPermission } from '@/api/user.js'
const goodsStore = useGoods();
const printStore = usePrint();
const store = useUser();
const router = useRouter();
const dialogVisible = ref(false) //交班
//详情数据
const infoData = ref({})
const loading = ref(false);
const isPrint = ref(1)
// 查看交班记录
async function checkRecord() {
try {
// await staffPermission('yun_xu_cha_kan_suo_you_jiao_ban_ji_lu')
router.push('/workrecord')
} catch (error) {
console.log(error);
}
}
// 开始交班
const exit = async () => {
try {
if (loading.value) return
loading.value = true;
// await staffPermission('yun_xu_jiao_ban')
const res = await handover(isPrint.value)
const data = await handoverData(res)
if (printStore.deviceNoteList.length) {
// 使用本地打印机 打印交班数据
data.printTime = dayjs().format('YYYY-MM-DD HH:mm:ss')
data.printShop = isPrint.value
printStore.printWork(data)
} else {
// 使用云打印机 打印交班数据
await handoverNetworkPrint(data.id)
}
logoutHandle()
} catch (error) {
loading.value = false;
console.log(error);
}
}
// 退出登录
async function logoutHandle() {
try {
loading.value = true;
await store.logout()
goodsStore.clearAllGoods()
ElMessage.success("交班成功");
setTimeout(() => {
router.replace({
name: "login",
});
}, 1000);
} catch (error) {
loading.value = false;
console.log('退出失败');
}
}
// 获取交班打印数据前置
const infoshopInfoqueryDutys = async () => {
try {
let res = await handoverTotal()
infoData.value = res
} catch (error) {
console.log(error);
}
}
defineExpose({
show
})
function show() {
dialogVisible.value = true
infoshopInfoqueryDutys()
}
</script>
<style scoped lang="scss">
.box {
padding: 16px 0;
height: 100%;
.box_top {
display: flex;
justify-content: space-between;
align-items: center;
background: #fff;
padding: 10px;
border-radius: 6px;
color: #161718;
text-decoration: none;
/* 取消下划线效果 */
.box_top_left {
display: flex;
justify-content: flex-start;
align-items: center;
color: #161718;
text-decoration: none;
}
.box_top_right {
color: #161718;
text-decoration: none;
/* 取消下划线效果 */
}
}
.box_content {
margin-top: 10px;
width: 100%;
height: 92%;
display: flex;
.box_content_left {
background: #fff;
width: 70%;
height: 100%;
border-radius: 6px;
padding: 30px 20px;
.box_content_left_top {
display: flex;
flex-direction: column;
padding-bottom: 20px;
.box_content_left_top_item {
display: flex;
align-items: center;
.box_content_left_top_item_top {
margin-left: 30px;
display: flex;
align-items: center;
flex-direction: column;
}
.box_content_left_top_item_botton:nth-child(1) {
margin-left: 0;
}
.box_content_left_top_item_botton {
position: relative;
margin-left: 10px;
margin-top: 10px;
display: flex;
align-items: center;
flex-direction: column;
width: 200px;
padding: 20px 0;
background: #e0e0e0;
border-radius: 10px;
}
.box_content_left_top_item_botton::after {
position: absolute;
top: 0;
content: '';
display: inline-block;
width: 200px;
height: 8px;
background: #ff5252;
border-radius: 10px 10px 0 0;
}
}
}
}
.box_content_right {
width: 30%;
height: 100%;
margin-left: 10px;
position: relative;
display: flex;
flex-direction: column;
gap: 10px;
.box_content_right_tiem {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px;
.box_content_right_tiemleft {
color: #9e9e9e;
}
}
.box_content_right_tiembutton {
background: #ba5050;
border-radius: 5px;
color: #fff;
text-align: center;
height: 60px;
line-height: 60px;
}
}
}
}
.top {
flex: 1;
background-color: #fff;
padding: 10px 0;
border-radius: 6px;
}
.footer {
padding: 10px;
background: #fff;
border-radius: 6px;
}
.is_shop {
.button {
flex: 1;
margin-bottom: 10px;
:deep(.el-checkbox.el-checkbox--large) {
height: var(--el-component-size-large);
background-color: #fff;
}
:deep(.el-checkbox__inner) {
width: 20px;
height: 20px;
&::after {
border-width: 2px;
top: 0;
left: 4px;
}
}
:deep(.el-checkbox__label) {
font-size: var(--el-font-size-base) !important;
}
}
}
</style>