2025-04-16 02:11:26 +01:00

456 lines
10 KiB
Vue

<template>
<view class="home">
<!-- 头部 -->
<view class="base">
<view class="title" @click="show=true">
<text>{{currentBase.baseName}}</text>
</view>
<view class="baseInfo">
<view class="item">
<view class="num">
{{baseInfo.areaCount}}
</view>
<view class="unit">
基地面积()
</view>
</view>
<view class="item">
<view class="num">
{{baseInfo.diCount+baseInfo.pengCount}}
</view>
<view class="unit">
地块数量()
</view>
</view>
</view>
<image class="bg" src="https://sancangshop.oss-cn-beijing.aliyuncs.com/frog/bg.png" mode=""></image>
</view>
<view class="content">
<!-- 菜单 -->
<view class="tabs" >
<view class="tab" v-for="(item,index) in fixMenus" :key="index" @click="jump(item)">
<image class="img" :src="item.menuPicture" mode=""></image>
<view class="label">
{{item.menuName}}
</view>
</view>
</view>
<u-divider></u-divider>
<!-- 幻灯 -->
<view class="swiper">
<u-swiper :list="swiperList" showTitle keyName="imgUrl" height="100" :circular="true" @change="e => current = e.current" @click="jumpToNewDetail">
<view slot="indicator" class="indicator">
<view class="indicator__dot" v-for="(item, index) in swiperList" :key="index"
:class="[index === current && 'indicator__dot--active']"></view>
</view>
</u-swiper>
</view>
<u-divider></u-divider>
<!-- 任务统计 -->
<view class="chart">
<view class="title">
<text class="font-weight-700 font-size-35">我的任务</text>
<view @click="jumpToTaskList" class="flex aic jcc font-color-2b7 font-size-26">
查看更多</view>
</view>
<qiun-data-charts type="ring" :opts="opts" :chartData="chartData"
:canvas2d="true" canvasId="CvlrbaEbAdVUhFMpyxLGWSdKKCpHGkMf"/>
</view>
</view>
<!-- 基地选择弹窗 -->
<u-picker :show="show" :columns="baseList" keyName="baseName" @cancel="show=false" @confirm="confirm"></u-picker>
</view>
</template>
<script>
//#ifdef APP-PLUS
import { round } from '../../uni_modules/uview-ui/libs/function/digit.js'
import { onLoad } from '../../uni_modules/uview-ui/libs/mixin/mixin.js';
import { appUpgrade} from '../../utils/upgrade.js'
//#endif
//#ifdef MP
import {mpUpgrade} from '../../utils/upgrade.js'
//#endif
import fixMenus from './menusConfig.js';
export default {
data() {
return {
//基地信息
baseInfo:{
areaCount:0,
diCount:0,
pengCount:0
},
fixMenus,
//当前选择的基地
currentBase:{baseName:''},
//基地选择控件
show:false,
//基地列表
baseList: [],
//菜单列表
list: [],
//农事任务图表值
chartData: {},
//图表配置项
opts: {
update:true,
rotate: false,
rotateLock: false,
color: [ "#dadada","#fc842d", "#ead900", "#2b7"],
padding: [5, 5, 5, 5],
dataLabel: true,
enableScroll: false,
legend: {
show: true,
position: "bottom",
lineHeight: 16
},
title: {
name: "0",
fontSize: 24,
color: "#666666"
},
subtitle: {
name: "完成进度",
fontSize: 10,
color: "#999999"
},
extra: {
ring: {
ringWidth: 10,
activeOpacity: 0.5,
activeRadius: 10,
offsetAngle: 0,
labelWidth: 15,
border: true,
borderWidth: 3,
borderColor: "#FFFFFF",
customRadius: "60"
}
}
},
//host
baseUrl:uni.$u.http.config.baseURL,
//幻灯列表
swiperList:[],
//幻灯当前值
current:0
}
},
onLoad() {
//监听登陆成功事件
uni.$on("login",(data)=>{
if(data.msg=="success"){
uni.hideLoading()
uni.showToast({
title: '登录成功',
duration: 1500,
icon:"none",
position:"bottom"
});
}
})
},
destroyed() {
//取消事件监听
uni.$off("login")
},
watch:{
currentBase:{
handler:async function(n){
if(n.deptId){
//获取基地详情
this.getBaseInfo();
//获取轮播新闻列表
this.getSwiperList();
//农事
this.loadChart();
}
},
deep:true
}
},
async onLoad() {
//升级
this.upgrade();
//获取基地列表
this.getBaseList();
},
async onPullDownRefresh() {
//获取基地详情
await this.getBaseInfo();
//获取轮播新闻列表
await this.getSwiperList();
//农事
await this.loadChart();
uni.stopPullDownRefresh();
},
methods: {
//升级
async upgrade() {
//#ifdef APP-PLUS
const {rows} = await uni.$u.http.get('/system/upgrade/mobile/list', {params: {isCurrent: 1}})
appUpgrade(rows[0])
//#endif
//#ifdef MP
mpUpgrade();
//#endif
},
//获取基地列表
async getBaseList(){
const {data} = await uni.$u.http.get('/agriculture/baseinfo/selectBaseinfoListByRoles');
this.baseList = [data];
//默认选择第一个
if(data.length>0) {
this.currentBase = data[0]
uni.setStorageSync('baseId',this.currentBase.deptId)
}
},
//基地选择确定
confirm(e){
this.currentBase = e.value[0];
uni.setStorageSync('baseId',this.currentBase.deptId)
this.show = false;
},
//获取基地详情
async getBaseInfo(){
const { rows } = await uni.$u.http.get("/agriculture/statistics/selectBaseInfo/"+this.currentBase.deptId);
if(rows.length>0){
this.baseInfo=rows[0];
}
},
//获取新闻轮播类标
async getSwiperList(){
const { rows} = await uni.$u.http.get("/iot/news/list",{params:{
isBanner: 1,
status: 1,
baseId:this.currentBase.deptId
}});
this.swiperList=rows.map(item=>{
return {
//图片转换
imgUrl:uni.$u.http.config.baseURL+item.imgUrl,
//新闻标题截取
title:item.title.length>16?item.title.slice(0,16)+"...":item.title,
//新闻ID
newsId:item.newsId
}
})
},
//跳转带新闻详情
jumpToNewDetail(index){
uni.$u.route({
url: 'pages/service/newsDetail',
params: {
id: this.swiperList[index].newsId
}
})
},
//农事任务统计 TODO:图表组建数据改变了没有重新加载
async loadChart(){
const {rows} = await uni.$u.http.get("/agriculture/statistics/selectTaskInfoOfMine");
let data=rows.map(item=>({name:item.name,value:item.value,status:item.status}));
//总任务数
let total = data.reduce((total,item)=>{
return total+item.value;
},0);
//已经完成任务数
let finsh = data.filter(item=>item.status=='3').reduce((total,item)=>{
return total+item.value;
},0);
//完成比例
let finishPercent = total==0?0+'%' : (finsh/total*100).toFixed(0)+'%';
let res = {
series: [{
data: data
}]
};
this.opts.title.name=String(finishPercent)
this.$nextTick(()=>{
this.chartData = JSON.parse(JSON.stringify(res));
})
},
//菜单跳转
jump(data) {
//数据采集按钮,跳转到所有的设备
uni.$u.route({
type: data.type,
url: data.pageUrl,
params:data.params
})
},
//跳转到任务详情
jumpToTaskList(){
uni.$u.route({
url: 'pages/farm/index',
})
// uni.$u.route({
// url: 'pages/farm/taskList',
// params: {
// //任务的状态值为0
// status:0,
// //任务的计划开始时间为当天
// planStart:this.$date.getDate(),
// //页面标题
// title:'待处理任务',
// jumpFrom:2
// }
// })
},
}
}
</script>
<style lang="scss" scoped>
.home {
.base {
background: #2b7;
height: 450rpx;
color: #fff;
padding: 80rpx 30rpx 80rpx 30rpx;
box-sizing: border-box;
display: flex;
align-items: flex-end;
margin-bottom: -40rpx;
position: relative;
z-index: 0;
.title{
font-weight: 600;
font-size: 45rpx;
color: #fff;
position: absolute;
top: 130rpx;
left: 30rpx;
}
.baseInfo {
width: 100%;
display: flex;
.item{
font-size: 25rpx;
margin-right: 20rpx;
.num{
font-size: 45rpx;
font-weight: bold;
margin-bottom: 20rpx;
}
.unit{
font-size:28rpx;
color: #fff;
font-weight: 600;
}
}
}
.bg{
position: absolute;
right: 30rpx;
top: 20%;
width: 350rpx;
height: 252rpx;
}
}
.content {
position: relative;
z-index: 0;
border-top-left-radius: 40rpx;
border-top-right-radius: 40rpx;
background: #fff;
padding: 40rpx;
box-sizing: border-box;
.tabs {
display: flex;
flex-wrap: wrap;
.tab {
width: 25%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
margin-bottom: 10rpx;
position: relative;
&::after {
display: block;
content: '';
width: 100%;
height: 100%;
position: absolute;
left: 0;
right: 0;
}
.iconfont {
color: #fff;
border-radius: 30rpx;
width: 90rpx;
height: 90rpx;
font-size: 76rpx;
margin-bottom: 16rpx;
display: flex;
justify-content: center;
align-items: center;
}
.img{
width: 130rpx;
height: 130rpx;
border-radius: 30rpx;
overflow: hidden;
margin-bottom: -20rpx;
}
.label {
font-size: 24rpx;
font-weight: 500;
text-align: center;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
width: 100%;
position: relative;
z-index: 0;
}
}
}
.swiper{
overflow: hidden;
position: relative;
.indicator{
position: absolute;
z-index: 0;
display: flex;
right: -330rpx;
top: -10rpx;
&__dot {
height: 8rpx;
width: 16rpx;
border-radius: 4rpx;
background-color: #fff;
margin: 0 4rpx;
transition: background-color 0.3s;
transition: width 0.3s;
&--active {
background-color: #69BB73;
width: 40rpx;
}
}
}
}
.chart {
height: 500rpx;
.title {
display: flex;
justify-content: space-between;
align-items: center;
}
}
}
}
</style>