lanan-app/pages/rescue/rescue.vue

1782 lines
40 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>
<view class="content">
<!-- 顶部 -->
<view class="content-top" :style="{ paddingTop: homeHeaderPaddingTop + 'px' }">
<view style="display: flex; justify-content: start;">
<image class="logo-icon" src="@/static/leftLogo.png" mode="scaleToFill">
</image>
<view class="top-two">
<view class="user-info">
<view class="user-name">{{ userinfo.nickname || '用户昵称'}}</view>
<view class="user-position" v-if="highestWeightRoleName">{{ highestWeightRoleName }}</view>
</view>
<!-- #ifdef APP-PLUS || H5 -->
<view class="real-time">
<text class="date-part">{{currentDate}}</text>
<text class="time-part">{{currentTime}}</text>
</view>
<!-- #endif -->
</view>
</view>
<view class="top-menu">
<view class="top-menu-item" :key="index" v-for="(item, index) in topMenuList"
@click="goToMenuPage(item)" v-if="checkPermi(['rescue_home_page'])">
<image class="top-menu-item-icon" :src="item.icon" mode="aspectFit"></image>
<text>{{ item.title }}</text>
</view>
</view>
</view>
<view class="dil" v-if="checkPermi(['rescue_home_page'])">
<!-- 四个选项 -->
<!-- #ifdef APP-PLUS || H5 -->
<!-- <view style="display: flex; flex-direction: row; align-items: center; justify-content: space-between;"> -->
<view class="four-box-header">
<view class="blue-line"></view>
<text class="four-box-header-title">业务管理</text>
<!-- <view class="four-box-header-extra">
<text style="color: #929292;">待评价</text>
<uni-icons type="right" color="#929292"></uni-icons>
</view> -->
</view>
<!-- <view class="four-box-header-extra" @click="gohistory()">
<text style="color: #929292;">历史订单</text>
<uni-icons type="right" color="#929292"></uni-icons>
</view>
</view> -->
<view class="tab-choose-class">
<view class="tab-content" @click="tabChoose(item, index)"
v-for='(item, index) in ["当日", "当月", "全部", "自定义"]' :key='index'>
<!-- tab 名称信息 -->
<view class='tab-name-class'
:style='{ color: index + 1 == tabValue ? "#101A3E" : "#8D90A6", fontWeight: index + 1 == tabValue ? "bold" : "normal" }'>
{{ item }}
<view class="icon-tab" v-if='index == 3'>
<image src="@/static/icons/homeOrderCard/xialajiantou.svg" mode="scaleToFill"></image>
</view>
</view>
<!-- 名称下 icon -->
<view class="tab-icon"
:style='{ background: index + 1 == tabValue ? "linear-gradient( 180deg, #054DF3 0%, #55A3FF 100%)" : "" }'>
</view>
</view>
</view>
<view class="example-body" v-show="tabValue==4" style="margin-bottom: 16rpx;">
<uni-datetime-picker v-model="range" type="daterange" @maskClick="maskClick" />
</view>
<view class="four-box">
<view class="boxf" @click="goToOrder('null')">
<view class="zi1">
<image class="zi1-icon" src="@/static/icons/homeOrderCard/receivedOrder_new.png"
mode="aspectFit">
</image>
<text>已接单</text>
</view>
<view class="zi2" style="margin-top: 10rpx;">{{yjdNum ? yjdNum : '0'}}</view>
</view>
<view class="boxf" @click="goToOrder(1)">
<view class="zi1">
<image class="zi1-icon" src="@/static/icons/homeOrderCard/jyz_new.png" mode="aspectFit"></image>
<text>救援中</text>
</view>
<view class="zi2" style="margin-top: 10rpx;">{{jyzNum}}</view>
</view>
<view class="boxf" @click="goToOrder(5)">
<view class="zi1">
<image class="zi1-icon" src="@/static/icons/homeOrderCard/ywc_new.png" mode="aspectFit"></image>
<text>已完成</text>
</view>
<view class="zi2" style="margin-top: 10rpx;">{{ywcNum}}</view>
</view>
</view>
<view class="two-box-container">
<view class="two-box">
<view class="boxf2" style="background: linear-gradient(135deg, #E0F0FF 40%, #BBD9FF 100%);">
<view style="display: flex; justify-content: space-between; align-items: center;">
<view class="zi1_1">
<image class="zi1_1-icon" src="@/static/icons/homeOrderCard/ysk_solid.png"
mode="aspectFit">
</image>
<text style="color: #3d6ba0; font-weight: bold; font-size: 30rpx;">应收款</text>
</view>
<uni-icons class="eye-icon" :type="yskShowAmount ? 'eye' : 'eye-slash'"
@click.native.stop.prevent="yskShowAmount = !yskShowAmount"></uni-icons>
</view>
<view class="zi2_2" style="margin-top: 10rpx;">{{ yskShowAmount ? yingskNum : '*****' }}</view>
</view>
<view class="boxf2" style="background: linear-gradient(135deg, #FFF7E0 40%, #FFE7B8 100%);"
@click="goToOrder(3)">
<view style="display: flex; justify-content: space-between; align-items: center;">
<view class="zi1_1">
<image class="zi1_1-icon" src="@/static/icons/homeOrderCard/qucar.png" mode="aspectFit">
</image>
<text style="color: #a97747; font-size: 30rpx; font-weight: bold;">待取车</text>
</view>
<uni-icons class="eye-icon" :type="dqcShowAmount ? 'eye' : 'eye-slash'"
@click.native.stop="dqcShowAmount = !dqcShowAmount"></uni-icons>
</view>
<view class="zi2_2" style="margin-top: 10rpx;">{{ dqcShowAmount ? dqcNum : '*****' }}</view>
</view>
</view>
<view class="two-box">
<view class="boxf2" style="background: linear-gradient(135deg, #E6F8ED 40%, #C8F0D8 100%);">
<view style="display: flex; justify-content: space-between; align-items: center;">
<view class="zi1_1">
<image class="zi1_1-icon" src="@/static/icons/homeOrderCard/yisk_solid.png"
mode="aspectFit">
</image>
<text style="color: #169948; font-size: 30rpx; font-weight: bold;">已收款</text>
</view>
<uni-icons class="eye-icon" :type="yiskShowAmount ? 'eye' : 'eye-slash'"
@click.native.stop="yiskShowAmount = !yiskShowAmount"></uni-icons>
</view>
<view class="zi2_2" style="margin-top: 10rpx;">{{ yiskShowAmount ? yiskNum : '*****' }}</view>
</view>
<view class="boxf2" style="background: linear-gradient(135deg, #F0E9FF 40%, #D9CEFF 100%);">
<view style="display: flex; justify-content: space-between; align-items: center;">
<view class="zi1_1">
<image class="zi1_1-icon" src="@/static/icons/homeOrderCard/dsk_solid.png"
mode="aspectFit">
</image>
<text style="color: #6657da; font-weight: bold; font-size: 30rpx;">待收款</text>
</view>
<uni-icons class="eye-icon" :type="dskShowAmount ? 'eye' : 'eye-slash'"
@click.native.stop="dskShowAmount = !dskShowAmount"></uni-icons>
</view>
<view class="zi2_2" style="margin-top: 10rpx;">{{ dskShowAmount ? dskNum : '*****' }}</view>
</view>
</view>
</view>
<view class="yijian">
<view class="y-left" @click="getyi()">
<view class="">立即救援</view>
</view>
</view>
<!-- #endif -->
<!-- #ifdef MP-WEIXIN -->
<view class="box">
<template v-for="(item, index) in busiTypeList">
<view :key="index" class="xz-box" :class="{ checked: busiType === index + 1 }"
@click="getsxwhat(index + 1)">
<image class="xz-box-icon" :src="item.icon" mode="aspectFit"></image>
<view class="box-wenzi">{{item.label}}</view>
<view class="checkedFlag">
</view>
<uni-icons class="checkedFlagIcon" type="checkmarkempty" size="22" color="#fff"></uni-icons>
</view>
</template>
</view>
<!-- #endif -->
<view class="four-box-header_2">
<view class="four-box-header">
<view class="blue-line"></view>
<text class="four-box-header-title">救援列表</text>
<!-- <view class="four-box-header-extra" @click="gohistory()">
<text style="color: #929292;">历史订单</text>
<uni-icons type="right" color="#929292"></uni-icons>
</view> -->
</view>
<!-- <view class="four-box-header_2_right">
<text :class="['tab-item', { active: activeTab === 0 }]" @click="switchTab(0)">司机端</text>
<text :class="['tab-item', { active: activeTab === 1 }]" @click="switchTab(1)">业务端</text>
<text :class="['tab-item', { active: activeTab === 2 }]" @click="switchTab(2)">客户端</text>
</view> -->
</view>
<view class="tap-box">
<view class="ques" v-if="loading && orderList.length == 0">
<!-- <image src="../../static/quesheng.png" mode="aspectFit"></image> -->
<view class="loading-container">
<view class="loading-spinner"></view>
<text class="loading-text">加载中,请稍候...</text>
</view>
</view>
<view class="ques" v-else-if="!loading && orderList.length == 0">
<image src="../../static/quesheng.png" mode="aspectFit"></image>
</view>
<view style="display: flex;flex-direction: column;row-gap: 10px;" v-else>
<order-card-new :status="1" @deleteOk="deleteOrderHandle" @revokeOk="revokeOrderHandle"
@refresh="getlist" v-for="(item, index) in orderList" :key="index" :orderData="item"
:activeTab="activeTab" @update:activeTab="activeTab = $event"></order-card-new>
</view>
</view>
<!-- 一键救援 -->
<view style="width: 100%; height: 80px; "></view>
<!-- dibu -->
</view>
<u-modal :show="showDelete" :title="title" :showCancelButton="true"></u-modal>
<u-popup :show="showp" mode="center" :round="10">
<scroll-view scroll-y style="height: 200px;">
<view class="box_">
<view class="title_">车辆提醒</view>
<view class="size_" v-for="(item,index) in warnList" :key="index">{{item}}</view>
</view>
</scroll-view>
<view class="annaiu" @click="showp=false">
<view class="">确定</view>
</view>
</u-popup>
<!-- 悬浮刷新按钮 -->
<view v-if="checkPermi(['rescue_home_page'])" class="floating-refresh-btn" :class="{ rotating: isRefreshing }"
@click="handleRefresh">
<uni-icons type="refreshempty" size="40" color="#fff"></uni-icons>
</view>
<tabBar :msg="msg"></tabBar>
</view>
</template>
<script>
import request from '../../utils/request';
import tabBar from '@/components/tabBar/tabBar.vue'
import {
getToken
} from '@/utils/auth'
// #ifdef APP
const keepAlivePlugin = uni.requireNativePlugin('Ba-KeepAlive')
const jyJPush = uni.requireNativePlugin('JY-JPush');
// #endif
import OrderCardNew from '@/components/orderCard/OrderCardNew.vue'
import {
getWXStatusHeight
} from '@/utils/utils.js';
import {
checkPermi,
checkRole
} from "@/utils/permission"; // 权限判断函数
// import { getWeather } from'../../utils/Weather'
export default {
data() {
return {
// #ifdef MP
homeHeaderPaddingTop: 0,
homeHeaderMenuHeight: 0,
homeHeaderMenuLeft: 0,
// #endif
// #ifdef APP || H5
homeHeaderPaddingTop: uni.upx2px(90),
homeHeaderMenuHeight: 50,
homeHeaderMenuLeft: 0,
// #endif
// activeTab: 1, // 新增:当前选中的选项卡索引
activeTab: -1, // 新增:当前选中的选项卡索引
busiTypeList: [{
label: '拖车',
icon: require('@/static/icons/order/tuoche.png')
},
{
label: '送油',
icon: require('@/static/icons/order/songyou.png')
},
{
label: '搭电',
icon: require('@/static/icons/order/dadian.png')
},
{
label: '换胎',
icon: require('@/static/icons/order/huantai.png')
},
// {
// label: '扣车',
// icon: require('@/static/icons/order/tuoche.png')
// },
],
topMenuList: [{
title: '业务管理',
// path: '/pages/rescue/historylist?id=1',
// path: '/pages/rescue/historylist',
path: '/pages/rescue/businessManage',
icon: require('@/static/icons/homeTopMenu/icon_business.png')
},
{
title: '车辆管理',
path: '/pages/my/carManage',
icon: require('@/static/icons/homeTopMenu/icon_clean.png')
},
{
title: '数据统计',
path: '/pages/my/StatisticsInfo',
icon: require('@/static/icons/homeTopMenu/icon_maintain.png')
},
{
title: '消息通知',
path: '/pages/message/message',
icon: require('@/static/icons/homeTopMenu/icon_fitment.png')
}
],
msgSocket: this.$msgSocket,
showp: false,
title: '是否确认删除',
content: '是否确认删除',
dqcNum: 0,
dzfNum: 0,
jyzNum: 0,
ywcNum: 0,
zwxNum: 0,
// 已接单
yjdNum: 0,
// 应收款
yingskNum: 0,
// 已收款
yiskNum: 0,
// 待收款
dskNum: 0,
currentTime: '',
cityName: '济南',
positionInfo: '泸州',
msg: '1',
total: 0,
pageNum: 1, //第几页
pageSize: 10, //一页多少张
totalPages: 0, //总数
orderList: [
// {
// rescueTypeStr: '扣车',
// rescuePosition: '四川省泸州市江阳区酒谷大道四段18号泸州',
// rescueStatus: 2,
// rescueStatusStr: '待救援',
// driverName: '先伟',
// driverCarNum: '川E69752',
// distance: 12800,
// needTime: 26,
// rescueTime: '2024-08-12 08:42'
// }
],
sjlist: [],
showDelete: false,
arrbox: [
// {text:'待支付',id:1},
// {text:'待评价',id:2},
],
keepLive: {
channelId: 'Ba-KeepAlive',
channelName: "Ba-KeepAlive",
title: "蓝安救援正在运行",
content: "蓝安救援正在运行",
dataResult: "",
type: undefined
},
one: true,
warnList: [],
userinfo: {},
currentDateTime: '', // 实时时间变量
timer: null, // 定时器
tabValue: 1,
timeType: "day",
range: [],
yskShowAmount: false,
yiskShowAmount: false,
dskShowAmount: false,
dqcShowAmount: false,
startTimeStr: null,
endTimeStr: null,
currentDate: '',
// currentTime: '',
roleList: [],
positionName: '', // 岗位名称
highestWeightRoleName: '',
isRefreshing: false, // 新增:刷新状态
loading: true, // 加载状态控制
}
},
onLoad() {
// #ifdef MP
const {
barHeight,
barTop,
menuButtonLeft
} = getWXStatusHeight()
console.log('barHeight, barTop, menuButtonLeft: ', barHeight, barTop, menuButtonLeft);
this.homeHeaderPaddingTop = barTop || 0
this.homeHeaderMenuHeight = barHeight
this.homeHeaderMenuLeft = menuButtonLeft - 6
// #endif
this.$startMsgSocket(uni.getStorageSync('userId'))
this.updateDateTime();
this.timer = setInterval(this.updateDateTime, 1000);
// #ifdef APP || H5
// this.register()
this.jyPushStart()
this.updateDateTime();
this.timer = setInterval(this.updateDateTime, 1000);
// #endif
/* // 监听编辑完成事件
uni.$on('refreshHomePage', this.handleRefreshHomePage); */
},
onUnload() {
// 清除定时器
if (this.timer) clearInterval(this.timer);
/* // 移除事件监听,避免内存泄漏
uni.$off('refreshHomePage', this.handleRefreshHomePage); */
},
onShow() {
this.timeWeekFormat()
//this.getWarnList()
if (getToken()) {
this.Fourhammers()
this.getlist()
this.userinfo = uni.getStorageSync('userInfo')
this.roleList = uni.getStorageSync('role')
this.highestWeightRoleName = uni.getStorageSync('highestWeightRoleName')
console.log('highestWeightRoleName', this.highestWeightRoleName)
} else {
return
}
},
onReachBottom() {
if (this.pageNum >= this.totalPages) {
uni.showToast({
title: '没有下一页数据',
icon: 'none'
})
} else {
this.pageNum++
this.getlist()
}
},
watch: {
range(newval) {
if (newval && newval.length === 2) {
this.startTimeStr = newval[0];
this.endTimeStr = newval[1];
this.Fourhammers();
}
},
roleList: {
handler(newVal) {
if (newVal && newVal.length > 0) {
this.filterPosition();
} else {
this.positionName = ''; // 设置为空,不显示
}
},
immediate: true // 立即执行一次
}
},
components: {
tabBar,
OrderCardNew
},
methods: {
checkPermi,
checkRole,
// 切换选项卡
switchTab(index) {
this.activeTab = index;
console.log('切换到选项卡:', index);
},
/* // 处理首页刷新
handleRefreshHomePage() {
console.log('收到编辑完成事件,刷新首页数据');
this.pageNum = 1;
this.orderList = [];
this.getlist();
this.Fourhammers();
}, */
// 处理刷新
handleRefresh() {
if (this.isRefreshing) return;
this.isRefreshing = true;
// 刷新数据
this.pageNum = 1;
this.orderList = [];
// 同时调用多个接口刷新数据
Promise.all([
this.getlist(),
this.Fourhammers()
]).then(() => {
this.isRefreshing = false;
uni.showToast({
title: '刷新成功',
icon: 'success',
duration: 1000
});
}).catch(() => {
this.isRefreshing = false;
uni.showToast({
title: '刷新失败',
icon: 'none',
duration: 1000
});
});
},
jyPushStart() {
console.log("jyPushStart", jyJPush);
// 暂时只有安卓支持
jyJPush.registerSDKCallBack(sdkCallBack => {
// 这里会返回regid
console.log("sdk Callback 结果 " + JSON.stringify(sdkCallBack));
})
// 此处只是演示 授权实际应该弹出自己的隐私授权页面或者用uniapp提供的隐私协议
setTimeout(function() {
jyJPush.setAuth({
auth: "1"
}, res => {
console.log("auth 结果 " + JSON.stringify(res));
if (res.errorCode == 0) {
// 安卓需要单独调用
if (uni.getSystemInfoSync().platform == 'android') {
jyJPush.android_init(initRes => {
console.log("init 结果 " + JSON.stringify(initRes));
jyJPush.deleteJYJPushAlias({
// 可以不用传值进去,但是需要配置这项数据
}, result => {
jyJPush.setJYJPushAlias({
userAlias: uni.getStorageSync('userId')
}, result => {
// 设置成功或者失败都会通过这个result回调返回数据数据格式保持极光返回的安卓/iOS数据一致
// 注:若没有返回任何数据,考虑是否初始化完成
console.log('setJYJPushAlias', result);
jyJPush.getJYJPushAlias({
// 可以不用传值进去,但是需要配置这项数据
}, result => {
console.log(
'getJYJPushAlias',
result);
});
});
});
})
}
}
})
}, 5000);
},
msgInfo() {
if (this.msgSocket) {
this.msgSocket.onMessage(res => {
console.log('触发首页的消息回调');
this.singleList = []
this.getthreelist()
this.driverRescuePage()
})
}
},
/**
* 导航菜单跳转
*/
goToMenuPage(item) {
if (!item.path) {
return; // 如果没有path则不进行跳转
}
uni.navigateTo({
url: item.path
})
},
isRunning() { //是否正在运行
keepAlive.isRunning((res) => {
console.log('保活服务验证', res);
});
},
restart() { //重启
keepAlive.restart((res) => {
console.log('重启保活服务', res);
})
},
register() { //注册
// #ifdef APP
console.log('keepAlive', keepAlivePlugin);
keepAlivePlugin.register({
channelId: this.keepLive.channelId,
channelName: this.keepLive.channelName,
title: this.keepLive.title,
content: this.keepLive.content,
},
(res) => {
console.log('保活注册', res);
});
// #endif
},
deleteOrderHandle() {
this.pageNum = 1
this.orderList = []
this.getlist()
},
revokeOrderHandle() {
this.pageNum = 1
this.orderList = []
this.getlist()
},
getWarnList() {
this.warnList = []
request({
url: "/system/rescueCar/warnList",
method: 'get',
}).then(res => {
this.warnList = res.data
if (this.warnList.length > 0) {
this.showp = true
}
})
},
goToOrder(type) {
uni.navigateTo({
url: '/pages/rescue/historylist?id=' + type
})
},
gettel(num) {
uni.makePhoneCall({
phoneNumber: num //仅为示例
});
},
getsxwhat(id) {
uni.navigateTo({
url: '/pages/rescue/initiate?id=' + id + '&isAppointment=' + this.isAppointment
})
},
Fourhammers() {
request({
url: '/app/rescueInfo/getRescueStatistics',
method: 'get',
params: {
timeType: this.timeType,
startTimeStr: this.startTimeStr,
endTimeStr: this.endTimeStr,
}
}).then((res) => {
console.log('四个', res);
this.dqcNum = res.data.dqcNum
this.dzfNum = res.data.dzfNum
this.jyzNum = res.data.jyzNum
this.ywcNum = res.data.ywcNum
this.yjdNum = res.data.yjdNum
this.yingskNum = res.data.yingskNum ? res.data.yingskNum / 100 : 0
this.yiskNum = res.data.yiskNum ? res.data.yiskNum / 100 : 0
this.dskNum = res.data.dskNum ? res.data.dskNum / 100 : 0
})
},
timeWeekFormat() {
//定义一个日期对象;
var dateTime = new Date();
//获得系统年份;
var year = dateTime.getFullYear();
//获得系统月份;
var month = dateTime.getMonth() + 1;
//获得系统当月分天数;
var day = dateTime.getDate();
//获得系统小时;
var hours = dateTime.getHours();
//获得系统分钟;
var minutes = dateTime.getMinutes();
//获得系统秒数;
var second = dateTime.getSeconds();
//获得系统星期几;
var dayCycle = dateTime.getDay();
//使用数组更改日期样式;
var dayCycleArray = ["日", "一", "二", "三", "四", "五", "六"];
for (var i = 0; i < 7; i++) {
if (dayCycle == i) {
//将dayCycleArray的数赋值到系统星期几里面中去;
dayCycle = dayCycleArray[i];
}
}
month < 10 ? month = '0' + month : month;
day < 10 ? day = '0' + day : day;
hours < 10 ? hours = '0' + hours : hours;
minutes < 10 ? minutes = '0' + minutes : minutes;
second < 10 ? second = '0' + second : second;
//打印完整的系统日期;
// this.dateStr = year + '-' + month + '-' + day + ' ';
this.currentTime = '星期' + dayCycle
// this.time = hours + ':' + minutes + ':' + second
},
/* getlist() {
let data = {
rescueStatus: 1,
pageSize: this.pageSize,
pageNum: this.pageNum,
}
request({
url: '/app/rescueInfo/getRescueList',
method: 'get',
params: data
}).then((res) => {
console.log('首页', res);
if (res.code == 200) {
if (this.pageNum != 1) {
this.orderList = this.orderList.concat(res.rows)
} else {
this.orderList = res.rows
}
let total = res.total
this.totalPages = Math.ceil(total / this.pageSize);
}
})
}, */
getlist() {
return new Promise((resolve, reject) => {
this.loading = true;
let data = {
rescueStatus: 1,
pageSize: this.pageSize,
pageNum: this.pageNum,
}
request({
url: '/app/rescueInfo/getRescueList',
method: 'get',
params: data
}).then((res) => {
console.log('首页', res);
if (res.code == 200) {
if (this.pageNum != 1) {
this.orderList = this.orderList.concat(res.rows)
} else {
this.orderList = res.rows
}
let total = res.total
this.totalPages = Math.ceil(total / this.pageSize);
}
resolve(); // 请求完成
}).catch(error => {
console.error('获取列表失败', error);
reject(error);
}).finally(() => {
this.loading = false;
})
});
},
// 更新时间
/* updateDateTime() {
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
const seconds = String(now.getSeconds()).padStart(2, '0');
this.currentDateTime = `${year}年${month}月${day}日 ${hours}:${minutes}:${seconds}`;
}, */
updateDateTime() {
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
const seconds = String(now.getSeconds()).padStart(2, '0');
this.currentDate = `${year}${month}${day}`;
this.currentTime = `${hours}:${minutes}:${seconds}`;
this.currentDateTime = `${this.currentDate} ${this.currentTime}`;
},
maskClick(e) {
console.log('maskClick事件:', e);
},
tabChoose(item, index) {
this.tabValue = index + 1
if (1 == this.tabValue) {
this.timeType = "day"
} else if (2 == this.tabValue) {
this.timeType = "month"
} else if (3 == this.tabValue) {
this.timeType = "all"
} else if (4 == this.tabValue) {
this.timeType = "more"
this.range = []
}
if (4 == this.tabValue) {
if (this.range.length > 0) {
this.startTimeStr = this.range[0]
this.endTimeStr = this.range[1]
this.Fourhammers()
}
} else {
this.Fourhammers()
}
},
filterPosition() {
if (this.roleList && this.roleList.length > 0) {
console.log('roleList', this.roleList)
// 筛选servicePackageId为"jiuyuan"的角色
const filteredRoles = this.roleList.filter(role =>
role.servicePackageId === 'jiuyuan'
);
// 按id正序排序
filteredRoles.sort((a, b) => a.id - b.id);
// 取第一个
if (filteredRoles.length > 0) {
this.positionName = filteredRoles[0].name;
} else {
this.positionName = ''; // 设置为空,不显示
}
} else {
this.positionName = ''; // 设置为空,不显示
}
},
getone() {
this.one = !this.one
},
//一键救援
getyi() {
uni.navigateTo({
url: '/pages/rescue/order'
})
},
goisAppointment() {
uni.navigateTo({
url: '/pages/rescue/order?isAppointment=1'
})
},
getsx() {
uni.navigateTo({
url: '/pages/Detain/Detain'
})
},
//预约
getyue() {
uni.navigateTo({
url: '/pages/rescue/order'
})
},
godetail(id) {
uni.navigateTo({
url: '/pages/details/details?id=' + id
})
},
gohistory() {
uni.navigateTo({
url: '/pages/rescue/historylist?id=1'
})
}
}
}
</script>
<style scoped lang="scss">
.content {
width: 100%;
height: calc(100vh);
background-color: #F7F8FC;
}
.dil {
// background-color: #F7F8FC;
background-color: #f3f5fc;
box-sizing: border-box;
padding: 0 30rpx;
}
.content-top {
padding: 90rpx 40rpx 0;
// background-color: #327DFB;
background: linear-gradient(to bottom, #2a3eff 40%, #1863fd 100%);
border-bottom-left-radius: 6px;
border-bottom-right-radius: 6px;
}
.top-two {
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
padding: 20rpx 0;
}
.top-left {
height: 58rpx;
box-sizing: border-box;
// border-radius: 50px;
// background-color: #D1EDFF;
display: flex;
justify-content: space-between;
overflow: hidden;
}
.left1 {
width: 112rpx;
height: 58rpx;
background: rgba(255, 255, 255, 0.2);
border-radius: 200rpx 0rpx 0rpx 200rpx;
font-size: 26rpx;
color: white;
font-weight: 400;
text-align: center;
display: flex;
justify-content: center;
align-items: center;
}
.left2 {
width: 146rpx;
height: 58rpx;
background: #FFFFFF;
border-radius: 0rpx 29rpx 29rpx 0rpx;
font-size: 26rpx;
color: #207EFE;
font-weight: 400;
text-align: center;
display: flex;
justify-content: center;
align-items: center;
}
.top-right {
display: flex;
align-items: center;
font-size: 34rpx;
font-weight: 400;
color: #fff;
line-height: 1;
.top-right-icon {
width: 44rpx;
height: 44rpx;
}
}
.top-menu {
display: flex;
justify-content: space-between;
padding: 30rpx 0rpx 36rpx;
}
.top-menu-item {
color: #fff;
display: flex;
flex-direction: column;
align-items: center;
row-gap: 12rpx;
font-size: 28rpx;
}
.top-menu-item-icon {
width: 60rpx;
height: 60rpx;
}
.four-box-header {
display: flex;
justify-content: start;
align-items: center;
padding: 20rpx 0 10rpx 0;
}
.four-box-header_2 {
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
padding: 20rpx 0;
}
.four-box-header_2_right {
width: 60%;
display: flex;
justify-content: space-around;
align-items: center;
padding: 20rpx 0;
.tab-item {
font-size: 28rpx;
font-weight: normal;
color: #a1a6aa;
position: relative;
padding: 0rpx 20rpx;
cursor: pointer;
transition: all 0.3s ease;
&.active {
font-weight: bold;
color: #000000;
&::after {
content: '';
position: absolute;
bottom: -10rpx;
left: 50%;
transform: translateX(-50%);
width: 33.33%;
height: 6rpx;
background: linear-gradient(90deg, #054DF3 0%, #55A3FF 100%);
border-radius: 3rpx 3rpx 0 0;
}
}
}
}
.four-box-header-title {
font-weight: bold;
}
.four-box-header-extra {
font-size: 24rpx;
}
.four-box {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 24rpx;
// margin-top: 15px;
width: 100%;
margin-bottom: 20rpx;
}
/* .two-box {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 24rpx;
// margin-top: 15px;
width: 100%;
} */
.two-box-container {
display: flex;
flex-direction: column;
gap: 20rpx;
width: 100%;
}
.two-box {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 18rpx;
width: 100%;
}
.ques {
width: 100%;
margin: 60rpx auto;
image {
width: 100%;
}
}
.boxf {
height: 130rpx;
overflow: hidden;
box-sizing: border-box;
border-radius: 6px;
padding: 12px;
// background-image: url('~@/static/images/homeOrderCard/dzf.png');
// background: rgba(218, 218, 218, 0.2);
background-color: #fdfeff;
background-size: cover;
background-position: center;
display: flex;
flex-direction: column;
justify-content: center;
// 边框
border: 1px solid #badeff;
// 阴影
box-shadow: inset 0 2px 8px rgba(186, 222, 255, 0.3);
/* border: 1px solid rgba(186, 222, 255, 0.6);
box-shadow:
// 内阴影(顶部微亮)
inset 0 2px 4px rgba(255, 255, 255, 0.4),
// 内阴影(底部微暗)
inset 0 -2px 4px rgba(186, 222, 255, 0.4),
// 外阴影:更轻,更小
0 2px 6px rgba(186, 222, 255, 0.3);
backdrop-filter: blur(10px); */
}
.boxf1 {
height: 140rpx;
overflow: hidden;
box-sizing: border-box;
border-radius: 6px;
padding: 12px;
// background-image: url('~@/static/images/homeOrderCard/dqc.png');
background: rgba(218, 218, 218, 0.2);
background-size: cover;
background-position: center;
display: flex;
flex-direction: column;
justify-content: center;
}
.boxf2 {
height: 120rpx;
overflow: hidden;
box-sizing: border-box;
border-radius: 6px;
padding: 2px 12px 2px 12px;
// padding: 8px;
// background-image: url('~@/static/images/homeOrderCard/jyz.png');
background: rgba(218, 218, 218, 0.2);
background-size: cover;
background-position: center;
display: flex;
flex-direction: column;
justify-content: center;
}
.boxf3 {
height: 140rpx;
overflow: hidden;
box-sizing: border-box;
border-radius: 6px;
padding: 12px;
// background-image: url('~@/static/images/homeOrderCard/ywc.png');
background: rgba(218, 218, 218, 0.2);
background-size: cover;
background-position: center;
display: flex;
flex-direction: column;
justify-content: center;
}
.zi1 {
font-size: 24rpx;
color: #333;
display: flex;
align-items: center;
column-gap: 10rpx;
.zi1-icon {
width: 38rpx;
height: 38rpx;
}
}
.zi1_1 {
font-size: 24rpx;
color: #333;
display: flex;
align-items: center;
column-gap: 10rpx;
.zi1_1-icon {
width: 38rpx;
height: 38rpx;
}
}
.zi2 {
width: 100%;
font-size: 40rpx;
font-weight: bold;
color: #000;
}
.zi2_2 {
width: 100%;
font-size: 30rpx;
font-weight: bold;
color: #000;
}
.box-tap {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 25px;
}
.tap-left {
display: flex;
}
.tap-right {
display: flex;
align-items: center;
}
.zi3 {
font-size: 14px;
font-weight: 400;
color: #666666;
}
.left-img1 {
width: 65px;
height: 15px;
margin-right: 20px;
// smargin-bottom: 10px;
image {
width: 100%;
height: 100%;
}
}
.gang {
width: 60px;
height: 5px;
border-radius: 50px;
margin-top: 6px;
background: linear-gradient(87deg, #B6E1FF 0%, #339DFF 100%);
}
.tap-box {}
.boxt {
// height: 110px;
width: 100%;
background-color: white;
border-radius: 6px;
margin-top: 14px;
overflow: hidden;
display: flex;
box-sizing: border-box;
padding-bottom: 15px;
}
.boxt-left {
width: 100%;
height: 100%;
}
.left-lan {
width: 50px;
height: 25px;
display: flex;
justify-content: center;
align-items: center;
background-color: #207EFE;
font-size: 14px;
color: white;
border-radius: 0px 0px 6px 0px;
}
.text1 {
margin-left: 24px;
margin-top: 5px;
color: #333333;
font-size: 16px;
font-weight: bold;
color: #333333;
}
.lanzi {
font-weight: bold;
color: #4C98FF;
}
.text2 {
margin-left: 24px;
margin-top: 5px;
color: #333333;
font-size: 16px;
font-weight: 400;
color: #333333;
}
.boxt-right {
width: 50%;
height: 100%;
position: relative;
}
.zhtai {
position: absolute;
top: 10px;
right: 10px;
width: 60px;
height: 25px;
box-sizing: border-box;
background: #FFD7D7;
border-radius: 4px;
display: flex;
justify-content: center;
align-items: center;
color: #FF4C4C;
font-size: 14px;
}
.zhtait {
position: absolute;
top: 50px;
right: 10px;
width: 60px;
height: 25px;
box-sizing: border-box;
background: #d5e8ff;
border-radius: 4px;
display: flex;
justify-content: center;
align-items: center;
color: #53b5ff;
font-size: 14px;
}
.dianhua {
position: absolute;
bottom: -120px;
right: 10px;
display: flex;
font-size: 14px;
font-weight: 400;
color: #3289FF;
}
.dianhuad {
display: flex;
font-size: 14px;
font-weight: 400;
color: #ff1d3b;
}
.ticon {
width: 12px;
height: 13px;
margin-right: 5px;
image {
width: 100%;
height: 100%;
}
}
.yijian {
width: 100%;
overflow: hidden;
display: flex;
justify-content: space-between;
align-items: center;
border-radius: 10px;
height: 40px;
font-size: 16px;
background: #327DFB;
color: #fff;
margin-top: 30rpx;
}
.y-left {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
border-radius: 10px;
background: #327DFB;
}
.y-right {
width: 30%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
.kou {
position: fixed;
right: 5px;
bottom: 80px;
width: 60px;
height: 60px;
border-radius: 50%;
overflow: hidden;
z-index: 99;
image {
width: 100%;
height: 100%;
}
}
.box {
box-sizing: border-box;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
}
// .xz-box {
// height: 80px;
// width: 48%;
// display: flex;
// justify-content: center;
// align-items: center;
// font-size: 16px;
// font-weight: 400;
// color: #FFFFFF;
// background-size: cover;
// background-position: center;
// margin-top: 20px;
// }
.xz-box {
width: 330rpx;
height: 396rpx;
background: #FFFFFF;
box-shadow: 0rpx 4rpx 8rpx 0rpx rgba(0, 0, 0, 0.06);
border-radius: 16rpx;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
font-size: 16px;
font-weight: 400;
color: #FFFFFF;
margin-top: 36rpx;
transition: all ease 400ms;
overflow: hidden;
.checkedFlagIcon {
display: none;
}
&.checked {
box-sizing: border-box;
position: relative;
border: 2rpx solid #478AFA;
.checkedFlag {
background-color: #478AFA;
width: 120rpx;
height: 120rpx;
position: absolute;
right: -60rpx;
bottom: -60rpx;
transform: rotate(45deg);
z-index: 1;
}
.checkedFlagIcon {
display: inline-block;
position: absolute;
z-index: 2;
bottom: 0;
right: 0;
}
}
.xz-box-icon {
width: 130rpx;
height: 130rpx;
margin-bottom: 26rpx;
}
.box-wenzi {
font-size: 28rpx;
color: #000000;
}
}
#y1 {
background-image: url('../../static/tc.png');
}
#y2 {
background-image: url('../../static/sy.png');
}
#y3 {
background-image: url('../../static/dd.png');
}
#y4 {
background-image: url('../../static/ht.png');
}
#y5 {
background-image: url('../../static/kc.png');
}
.box_ {
width: 320px;
border-radius: 8px;
box-sizing: border-box;
padding: 15px;
background: white;
}
.title_ {
width: 100%;
text-align: center;
margin-bottom: 10px;
font-size: 17px;
font-weight: bold;
}
.size_ {
font-size: 16px;
color: #666;
margin: 5px 0px;
text-align: center;
}
.annaiu {
width: 100%;
height: 60px;
border-top: 1px solid #f3f3f3;
box-sizing: border-box;
padding-top: 10px;
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
color: #244ec6;
}
.user-info {
display: flex;
flex-direction: column;
.user-name {
font-size: 30rpx;
font-weight: bold;
color: #fff;
line-height: 1.2;
}
.user-position {
font-size: 24rpx;
color: rgba(255, 255, 255, 0.8);
line-height: 1.2;
}
}
/* .real-time {
font-size: 28rpx;
color: #fff;
background: rgba(255, 255, 255, 0.2);
padding: 8rpx 16rpx;
border-radius: 40rpx;
} */
.real-time {
display: flex;
align-items: center;
font-size: 26rpx;
color: #fff;
background: rgba(255, 255, 255, 0.2);
// background-color: #7d91ff;
// padding: 8rpx 0;
border-radius: 40rpx;
overflow: hidden;
}
.date-part {
padding: 14rpx 16rpx;
}
.time-part {
padding: 14rpx 20rpx 14rpx 12rpx;
background: #fff;
color: #327DFB;
border-radius: 0 40rpx 40rpx 0;
}
.tab-choose-class {
display: flex;
align-items: center;
justify-content: space-between;
padding: 4rpx 20rpx 16rpx 20rpx;
border-top: 1rpx solid #F5F5F5;
.tab-content {
font-size: 28rpx;
display: flex;
flex-direction: column;
align-items: center;
.tab-name-class {
display: flex;
align-items: center;
.icon-tab {
display: flex;
align-items: center;
justify-content: center;
width: 32rpx;
height: 32rpx;
image {
width: 100%;
height: 100%;
}
}
}
}
.tab-icon {
width: 66rpx;
height: 8rpx;
margin-top: 8rpx;
}
}
.eye-icon {
transform: scale(1.5);
padding: 10rpx;
color: #929292;
}
.blue-line {
width: 8rpx;
height: 32rpx;
background: #054DF3;
border-radius: 4rpx;
margin-right: 20rpx;
}
.bqing_ {
border-radius: 16rpx;
border: 3rpx solid #FFFFFF;
box-sizing: border-box;
color: #FFFFFF;
font-size: 24rpx;
padding: 3px 5px;
margin-top: 5px;
}
// 添加logo样式
.user-name-container {
display: flex;
align-items: center;
gap: 12rpx;
}
.logo-icon {
width: 120rpx;
height: 100rpx;
border-radius: 20%;
margin-right: 20rpx;
}
// 悬浮刷新按钮
.floating-refresh-btn {
position: fixed;
right: 30rpx;
bottom: 180rpx; // 位于底部导航栏上方
width: 100rpx;
height: 100rpx;
background-color: rgba(50, 125, 251, 0.7); // 半透明蓝色
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
// box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.2);
z-index: 999;
transition: transform 0.3s, background-color 0.3s;
// 点击效果
&:active {
background-color: rgba(50, 125, 251, 0.9);
transform: scale(0.95);
}
// 旋转动画
&.rotating {
animation: rotate 1s linear infinite;
}
}
// 旋转动画关键帧
@keyframes rotate {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.loading-container {
/* position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(255, 255, 255, 0.9); */
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
z-index: 9999;
}
.loading-spinner {
position: relative;
width: 60px;
height: 60px;
border: 4px solid #f3f3f3;
border-top: 4px solid #327DFB;
border-radius: 50%;
animation: spin 1s linear infinite;
margin-bottom: 15px;
display: flex;
justify-content: center;
align-items: center;
}
.loading-text {
font-size: 16px;
color: #666;
}
.loading-icon {
width: 35px;
height: 35px;
position: absolute;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
</style>