完善日报数据,添加日期范围选择组件

This commit is contained in:
廖德云 2025-03-09 02:06:02 +08:00
parent 680b26c6c1
commit 410e744851
7 changed files with 811 additions and 1085 deletions

View File

@ -176,6 +176,15 @@
// "navigationBarTextStyle": "white"
}
},
{
"path": "pages/views/shengchan/ribaoshuju/rbsjLsxq",
"style": {
// "navigationStyle": "custom"
"navigationBarTitleText": "历史详情",
"enablePullDownRefresh": false,
"navigationBarTextStyle": "white"
}
},
{
"path": "pages/userlist/index",
"style": {

View File

@ -1,444 +0,0 @@
<template>
<view :class="{ gray: store.isgray == 1 }">
<view class="wrapper f-col aic">
<view class="onduty">
<view class="title f-row aic jcb"><uni-title :title="strDate + ':生产数据'" type="h3" color="red" /></view>
<view class="info">
<!-- <uni-title :title="'天然气'" type="h3" color="blue" /> -->
<view v-for="(row, rowIndex) in groupedData" :key="rowIndex" class="data-row">
<uni-row>
<uni-col v-for="(item, colIndex) in row" :key="colIndex" :span="7">
<text style="color: black; font-size: 32; font-weight: bold">{{ item.gas }}</text>
<view class="value-group">
<text style="color: gray; font-size: 24">当日量:</text>
<text style="color: blue; font-size: 28; font-weight: bold">{{ item.dailyVolume }}</text>
<text style="color: gray; font-size: 24">年累计:</text>
<text style="color: blue; font-size: 28; font-weight: bold">{{ item.yearVolume }}</text>
</view>
</uni-col>
</uni-row>
</view>
</view>
</view>
</view>
</view>
</template>
<script setup>
import { ref, onMounted, computed, nextTick } from 'vue';
import { onLoad } from '@dcloudio/uni-app';
import { queryJinriShengchansj, queryYearShengchansj } from '@/api/shengchan.js';
import { formatDate, getDateAfterDays } from '@/utils/dateTime.js';
import { beforeJump } from '@/utils/index.js';
import { useStore } from '@/store';
const store = useStore();
import dataCom from '@/bpm/dataCom.vue';
const shishiArr = ref([
{
gas: '气井气',
dailyVolume: '',
yearVolume: ''
},
{
gas: '伴生气',
dailyVolume: '',
yearVolume: ''
},
{
gas: '外部气',
dailyVolume: '',
yearVolume: ''
},
{
gas: '站输差',
dailyVolume: '',
yearVolume: ''
},
{
gas: '线输差',
dailyVolume: '',
yearVolume: ''
},
{
gas: '综合输差',
dailyVolume: '',
yearVolume: ''
}
]);
onMounted(() => {
getJinriShengchansj();
getYearShengchansj();
});
const strDate = ref('');
const dataJinri = ref([]);
const dataJinriSum = ref([]);
const dataJinriSumUnit = ref([]);
//
const groupedData = computed(() => {
const groups = [];
for (let i = 0; i < shishiArr.value.length; i += 3) {
groups.push(shishiArr.value.slice(i, i + 3));
}
return groups;
});
const getJinriShengchansj = () => {
const now = new Date();
if (now.getHours() < 11) {
strDate.value = formatDate(getDateAfterDays(now, -1)).toString(); //11
} else {
strDate.value = formatDate(now).toString();
}
let queryParms = {};
dataJinri.value = [];
dataJinriSum.value = [];
dataJinriSumUnit.value = [];
queryParms.rqDate = strDate.value;
queryParms.pageSize = 100;
console.log(queryParms);
queryJinriShengchansj(queryParms).then((res) => {
if (res.success) {
console.log(res);
dataJinri.value = res.result.records;
dataJinriSumUnit.value = sumByUnit(dataJinri.value); //gas unit rq cq totalGas
console.log(dataJinriSumUnit.value);
// 使 nextTick DOM
nextTick();
getYearShengchansj(); //
}
});
};
const getYearShengchansj = () => {
const now = new Date();
let year = formatDate(now).split('-')[0];
let queryParms = {};
queryParms.yearStart = year;
queryParms.yearEnd = year;
// console.log(2, queryParms.value);
queryYearShengchansj(queryParms).then((res) => {
if (res.success) {
try {
// console.log(res.result);
let yearData = res.result[year];
console.log(dataJinriSumUnit.value.length, dataJinriSumUnit.value, yearData.length, yearData);
dataJinriSumUnit.value.forEach((item) => {
yearData.forEach((itemYear) => {
// console.log(item, itemYear);
if (item.unit === itemYear.unit) {
item.yearVolume = itemYear.yearSum || 0;
}
});
});
dataJinriSum.value = sumByGas(dataJinriSumUnit.value);
console.log(dataJinriSum.value);
shishiArr.value.forEach((item) => {
dataJinriSum.value.forEach((itemjinri) => {
if (item.gas === itemjinri.gas) {
// if (item.gas.includes('线')) {
// item.dailyVolume = itemjinri.totalGas.toFixed(4);
// } else {
item.dailyVolume = itemjinri.rq.toFixed(4);
item.yearVolume = itemjinri.yearVolume.toFixed(4);
// }
}
});
});
} catch (error) {
console.log(error);
}
}
});
};
function sumByGas(records) {
console.log(records);
const summaryMap = {};
try {
records.forEach((record) => {
const gas = record.gas;
if (!summaryMap[gas]) {
// gas
summaryMap[gas] = {
gas: gas,
rq: 0,
sq: 0,
totalGas: 0,
yearVolume: 0
};
}
// gas
summaryMap[gas].rq += record.rq || 0;
summaryMap[gas].sq += record.sq || 0;
summaryMap[gas].totalGas += record.totalGas || 0;
summaryMap[gas].yearVolume += record.yearVolume || 0;
});
return Object.values(summaryMap);
} catch (error) {
//TODO handle the exception
console.log(error);
}
}
function sumByUnit(records) {
console.log(records);
const summaryMap = {};
try {
records.forEach((record) => {
const unit = record.unit;
if (!summaryMap[unit]) {
// gas
summaryMap[unit] = {
unit: unit,
gas: record.gas,
rq: 0,
sq: 0,
totalGas: 0,
yearVolume: 0
};
}
// unit
summaryMap[unit].rq += record.rq || 0;
summaryMap[unit].sq += record.sq || 0;
summaryMap[unit].totalGas += record.totalGas || 0;
summaryMap[unit].yearVolume += record.yearVolume || 0;
});
return Object.values(summaryMap);
} catch (error) {
//TODO handle the exception
console.log(error);
}
}
</script>
<style lang="scss" scoped>
// .container {
// padding: 20rpx;
// background-color: #f8f8f8;
// min-height: 100vh;
// }
.content {
padding: 0 30rpx 20rpx 30rpx;
}
.card-content {
padding-right: 5px;
}
.data-row {
margin-bottom: 10rpx;
}
.value-group {
background-color: aliceblue;
display: flex;
flex-direction: column;
border-color: #ff00ff;
gap: 5px;
}
.uni-col {
margin-right: 10px;
background-color: #f8f8f8;
border-radius: 15rpx;
}
.wrapper {
padding: 0 30rpx;
// transform: translateY(-50rpx);
.onduty {
background: #ffffff;
box-shadow: 0rpx 2rpx 4rpx 0rpx rgba(0, 0, 0, 0.5);
border-radius: 16rpx;
padding: 20rpx 24rpx 24rpx 24rpx;
.title {
font-size: 32rpx;
color: #333333;
background-size: 44rpx 12rpx;
background-repeat: no-repeat;
background-position: left bottom;
}
.info {
background: #f8f8f8;
border-radius: 8rpx;
text-align: left;
width: 642rpx;
margin-top: 23rpx;
.info_title {
font-size: 24rpx;
color: #333333;
padding: 24rpx 0;
border-bottom: 1px solid #efefef;
view {
flex: 1;
}
}
.data_box {
font-size: 24rpx;
padding-bottom: 24rpx;
color: #888888;
.first {
font-weight: bold;
color: #333333;
}
.data {
margin-top: 23rpx;
view {
flex: 1;
}
}
}
}
}
.more {
font-size: 24rpx;
color: #999999;
text-align: right;
image {
width: 10rpx;
height: 18rpx;
}
}
.list_wrapper {
background: #ffffff;
box-shadow: 0rpx 2rpx 4rpx 0rpx rgba(0, 0, 0, 0.5);
border-radius: 16rpx;
padding: 26rpx 24rpx 24rpx 24rpx;
position: relative;
margin-top: 30rpx;
width: 642rpx;
&::after {
position: absolute;
top: 100rpx;
left: 0;
content: ' ';
width: 100%;
height: 1px;
background-color: #efefef;
}
.zhidu {
font-size: 24rpx;
color: #666666;
justify-content: flex-end;
padding-top: 40rpx;
view {
width: 120rpx;
height: 60rpx;
line-height: 60rpx;
text-align: center;
&:first-child {
margin-right: 40rpx;
}
}
.active {
position: relative;
color: #3179d6;
&::after {
content: ' ';
width: 120rpx;
height: 60rpx;
border-radius: 60rpx;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
position: absolute;
background-color: rgba(49, 121, 214, 0.1);
}
}
}
.list_title {
text-align: center;
padding-bottom: 29rpx;
font-size: 32rpx;
color: #666666;
.active {
position: relative;
color: #3179d6;
&::after {
content: ' ';
width: 120rpx;
height: 70rpx;
border-radius: 70rpx;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
position: absolute;
background-color: rgba(49, 121, 214, 0.1);
}
}
}
.list_box {
margin-top: 24rpx;
.list {
margin-bottom: 24rpx;
padding: 30rpx 30rpx 35rpx 30rpx;
// width: 570rpx;
background: #f8f8f8;
border-radius: 8rpx;
.topic {
font-size: 28rpx;
color: #333333;
}
.time_Box {
font-size: 24rpx;
color: #888888;
margin-top: 20rpx;
.time {
margin-right: 62rpx;
}
.look {
position: relative;
&::before {
position: absolute;
left: -30rpx;
top: 50%;
transform: translateY(-50%);
content: ' ';
width: 2rpx;
height: 20rpx;
background: #999999;
}
}
image {
width: 28rpx;
height: 22rpx;
margin-right: 8rpx;
}
}
}
}
}
}
</style>

View File

@ -1,35 +0,0 @@
<template>
<view>
<view class="nav">生产经营数据</view>
<view class="placeholder"></view>
<ng-data></ng-data>
</view>
</template>
<script setup>
const res = wx.getSystemInfoSync();
const statusHeight = res.statusBarHeight; //
const cusnavbarheight = statusHeight + 44 + 'px';
import ngData from './NatrueGas/index.vue';
</script>
<style lang="scss" scoped>
.nav {
width: calc(100% - 60rpx);
padding: 0 30rpx;
height: v-bind(cusnavbarheight);
font-size: 24rpx;
color: #ffffff;
position: fixed;
top: 0;
left: 0;
z-index: 99;
background-image: url('../../static/my/navbg.png');
background-repeat: no-repeat;
background-size: 750rpx 458rpx;
}
.placeholder {
height: v-bind(cusnavbarheight);
}
</style>

View File

@ -0,0 +1,50 @@
<template>
<view>
<cxc-szcx-dateRangeSelect v-model="dateRange"></cxc-szcx-dateRangeSelect>
</view>
</template>
<script setup>
import { ref, onMounted, computed, nextTick, watchEffect } from 'vue';
import { onLoad } from '@dcloudio/uni-app';
import { queryYearShengchansj } from '@/api/shengchan.js';
import { formatDate, getDateAfterDays, getDateAfterMonths } from '@/utils/dateTime.js';
const name = ref({});
const dateRange = ref([]);
const dataList = ref([]);
const endDate = ref('');
const startDate = ref('');
const getYearShengchansj = () => {
let queryParms = {};
dataList.value = [];
queryParms.yearStart = formatDate(dateRange[0]);
queryParms.yearEnd = formatDate(dateRange[1]);
// console.log(queryParms);
queryYearShengchansj(queryParms).then((res) => {
if (res.success) {
console.log(res);
dataList.value = res.result.records;
}
});
};
onMounted(() => {
const now = new Date();
if (now.getHours() < 11) {
endDate.value = getDateAfterDays(now, -1); //11
startDate.value = getDateAfterMonths(endDate.value, -1); //11
} else {
endDate.value = now;
startDate.value = getDateAfterMonths(endDate.value, -1); //11
}
dateRange.value = [startDate.value, endDate.value];
getYearShengchansj();
});
onLoad((options) => {
name.value = options.data;
});
</script>
<style></style>

View File

@ -1,6 +1,11 @@
<template>
<view :class="{ gray: store.isgray == 1 }">
<view style="margin-left: 20rpx;"> <uni-title :title="strDate + ':生产数据'" type="h1" color="red" />
<view style="margin-left: 20rpx"><uni-title :title="strDate + ':生产数据'" type="h1" color="red" /></view>
<view class="progress-bar">
<!-- 动态设置宽度和颜色 -->
<view class="progressTime" :style="{ width: `${timePercent}%`, 'background-color': '#00aaff' }"></view>
<!-- 显示带符号的百分比 -->
<text class="progress-text">全年时间进度:{{ timePercent }}%</text>
</view>
<view class="container">
<view v-for="(item, index) in shishiArr" :key="index" class="card-item" @click="handleCardClick(item.gas)">
@ -14,6 +19,12 @@
<text class="label">年累计</text>
<text class="value">{{ item.yearVolume || '-' }}</text>
</view>
<view class="progress-bar">
<!-- 动态设置宽度和颜色 -->
<view class="progress" :style="{ width: `${Math.abs(item.yearPerCent)}%`, 'background-color': item.yearPerCent < 0 ? '#ff4444' : '#007aff' }"></view>
<!-- 显示带符号的百分比 -->
<text v-if="!(item.yearPlan === '' || item.yearPlan === '0')" class="progress-text">{{ item.yearPerCent }}%</text>
</view>
</view>
</view>
</view>
@ -25,161 +36,155 @@
<uni-icons type="closeempty" size="24" color="#666" @click="closePopup"></uni-icons>
</view>
<scroll-view scroll-X="true" scroll-Y="true" class="table-container">
<view class="table">
<!-- 表头 -->
<view class="tr header">
<view class="th1">序号</view>
<view class="th">名称</view>
<view class="th">日气量</view>
<view class="th">总气量 </view>
<view class="th">年累计 </view>
<view class="th">年累计</view>
<view class="th1">操作</view>
</view>
<scroll-view scroll-X="true" scroll-Y="true" class="table-container">
<!-- 表格内容 -->
<view class="tr" v-for="(item, index) in filteredData" :key="index"
:class="{ even: index % 2 === 0 }">
<view class="td1">{{ index }}</view>
<view class="tr" v-for="(item, index) in filteredData" :key="index" :class="{ even: index % 2 === 0 }">
<view class="td1">{{ index + 1 }}</view>
<view class="td">{{ item.unit }}</view>
<view class="td" :class="{ negative: item.rq < 0 }">
{{ formatNumber(item.rq) }}
</view>
<view class="td">{{ formatNumber(item.totalGas) }}</view>
<view class="td" :class="{ negative: item.yearVolume < 0 }">
{{ formatNumber(item.yearVolume) }}
</view>
<view class="td1" style="color: red" @click="goHistory(item)">详情</view>
</view>
<!-- 空数据提示 -->
<view v-if="!filteredData.length" class="empty">
暂无相关数据
</view>
</view>
<view v-if="!filteredData.length" class="empty">暂无相关数据</view>
</scroll-view>
</view>
</view>
</uni-popup>
</view>
</template>
<script setup>
import {
ref,
onMounted,
computed,
nextTick,
watchEffect
} from 'vue';
import {
onLoad
} from '@dcloudio/uni-app';
import {
queryJinriShengchansj,
queryYearShengchansj
} from '@/api/shengchan.js';
import {
formatDate,
getDateAfterDays
} from '@/utils/dateTime.js';
import {
beforeJump
} from '@/utils/index.js';
import {
useStore
} from '@/store';
import { ref, onMounted, computed, nextTick, watchEffect } from 'vue';
import { onLoad } from '@dcloudio/uni-app';
import { queryJinriShengchansj, queryYearShengchansj } from '@/api/shengchan.js';
import { formatDate, getDateAfterDays } from '@/utils/dateTime.js';
import { beforeJump } from '@/utils/index.js';
import { useStore } from '@/store';
import { getYearProgress } from '@/utils/dateTime.js';
const store = useStore();
const store = useStore();
const shishiArr = ref([{
const shishiArr = ref([
{
gas: '气井气',
dailyVolume: '',
yearVolume: ''
yearVolume: '',
yearPlan: '7500',
yearPerCent: ''
},
{
gas: '伴生气',
dailyVolume: '',
yearVolume: ''
yearVolume: '',
yearPlan: '',
yearPerCent: ''
},
{
gas: '外部气',
dailyVolume: '',
yearVolume: ''
yearVolume: '',
yearPlan: '',
yearPerCent: ''
},
{
gas: '站输差',
dailyVolume: '',
yearVolume: ''
yearVolume: '',
yearPlan: '',
yearPerCent: ''
},
{
gas: '线输差',
dailyVolume: '',
yearVolume: ''
yearVolume: '',
yearPlan: '',
yearPerCent: ''
},
{
gas: '综合输差',
dailyVolume: '',
yearVolume: ''
yearVolume: '',
yearPlan: '100',
yearPerCent: ''
}
]);
]);
const dataJinri = ref([]);
const dataJinriSum = ref([]);
const dataJinriSumUnit = ref([]);
const selectedGas = ref('');
const filteredData = ref([]);
const popup = ref(null);
//
const handleCardClick = (gas) => {
const dataJinri = ref([]);
const dataJinriSum = ref([]);
const dataJinriSumUnit = ref([]);
const selectedGas = ref('');
const filteredData = ref([]);
const popup = ref(null);
const timePercent = ref(0);
//
const handleCardClick = (gas) => {
selectedGas.value = gas;
filteredData.value = dataJinriSumUnit.value.filter(item => item.gas === gas);
filteredData.value = dataJinriSumUnit.value.filter((item) => item.gas === gas);
popup.value.open();
};
};
//
const closePopup = () => {
//
const closePopup = () => {
popup.value.close();
};
onMounted(() => {
};
onMounted(() => {
getJinriShengchansj();
getYearShengchansj();
});
timePercent.value = getYearProgress();
});
const strDate = ref('');
//
const formatNumber = (num) => {
const strDate = ref('');
//
const formatNumber = (num) => {
if (typeof num !== 'number') return '-';
return num.toFixed(4).replace(/\.?0+$/, '');
};
};
//
const groupedData = computed(() => {
//
const groupedData = computed(() => {
const groups = [];
for (let i = 0; i < shishiArr.value.length; i += 3) {
groups.push(shishiArr.value.slice(i, i + 3));
}
return groups;
});
});
//
watchEffect(() => {
const station = shishiArr.value[3] //
const line = shishiArr.value[4] // 线
const composite = shishiArr.value[5] //
//
watchEffect(() => {
const station = shishiArr.value[3]; //
const line = shishiArr.value[4]; // 线
const composite = shishiArr.value[5]; //
//
const dailyStation = parseFloat(station.dailyVolume) || 0
const dailyLine = parseFloat(line.dailyVolume) || 0
composite.dailyVolume = (dailyStation + dailyLine).toFixed(4)
const dailyStation = parseFloat(station.dailyVolume) || 0;
const dailyLine = parseFloat(line.dailyVolume) || 0;
composite.dailyVolume = (dailyStation + dailyLine).toFixed(4);
//
const yearStation = parseFloat(station.yearVolume) || 0
const yearLine = parseFloat(line.yearVolume) || 0
composite.yearVolume = (yearStation + yearLine).toFixed(4)
})
const yearStation = parseFloat(station.yearVolume) || 0;
const yearLine = parseFloat(line.yearVolume) || 0;
composite.yearVolume = (yearStation + yearLine).toFixed(4);
composite.yearPerCent = calcPercent(composite.yearPlan, composite.yearVolume);
console.log(composite);
});
const getJinriShengchansj = () => {
const getJinriShengchansj = () => {
const now = new Date();
if (now.getHours() < 11) {
strDate.value = formatDate(getDateAfterDays(now, -1)).toString(); //11
@ -204,8 +209,8 @@
getYearShengchansj(); //
}
});
};
const getYearShengchansj = () => {
};
const getYearShengchansj = () => {
const now = new Date();
let year = formatDate(now).split('-')[0];
let queryParms = {};
@ -235,17 +240,37 @@
if (item.gas === itemjinri.gas) {
item.dailyVolume = itemjinri.rq.toFixed(4);
item.yearVolume = itemjinri.yearVolume.toFixed(4);
item.yearPerCent = calcPercent(item.yearPlan, item.yearVolume);
}
});
});
// console.log(shishiArr);
} catch (error) {
// console.log(error);
}
}
});
};
function sumByGas(records) {
};
function goHistory(val) {
uni.navigateTo({
url: '/pages/views/shengchan/ribaoshuju/rbsjLsxq?data=' + JSON.stringify(val)
});
}
function calcPercent(yearJihua, yearShiji) {
// 0
// 100
let plan = parseFloat(yearJihua === '' ? 0 : yearJihua);
let shiji = parseFloat(yearShiji);
let percent = 0;
//
if (plan > 0) {
percent = (shiji / plan) * 100;
percent = Math.min(percent, 100); // 100%
}
return parseFloat(percent.toFixed(4)); //
}
function sumByGas(records) {
// console.log(records);
const summaryMap = {};
try {
@ -272,9 +297,9 @@
//TODO handle the exception
// console.log(error);
}
}
}
function sumByUnit(records) {
function sumByUnit(records) {
// console.log(records);
const summaryMap = {};
try {
@ -305,23 +330,23 @@
//TODO handle the exception
// console.log(error);
}
}
}
</script>
<style lang="scss" scoped>
.container {
.container {
display: flex;
flex-wrap: wrap;
padding: 20rpx;
gap: 20rpx;
}
}
.popup-content {
.popup-content {
padding: 30rpx;
max-height: 70vh;
}
max-height: 40vh;
}
.popup-header {
.popup-header {
display: flex;
justify-content: space-between;
align-items: center;
@ -334,15 +359,15 @@
font-weight: 600;
color: #333;
}
}
}
.table-container {
.table-container {
width: 100%;
height: 30vh;
overflow: hidden;
}
}
.table {
.table {
min-width: 100%;
border: 2rpx solid #e8e8e8;
@ -365,10 +390,13 @@
flex: 1;
min-width: 80rpx;
padding: 10rpx;
font-size: 20rpx;
font-size: 22rpx;
font-weight: bold;
color: #333;
text-align: center;
white-space: nowrap;
height: 30rpx;
vertical-align: middle;
}
.th1,
@ -376,10 +404,13 @@
flex: 1;
max-width: 40rpx;
padding: 10rpx;
font-size: 20rpx;
font-size: 22rpx;
font-weight: bold;
color: #333;
text-align: center;
white-space: nowrap;
height: 30rpx;
vertical-align: middle;
}
.th {
@ -390,16 +421,16 @@
color: #ff4444;
font-weight: 500;
}
}
}
.empty {
.empty {
padding: 40rpx;
text-align: center;
color: #888;
font-size: 16rpx;
}
}
.card-item {
.card-item {
flex: 1 1 200rpx; // 300rpx selectedGas formatNumber
min-width: 240rpx;
max-width: calc(50% - 10rpx); //
@ -407,9 +438,9 @@
@media (min-width: 768px) {
max-width: calc(33.33% - 14rpx); // 3
}
}
}
.card {
.card {
background: #ffffff;
border-radius: 16rpx;
padding: 10rpx;
@ -444,5 +475,37 @@
font-weight: 500;
}
}
}
}
.progress-item {
margin-bottom: 20px;
}
.progress-bar {
position: relative;
height: 20px;
background: #f0f0f0;
border-radius: 10px;
overflow: hidden;
}
.progress {
height: 100%;
transition: all 0.3s;
}
.progressTime {
height: 100%;
transition: all 0.3s;
}
.progress-text {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
color: red; /* 保持红色 */
font-size: 12px;
font-weight: bold;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); /* 提升可读性 */
}
</style>

