最新版本医废小程序代码,包含医废收集、一键入库/出库、周转箱入库/出库

This commit is contained in:
2026-05-12 01:25:59 +08:00
commit 6c5847b2e8
70 changed files with 23577 additions and 0 deletions
+942
View File
@@ -0,0 +1,942 @@
<template name="basics">
<view>
<scroll-view scroll-y class="page">
<cu-custom bgColor="bg-blue"><block slot="content">数据概览</block></cu-custom>
<view class="content-area">
<!-- 医院名称显示区域 -->
<view class="section-header first-section">
<view class="header-icon">🏥</view>
<view class="header-title">{{hospital}}</view>
</view>
<!-- 今日/本周/本月收集数据 -->
<view class="collection-stats">
<!-- 今日收集 -->
<view class="stat-item">
<view class="stat-card stat-today" @click="buttonClickToday">
<view class="stat-label">今日收集</view>
<view class="stat-value">{{hospitalBasisInfo.today_collection || 0}}</view>
<view class="stat-unit">kg</view>
</view>
<view class="stat-card stat-today-bottom">
<view class="stat-count">{{hospitalBasisInfo.today_collection_count || 0}} </view>
<view class="stat-price">¥ {{hospitalBasisInfo.today_price || 0}} </view>
</view>
</view>
<!-- 本周收集 -->
<view class="stat-item">
<view class="stat-card stat-week" @click="buttonClickWeek">
<view class="stat-label">本周收集</view>
<view class="stat-value">{{hospitalBasisInfo.week_collection || 0}}</view>
<view class="stat-unit">kg</view>
</view>
<view class="stat-card stat-week-bottom">
<view class="stat-count">{{hospitalBasisInfo.week_collection_count || 0}} </view>
<view class="stat-price">¥ {{hospitalBasisInfo.week_price || 0}} </view>
</view>
</view>
<!-- 本月收集 -->
<view class="stat-item">
<view class="stat-card stat-month" @click="buttonClickMonth">
<view class="stat-label">本月收集</view>
<view class="stat-value">{{hospitalBasisInfo.month_collection || 0}}</view>
<view class="stat-unit">kg</view>
</view>
<view class="stat-card stat-month-bottom">
<view class="stat-count">{{hospitalBasisInfo.month_collection_count || 0}} </view>
<view class="stat-price">¥ {{hospitalBasisInfo.month_price || 0}} </view>
</view>
</view>
</view>
<view class="section-header">
<view class="header-icon">📉</view>
<view class="header-title">一周数据变化图</view>
</view>
<view class="qiun-charts">
<canvas canvas-id="canvasLineA" id="canvasLineA" disable-scroll=true class="charts" :width="cWidth*pixelRatio" :height="cHeight*pixelRatio" @touchstart="touchLineA"></canvas>
<image :src="imgSrc" style="width: 750upx;height: 500upx;"></image>
</view>
<!-- <canvas canvas-id="canvas1" class="canvas" disable-scroll="true"></canvas> -->
<view class="section-header">
<view class="header-icon">📦</view>
<view class="header-title">今日医废库存</view>
</view>
<!-- 今日入库/今日出库 -->
<view class="stock-stats">
<view class="stat-card stat-in" @click="goInList">
<view class="stat-icon">📥</view>
<view class="stat-value">{{stockBasisInfo.today_in_ware || 0}}</view>
<view class="stat-unit">kg</view>
<view class="stat-label">今日入库</view>
</view>
<view class="stat-card stat-out" @click="goOutList">
<view class="stat-icon">📤</view>
<view class="stat-value">{{stockBasisInfo.today_out_ware || 0}}</view>
<view class="stat-unit">kg</view>
<view class="stat-label">今日出库</view>
</view>
</view>
<view class="section-header">
<view class="header-icon">🏆</view>
<view class="header-title">今日科室排行</view>
</view>
<view class="qiun-charts" >
<canvas canvas-id="canvasColumn" id="canvasColumn" disable-scroll=true class="charts" @touchstart="touchColumn"></canvas>
<image :src="imgSrc2" style="width: 750upx;height: 500upx;"></image>
</view>
<!-- 预警信息模块 -->
<view class="section-header">
<view class="header-icon"></view>
<view class="header-title">预警信息</view>
</view>
<view class="warning-stats">
<view class="warning-card warning-today" @click="goWarnRecord">
<view class="warning-icon">🔔</view>
<view class="warning-value">{{warningInfo.today_warning || 0}}</view>
<view class="warning-label">今日预警数</view>
</view>
<view class="warning-card warning-history" @click="goWarnRecord">
<view class="warning-icon">📋</view>
<view class="warning-value">{{warningInfo.history_warning || 0}}</view>
<view class="warning-label">历史预警数</view>
</view>
<view class="warning-card warning-handled" @click="goWarnRecord">
<view class="warning-icon"></view>
<view class="warning-value">{{warningInfo.handled_warning || 0}}</view>
<view class="warning-label">已处理预警数</view>
</view>
</view>
<!-- 每日类型占比模块 -->
<view class="section-header">
<view class="header-icon">📊</view>
<view class="header-title">今日医废类型占比</view>
</view>
<view class="qiun-charts">
<canvas canvas-id="canvasPie" id="canvasPie" disable-scroll=true class="charts" @touchstart="touchPie"></canvas>
<image :src="imgSrc3" style="width: 750upx;height: 500upx;"></image>
</view>
<view class="cu-tabbar-height"></view>
</view>
</scroll-view>
</view>
</template>
<script>
import uCharts from '@/pages/component/u-charts.min.js';
import { isJSON } from '@/pages/component/checker.js';
var _self;
var canvaLineA=null;
var canvaColumn=null;
var canvaPie=null;
export default {
data() {
return {
cWidth:'',
cHeight:'',
pixelRatio:1,
textarea:'',
serverData: '',
hospital: '',
sortHospital: '',
department: '',
duty: '',
name: '',
openid: '',
phone: '',
hospitalBasisInfo: [],
stockBasisInfo: [],
warningInfo: [],
imgSrc: '',
imgSrc2: '',
imgSrc3: ''
}
},
mounted() {
_self = this;
//#ifdef MP-ALIPAY
uni.getSystemInfo({
success: function (res) {
if(res.pixelRatio>1){
//正常这里给2就行,如果pixelRatio=3性能会降低一点
//_self.pixelRatio =res.pixelRatio;
_self.pixelRatio =2;
}
}
});
//#endif
if(getApp().globalData.hospital == '' || getApp().globalData.hospital == undefined){
uni.reLaunch({
url: '/pages/register/login'
})
}
this.cWidth=uni.upx2px(750);
this.cHeight=uni.upx2px(500);
this.hospital = getApp().globalData.hospital;
this.sortHospital = getApp().globalData.sortHospital;
this.department = getApp().globalData.department;
this.duty = getApp().globalData.duty;
this.name = getApp().globalData.name;
this.phone = getApp().globalData.phone;
this.openid = getApp().globalData.openid;
this.getServerData();
this.getHospitalBasisInfo();
this.getStockBasisInfo();
this.getDepartmentRankList();
this.getWarningInfo();
this.getDailyTypeRatio();
},
methods: {
getServerData(){
let that = this;
uni.request({
url: 'https://lekapi.opmonitor.com/?c=app_api&a=getMedicalData7Days',
data:{
hospital: that.hospital,
sortHospital: that.sortHospital,
department: that.department,
duty: that.duty
},
header: {
'Content-type': 'application/json'
},
success: function(res) {
let LineA={categories:[],series:[]};
//这里我后台返回的是数组,所以用等于,如果您后台返回的是单条数据,需要push进去
LineA.categories=res.data.data.categories;
LineA.series=res.data.data.series;
//第二根线为虚线的设置
LineA.series[1].lineType='dash';
LineA.series[1].dashLength=10;
_self.textarea = JSON.stringify(res.data.data);
_self.showLineA("canvasLineA",LineA);
},
fail: () => {
_self.tips="网络错误,小程序端请检查合法域名";
},
});
},
showLineA(canvasId,chartData){
canvaLineA=new uCharts({
$this:_self,
canvasId: canvasId,
type: 'line',
colors:['#4a90e2', '#1abc9c', '#e67e22', '#9b59b6'],
fontSize:11,
padding:[15,15,0,15],
legend:{
show:true,
padding:5,
lineHeight:11,
margin:0,
itemSetState:true,
selectedMode:true,
},
dataLabel:true,
dataPointShape:true,
background:'#FFFFFF',
pixelRatio:_self.pixelRatio,
categories: chartData.categories,
series: chartData.series,
animation: true,
xAxis: {
type:'grid',
gridColor:'#E8F4F8',
gridType:'dash',
dashLength:8
},
yAxis: {
gridType:'dash',
gridColor:'#E8F4F8',
dashLength:8,
format:(val)=>{return val.toFixed(0)}
},
width: _self.cWidth*_self.pixelRatio,
height: _self.cHeight*_self.pixelRatio,
extra: {
line:{
type: 'curve',
width: 3
}
}
});
canvaLineA.addEventListener('renderComplete', () => {
setTimeout(function(){
uni.canvasToTempFilePath({
x: 0,
y: 0,
width: _self.cWidth*_self.pixelRatio,
height: _self.cHeight*_self.pixelRatio,
fileType: 'png',
canvasId: 'canvasLineA',
success: function(res) {
_self.imgSrc=res.tempFilePath;
},
fail:function(res){
console.info(res)
}
},_self);
},50);
})
},
touchLineA(e) {
canvaLineA.touchLegend(e);
canvaLineA.showToolTip(e, {
format: function (item, category) {
return category + ' ' + item.name + ':' + item.data
}
});
// 点击图例后重新生成图片以同步显示状态
setTimeout(function(){
uni.canvasToTempFilePath({
x: 0,
y: 0,
width: _self.cWidth*_self.pixelRatio,
height: _self.cHeight*_self.pixelRatio,
fileType: 'png',
canvasId: 'canvasLineA',
success: function(res) {
_self.imgSrc=res.tempFilePath;
},
fail:function(res){
console.info(res)
}
},_self);
},50);
},
// 获取医院的基本信息
getHospitalBasisInfo(){
let that = this;
uni.request({
url: 'https://lekapi.opmonitor.com/?c=app_api&a=getHospitalBasisInfo',
data: {hospital: that.hospital,sortHospital: that.sortHospital,department: that.department,duty: that.duty},
header: {
'Content-type': 'application/json'
},
success: function(res){
that.hospitalBasisInfo = res.data.data;
},
fail: () => {
console.info('小程序域名不正确,请检查域名的正确性')
}
})
},
// 获取库存的基本信息
getStockBasisInfo(){
let that = this;
uni.request({
url: 'https://lekapi.opmonitor.com/?c=app_api&a=getStockBasisInfo',
data: {hospital: that.hospital, sortHospital: that.sortHospital, department: that.department, duty: that.duty},
header: {
'Content-type': 'application/json'
},
success: function(res){
that.stockBasisInfo = res.data.data
},
fail: () => {
console.info('小程序域名不正确,请检查域名的正确性')
}
})
},
// 排行榜uCharts
getDepartmentRankList(){
let that = this;
uni.request({
url: "https://lekapi.opmonitor.com/?c=app_api&a=getDepartmentRankList",
data:{
hospital: that.hospital,
sortHospital: that.sortHospital,
department: that.department,
duty: that.duty
},
success: function(res) {
//下面这个根据需要保存后台数据,我是为了模拟更新柱状图,所以存下来了
_self.serverData=res.data.data;
let Column={categories:[],series:[]};
//这里我后台返回的是数组,所以用等于,如果您后台返回的是单条数据,需要push进去
Column.categories=res.data.data.categories;
Column.series=res.data.data.series;
_self.showColumn("canvasColumn",Column);
},
fail: () => {
_self.tips="网络错误,小程序端请检查合法域名";
}
})
},
showColumn(canvasId,chartData){
canvaColumn=new uCharts({
$this:_self,
canvasId: canvasId,
type: 'column',
legend:true,
fontSize:11,
background:'#FFFFFF',
pixelRatio:_self.pixelRatio,
animation: true,
categories: chartData.categories,
series: chartData.series,
xAxis: {
disableGrid:true,
},
yAxis: {
gridColor:'#E8F4F8',
gridType:'dash',
dashLength:8,
splitLine: {
show: true
},
format:(val)=>{return val.toFixed(0)}
},
dataLabel: true,
width: _self.cWidth*_self.pixelRatio,
height: _self.cHeight*_self.pixelRatio,
extra: {
column: {
type:'group',
width: _self.cWidth*_self.pixelRatio*0.5/chartData.categories.length,
linearType:'custom',
linearOpacity:0.8,
customColor:[['#4a90e2', '#357abd']]
}
}
});
canvaColumn.addEventListener('renderComplete', () => {
setTimeout(function(){
uni.canvasToTempFilePath({
x: 0,
y: 0,
width: _self.cWidth*_self.pixelRatio,
height: _self.cHeight*_self.pixelRatio,
fileType: 'png',
canvasId: 'canvasColumn',
success: function(res) {
_self.imgSrc2=res.tempFilePath;
},
fail:function(res){
console.info(res)
}
},_self);
},50);
})
},
touchColumn(e){
canvaColumn.showToolTip(e, {
format: function (item, category) {
if(typeof item.data === 'object'){
return category + ' ' + item.name + ':' + item.data.value
}else{
return category + ' ' + item.name + ':' + item.data
}
}
});
},
buttonClickToday(){
uni.navigateTo({
url: "/pages/main/inventory"
})
},
buttonClickWeek(){
uni.navigateTo({
url: "/pages/main/inventory"
})
},
buttonClickMonth(){
uni.navigateTo({
url: "/pages/main/inventory"
})
},
// 获取预警信息
getWarningInfo(){
let that = this;
uni.request({
url: 'https://lekapi.opmonitor.com/?c=app_api&a=getWarningInfo',
data: {hospital: that.hospital, sortHospital: that.sortHospital, department: that.department, duty: that.duty},
header: {
'Content-type': 'application/json'
},
success: function(res){
that.warningInfo = res.data.data || {}
},
fail: () => {
console.info('获取预警信息失败')
}
})
},
// 跳转到预警记录页面
goWarnRecord(){
uni.navigateTo({
url: '/pages/plugin/warnRecord'
})
},
// 跳转到入库列表页面
goInList(){
uni.navigateTo({
url: '/pages/plugin/inList'
})
},
// 跳转到出库列表页面
goOutList(){
uni.navigateTo({
url: '/pages/plugin/outList'
})
},
// 获取每日类型占比
getDailyTypeRatio(){
let that = this;
uni.request({
url: 'https://lekapi.opmonitor.com/?c=app_api&a=getDailyTypeRatio',
data: {hospital: that.hospital, sortHospital: that.sortHospital, department: that.department, duty: that.duty},
header: {
'Content-type': 'application/json'
},
success: function(res) {
let Pie={series:[]};
Pie.series=res.data.data.series;
_self.showPie("canvasPie",Pie);
},
fail: () => {
_self.tips="网络错误,小程序端请检查合法域名";
}
})
},
showPie(canvasId,chartData){
canvaPie=new uCharts({
$this:_self,
canvasId: canvasId,
type: 'pie',
colors:['#4a90e2', '#1abc9c', '#e67e22', '#9b59b6', '#e74c3c'],
fontSize:11,
padding:[15,15,0,15],
legend:{
show:true,
padding:5,
lineHeight:11,
margin:0,
position:'bottom',
float:'center'
},
dataLabel:true,
background:'#FFFFFF',
pixelRatio:_self.pixelRatio,
series: chartData.series,
animation: true,
width: _self.cWidth*_self.pixelRatio,
height: _self.cHeight*_self.pixelRatio,
extra: {
pie:{
activeOpacity: 0.5,
activeRadius: 10,
offsetAngle: 0,
labelWidth: 15,
ringWidth: 0,
border: true,
borderWidth: 2,
borderColor: '#FFFFFF'
}
}
});
canvaPie.addEventListener('renderComplete', () => {
setTimeout(function(){
uni.canvasToTempFilePath({
x: 0,
y: 0,
width: _self.cWidth*_self.pixelRatio,
height: _self.cHeight*_self.pixelRatio,
fileType: 'png',
canvasId: 'canvasPie',
success: function(res) {
_self.imgSrc3=res.tempFilePath;
},
fail:function(res){
console.info(res)
}
},_self);
},50);
})
},
touchPie(e) {
canvaPie.showToolTip(e, {
format: function (item, category) {
return item.name + ':' + item.data + 'kg'
}
});
}
}
}
</script>
<style>
.page {
background: #f5f5f5;
}
.content-area {
background: #f5f5f5;
}
.first-section {
margin-top: 10rpx;
}
/* 医院名称横幅 */
.hospital-name-banner {
display: flex;
align-items: center;
justify-content: center;
margin: 20rpx 20rpx 10rpx 20rpx;
padding: 24rpx 30rpx;
background: linear-gradient(135deg, #00bcd4 0%, #0097a7 100%);
border-radius: 16rpx;
box-shadow: 0 6rpx 24rpx rgba(0, 188, 212, 0.35);
}
.hospital-name {
font-size: 32rpx;
font-weight: 700;
color: #fff;
text-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.2);
}
/* 区块标题样式 */
.section-header {
display: flex;
align-items: center;
margin: 30rpx 20rpx 20rpx 20rpx;
padding: 24rpx 30rpx;
background: linear-gradient(135deg, #4a90e2 0%, #357abd 100%);
border-radius: 20rpx;
box-shadow: 0 6rpx 24rpx rgba(74, 144, 226, 0.3);
position: relative;
overflow: hidden;
}
.section-header::before {
content: '';
position: absolute;
top: -50%;
right: -20%;
width: 200rpx;
height: 200rpx;
background: radial-gradient(circle, rgba(255,255,255,0.15) 0%, transparent 70%);
border-radius: 50%;
}
.header-icon {
font-size: 44rpx;
margin-right: 20rpx;
filter: drop-shadow(0 2rpx 8rpx rgba(0, 0, 0, 0.15));
position: relative;
z-index: 1;
}
.header-title {
font-size: 32rpx;
font-weight: 700;
color: #fff;
text-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.2);
position: relative;
z-index: 1;
letter-spacing: 2rpx;
}
.section-title {
margin-top: 20rpx;
}
.box {
margin: 20upx 0;
}
.box view.cu-bar {
margin-top: 20upx;
}
.text-custom {
font-weight: 600;
font-size: 30rpx;
}
.qiun-charts {
margin: 20upx;
width: 750upx;
height: 500upx;
background-color: #FFFFFF;
}
.charts {
width: 750upx;
height: 500upx;
background-color: #FFFFFF;
}
canvas{
position: absolute;
width: 100%;
right: -900px;
top: -600px;
}
/* 统计数据容器 - 今日/本周/本月收集 */
.collection-stats {
display: flex;
justify-content: space-between;
padding: 20rpx 20rpx;
margin: 20rpx;
flex: 1;
}
/* 每个统计项容器(上下两个框) */
.stat-item {
display: flex;
flex-direction: column;
align-items: center;
flex: 1;
margin: 0 6rpx;
}
/* 收集统计卡片样式(上下两个框) */
.collection-stats .stat-card {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 12rpx 10rpx;
border-radius: 16rpx;
width: 100%;
min-height: 70rpx;
margin: 4rpx 0;
position: relative;
overflow: hidden;
transition: all 0.3s ease;
}
/* 收集卡片内的标签样式 */
.collection-stats .stat-label {
font-size: 28rpx;
color: #fff;
font-weight: 700;
margin-bottom: 6rpx;
}
/* 收集卡片内的数值样式 */
.collection-stats .stat-value {
font-size: 42rpx;
font-weight: 800;
color: #fff;
margin-bottom: 2rpx;
text-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.2);
}
/* 收集卡片内的单位样式 */
.collection-stats .stat-unit {
font-size: 20rpx;
color: rgba(255, 255, 255, 0.8);
font-weight: 500;
}
/* 今日医废库存容器 */
.stock-stats {
display: flex;
justify-content: center;
gap: 40rpx;
padding: 30rpx 20rpx;
margin: 20rpx;
background: rgba(255, 255, 255, 0.95);
border-radius: 24rpx;
box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.12);
backdrop-filter: blur(10rpx);
border: 1px solid rgba(255, 255, 255, 0.6);
}
/* 统计卡片 - 今日入库/出库使用 */
.stock-stats .stat-card {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 24rpx 20rpx;
border-radius: 20rpx;
width: 200rpx;
position: relative;
overflow: hidden;
transition: all 0.3s ease;
}
.stat-card::before {
content: '';
position: absolute;
top: -50%;
right: -50%;
width: 100%;
height: 100%;
background: radial-gradient(circle, rgba(255,255,255,0.2) 0%, transparent 70%);
border-radius: 50%;
}
.stat-icon {
font-size: 44rpx;
margin-bottom: 8rpx;
filter: drop-shadow(0 2rpx 8rpx rgba(0, 0, 0, 0.15));
}
.stat-value {
font-size: 48rpx;
font-weight: 800;
color: #fff;
margin-bottom: 4rpx;
text-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.2);
}
.stat-unit {
font-size: 22rpx;
color: rgba(255, 255, 255, 0.8);
font-weight: 500;
margin-bottom: 2rpx;
}
.stat-count {
font-size: 40rpx;
color: #fff;
font-weight: 700;
margin-bottom: 4rpx;
text-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.2);
}
.stat-label {
font-size: 24rpx;
color: rgba(255, 255, 255, 0.85);
font-weight: 500;
}
.stat-price {
font-size: 40rpx;
color: rgba(255, 255, 255, 0.9);
font-weight: 600;
margin-bottom: 4rpx;
}
/* 今日收集卡片 - 蓝色 */
.stat-today {
background: linear-gradient(135deg, #4a90e2 0%, #357abd 100%);
box-shadow: 0 6rpx 24rpx rgba(74, 144, 226, 0.35);
}
/* 今日收集底部卡片 */
.stat-today-bottom {
background: linear-gradient(135deg, #4a90e2 0%, #357abd 100%);
box-shadow: 0 6rpx 24rpx rgba(74, 144, 226, 0.35);
}
/* 本周收集卡片 - 青色 */
.stat-week {
background: linear-gradient(135deg, #1abc9c 0%, #16a085 100%);
box-shadow: 0 6rpx 24rpx rgba(26, 188, 156, 0.35);
}
/* 本周收集底部卡片 */
.stat-week-bottom {
background: linear-gradient(135deg, #1abc9c 0%, #16a085 100%);
box-shadow: 0 6rpx 24rpx rgba(26, 188, 156, 0.35);
}
/* 本月收集卡片 - 紫色 */
.stat-month {
background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%);
box-shadow: 0 6rpx 24rpx rgba(155, 89, 182, 0.35);
}
/* 本月收集底部卡片 */
.stat-month-bottom {
background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%);
box-shadow: 0 6rpx 24rpx rgba(155, 89, 182, 0.35);
}
/* 今日入库卡片 - 橙色 */
.stat-in {
background: linear-gradient(135deg, #e67e22 0%, #d35400 100%);
box-shadow: 0 6rpx 24rpx rgba(230, 126, 34, 0.35);
}
/* 今日出库卡片 - 红色 */
.stat-out {
background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%);
box-shadow: 0 6rpx 24rpx rgba(231, 76, 60, 0.35);
}
/* 预警统计容器 */
.warning-stats {
display: flex;
justify-content: space-around;
padding: 30rpx 20rpx;
margin: 20rpx;
background: rgba(255, 255, 255, 0.95);
border-radius: 24rpx;
box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.12);
backdrop-filter: blur(10rpx);
border: 1px solid rgba(255, 255, 255, 0.6);
}
/* 预警卡片 */
.warning-card {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 20rpx 16rpx;
border-radius: 20rpx;
width: 180rpx;
position: relative;
overflow: hidden;
transition: all 0.3s ease;
}
.warning-card::before {
content: '';
position: absolute;
top: -50%;
right: -50%;
width: 100%;
height: 100%;
background: radial-gradient(circle, rgba(255,255,255,0.2) 0%, transparent 70%);
border-radius: 50%;
}
.warning-icon {
font-size: 40rpx;
margin-bottom: 8rpx;
filter: drop-shadow(0 2rpx 8rpx rgba(0, 0, 0, 0.15));
}
.warning-value {
font-size: 44rpx;
font-weight: 800;
color: #fff;
margin-bottom: 4rpx;
text-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.2);
}
.warning-label {
font-size: 22rpx;
color: rgba(255, 255, 255, 0.85);
font-weight: 500;
}
/* 今日预警 - 黄色 */
.warning-today {
background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%);
box-shadow: 0 6rpx 24rpx rgba(243, 156, 18, 0.35);
}
/* 历史预警 - 橙色 */
.warning-history {
background: linear-gradient(135deg, #e67e22 0%, #d35400 100%);
box-shadow: 0 6rpx 24rpx rgba(230, 126, 34, 0.35);
}
/* 已处理预警 - 绿色 */
.warning-handled {
background: linear-gradient(135deg, #27ae60 0%, #1e8449 100%);
box-shadow: 0 6rpx 24rpx rgba(39, 174, 96, 0.35);
}
</style>