Files
fishery-app/src/my/addController.vue
2026-01-12 18:48:03 +08:00

664 lines
20 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="controller_home">
<view class="body">
<nut-cell>
<nut-row>
<nut-col :span="24">
<nut-steps :current="current">
<nut-step title="第一步" />
<nut-step title="第二步" />
<nut-step title="第三步" />
<nut-step title="第四步" />
</nut-steps>
</nut-col>
</nut-row>
</nut-cell>
<nut-config-provider :theme-vars="themeVars1">
<nut-cell>
<nut-row v-if="current === 1">
<nut-col :span="24" class="font_36 f_weight c_222">
检查设备
</nut-col>
<nut-col :span="24" class="font_32 c_666 m_t_20">
请检查设备是否上电网络指示灯处于常亮状态
</nut-col>
</nut-row>
<nut-row v-else-if="current === 2">
<nut-col :span="24" class="font_36 f_weight c_222">
请选择当前进线电压
</nut-col>
<nut-col :span="24" class="font_36 f_weight c_222 m_t_20">
220V
</nut-col>
<nut-col :span="24" class="m_t_20">
<nut-radio-group v-model="inputVoltage" direction="horizontal">
<nut-radio :label="1" icon-size="20">
<template #checkedIcon>
<IconFont :name="r_v" size="20" />
</template>
A相
</nut-radio>
<nut-radio :label="2" icon-size="20">
<template #checkedIcon>
<IconFont :name="r_v" size="20" />
</template>
B相
</nut-radio>
<nut-radio :label="3" icon-size="20">
<template #checkedIcon>
<IconFont :name="r_v" size="20" />
</template>
C相
</nut-radio>
</nut-radio-group>
</nut-col>
<nut-col :span="24" class="font_36 f_weight c_222 m_t_20">
380V
</nut-col>
<nut-col :span="24" class="m_t_20">
<nut-radio-group v-model="inputVoltage" direction="horizontal">
<nut-radio :label="4" icon-size="20">
<template #checkedIcon>
<IconFont :name="r_v" size="20" />
</template>
ABC相
</nut-radio>
</nut-radio-group>
</nut-col>
</nut-row>
<nut-row v-else-if="current === 3">
<nut-col :span="24" class="font_36 f_weight c_222">
请选择设备是否插入溶解氧探头
</nut-col>
<nut-col :span="24" class="m_t_20">
<nut-radio-group v-model="isHave">
<nut-radio :label="1" icon-size="20">
<template #checkedIcon>
<IconFont :name="r_v" size="20" />
</template>
有溶解氧探头
</nut-radio>
<nut-radio :label="2" icon-size="20">
<template #checkedIcon>
<IconFont :name="r_v" size="20" />
</template>
无溶解氧探头
</nut-radio>
</nut-radio-group>
</nut-col>
</nut-row>
<nut-row v-else-if="current === 4">
<nut-col :span="24" class="font_36 f_weight c_222">
请选择要放置塘口的设备
</nut-col>
<nut-col :span="24" class="m_t_20">
<nut-checkbox-group v-model="listPutPondPartId">
<nut-checkbox
label="0"
:style="{ width: '100%' }"
v-if="isHave == 1"
>
<template #icon>
<IconFont :name="check" />
</template>
<template #checkedIcon>
<IconFont :name="check_a" />
</template>
溶解氧检测仪
</nut-checkbox>
<nut-checkbox
label="1"
:style="{ width: '100%' }"
class="m_t_15"
>
<template #icon>
<IconFont :name="check" />
</template>
<template #checkedIcon>
<IconFont :name="check_a" />
</template>
开关1
</nut-checkbox>
<nut-checkbox
label="2"
:style="{ width: '100%' }"
class="m_t_15"
>
<template #icon>
<IconFont :name="check" />
</template>
<template #checkedIcon>
<IconFont :name="check_a" />
</template>
开关2
</nut-checkbox>
<nut-checkbox
label="3"
:style="{ width: '100%' }"
class="m_t_15"
>
<template #icon>
<IconFont :name="check" />
</template>
<template #checkedIcon>
<IconFont :name="check_a" />
</template>
开关3
</nut-checkbox>
<nut-checkbox
label="4"
:style="{ width: '100%' }"
class="m_t_15"
>
<template #icon>
<IconFont :name="check" />
</template>
<template #checkedIcon>
<IconFont :name="check_a" />
</template>
开关4
</nut-checkbox>
</nut-checkbox-group>
</nut-col>
</nut-row>
</nut-cell>
<nut-cell v-if="current == 3 && isHave == 1">
<nut-row>
<nut-col :span="24" class="m_t_10">
<nut-radio-group v-model="waterType" direction="horizontal">
<nut-radio :label="1" icon-size="25">
淡水
<template #icon>
<IconFont :name="check" />
</template>
<template #checkedIcon>
<IconFont :name="check_a" />
</template>
</nut-radio>
<nut-radio :label="2" icon-size="25">
海水
<template #icon>
<IconFont :name="check" />
</template>
<template #checkedIcon>
<IconFont :name="check_a" />
</template>
</nut-radio>
</nut-radio-group>
</nut-col>
<nut-col :span="24" v-if="waterType == 2">
<nut-config-provider :theme-vars="themeVars">
<nut-cell
title="请设置您的盐度"
is-link
:desc="salt + '‰'"
@click="setSalt"
></nut-cell>
</nut-config-provider>
</nut-col>
<nut-col :span="24" class="c_888 font_28">
<view>淡水养殖无需设置海水根据实际盐度设置</view>
<!-- <view>(盐度输入数值0-40)</view> -->
</nut-col>
<nut-col :span="24" class="m_t_20">
<nut-config-provider :theme-vars="themeVars">
<nut-cell
title="设置告警值"
is-link
:desc="String(alarm)"
@click="setAlarm"
></nut-cell>
</nut-config-provider>
</nut-col>
<nut-col :span="24" class="c_888 font_28">
<view>当溶解氧低于设定数值时会电话告警</view>
<view>(数值默认为3可设定最低值不能低于1.5) </view>
</nut-col>
</nut-row>
</nut-cell>
</nut-config-provider>
<view>
<nut-button
block
shape="square"
size="large"
:loading="isLoading"
:style="{
fontWeight: 'bold',
fontSize: '14px !important',
borderRadius: '10px',
marginBottom: '15px',
}"
@click="prev"
v-if="current != 1"
>
上一步
</nut-button>
<nut-button
block
shape="square"
type="primary"
size="large"
:style="{
fontWeight: 'bold',
fontSize: '14px !important',
borderRadius: '10px',
}"
@click="next"
>{{ current == 4 ? "添加" : "下一步" }}</nut-button
>
</view>
<nut-config-provider :theme-vars="themeVars">
<nut-dialog v-model:visible="saltShow" text-align="left" no-footer>
<view :style="{ height: '100%' }">
<view class="d_body">
<nut-row>
<nut-col :span="24">
<view class="d_title">请设置您的盐度</view>
</nut-col>
<nut-col :span="24">
<nut-divider class="divider" />
</nut-col>
<nut-col :span="24" class="view_f">
<view :style="{ width: '20%' }" class="font_32 c_444"
>盐度</view
>
<view :style="{ width: '80%' }">
<nut-input
type="digit"
@blur="upValue"
v-model="salt"
placeholder="(盐度输入数值0-40‰)"
:border="false"
input-align="right"
max-length="5"
clearable
:cursor="String(salt).length"
>
<template #right>
<text class="c_222"></text>
</template>
</nut-input>
</view>
</nut-col>
<nut-col :span="24">
<nut-divider class="divider" />
</nut-col>
</nut-row>
</view>
<view class="d_btn">
<nut-row>
<nut-col
:span="12"
:style="{ border: '1px solid #eee', color: '#222' }"
@click="saltShow = false"
>
取消
</nut-col>
<nut-col
:span="12"
:style="{ border: '1px solid #eee', color: '#15BBC5' }"
@click="saltShow = false"
>
确定
</nut-col>
</nut-row>
</view>
</view>
</nut-dialog>
<nut-dialog v-model:visible="alarmShow" text-align="left" no-footer>
<view :style="{ height: '100%' }">
<view class="d_body">
<nut-row>
<nut-col :span="24">
<view class="d_title">低溶解氧告警值</view>
</nut-col>
<nut-col :span="24">
<nut-divider class="divider" />
</nut-col>
<nut-col :span="24" class="view_f">
<view :style="{ width: '20%' }" class="font_32 c_444"
>告警值</view
>
<view :style="{ width: '80%' }">
<nut-input
type="digit"
@blur="upAlarmValue"
v-model="alarm"
placeholder="1.5~20"
:border="false"
input-align="right"
max-length="5"
clearable
:cursor="String(alarm).length"
>
<template #right>
<text class="c_222">Mg/L</text>
</template>
</nut-input>
</view>
</nut-col>
<nut-col :span="24">
<nut-divider class="divider" />
</nut-col>
</nut-row>
</view>
<view class="d_btn">
<nut-row>
<nut-col
:span="12"
:style="{ border: '1px solid #eee', color: '#222' }"
@click="alarmShow = false"
>
取消
</nut-col>
<nut-col
:span="12"
:style="{ border: '1px solid #eee', color: '#15BBC5' }"
@click="alarmShow = false"
>
确定
</nut-col>
</nut-row>
</view>
</view>
</nut-dialog>
</nut-config-provider>
</view>
<!-- 弹出层提示 -->
<nut-toast
:msg="state.msg"
v-model:visible="state.show"
:type="state.type"
/>
</view>
</template>
<script lang="ts" setup>
import Taro from "@tarojs/taro";
import { stateType } from "@/utils/types";
import { addDeviceController, checkDeviceStatus } from "@/api/device";
import { IconFont } from "@nutui/icons-vue-taro";
import { imgUrl } from "@/utils/imgUrl";
definePageConfig({
navigationBarTitleText: "添加测控一体机",
});
const instance = Taro.getCurrentInstance();
const r = instance.router.params.params;
const page = instance.router.params.page;
console.log('URL参数原始值', r);
let params: any = undefined;
try {
if (r) {
// URL解码后再解析JSON
const decodedParams = decodeURIComponent(r);
console.log('URL解码后', decodedParams);
params = JSON.parse(decodedParams);
console.log('解析后的参数', params);
} else {
console.error('未获取到params参数');
}
} catch (e) {
console.error('参数解析失败', e, '原始参数:', r);
// 参数解析失败,显示提示后返回
Taro.showModal({
title: '提示',
content: '参数错误,请重新进入',
showCancel: false,
success: () => {
Taro.navigateBack();
}
});
}
const check = `https://www.yuceyun.cn/wechat/check.png`;
const check_a = `https://www.yuceyun.cn/wechat/check_a.png`;
const r_v = `https://www.yuceyun.cn/wechat/r_v.png`;
// const params = {
// devNum: "12312399",
// devType: 2,
// pondId: [1],
// pondName: "我的一号塘口"
// }
// 步骤
const current = ref<number>(1);
const themeVars = ref({
cellBoxShadow: "0px 0px 0px 0px",
cellPadding: "0",
cellColor: "#666666",
cellTitleFont: "32rpx",
cellTitleDescFont: "30rpx",
cellDescFont: "30rpx",
cellDescColor: "#222222",
popupBorderRadius: "10rpx",
checkboxLabelFontSize: "30rpx",
});
const themeVars1 = ref({
radioLabelFontSize: "30rpx",
});
// 盐度
const salt = ref<number>(40);
// 电压
const inputVoltage = ref<number>(1);
const saltShow = ref<boolean>(false);
const alarm = ref<number>(3);
const alarmShow = ref<boolean>(false);
const isHave = ref<number>(1);
const listPutPondPartId = ref(["0"]);
const state: stateType = reactive({
msg: "",
type: "text",
center: true,
show: false,
});
const status = ref(0);
const isLoading = ref<boolean>(false);
const waterType = ref<number>(1);
/** ----------------metod start------------------ */
// 监测设备在线状态
function getCheckDevice() {
if (!params) {
console.error('params参数为空');
state.show = true;
state.msg = '参数错误';
return;
}
const data = {
devicetype: params.devType,
serialnum: params.devNum,
};
console.log('检查设备状态', data);
isLoading.value = true;
checkDeviceStatus(data)
.then((res: any) => {
if (res.code == 200) {
status.value = res.data;
if (status.value == 0) {
state.show = true;
state.msg = "设备未激活";
} else if (status.value == 1) {
current.value = 2;
} else if (status.value == 3) {
state.show = true;
state.msg = "设备离线";
} else if (status.value == 8) {
state.show = true;
state.msg = "设备禁用";
} else {
state.show = true;
state.msg = "设备异常";
}
}
})
.finally(() => {
isLoading.value = false;
});
}
function next() {
if (!params) {
state.show = true;
state.msg = '参数错误';
return;
}
const num = current.value;
if (num == 4) {
// 验证参数,发起添加设备请求
if (salt.value) {
if (Number(salt.value) < 0 || Number(salt.value) > 40) {
state.show = true;
state.msg = "盐度范围为0-40";
return;
}
} else {
state.show = true;
state.msg = "请录入盐度";
return;
}
if (alarm.value) {
if (Number(alarm.value) < 1.5 || Number(alarm.value) > 20) {
state.show = true;
state.msg = "告警值范围为1.5-20";
return;
}
} else {
state.show = true;
state.msg = "请录入告警值";
return;
}
if (listPutPondPartId.value.length <= 0) {
state.show = true;
state.msg = "请选择放置的设备";
return;
}
// 发起添加设备请求
const data = {
serialNum: params.devNum,
pondId: params.pondId[0],
salinityCompensation: waterType.value == 1 ? 0 : Number(salt.value),
oxyWarnLower: Number(alarm.value),
inputVoltage: Number(inputVoltage.value),
listPutPondPartId: listPutPondPartId.value,
isOxygenUsed:isHave.value==1?true:false
};
console.log('添加设备数据', data);
addDeviceController(data).then((res) => {
if (res.code == 200) {
Taro.redirectTo({
url: "/my/addDevSuccess?name=添加测控一体机&page=" + page,
});
}
});
} else {
if (num != 1 && status.value == 1) {
current.value = num + 1;
}
if (num == 1) {
// 检查设备状态
getCheckDevice();
} else {
}
return;
}
}
// 上一步
function prev() {
const num = current.value;
current.value = num - 1;
}
// 设置盐度弹框
function setSalt() {
saltShow.value = true;
}
// 验证输入框内容
function upValue() {
const val = salt.value;
if (Number(val) < 0 || Number(val) > 40) {
salt.value = 40;
}
}
// 设置高净值弹框
function setAlarm() {
alarmShow.value = true;
}
// 验证输入框内容
function upAlarmValue() {
const val = alarm.value;
if (Number(val) < 1.5 || Number(val) > 20) {
alarm.value = 20;
}
}
/** ----------------metod end-------------------- */
</script>
<style lang="scss">
.controller_home {
width: 100%;
height: 100%;
background-image: url("https://www.yuceyun.cn/wechat/bg.jpg");
background-color: #e5ebed;
background-repeat: no-repeat;
background-size: 100% 100%;
position: fixed;
margin: 0;
font-size: 32px;
font-family: "PingFang SC";
font-weight: 400;
.body {
padding: 15px;
.title {
font-size: 32px;
color: #222;
font-weight: bold;
}
.time {
font-size: 24px;
color: #666666;
}
.mt {
margin-top: 10px;
}
.content {
margin-top: 10px;
font-size: 28px;
color: #444;
}
.tag {
background: RGB(21, 137, 233, 0.1);
border-radius: 4px;
color: #1589e9;
font-size: 28rpx;
margin-left: 10px;
}
.price {
font-size: 48px;
color: #444444;
font-weight: bold;
text-align: right;
}
.nut-dialog {
padding: 0;
}
.nut-dialog__content {
margin: 0;
}
.nut-input {
padding: 20rpx 0;
}
}
}
</style>