View File

@ -18,6 +18,19 @@
<text class="label">年累计</text>
<text class="value">{{ item.nl || '-' }}</text>
</view>
<view class="progress-bar">
<!-- 动态设置宽度和颜色 -->
<view
class="progress"
:style="{
width: `${Math.abs(item.yearPerCent)}%`,
'background-color': item.yearPerCent < 0 ? '#ff4444' : '#007aff'
}"
></view>
<!-- 显示带符号的百分比 -->
<text v-if="!(item.yearPlan === '' || item.yearPlan === '0')" class="progress-text">{{ item.yearPerCent }}%</text>
</view>
</view>
</view>
</view>
@ -36,13 +49,12 @@
<view class="th">序号</view>
<view class="th">名称</view>
<view class="th">日油量</view>
<view class="th">月累计 </view>
<view class="th">年累计 </view>
<view class="th">月累计</view>
<view class="th">年累计</view>
</view>
<!-- 表格内容 -->
<view class="tr" v-for="(item, index) in dataJinri" :key="index"
:class="{ even: index % 2 === 0 }">
<view class="tr" v-for="(item, index) in dataJinri" :key="index" :class="{ even: index % 2 === 0 }">
<view class="td">{{ index }}</view>
<view class="td">{{ item.dw }}</view>
<view class="td">
@ -55,83 +67,61 @@
</view>
<!-- 空数据提示 -->
<view v-if="!dataJinri.length" class="empty">
暂无相关数据
</view>
<view v-if="!dataJinri.length" class="empty">暂无相关数据</view>
</view>
</scroll-view>
</view>
</uni-popup>
</view>
</template>
<script setup>
import {
ref,
onMounted,
computed,
nextTick,
watchEffect
} from 'vue';
import {
onLoad
} from '@dcloudio/uni-app';
import {
queryJinriYuanyouShengchansj
} from '@/api/shengchan.js';
import {
formatDate,
getDateAfterDays
} from '@/utils/dateTime.js';
import {
beforeJump
} from '@/utils/index.js';
import {
useStore
} from '@/store';
import { ref, onMounted, computed, nextTick, watchEffect } from 'vue';
import { onLoad } from '@dcloudio/uni-app';
import { queryJinriYuanyouShengchansj } from '@/api/shengchan.js';
import { formatDate, getDateAfterDays } from '@/utils/dateTime.js';
import { beforeJump } from '@/utils/index.js';
import { useStore } from '@/store';
const store = useStore();
import dataCom from '@/bpm/dataCom.vue';
const store = useStore();
import dataCom from '@/bpm/dataCom.vue';
const shishiArr = ref([{
const shishiArr = ref([
{
gas: '原油产量',
rcwy: '',
yl: '',
nl: ''
},
nl: '',
yearPlan: '1500',
yearPerCent: ''
}
]);
]);
const dataJinri = ref([]);
const dataJinriSum = ref([]);
const popup = ref(null);
//
const handleCardClick = () => {
const dataJinri = ref([]);
const dataJinriSum = ref([]);
const popup = ref(null);
//
const handleCardClick = () => {
popup.value.open();
};
};
//
const closePopup = () => {
//
const closePopup = () => {
popup.value.close();
};
onMounted(() => {
};
onMounted(() => {
getJinriYuanyouShengchansj();
// getYearShengchansj();
});
});
const strDate = ref('');
//
const formatNumber = (num) => {
const strDate = ref('');
//
const formatNumber = (num) => {
if (typeof num !== 'number') return '-';
return num.toFixed(4).replace(/\.?0+$/, '');
};
};
const getJinriYuanyouShengchansj = () => {
const getJinriYuanyouShengchansj = () => {
const now = new Date();
if (now.getHours() < 11) {
strDate.value = formatDate(getDateAfterDays(now, -1)).toString(); //11
@ -149,27 +139,34 @@
console.log(res);
dataJinri.value = res.result.records;
dataJinriSum.value = sumByOil(dataJinri.value); //gas unit rq cq totalGas
console.log(dataJinriSum.value);
// console.log(dataJinriSum.value);
nextTick();
shishiArr.value.forEach((item) => {
dataJinriSum.value.forEach((itemjinri) => {
item.rcwy = itemjinri.rcwy.toFixed(4);
item.nl = itemjinri.nl.toFixed(4);
item.yl = itemjinri.yl.toFixed(4);
item.yearPerCent = calcPercent(item.yearPlan, item.nl);
});
});
// getYearShengchansj(); //
}
});
};
function sumByOil(records) {
};
function calcPercent(yearJihua, yearShiji) {
// 0
// 100
let plan = parseFloat(yearJihua === '' ? 0 : yearJihua);
let shiji = parseFloat(yearShiji);
let percent = 0;
//
if (plan > 0) {
percent = (shiji / plan) * 100;
percent = Math.min(percent, 100); // 100%
}
return parseFloat(percent.toFixed(1)); //
}
function sumByOil(records) {
console.log(records);
const summaryMap = {};
try {
@ -186,30 +183,30 @@
// gas
summaryMap[gas].rcwy += record.rcwy || 0;
summaryMap[gas].yl += record.yl || 0;
summaryMap[gas].nl += record.nl || 0
summaryMap[gas].nl += record.nl || 0;
});
return Object.values(summaryMap);
} catch (error) {
//TODO handle the exception
console.log(error);
}
}
}
</script>
<style lang="scss" scoped>
.container {
.container {
display: flex;
flex-wrap: wrap;
padding: 20rpx;
gap: 20rpx;
}
}
.popup-content {
.popup-content {
padding: 30rpx;
max-height: 70vh;
}
}
.popup-header {
.popup-header {
display: flex;
justify-content: space-between;
align-items: center;
@ -222,15 +219,15 @@
font-weight: 600;
color: #333;
}
}
}
.table-container {
.table-container {
width: 100%;
height: 30vh;
overflow: hidden;
}
}
.table {
.table {
min-width: 100%;
border: 2rpx solid #e8e8e8;
@ -268,16 +265,16 @@
color: #ff4444;
font-weight: 500;
}
}
}
.empty {
.empty {
padding: 40rpx;
text-align: center;
color: #888;
font-size: 16rpx;
}
}
.card-item {
.card-item {
flex: 1 1 200rpx; // 300rpx selectedGas formatNumber
min-width: 200rpx;
max-width: calc(50% - 10rpx); //
@ -285,9 +282,9 @@
@media (min-width: 768px) {
max-width: calc(33.33% - 14rpx); // 3
}
}
}
.card {
.card {
background: #ffffff;
border-radius: 16rpx;
padding: 10rpx;
@ -322,5 +319,32 @@
font-weight: 500;
}
}
}
}
.progress-item {
margin-bottom: 20px;
}
.progress-bar {
position: relative;
height: 20px;
background: #f0f0f0;
border-radius: 10px;
overflow: hidden;
}
.progress {
height: 100%;
transition: all 0.3s;
}
.progress-text {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
color: red; /* 保持红色 */
font-size: 12px;
font-weight: bold;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); /* 提升可读性 */
}
</style>

