提交代码

This commit is contained in:
guanj
2026-04-24 09:13:17 +08:00
parent 747d3139cf
commit ce78b65875
32 changed files with 2470 additions and 1142 deletions

View File

@@ -35,12 +35,12 @@
</picker>
<picker
@change="runStatusChange"
@cancel="select.runStatusSelect = false"
:value="select.runStatusIndex"
:range="projectType"
range-key="text"
>
<view class="nav-menu" @click="select.runStatusSelect = true">
<view class="nav-menu" >
{{
select.runStatusName
? select.runStatusName.length > 12

View File

@@ -142,7 +142,7 @@ export default {
data() {
return {
loading: true,
deviceInfo: {},
// 使用上面定义的图表配置项
option: {},
@@ -199,9 +199,9 @@ export default {
}
},
onLoad(options) {
this.device= JSON.parse(options.device)
this.device = JSON.parse(options.device)
this.lineKey = 0
this.lineList = this.device.lineList
this.lineList = this.device.lineList
this.lineId = this.lineList[0].lineId
this.userInfo = uni.getStorageSync(this.$cacheKey.userInfo)
this.echartsData0 = this.initEcharts0()
@@ -660,9 +660,8 @@ export default {
.then((res) => {
if (res.code == 'A0000') {
this.connection = true
setTimeout(() => {
this.$util.toast(e == 0 ? '连接成功!' : '刷新成功!')
}, 3000)
this.$util.toast(e == 0 ? '连接成功!' : '刷新成功!')
if (this.timer) {
clearInterval(this.timer)
this.timer = null
@@ -738,12 +737,13 @@ export default {
})
.on('message', (topic, message) => {
// console.log('接收推送信息:', JSON.parse(message.toString()), topic)
// console.log('🚀 ~ .on ~ topic:', topic)
if (!this.connection) return
// console.log('🚀 ~ .on ~ topic:', topic, this.userInfo.userIndex)
if (topic === `/Web/RealData/${this.userInfo.userIndex}`) {
if (topic == `/Web/RealData/${this.lineId}`) {
let list = JSON.parse(message.toString())
if (list.lineId == this.lineId) {
// if (list.userId == this.userInfo.userIndex) {
// console.log(list)
this.realTime = list.dataTime
let pt = list.pt || 0
@@ -859,7 +859,7 @@ export default {
// this.echartA1.setOption(this.echartsDataA1, true)
// this.echartA2.setOption(this.echartsDataA2, true)
// this.echartA3.setOption(this.echartsDataA3, true)
}
// }
}
})
},
@@ -967,7 +967,13 @@ export default {
} else if (e.text === '反馈') {
uni.navigateTo({ url: '/pages/device/feedback' })
} else if (e.text === '用户') {
uni.navigateTo({ url: '/pages/device/user?id=' + this.device.equipmentId + '&isPrimaryUser=' + this.device.isPrimaryUser })
uni.navigateTo({
url:
'/pages/device/user?id=' +
this.device.equipmentId +
'&isPrimaryUser=' +
this.device.isPrimaryUser,
})
}
// this.$refs.fab.close()
},

View File

@@ -26,8 +26,9 @@
></uni-search-bar>
<view class="message">
<uni-card
class="boxClick"
:title="item.name"
extra="🔍"
extra="🔍"
@click="jump(item)"
v-for="(item, index) in store.data"
:style="{ marginTop: index === 0 ? '0' : '' }"

View File

@@ -66,18 +66,7 @@ export default {
},
onShow() {
queryEngineering().then((res) => {
this.engineeringList = res.data.sort((a, b) => {
const nameA = a.name
const nameB = b.name
const isANumber = /^\d/.test(nameA)
const isBNumber = /^\d/.test(nameB)
if (isANumber !== isBNumber) {
return isANumber ? 1 : -1
}
return nameA.localeCompare(nameB, 'zh', { sensitivity: 'accent' })
})
this.engineeringList = this.sortByFirstLetter(res.data)
})
},
onNavigationBarButtonTap(e) {
@@ -93,6 +82,33 @@ export default {
}
},
methods: {
// 处理函数
sortByFirstLetter(data) {
// 1. 添加首字母字段
const withLetter = data.map((item) => {
let letter = '#'
const firstChar = item.name?.charAt(0) || ''
if (/[A-Za-z]/.test(firstChar)) {
letter = firstChar.toUpperCase()
} else if (/[0-9]/.test(firstChar)) {
letter = '#'
} else {
const py = pinyin(firstChar, { pattern: 'first', toneType: 'none' })
letter = py ? py.toUpperCase() : '#'
}
return { ...item, letter }
})
// 2. 排序
return withLetter.sort((a, b) => {
if (a.letter === '#') return 1
if (b.letter === '#') return -1
return a.letter.localeCompare(b.letter)
})
},
all() {
uni.setStorageSync('onceSelectEngineering', {
createBy: '',

View File

@@ -0,0 +1,144 @@
<template>
<Cn-page :loading="loading">
<view slot="body">
<view class="select-enineering">
<view class="all" @click="all">全部工程</view>
<uni-indexed-list
:style="{ top: showAll ? '110rpx' : '0' }"
:options="engineeringListFilter"
:showSelect="false"
@click="confirm"
>
</uni-indexed-list>
</view>
</view>
</Cn-page>
</template>
<script>
import { pinyin } from 'pinyin-pro'
import { queryEngineering } from '@/common/api/engineering'
export default {
props: {},
data() {
return {
loading: false,
engineeringList: [],
options: {},
showAll: true,
}
},
computed: {
engineeringListFilter() {
let result = []
this.engineeringList.forEach((item) => {
let arr = pinyin(item.name[0], { toneType: 'none', type: 'array' })
let letter = arr[0][0].toUpperCase()
// console.log(letter)
let index = result.findIndex((item) => item.letter === letter)
if (index === -1) {
result.push({
letter,
data: [item.name],
})
} else {
result[index].data.push(item.name)
}
})
return result
},
},
onLoad(options) {
this.options = options
this.showAll = this.options.showAll ? true : false
this.engineeringList = uni.getStorageSync('engineeringList')
this.userInfo = uni.getStorageSync(this.$cacheKey.userInfo)
if (!(this.userInfo.authorities === 'app_vip_user' || this.userInfo.authorities === 'engineering_user')) {
// 修改buttons
// #ifdef APP-PLUS
var webView = this.$mp.page.$getAppWebview()
// 修改buttons
webView.setTitleNViewButtonStyle(0, {
width: '0',
})
// #endif
}
},
onShow() {
queryEngineering().then((res) => {
this.engineeringList = res.data.sort((a, b) => {
const nameA = a.name
const nameB = b.name
const isANumber = /^\d/.test(nameA)
const isBNumber = /^\d/.test(nameB)
if (isANumber !== isBNumber) {
return isANumber ? 1 : -1
}
return nameA.localeCompare(nameB, 'zh', { sensitivity: 'accent' })
})
})
},
onNavigationBarButtonTap(e) {
if (this.userInfo.authorities === 'app_vip_user' || this.userInfo.authorities === 'engineering_user') {
uni.navigateTo({
url: `/pages/engineering/new`,
})
} else {
uni.showToast({
title: '暂无权限',
icon: 'none',
})
}
},
methods: {
all() {
uni.setStorageSync('onceSelectEngineering', {
createBy: '',
createTime: '',
updateBy: '',
updateTime: '',
id: '',
name: '',
userId: null,
province: '',
provinceName: '',
city: '',
cityName: '',
description: '',
status: '1',
})
uni.navigateBack()
},
confirm(e) {
console.log(e)
let engineering = this.engineeringList.find((item) => item.name === e.item.name)
if (this.options.from === 'once') {
// 创建项目的时候选择工程 用完即删
uni.setStorageSync('onceSelectEngineering', engineering)
} else {
uni.setStorageSync('engineering', engineering)
}
uni.navigateBack()
},
},
}
</script>
<style lang="scss">
.index {
padding: 34rpx;
}
.all {
padding-left: 30rpx;
display: flex;
align-items: center;
cursor: pointer;
height: 50px;
border-bottom-style: solid;
border-bottom-width: 1px;
border-bottom-color: #dedede;
background-color: #ffffff;
}
</style>

View File

@@ -66,7 +66,7 @@
<text>设备名称{{ item.equipmentName }}</text>
</view>
</view>
<view class="event-action">
<view class="event-action" @click="handleWrapperClick(item, !item.wavePath)">
<!-- 选择 -->
<checkbox-group @change="changeChild($event, item)"
><checkbox value="true" :disabled="!item.wavePath" :checked="item.checked" />
@@ -137,7 +137,7 @@ export default {
this.height = rect?.height + 170 || 0
// #endif
// #ifdef APP-PLUS
this.height = rect?.height + 100 || 0
this.height = rect?.height + 110 || 0
// #endif
})
.exec()
@@ -200,6 +200,14 @@ export default {
this.checkedAll = this.store.data.every((item) => item.checked === true)
this.checkedTotal = this.store.data.filter((item) => item.checked === true).length
},
handleWrapperClick(e, flag) {
if (flag) {
return uni.showToast({
title: '当前事件没有波形,不支持生成报告!',
icon: 'none',
})
}
},
// 点击卡片
clackCard() {},
// 切换排序
@@ -266,6 +274,7 @@ export default {
startTime: this.$util.getMonthFirstAndLastDay(this.selectValue.date).firstDay,
endTime: this.$util.getMonthFirstAndLastDay(this.selectValue.date).lastDay,
}).then((res) => {
this.checkedAll = false
this.store.reload()
uni.showToast({
icon: 'success',

View File

@@ -56,7 +56,7 @@
</view>
</view>
<view class="event-action" v-if="curSub == 0 ? monthFlag : item.endTime != thisMonth01">
<view class="iconText" @click="download(item)"
<view class="iconText boxClick" @click="download(item)"
><uni-icons type="arrow-down" color="#fff" size="16"></uni-icons>
</view>
</view>
@@ -130,7 +130,7 @@ export default {
this.height = rect?.height + 140 || 0
// #endif
// #ifdef APP-PLUS
this.height = rect?.height + 70 || 0
this.height = rect?.height + 75 || 0
// #endif
})
.exec()

View File

@@ -58,11 +58,11 @@
</view>
</view>
<view class="event-action">
<view class="iconText" v-if="item.isComplete == 1" @click="download(item)"
<view class="iconText boxClick" v-if="item.isComplete == 1" @click="download(item)"
><uni-icons type="arrow-down" color="#fff" size="16"></uni-icons>
</view>
<view
class="nav-menu nav-menu-btn"
class="nav-menu nav-menu-btn boxClick"
v-else-if="userInfo.authorities === 'operation_manager'"
@click="generate(item)"
>生成报告
@@ -86,10 +86,9 @@
</view>
<view class="device-body-item">
<text>报告状态</text>
<text
:style="{ color: item.isComplete == 1 ? '#10b981' : '#FF0000' }"
>{{ item.isComplete == 1 ? '已完成' : '未完成' }}</text
>
<text :style="{ color: item.isComplete == 1 ? '#10b981' : '#FF0000' }">{{
item.isComplete == 1 ? '已完成' : '未完成'
}}</text>
</view>
<!-- <view class="device-body-item">
@@ -174,13 +173,12 @@ export default {
this.store = this.DataSource('/cs-report-boot/csAppReport/getApplicationReport')
this.store.params.startTime = this.$util.getMonthFirstAndLastDay(this.selectValue.date).firstDay
this.store.params.endTime = this.$util.getMonthFirstAndLastDay(this.selectValue.date).lastDay
this.store.loadedCallback = () => {}
this.store.loadedCallback = () => {
this.setHeight()
}
this.store.reload()
},
async select(val) {
setTimeout(() => {
this.setHeight()
}, 200)
this.selectValue = val
await this.init()
},
@@ -382,4 +380,7 @@ export default {
margin-right: 24rpx;
height: 60rpx;
}
/deep/ .uni-scroll-view-refresher {
display: none;
}
</style>

View File

@@ -198,7 +198,7 @@ export default {
(uni.getStorageSync(this.$cacheKey.userInfo).authorities == 'operation_manager'
? this.devCount.alarmCount + this.devCount.runCount
: 0)
console.log('🚀 ~ messagePage:', messagePage)
// console.log('🚀 ~ messagePage:', messagePage)
let minePage = this.devCount.feedBackCount
if (messagePage) {

View File

@@ -14,7 +14,7 @@
>
<!-- 循环渲染事件项 -->
<uni-card
class="event-item"
class="event-item boxClick"
:class="item.type"
v-for="(item, index) in this.store.data"
:key="index"

View File

@@ -168,8 +168,8 @@ export default {
color: #007aff;
}
.jc-tag {
background-color: #3498db20;
color: #3498db;
background-color: #007aff20;
color: #007aff;
}
}
/deep/ .uni-collapse-item__title-box {

View File

@@ -24,8 +24,8 @@
class="movable-view"
direction="all"
:scale="true"
:scale-min="0.5"
:scale-max="3"
:scale-min="0.2"
:scale-max="0.5"
:scale-value="scaleValue"
@touchstart="onTouchStart"
@@ -76,7 +76,7 @@ export default {
return {
imageUrl: '',
// 缩放相关 - 默认0.5
scaleValue: 0.6,
scaleValue: 0.2,
x: 0,
y: 0,
// 图片原始尺寸
@@ -92,7 +92,7 @@ export default {
windowWidth: 0,
windowHeight: 0,
// 缩放步长
zoomStep: 0.2,
zoomStep: 0.1,
// 动画控制
isTouching: false,
animationTimer: null
@@ -160,14 +160,14 @@ export default {
// 放大
zoomIn() {
// 计算新的缩放值,不超过最大值
const newScale = Math.min(this.scaleValue + this.zoomStep, 3)
const newScale = Math.min(this.scaleValue + this.zoomStep, 0.5)
this.setScaleWithAnimation(newScale)
},
// 缩小
zoomOut() {
// 计算新的缩放值,不低于最小值
const newScale = Math.max(this.scaleValue - this.zoomStep, 0.5)
const newScale = Math.max(this.scaleValue - this.zoomStep, 0.2)
this.setScaleWithAnimation(newScale)
},

View File

@@ -18,7 +18,7 @@
.box:first-child {
flex: 1.7;
}
.boxClick {
.boxClick1 {
background-color: $uni-theme-color;
color: #ffffff;
}
@@ -120,7 +120,8 @@
padding: 0rpx 10rpx;
border-radius: 8rpx;
color: #ffffff;
height: 38rpx;
height: 34rpx;
line-height: 38rpx;
}
.sag-tag {
background-color: #2563eb20;

View File

@@ -3,41 +3,26 @@
<!-- 运行事件 -->
<!-- 卡片 -->
<scroll-view
scroll-y="true"
@refresherrefresh="refresherrefresh"
@scrolltolower="scrolltolower"
:refresher-triggered="triggered"
refresher-enabled="true"
class="event-list"
:style="{ height: 'calc(100vh - ' + (navHeight + 10) + 'px)', overflow: 'auto' }"
>
<scroll-view scroll-y="true" @refresherrefresh="refresherrefresh" @scrolltolower="scrolltolower"
:refresher-triggered="triggered" refresher-enabled="true" class="event-list"
:style="{ height: 'calc(100vh - ' + (navHeight + 10) + 'px)', overflow: 'auto' }">
<!-- 循环渲染事件项 -->
<uni-card
class="event-item"
:class="item.type"
v-for="(item, index) in store.data"
:key="index"
@click="jump(item)"
>
<uni-card class="event-item " :class="item.type" v-for="(item, index) in store.data" :key="index"
@click="jump(item)">
<!-- 头部图标 + 信息 + 操作 -->
<view class="event-header">
<view class="event-icon" :class="item.devType == 'Direct_Connected_Device' ? 'zl-bgc' : 'jc-bgc'">
<!-- 动态图标根据类型切换 -->
<!-- <uni-icons custom-prefix="iconfont" type="icon-shebei3" size="35" color="#376cf3"></uni-icons> -->
<Cn-icon-transient
:name="item.devType == 'Direct_Connected_Device' ? '治理设备' : '监测设备'"
/>
<Cn-icon-transient :name="item.devType == 'Direct_Connected_Device' ? '治理设备' : '监测设备'" />
<view class="badge1" v-if="item.status == 0"> </view>
</view>
<view class="event-info">
<view class="event-title">
<text class="event-id">{{ item.equipmentName }}</text>
<text
class="event-tag"
:class="item.devType == 'Direct_Connected_Device' ? 'zl-tag' : 'jc-tag'"
>{{ item.devType == 'Direct_Connected_Device' ? '治理设备' : '监测设备' }}</text
>
<text class="event-tag"
:class="item.devType == 'Direct_Connected_Device' ? 'zl-tag' : 'jc-tag'">{{ item.devType
== 'Direct_Connected_Device' ? '治理设备' : '监测设备' }}</text>
</view>
<view class="event-desc">
<text>工程名称{{ item.engineeringName }}</text>
@@ -51,10 +36,8 @@
<text> {{ item.showName }} </text>
</view>
</uni-card>
<uni-load-more
v-if="store.status == 'loading' || (store.data && store.data.length > 0)"
:status="store.status"
></uni-load-more>
<uni-load-more v-if="store.status == 'loading' || (store.data && store.data.length > 0)"
:status="store.status"></uni-load-more>
<Cn-empty v-else style="top: 20%"></Cn-empty>
</scroll-view>
</view>
@@ -80,7 +63,7 @@ export default {
triggered: true,
}
},
mounted() {},
mounted() { },
methods: {
// 查詢
@@ -142,6 +125,7 @@ export default {
<style lang="scss" scoped>
@import './index.scss';
/* 列表容器 */
.event-list {
margin-top: 20rpx;
@@ -152,18 +136,22 @@ export default {
.zl-bgc {
background-color: #376cf320;
}
.jc-bgc {
background-color: #376cf320;
}
.zl-tag {
background-color: #007aff20;
color: #007aff;
}
.jc-tag {
background-color: #3498db20;
color: #3498db;
background-color: #007aff20;
color: #007aff;
}
}
/deep/ .uni-scroll-view-refresher {
display: none;
}

View File

@@ -30,7 +30,7 @@
>
<!-- 循环渲染事件项 -->
<uni-card
class="event-item"
class="event-item boxClick"
:class="item.type"
v-for="(item, index) in store.data"
:key="index"
@@ -338,7 +338,7 @@ export default {
height: 39px;
border-radius: 50%;
z-index: 0;
background-color: #f43530;
background-color: #e6a23c;
}
/* 核心:选中圆圈下的 子元素(日期数字) */
/deep/ .uni-calendar-item__weeks-box-circle + .uni-calendar-item__weeks-box-text {

View File

@@ -4,8 +4,8 @@
<view class="transientBox">
<view class="statistics pd20">
<view
class="box"
:class="{ boxClick: filterValue == index }"
class="box boxClick"
:class="{ boxClick1: filterValue == index }"
v-for="(item, index) in dataList"
@click="
filterValue = index
@@ -53,7 +53,7 @@
>
<!-- 循环渲染事件项 -->
<uni-card
class="event-item"
class="event-item boxClick"
:class="judgment(item.showName).type"
v-for="(item, index) in store.data || []"
:key="index"
@@ -175,21 +175,23 @@ export default {
mounted() {
this.getConfig()
uni.createSelectorQuery()
.select('.transientBox')
.boundingClientRect((rect) => {
//
// #ifdef H5
this.height = rect?.height + 10 || 0
// #endif
// #ifdef APP-PLUS
this.height = rect?.height + 10 || 0
// #endif
})
.exec()
},
methods: {
getHeight() {
uni.createSelectorQuery()
.select('.transientBox')
.boundingClientRect((rect) => {
//
// #ifdef H5
this.height = rect?.height || 0
// #endif
// #ifdef APP-PLUS
this.height = rect?.height || 0
// #endif
})
.exec()
},
// 查詢
init() {
this.store = this.DataSource('/cs-harmonic-boot/eventUser/queryEventpage')
@@ -211,6 +213,7 @@ export default {
this.store.params.startTime = this.$util.getMonthFirstAndLastDay(this.selectValue.date).firstDay
this.store.params.endTime = this.$util.getMonthFirstAndLastDay(this.selectValue.date).lastDay
this.store.loadedCallback = () => {
this.getHeight()
this.loading = false
queryAppEventCounts(this.store.params).then((res) => {
this.dataList[0].value = res.data.allNum

View File

@@ -26,6 +26,7 @@
></uni-search-bar>
<view class="message">
<uni-card
class="boxClick"
:title="item.name"
@click="jump(item)"
extra="🔍"