Merge remote-tracking branch 'origin/master'

# Conflicts:
#	frontend/src/api/device/device/index.ts
This commit is contained in:
caozehui
2025-01-13 18:21:24 +08:00
15 changed files with 205 additions and 81 deletions

View File

@@ -37,6 +37,11 @@ export const importPqDev=(params: Device.ReqPqDevParams)=>{
return http.upload(`/pqDev/import`, params) return http.upload(`/pqDev/import`, params)
} }
//根据设备类型决定电源、icd、模板、通道数、额定电压、额定电流
export const getPqDev = () => {
return http.post(`/devType/list`)
}
//被检设备归档 //被检设备归档
export const documentedPqDev=(ids:string[])=>{ export const documentedPqDev=(ids:string[])=>{

View File

@@ -25,7 +25,7 @@ export namespace Device {
devChns: number; //设备通道数 devChns: number; //设备通道数
devVolt: number; //额定电压V devVolt: number; //额定电压V
devCurr: number; //额定电流A devCurr: number; //额定电流A
manufacturer: string;//生产厂家 manufacturer?: string | null;//生产厂家
createDate: string; //生产日期 createDate: string; //生产日期
createId: string; //出厂编号 createId: string; //出厂编号
hardwareVersion: string; //固件版本 hardwareVersion: string; //固件版本
@@ -56,7 +56,8 @@ export namespace Device {
createTime?: string| null; //创建时间 createTime?: string| null; //创建时间
updateBy?: string| null; //更新用户 updateBy?: string| null; //更新用户
updateTime?: string| null; //更新时间 updateTime?: string| null; //更新时间
icd: string;
power: string;
} }
/** /**

View File

@@ -37,6 +37,7 @@ const init = () => {
isLabelLine: true, //是否显示引导线 isLabelLine: true, //是否显示引导线
titleFontSize: '14px', //标题字体大小 titleFontSize: '14px', //标题字体大小
...props.customData, ...props.customData,
}; };
legendData.value = { legendData.value = {
icon: "roundRect", // 图例项的icon,类型包括 circle(圆形),rect(正方形),//roundRect(圆角正方形),triangle(三角形),diamond(菱形),//pin(大头针行),arrow(箭头形),none(无图例项的icon) icon: "roundRect", // 图例项的icon,类型包括 circle(圆形),rect(正方形),//roundRect(圆角正方形),triangle(三角形),diamond(菱形),//pin(大头针行),arrow(箭头形),none(无图例项的icon)
@@ -86,7 +87,7 @@ const init = () => {
if(item) if(item)
return item[0].value; return item[0].value;
}, },
center: ["55%", "50%"], // 设置饼图的中心位置 center: ["55%", "55%"], // 设置饼图的中心位置
// padAngle: 2, // padAngle: 2,
minAngle: 15, //最小角度 minAngle: 15, //最小角度
startAngle: 270, //起始角度 startAngle: 270, //起始角度

View File

@@ -13,11 +13,11 @@ const auth: Directive = {
// console.log('1234',authStore.routeName) // console.log('1234',authStore.routeName)
// console.log('123',currentPageRoles) // console.log('123',currentPageRoles)
if (value instanceof Array && value.length) { if (value instanceof Array && value.length) {
console.log('123456',value) //console.log('123456',value)
const hasPermission = value.every(item => currentPageRoles.includes(item)) const hasPermission = value.every(item => currentPageRoles.includes(item))
if (!hasPermission) el.remove() if (!hasPermission) el.remove()
} else { } else {
console.log('12345',value) //console.log('12345',value)
if (!currentPageRoles.includes(value)) el.remove() if (!currentPageRoles.includes(value)) el.remove()
} }
}, },

View File

@@ -66,6 +66,7 @@ onMounted(() => {
const handelOpen = async (item: string) => { const handelOpen = async (item: string) => {
await authStore.setShowMenu(); await authStore.setShowMenu();
modeStore.setCurrentMode(item); // 将模式code存入 store modeStore.setCurrentMode(item); // 将模式code存入 store
if (router.currentRoute.value.path === '/home/index') { if (router.currentRoute.value.path === '/home/index') {
// 强制刷新页面 // 强制刷新页面
window.location.reload(); window.location.reload();

View File

@@ -56,14 +56,14 @@ import Message from "./components/Message.vue";
import Fullscreen from "./components/Fullscreen.vue"; import Fullscreen from "./components/Fullscreen.vue";
import { useAuthStore } from "@/stores/modules/auth"; import { useAuthStore } from "@/stores/modules/auth";
import {useDictStore} from "@/stores/modules/dict"; import {useDictStore} from "@/stores/modules/dict";
import { useModeStore } from "@/stores/modules/mode"; import { useModeStore,useAppSceneStore } from "@/stores/modules/mode";
const userStore = useUserStore(); const userStore = useUserStore();
const dictStore = useDictStore(); const dictStore = useDictStore();
const username = computed(() => userStore.userInfo.name); const username = computed(() => userStore.userInfo.name);
const router = useRouter(); const router = useRouter();
const authStore = useAuthStore(); const authStore = useAuthStore();
const modeStore = useModeStore(); const modeStore = useModeStore();
const AppSceneStore = useAppSceneStore();
// 退出登录 // 退出登录
const logout = () => { const logout = () => {
ElMessageBox.confirm("您是否确认退出登录?", "温馨提示", { ElMessageBox.confirm("您是否确认退出登录?", "温馨提示", {
@@ -78,6 +78,7 @@ const logout = () => {
userStore.setUserInfo({name: ""}); userStore.setUserInfo({name: ""});
dictStore.setDictData([]); dictStore.setDictData([]);
modeStore.setCurrentMode(''); modeStore.setCurrentMode('');
AppSceneStore.setCurrentMode('');
// 3.重定向到登陆页 // 3.重定向到登陆页
router.replace(LOGIN_URL); router.replace(LOGIN_URL);
ElMessage.success("退出登录成功!"); ElMessage.success("退出登录成功!");

View File

@@ -24,3 +24,15 @@ export const useModeStore = defineStore('mode', {
}, },
}, },
}); });
export const useAppSceneStore = defineStore('scene', {
state: () => ({
currentScene: localStorage.getItem('currentScene') || '' as string,
}),
actions: {
setCurrentMode(sceneName: string) {
this.currentScene = sceneName;
localStorage.setItem('currentScene', sceneName); // 保存到 localStorage
},
},
});

View File

@@ -240,7 +240,7 @@ watch(webMsgSend,function (newValue,oldValue){
item.desc === newValue.data.desc && item.desc === newValue.data.desc &&
item.devName === newValue.data.devName); item.devName === newValue.data.devName);
if (firstCoefficientVO) { // 检查 firstCoefficientVO 是否存在 if (firstCoefficientVO) { // 检查 firstCoefficientVO 是否存在
firstCoefficientVO.aVuData = parseFloat(newValue.data.aVuData).toFixed(4);; firstCoefficientVO.aVuData = parseFloat(newValue.data.aVuData).toFixed(4);
firstCoefficientVO.aVuXi = newValue.data.aVuXi; firstCoefficientVO.aVuXi = newValue.data.aVuXi;
firstCoefficientVO.bVuData = parseFloat(newValue.data.bVuData).toFixed(4); firstCoefficientVO.bVuData = parseFloat(newValue.data.bVuData).toFixed(4);
firstCoefficientVO.bVuXi = newValue.data.bVuXi; firstCoefficientVO.bVuXi = newValue.data.bVuXi;
@@ -555,7 +555,7 @@ const handleSubmit = async () => {
tableLoading('big','系数下装') tableLoading('big','系数下装')
await getCoefficientCheck({ await getCoefficientCheck({
userPageId: "cdf", userPageId: "cdf",
devIds: devIdArray.value, devIds:devIdArray.value,
planId:planId.value, planId:planId.value,
errorSysId: select_Plan.value?.errorSysId, errorSysId: select_Plan.value?.errorSysId,
     scriptId: select_Plan.value?.scriptId,      scriptId: select_Plan.value?.scriptId,

View File

@@ -21,6 +21,7 @@
<script lang="tsx" setup> <script lang="tsx" setup>
import {CheckData} from "@/api/check/interface"; import {CheckData} from "@/api/check/interface";
import { computed } from "vue";
import {useDownload} from "@/hooks/useDownload"; import {useDownload} from "@/hooks/useDownload";
import {exportRawData} from "@/api/check/test" import {exportRawData} from "@/api/check/test"

View File

@@ -928,7 +928,11 @@ const handleTest = async (val:string) => {
return return
} }
// 检查 socketClient.Instance 是否存在
if (!socketClient.Instance) {
console.error('WebSocket 客户端实例不存在');
return;
}
//开始创建webSocket客户端 //开始创建webSocket客户端
const data = reactive({ const data = reactive({

View File

@@ -37,7 +37,7 @@ import { useAuthStore } from "@/stores/modules/auth";
import model from "./tabs/model.vue"; import model from "./tabs/model.vue";
import dashboard from "./tabs/dashboard.vue"; import dashboard from "./tabs/dashboard.vue";
import { onMounted } from "vue"; import { onMounted, ref } from "vue";
const authStore = useAuthStore(); const authStore = useAuthStore();
const activeIndex = ref("1-1"); const activeIndex = ref("1-1");

View File

@@ -300,22 +300,31 @@ const getPieData = async (id: string) => {
}) })
} }
chartsData1.value = [ // 检查 checkStateCount 是否全为 0
{ value: checkStateCount[0], name: '未检', itemStyle: { color: '#fac858' } }, const allZero = Object.values(checkStateCount).every(count => count === 0);
{ value: checkStateCount[1], name: '检测中', itemStyle: { color: '#ee6666' } }, chartsData1.value = [
{ value: checkStateCount[2], name: '检测完成', itemStyle: { color: '#91cc75' } }, { value: allZero ? 0 : checkStateCount[0] === 0 ? null : checkStateCount[0], name: '检', itemStyle: { color: '#fac858' } },
{ value: checkStateCount[3], name: '归档', itemStyle: { color: '#5470c6' } }, { value: allZero ? 0 : checkStateCount[1] === 0 ? null : checkStateCount[1], name: '检测中', itemStyle: { color: '#ee6666' } },
] { value: allZero ? 0 : checkStateCount[2] === 0 ? null : checkStateCount[2], name: '检测完成', itemStyle: { color: '#91cc75' } },
chartsData2.value = [ { value: allZero ? 0 : checkStateCount[3] === 0 ? null : checkStateCount[3], name: '归档', itemStyle: { color: '#5470c6' } },
{ value: checkResultCount[2], name: '未检', itemStyle: { color: '#fac858' } }, ];
{ value: checkResultCount[0], name: '不符合', itemStyle: { color: '#ee6666' } },
{ value: checkResultCount[1], name: '符合', itemStyle: { color: '#91cc75' } }, // 同样处理 chartsData2 和 chartsData3
] const allZeroResult = Object.values(checkResultCount).every(count => count === 0);
chartsData3.value = [ chartsData2.value = [
{ value: reportStateCount[2], name: '未检', itemStyle: { color: '#fac858' } }, { value: allZeroResult ? 0 : checkResultCount[2] === 0 ? null : checkResultCount[2], name: '未检', itemStyle: { color: '#fac858' } },
{ value: reportStateCount[0], name: '未生成', itemStyle: { color: '#ee6666' } }, { value: allZeroResult ? 0 : checkResultCount[0] === 0 ? null : checkResultCount[0], name: '不符合', itemStyle: { color: '#ee6666' } },
{ value: reportStateCount[1], name: '已生成', itemStyle: { color: '#91cc75' } }, { value: allZeroResult ? 0 : checkResultCount[1] === 0 ? null : checkResultCount[1], name: '符合', itemStyle: { color: '#91cc75' } },
] ];
// 检查 reportStateCount 是否全为 0
const allZeroReport = Object.values(reportStateCount).every(count => count === 0);
chartsData3.value = [
{ value: allZeroReport ? 0 : reportStateCount[2] === 0 ? null : reportStateCount[2], name: '未检', itemStyle: { color: '#fac858' } },
{ value: allZeroReport ? 0 : reportStateCount[0] === 0 ? null : reportStateCount[0], name: '未生成', itemStyle: { color: '#ee6666' } },
{ value: allZeroReport ? 0 : reportStateCount[1] === 0 ? null : reportStateCount[1], name: '已生成', itemStyle: { color: '#91cc75' } },
];
pieRef1.value.init() pieRef1.value.init()
pieRef2.value.init() pieRef2.value.init()

View File

@@ -33,9 +33,11 @@
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import { useAuthStore } from "@/stores/modules/auth"; import { useAuthStore } from "@/stores/modules/auth";
import { useModeStore } from "@/stores/modules/mode"; // 引入模式 store import { useModeStore ,useAppSceneStore} from "@/stores/modules/mode"; // 引入模式 store
import { ref } from "vue";
const authStore = useAuthStore(); const authStore = useAuthStore();
const modeStore = useModeStore(); // 使用模式 store const modeStore = useModeStore(); // 使用模式 store
const AppSceneStore = useAppSceneStore();
const activeIndex = ref("1-1"); const activeIndex = ref("1-1");
const router = useRouter(); const router = useRouter();
const modeList = [ const modeList = [
@@ -63,6 +65,7 @@ const modeList = [
]; ];
const handelOpen = async (item: any) => { const handelOpen = async (item: any) => {
modeStore.setCurrentMode(item.code); // 将模式code存入 store modeStore.setCurrentMode(item.code); // 将模式code存入 store
AppSceneStore.setCurrentMode('1');//0省级平台1设备出厂2研发自测
await authStore.setShowMenu(); await authStore.setShowMenu();
return; return;
// if (isActive) { // if (isActive) {

View File

@@ -5,13 +5,13 @@
<div > <div >
<el-form :model='formContent' ref='dialogFormRef' :rules='rules' :disabled="false" label-width="auto" class="form-three"> <el-form :model='formContent' ref='dialogFormRef' :rules='rules' :disabled="false" label-width="auto" class="form-three">
<el-divider >设备信息</el-divider> <el-divider >设备信息</el-divider>
<el-form-item label="设备名称" prop="name" > <el-form-item label="设备名称" prop="name" v-if="scene != '1'">
<el-input v-model='formContent.name' placeholder="请输入设备名称"/> <el-input v-model='formContent.name' placeholder="请输入设备名称"/>
</el-form-item> </el-form-item>
<el-form-item label='设备类型' prop='devType' > <el-form-item label='设备类型' prop='devType' >
<el-select v-model="formContent.devType" filterable clearable placeholder="请选择设备类型"> <el-select v-model="formContent.devType" filterable clearable placeholder="请选择设备类型" @change="handleDevTypeChange">
<el-option <el-option
v-for="item in dictStore.getDictData('Dev_Type')" v-for="item in devTypeOptions"
:key="item.id" :key="item.id"
:label="item.name" :label="item.name"
:value="item.id" :value="item.id"
@@ -28,8 +28,8 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label='设备厂家' prop='manufacturer' > <el-form-item label='设备厂家' prop='manufacturer' v-if="scene != '1'">
<el-select v-model="formContent.manufacturer" clearable placeholder="请选择生产厂商"> <el-select v-model="formContent.manufacturer" clearable placeholder="请选择设备厂家">
<el-option <el-option
v-for="item in dictStore.getDictData('Dev_Manufacturers')" v-for="item in dictStore.getDictData('Dev_Manufacturers')"
:key="item.id" :key="item.id"
@@ -48,10 +48,10 @@
<el-form-item label="设备序列号" prop="createId" > <el-form-item label="设备序列号" prop="createId" >
<el-input v-model="formContent.createId" placeholder="请输入设备序列号"/> <el-input v-model="formContent.createId" placeholder="请输入设备序列号"/>
</el-form-item> </el-form-item>
<el-form-item label="固件版本" prop="hardwareVersion" > <el-form-item label="固件版本" prop="hardwareVersion" v-if="scene === '0'">
<el-input v-model="formContent.hardwareVersion" placeholder="请输入固件版本"/> <el-input v-model="formContent.hardwareVersion" placeholder="请输入固件版本"/>
</el-form-item> </el-form-item>
<el-form-item label="软件版本" prop="softwareVersion" > <el-form-item label="软件版本" prop="softwareVersion" v-if="scene === '0'">
<el-input v-model="formContent.softwareVersion" placeholder="请输入软件版本"/> <el-input v-model="formContent.softwareVersion" placeholder="请输入软件版本"/>
</el-form-item> </el-form-item>
<el-divider >参数信息</el-divider> <el-divider >参数信息</el-divider>
@@ -113,10 +113,10 @@
<el-form-item label='密钥' prop='devKey' clearable v-if="formContent.encryptionFlag"> <el-form-item label='密钥' prop='devKey' clearable v-if="formContent.encryptionFlag">
<el-input v-model='formContent.devKey' placeholder="请输入密钥" show-password/> <el-input v-model='formContent.devKey' placeholder="请输入密钥" show-password/>
</el-form-item> </el-form-item>
<el-form-item label='样品编号' prop='sampleID' clearable v-if="DevIsShow"> <el-form-item label='样品编号' prop='sampleID' clearable v-if="DevIsShow && scene === '0'">
<el-input v-model='formContent.sampleID' placeholder="请输入样品编号" /> <el-input v-model='formContent.sampleID' placeholder="请输入样品编号" />
</el-form-item> </el-form-item>
<el-form-item label='送样日期' prop='arrivedDate' > <el-form-item label='送样日期' prop='arrivedDate' v-if="scene === '0'">
<el-date-picker <el-date-picker
v-model="formContent.arrivedDate" v-model="formContent.arrivedDate"
placeholder="请选择送样日期" placeholder="请选择送样日期"
@@ -160,7 +160,7 @@ import IPAddress from '@/components/IpAddress/index.vue'
import { dialogBig } from '@/utils/elementBind' import { dialogBig } from '@/utils/elementBind'
import { type Device } from '@/api/device/interface/device' import { type Device } from '@/api/device/interface/device'
import { ElMessage, type FormItemRule } from 'element-plus' import { ElMessage, type FormItemRule } from 'element-plus'
import { addPqDev, updatePqDev } from '@/api/device/device' import { addPqDev, updatePqDev,getPqDev } from '@/api/device/device'
import { computed, reactive, type Ref, ref } from 'vue' import { computed, reactive, type Ref, ref } from 'vue'
import { useDictStore } from '@/stores/modules/dict' import { useDictStore } from '@/stores/modules/dict'
import { CirclePlus, Delete, EditPen } from '@element-plus/icons-vue' import { CirclePlus, Delete, EditPen } from '@element-plus/icons-vue'
@@ -170,15 +170,44 @@ import MonitorTable from '@/views/machine/device/components/monitorTab.vue';
const MonIsShow = ref(false) const MonIsShow = ref(false)
const DevIsShow = ref(false) const DevIsShow = ref(false)
// 存储设备类型选项
const devTypeOptions = ref<{
id: string;
name: string ,
icd:string ,
power:string,
devVolt:number,
devCurr:number,
devChns:number,
}[]>([])
// const IsPasswordShow = ref(false) // const IsPasswordShow = ref(false)
const dictStore = useDictStore() const dictStore = useDictStore()
const mode = ref() const mode = ref()
const scene = ref('')
// 定义弹出组件元信息 // 定义弹出组件元信息
const dialogFormRef = ref() const dialogFormRef = ref()
const disabledDate = (time: Date) => { const disabledDate = (time: Date) => {
return time.getTime() > Date.now() return time.getTime() > Date.now()
} }
// 获取设备类型选项
const fetchDevTypeOptions = async () => {
try {
const response = await getPqDev()
devTypeOptions.value = response.data.map(item => ({
id: item.id,
name: item.name,
icd: item.icd,
power: item.power,
devVolt: item.devVolt,
devCurr: item.devCurr,
devChns: item.devChns
}))
} catch (error) {
console.error('获取设备类型选项失败', error)
}
}
function useMetaInfo() { function useMetaInfo() {
const dialogVisible = ref(false) const dialogVisible = ref(false)
const titleType = ref('add') const titleType = ref('add')
@@ -189,8 +218,8 @@ const disabledDate = (time: Date) => {
devType:'', devType:'',
devChns:1, devChns:1,
devVolt:57.74, devVolt:57.74,
devCurr:1, devCurr:5,
manufacturer: '', manufacturer:'',
createDate: dayjs().format('YYYY-MM-DD'), createDate: dayjs().format('YYYY-MM-DD'),
createId: '', createId: '',
hardwareVersion: '', hardwareVersion: '',
@@ -202,6 +231,8 @@ const disabledDate = (time: Date) => {
reCheckNum:0, reCheckNum:0,
state: 1, state: 1,
factorFlag:0, factorFlag:0,
icd:'',
power:''
}) })
return { dialogVisible, titleType, formContent } return { dialogVisible, titleType, formContent }
} }
@@ -216,7 +247,7 @@ const disabledDate = (time: Date) => {
devType:'', devType:'',
devChns:1, devChns:1,
devVolt:57.74, devVolt:57.74,
devCurr:1, devCurr:5,
manufacturer: '', manufacturer: '',
createDate: dayjs().format('YYYY-MM-DD'), createDate: dayjs().format('YYYY-MM-DD'),
createId: '', createId: '',
@@ -229,6 +260,8 @@ const disabledDate = (time: Date) => {
reCheckNum:0, reCheckNum:0,
state: 1, state: 1,
factorFlag:0, factorFlag:0,
icd:'',
power:''
} }
} }
@@ -238,38 +271,56 @@ const disabledDate = (time: Date) => {
}) })
// 定义表单校验规则 // 定义表单校验规则
const rules: Ref<Record<string, Array<FormItemRule>>> = ref({ const baseRules: Record<string, Array<FormItemRule>> = {
devType: [{ required: true, message: '设备类型必选!', trigger: 'change' }], devType: [{ required: true, message: '设备类型必选!', trigger: 'change' }],
pattern: [{ required: true, message: '设备模式必填!', trigger: 'blur' }], pattern: [{ required: true, message: '设备模式必填!', trigger: 'blur' }],
name: [{ required: true, message: '设备名称必填!', trigger: 'blur' }], devChns: [
devChns: [{ required: true, message: '设备通道数必填!', trigger: 'blur' }, { required: true, message: '设备通道数必填!', trigger: 'blur' },
// 指定正则,此处是数字正则 { pattern: /^[1-9]\d*$/, message: '设备通道数为大于1的整数', trigger: 'blur' }
{ pattern: /^[1-9]\d*$/, message: '设备通道数为大于1的整数', trigger: 'blur' }], ],
devVolt: [{ required: true, message: '额定电压必填!', trigger: 'blur' }, devVolt: [
{ pattern: /^\d+(\.\d+)?$/, message: '额定电压格式错误', trigger: 'blur' }], { required: true, message: '额定电压必填!', trigger: 'blur' },
devCurr: [{ required: true, message: '额定电流必填!', trigger: 'blur' }, { pattern: /^\d+(\.\d+)?$/, message: '额定电压格式错误', trigger: 'blur' }
{ pattern: /^\d+(\.\d+)?$/, message: '额定电流格式错误', trigger: 'blur' }], ],
devCurr: [
{ required: true, message: '额定电流必填!', trigger: 'blur' },
{ pattern: /^\d+(\.\d+)?$/, message: '额定电流格式错误', trigger: 'blur' }
],
createDate: [{ required: true, message: '生产日期必填!', trigger: 'blur' }], createDate: [{ required: true, message: '生产日期必填!', trigger: 'blur' }],
createId: [{ required: true, message: '出厂编号必填!', trigger: 'blur' }], createId: [{ required: true, message: '出厂编号必填!', trigger: 'blur' }],
hardwareVersion: [{ required: true, message: '固件版本必填!', trigger: 'blur' }], ip: [
softwareVersion: [{ required: true, message: '软件版本必填!', trigger: 'blur' }], { required: true, message: 'IP地址必填!', trigger: 'blur' },
ip:[{ required: true, message: 'IP地址必填!', trigger: 'blur' } , { pattern: /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/, message: 'IP地址格式错误', trigger: 'blur' }
{ pattern: /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/, message: 'IP地址格式错误', trigger: 'blur' }], ],
port:[{ required: true, message: '端口号必填!', trigger: 'blur' }, port: [
{ pattern: /^(6553[0-5]|655[0-2][0-9]|64[0-9]{3}|[1-5]?[0-9]{1,4})$/, message: '端口号范围0到65535的整数', trigger: 'blur' }], { required: true, message: '端口号必填!', trigger: 'blur' },
manufacturer: [{ required: true, message: '生产厂家必选!', trigger: 'change' }], { pattern: /^(6553[0-5]|655[0-2][0-9]|64[0-9]{3}|[1-5]?[0-9]{1,4})$/, message: '端口号范围0到65535的整数', trigger: 'blur' }
],
encryptionFlag: [{ required: true, message: '是否加密必选!', trigger: 'change' }], encryptionFlag: [{ required: true, message: '是否加密必选!', trigger: 'change' }],
protocol: [{ required: true, message: '通讯协议必选!', trigger: 'change' }], protocol: [{ required: true, message: '通讯协议必选!', trigger: 'change' }],
// series: [], series: [{ required: true, message: '请输入识别码', trigger: 'blur' }],
// devKey: [] devKey: [{ required: true, message: '请输入密钥', trigger: 'blur' }]
series : [ };
{ required: true, message: '请输入识别码', trigger: 'blur' }
], // 使用计算属性根据 scene 动态生成规则
devKey : [ const rules = computed(() => {
{ required: true, message: '请输入密钥', trigger: 'blur' } const dynamicRules = { ...baseRules };
],
}) if (scene.value !== '0') {
dynamicRules.name = [{ required: true, message: '设备名称必填!', trigger: 'blur' }];
dynamicRules.hardwareVersion = [{ required: true, message: '固件版本必填!', trigger: 'blur' }];
dynamicRules.softwareVersion = [{ required: true, message: '软件版本必填!', trigger: 'blur' }];
dynamicRules.manufacturer = [{ required: true, message: '生产厂家必选!', trigger: 'change' }];
}
if (scene.value !== '2') {
dynamicRules.name = [{ required: true, message: '设备名称必填!', trigger: 'blur' }];
dynamicRules.manufacturer = [{ required: true, message: '生产厂家必选!', trigger: 'change' }];
}
return dynamicRules;
});
// 关闭弹窗 // 关闭弹窗
const close = () => { const close = () => {
@@ -327,8 +378,10 @@ const disabledDate = (time: Date) => {
// 打开弹窗,可能是新增,也可能是编辑 // 打开弹窗,可能是新增,也可能是编辑
const open = (sign: string, data: Device.ResPqDev,currentMode: string) => { const open = async (sign: string, data: Device.ResPqDev,currentMode: string,currentScene: string ) => {
fetchDevTypeOptions()
mode.value = currentMode mode.value = currentMode
scene.value = currentScene
titleType.value = sign titleType.value = sign
dialogVisible.value = true dialogVisible.value = true
@@ -349,6 +402,14 @@ const open = (sign: string, data: Device.ResPqDev,currentMode: string) => {
formContent.value = { ...data } formContent.value = { ...data }
} else { } else {
resetFormContent() resetFormContent()
if(scene.value === '2'){
const manufacturers = dictStore.getDictData('Dev_Manufacturers');
const nanjingCanxuan = manufacturers.find(item => item.name === '南京灿能');
if(nanjingCanxuan){
formContent.value.manufacturer = nanjingCanxuan.id;
}
}
//handleEncryptionChange(1) //handleEncryptionChange(1)
} }
@@ -370,6 +431,24 @@ const open = (sign: string, data: Device.ResPqDev,currentMode: string) => {
// } // }
// } // }
const handleDevTypeChange = (value: string) => {
// 在这里处理选中事件的逻辑
const dev = devTypeOptions.value.find(t =>t.id === value)
if (dev) {
formContent.value.devChns = dev.devChns; // 默认值为1
formContent.value.devCurr = dev.devCurr; // 默认值为1
formContent.value.devVolt = dev.devVolt; // 默认值为1
formContent.value.icd = dev.icd
formContent.value.power = dev.power
} else {
formContent.value.devChns = 1; // 默认值为1
formContent.value.devCurr = 1; // 默认值为1
formContent.value.devVolt = 57.74; // 默认值为1
}
}
// 对外映射 // 对外映射
defineExpose({ open }) defineExpose({ open })
const props = defineProps<{ const props = defineProps<{

View File

@@ -42,15 +42,15 @@ import { useDictStore } from '@/stores/modules/dict'
import { getPqDevList, deletePqDev, exportPqDev, downloadTemplate, importPqDev } from '@/api/device/device/index.ts' import { getPqDevList, deletePqDev, exportPqDev, downloadTemplate, importPqDev } from '@/api/device/device/index.ts'
import { ElMessageBox } from 'element-plus' import { ElMessageBox } from 'element-plus'
import { computed, reactive, ref } from 'vue' import { computed, reactive, ref } from 'vue'
import { useModeStore } from '@/stores/modules/mode'; // 引入模式 store import { useModeStore , useAppSceneStore} from '@/stores/modules/mode'; // 引入模式 store
const modeStore = useModeStore(); const modeStore = useModeStore();
const dictStore = useDictStore() const dictStore = useDictStore()
const appSceneStore = useAppSceneStore()
// ProTable 实例 // ProTable 实例
const proTable = ref<ProTableInstance>() const proTable = ref<ProTableInstance>()
const devicePopup = ref() const devicePopup = ref()
// 定义包含和排除的单位 const ConditionsIsShow = ref(false)
const boundPqDevList=ref<Device.ReqPqDevParams[]>([])//根据检测计划id查询出所有已绑定的设备 const boundPqDevList=ref<Device.ReqPqDevParams[]>([])//根据检测计划id查询出所有已绑定的设备
@@ -71,7 +71,11 @@ const columns = reactive<ColumnProps<Device.ResPqDev>[]>([
{ {
prop: 'name', prop: 'name',
label: '名称', label: '名称',
isShow: appSceneStore.currentScene != '1',
...(appSceneStore.currentScene != '1' ? {
search: { el: 'input' }, search: { el: 'input' },
} : {}),
minWidth: 200, minWidth: 200,
}, },
{ {
@@ -121,8 +125,11 @@ const columns = reactive<ColumnProps<Device.ResPqDev>[]>([
prop: 'manufacturer', prop: 'manufacturer',
label: '设备厂家', label: '设备厂家',
enum: dictStore.getDictData('Dev_Manufacturers'), enum: dictStore.getDictData('Dev_Manufacturers'),
isShow: appSceneStore.currentScene != '1',
...(appSceneStore.currentScene != '1' ? {
search: { el: 'select', props: { filterable: true }, order: 1 }, search: { el: 'select', props: { filterable: true }, order: 1 },
fieldNames: { label: 'name', value: 'id' }, fieldNames: { label: 'name', value: 'id' },
} : {}),
minWidth: 200, minWidth: 200,
}, },
{ prop: 'operation', label: '操作', fixed: 'right', width: 200 }, { prop: 'operation', label: '操作', fixed: 'right', width: 200 },
@@ -138,7 +145,7 @@ const handleDateChange = (startDateTemp: string, endDateTemp: string) => {
} }
// 打开 drawer(新增、编辑) // 打开 drawer(新增、编辑)
const openDialog = (titleType: string, row: Partial<Device.ResPqDev> = {}) => { const openDialog = (titleType: string, row: Partial<Device.ResPqDev> = {}) => {
devicePopup.value?.open(titleType, row,modeStore.currentMode) devicePopup.value?.open(titleType, row,modeStore.currentMode,appSceneStore.currentScene)
} }