View File

@ -52,8 +52,67 @@ function getDateAfterDays(date, days) {
return newDate;
}
function getDateAfterMonths(date, months) {
const newDate = new Date(date);
const originalDate = date.getDate();
// 保存原始年月日
const originalYear = date.getFullYear();
const originalMonth = date.getMonth();
// 计算目标年月
const totalMonths = originalMonth + months;
const expectedYear = originalYear + Math.floor(totalMonths / 12);
const expectedMonth = totalMonths % 12;
// 尝试设置新月份
newDate.setMonth(totalMonths);
// 处理月末边界情况
if (
newDate.getFullYear() !== expectedYear ||
newDate.getMonth() !== expectedMonth
) {
// 当设置月份失败时如1月31日设置到2月
// 设置为目标月份的最后一天
newDate.setFullYear(expectedYear, expectedMonth + 1, 0);
} else if (newDate.getDate() !== originalDate) {
// 当日期自动变化时如1月30日设置到2月
// 同样设置为目标月份的最后一天
newDate.setDate(0);
}
return newDate;
}
//计算当前日期占全年的进度数据
// 示例用法
// console.log(getYearProgress()); // 输出如 "35.42%"
function getYearProgress() {
const now = new Date(); // 当前时间
const year = now.getFullYear();
// 关键时间点
const yearStart = new Date(year, 0, 1); // 当年1月1日
const nextYearStart = new Date(year + 1, 0, 1); // 下一年1月1日
// 计算时间差(毫秒)
const totalMs = nextYearStart - yearStart; // 全年总时长
const passedMs = now - yearStart; // 已过时长
// 计算百分比保留2位小数
const progress = ((passedMs / totalMs) * 100).toFixed(2);
return parseFloat(progress);
}
export {
formatDate,
getDateAfterDays,
getDaysDifference
getDaysDifference,
getDateAfterMonths,
getYearProgress
}