保存分析设计

This commit is contained in:
limengnan 2026-01-17 09:08:16 +08:00
parent 3e4ad3afb8
commit ea45e6f84b
4 changed files with 552 additions and 66 deletions

View File

@ -120,7 +120,7 @@ function confirmDevice(){ // 确定添加设备
} }
addDevices(params).then((res:any) => { addDevices(params).then((res:any) => {
if(res == true){ if(res == true){
emit('closeAdddevice', selectedDevice.value) emit('closeAdddevice', params)
} }
}); });
} }
@ -213,8 +213,6 @@ function addClick() {
</div> </div>
<el-table v-loading="loading" :data="tableData" style="width: 100%; height: calc(100vh - 300px);margin-bottom: 10px;" border <el-table v-loading="loading" :data="tableData" style="width: 100%; height: calc(100vh - 300px);margin-bottom: 10px;" border
@cell-click="selectPatient" highlight-current-row row-key="id" :header-cell-style="{ background: 'rgb(250 250 250)', color: '#383838', height: '50px' }"> @cell-click="selectPatient" highlight-current-row row-key="id" :header-cell-style="{ background: 'rgb(250 250 250)', color: '#383838', height: '50px' }">
<el-table-column type="selection" width="50" align="center"></el-table-column>
<el-table-column type="index" label="序号" width="70" align="center"></el-table-column>
<el-table-column type="index" label="序号" width="70" align="center"></el-table-column> <el-table-column type="index" label="序号" width="70" align="center"></el-table-column>
<el-table-column prop="name" label="设备名称" min-width="180"></el-table-column> <el-table-column prop="name" label="设备名称" min-width="180"></el-table-column>
<el-table-column v-if="deviceTypetype == 'FlatTank'" prop="length" label="长度(cm)" min-width="100"></el-table-column> <el-table-column v-if="deviceTypetype == 'FlatTank'" prop="length" label="长度(cm)" min-width="100"></el-table-column>

View File

@ -0,0 +1,369 @@
<script lang="ts">
export default {
name: "变动设置",
};
</script>
<script setup lang="ts">
import { onMounted, ref, nextTick } from "vue";
import { ElForm, ElMessage, ElMessageBox } from "element-plus";
import { searchDevicesPage } from "@/api/business/database/device";
const emit = defineEmits([ 'closeChangesettingsModel']);
const props = defineProps({
projectInfo: {
required: false,
type: Object,
default: {}
},
deviceInfo:{
required: false,
type: Object,
default: {}
},
materialInfo: {
required: false,
type: Object,
default: {}
},
materialId: {
required: false,
type: String,
default: ""
},
changesettingsData: {
required: false,
type: Array,
default: []
}
})
const deviceTypetype:any = ref("")
const deviceName:any = ref(props.deviceInfo.name) //
const materialName:any = ref(props.materialInfo.name) //
const tableData:any = ref([])
function gettableData() {
let params = {
name: "",
type: deviceTypetype.value,
pageNum: 1,
pageSize: 999,
};
if(deviceTypetype.value == ''){
return
}
searchDevicesPage(params).then((result:any) => {
deviceList.value = result.records;
}).catch((err) => {
});
}
onMounted(() => {
deviceTypetype.value = props.deviceInfo.type
if(props.changesettingsData != null && props.changesettingsData.length > 0){
tableData.value = props.changesettingsData
}else{
getInit(props.materialInfo);
}
gettableData()
});
function getInit(row:any){
tableData.value = []
if(row != null){
tableData.value.push({
key: "铀浓度g/L",
name: "u_concentration",
value: row.uConcentration,
unit: "g/L",
formula: '',
correlation: '',
delay: '',
},{
key: "氧化铀密度g/cm3",
name: "uo2_density",
value: row.uo2Density,
unit: "g/cm3",
formula: '',
correlation: '',
delay: '',
},{
key: "铀富集度(%",
name: "u_enrichment",
value: row.uEnrichment,
unit: "%",
formula: '',
correlation: '',
delay: '',
},{
key: "钚浓度g/L",
name: "pu_concentration",
value: row.puConcentration,
unit: "g/L",
formula: '',
correlation: '',
delay: '',
},{
key: "氧化钚密度g/cm3",
name: "puo2_density",
value: row.puo2Density,
unit: "g/cm3",
formula: '',
correlation: '',
delay: '',
},{
key: "钚同位素比例PU-240占比%",
name: "pu_isotope",
value: row.puIsotope,
unit: "%",
formula: '',
correlation: '',
delay: '',
},{
key: "硝酸酸度mol/L",
name: "hno3_acidity",
value: row.hno3Acidity,
unit: "mol/L",
},{
key: "草酸浓度mol/L",
name: "h2c2o4_concentration",
value: row.h2c2o4Concentration,
unit: "mol/L",
formula: '',
correlation: '',
delay: '',
},{
key: "有机相比例%",
name: "organic_ratio",
value: row.organicRatio,
unit: "%",
formula: '',
correlation: '',
delay: '',
},{
key: "含水率%",
name: "moisture_content",
value: row.moistureContent,
unit: "%",
formula: '',
correlation: '',
delay: '',
})
let tempData = []
if(row.customAttrs !=null && row.customAttrs != ""){
tempData = JSON.parse(row.customAttrs)
}
for(let i = 0; i < tempData.length; i++){
let attr = tempData[i]
tableData.value.push({
key: attr.key,
value: attr.value,
unit: attr.unit,
formula: '',
correlation: '',
delay: '',
})
}
}
}
function confirmClick(){ //
emit('closeChangesettingsModel',tableData.value)
}
const isDialogFormula:any = ref(false) //
const deviceList:any = ref([]) //
const isAcitve:any = ref(-1) //
const tempFormulaInfo:any = ref({})
const formulaInfo:any = ref({})
const tableIndex:any = ref(-1) //
function dialogFormulaOpen(row:any,index:any){
isAcitve.value = -1
tableIndex.value = index
formulaInfo.value = JSON.parse(JSON.stringify(row))
tempFormulaInfo.value = row
isDialogFormula.value = true
}
function dialogMaterialClose(){ //
isDialogFormula.value = false
}
function handleClick(item:any, index:any){
formulaInfo.value.correlation = JSON.parse(JSON.stringify(item.name))
isAcitve.value = index
}
function handleClose(){ //
isDialogFormula.value = false
}
function confirmTableClick(){ //
tableData.value[tableIndex.value].formula = formulaInfo.value.formula
tableData.value[tableIndex.value].correlation = formulaInfo.value.correlation
tableData.value[tableIndex.value].delay = formulaInfo.value.delay
isDialogFormula.value = false
}
</script>
<template>
<div class="editdevice-box">
<div>
<div style="display: flex; align-items: center;">
<div style="width: 80px;">
变动设备
</div>
<el-input v-model="deviceName" style="width: 300px" placeholder="" :disabled="true"></el-input>
<div style="width: 80px;">
物料名称
</div>
<el-input v-model="materialName" style="width: 300px" placeholder="" :disabled="true"></el-input>
</div>
</div>
<div style="display: flex;align-items: center;padding: 20px 0;">
<div class="materialmodel-title-line"></div>
<div>物料成分</div>
</div>
<div class="table-box">
<el-table :data="tableData" style="width: 100%" border>
<el-table-column prop="key" label="属性" width="280"></el-table-column>
<el-table-column prop="value" label="值" width="150"></el-table-column>
<el-table-column prop="formula" label="计算公式" min-width="100"></el-table-column>
<el-table-column fixed="right" label="操作" width="80" align="center">
<template #default="scope">
<span style=" font-family: '微软雅黑';
font-weight: 400;
font-style: normal;
font-size: 14px;
color: #266FFF;
text-align: left;
cursor: pointer;" @click="dialogFormulaOpen(scope.row,scope.$index)">设置</span>
</template>
</el-table-column>
</el-table>
</div>
<div style="display: flex; justify-content: flex-end;margin-top: 10px;">
<el-button type="primary" @click="confirmClick">确定</el-button>
</div>
<el-dialog v-model="isDialogFormula" :close-on-click-modal="false" :modal="false" draggable
:before-close="dialogMaterialClose" title="变动公式设置" append-to-body width="994px" class="materialmodel-dialog-box">
<div style="display: flex;">
<div class="choiceMateria-left">
<div class="choiceMateria-left-title">设备列表</div>
<div style="height: calc(100% - 70px);overflow: auto;margin-top: 10px;">
<div v-for="(item, index) in deviceList" :key="index" class="choiceMateria-left-item"
:class="{'choiceMateria-item-active': index == isAcitve}"
@click="handleClick(item, index)">
{{ item.name }}
</div>
</div>
</div>
<div style="padding-left: 45px;padding-top: 40px; width: calc(100% - 290px);">
<el-form :model="formulaInfo" label-width="80px"
style="height: calc(100vh - 360px) ; overflow: auto;">
<el-form-item label="变动设备" style="width: 100%;" label-width="80px">
<el-input v-model="deviceName" style="width: 100%" :disabled="true"></el-input>
</el-form-item>
<el-form-item label="物料名称" style="width: 100%;" label-width="80px">
<el-input v-model="materialName" style="width: 100%" :disabled="true"></el-input>
</el-form-item>
<el-form-item label="成分" style="width: 100%;" label-width="80px">
<el-input v-model="formulaInfo.key" style="width: 100%" :disabled="true"></el-input>
</el-form-item>
<div style="display: flex;align-items: center;padding: 20px 0;">
<div class="materialmodel-title-line"></div>
<div>变动公式</div>
</div>
<el-form-item label="值=" style="width: 100%;" label-width="80px">
<el-input v-model="formulaInfo.formula" style="width: 100%"></el-input>
</el-form-item>
<div style="display: flex;align-items: center;padding: 20px 0;">
<div class="materialmodel-title-line"></div>
<div>延时设置</div>
</div>
<div style="display: flex;align-items: center;">
<el-form-item label="关联设备" >
<el-input v-model="formulaInfo.correlation" style="width: 100%" placeholder=""></el-input>
</el-form-item>
<el-form-item label="延时时间" >
<el-input v-model="formulaInfo.delay" style="width: 100%" placeholder=""></el-input>
</el-form-item>
</div>
</el-form>
<span class="dialog-footer"
style="display: flex;display: -webkit-flex; justify-content: flex-end;-webkit-justify-content: flex-end;">
<el-button @click="handleClose"> </el-button>
<el-button type="primary" @click="confirmTableClick"> </el-button>
</span>
</div>
</div>
</el-dialog>
</div>
</template>
<style scoped>
.editdevice-box{
width: 100%;
height: calc(100vh - 200px);
}
.materialmodel-title-line{
width: 4px;
height: 12px;
background-color: rgba(38, 111, 255, 1);
margin-right: 4px;
}
.choiceMateria-left{
width: 240px;
height: calc(100vh - 200px);
border-right: 1px solid rgba(240, 240, 240, 1);
box-sizing: border-box;
}
.choiceMateria-left-title{
width: 240px;
height: 44px;
line-height: 44px;
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
font-weight: 700;
font-style: normal;
font-size: 14px;
color: #1B1B1B;
padding-left: 16px;
border-bottom: 1px solid rgba(240, 240, 240, 1);
}
.choiceMateria-left-item{
width: 100%;
height: 40px;
line-height: 40px;
padding-left: 16px;
font-family: 'Arial Normal', 'Arial';
font-weight: 400;
font-style: normal;
font-size: 14px;
color: #333333;
cursor: pointer;
}
.choiceMateria-left-item:hover{
background-color: #f5f8ff;
}
.choiceMateria-item-active{
background-color: #f5f8ff;
color: #266fff;
}
</style>
<style>
.materialmodel-dialog-box.el-dialog .el-dialog__body{
padding: 0 !important;
}
</style>

View File

@ -35,7 +35,7 @@ import line6 from '@/assets/x6/line6.png'
import AdddeviceModel from './adddevice.vue'; import AdddeviceModel from './adddevice.vue';
import EditdeviceModel from './editdevice.vue'; import EditdeviceModel from './editdevice.vue';
import MaterialModels from './materialmodel.vue'; import MaterialModels from './materialmodel.vue';
import ChangesettingsModels from './changesettings.vue';
const emit = defineEmits([ 'closeAntvx6']); const emit = defineEmits([ 'closeAntvx6']);
@ -639,7 +639,6 @@ graph.on('blank:mouseup', (e) => {
}, },
}), }),
) )
console.log(imageNodes)
stencil.load(imageNodes, 'group2') stencil.load(imageNodes, 'group2')
// 线 // 线
@ -858,51 +857,7 @@ function copyNode() { // 复制节点
function closeAntvx6() { function closeAntvx6() {
emit('closeAntvx6') emit('closeAntvx6')
} }
function saveDesign() { //
try {
// JSON
const designData:any = graph.toJSON()
let cells = []
if(designData !=null && designData.cells.length>0){
cells = designData.cells
}
const topology = {
projectId: projectInfo.value.projectId,
name: projectInfo.value.name,
devices:[],
pipelines:[],
systemboundaries:[],
globalDisplay:{
device:{
showProperties:[]
},
material:{
showProperties:[]
},
},
designData:cells
}
//
const saveData = {
projectId: projectInfo.value.projectId,
topology: JSON.stringify(topology)
}
updateProjects(saveData).then((res:any) => {
if(res === true){
ElMessage({
type: "success",
message: "保存成功",
});
}
});
//
return saveData
} catch (error) {
console.error('保存设计失败:', error)
return null
}
}
function revokeClick(){ function revokeClick(){
graph.undo() graph.undo()
} }
@ -989,14 +944,180 @@ function dialogMaterialModel(){ // 关闭物料信息弹窗
} }
function closeMaterialModel(e:any){ // function closeMaterialModel(e:any){ //
if(e == false){ if(e == false){
isEditdevice.value = false; isMaterialModel.value = false;
return return
} }
selectedMaterial.value = e selectedMaterial.value = e
let retrievedNode:any = graph.getCellById(nodeId.value) let retrievedNode:any = graph.getCellById(nodeId.value)
retrievedNode.store.data.materialInfo = e retrievedNode.store.data.materialInfo = e
isEditdevice.value = false; isMaterialModel.value = false;
}
const isChangesettings = ref(false)
const changesettingsData:any = ref([]) //
function dialogChangesettings(){ //
isChangesettings.value = false;
}
function ChangesettingsClick(){ //
changesettingsData.value = []
if(selectedNode.value.store.data.deviceInfo == null){
ElMessage({
type: "error",
message: "请先添加设备信息",
});
return
}
if(selectedNode.value.store.data.materialInfo == null){
ElMessage({
type: "error",
message: "请先添加物料信息",
});
return
}
deviceInfo.value = selectedNode.value.store.data.deviceInfo
materialInfo.value = selectedNode.value.store.data.materialInfo
if(selectedNode.value.store.data.changesettings != null){
changesettingsData.value = selectedNode.value.store.data.changesettings
}
nodeId.value = selectedNode.value.id
if(materialInfo.value != null){
deviceTypetype.value = materialInfo.value.type
}
isChangesettings.value = true;
}
function closeChangesettingsModel(e:any){ //
if(e == false){
isChangesettings.value = false;
return
}
selectedMaterial.value = e
let retrievedNode:any = graph.getCellById(nodeId.value)
retrievedNode.store.data.changesettings = e
isChangesettings.value = false;
}
function setFormulaInit(formula:any) {
// const formula = "(B)*0.2+(A)*1.0+0.5";
// *+)
const regex = /\*(\d+\.?\d*)/g;
const coefficients = [];
let match;
//
while ((match = regex.exec(formula)) !== null) {
coefficients.push(parseFloat(match[1])); //
}
console.log(coefficients); // : [0.2, 1.0]
return coefficients
}
function getBias(formula:any){
// +
const lastPlusIndex = formula.lastIndexOf('+');
// +
const constantStr = formula.slice(lastPlusIndex + 1, -1);
const constant = parseFloat(constantStr);
return constant
}
function saveDesign() { //
try {
// JSON
const designData:any = graph.toJSON()
let cells:any = []
if(designData !=null && designData.cells.length>0){
cells = designData.cells
}
let devices = []
for(let i=0;i<cells.length;i++){
if(cells[i].shape == 'custom-image'){
let tempData:any = {}
if(cells[i].changesettings && cells[i].changesettings.length > 0){
for(let j=0;j<cells[i].changesettings.length;j++){
if(cells[i].changesettings[j].formula != '' && cells[i].changesettings[j].formula != null){
const key = cells[i].changesettings[j].name as string
const unit = cells[i].changesettings[j].unit
let tempSources = []
for(let k=0;k<setFormulaInit(cells[i].changesettings[j].formula).length;k++){
tempSources.push({
entityType: 'material', //B
entityId: cells[i].materialInfo.materialId , //materialId : cdeeca2e-1e0c-4bdd-b946-f347c104752c
property: unit, // g/L
coefficient: setFormulaInit(cells[i].changesettings[j].formula)[k], //0.2
delay: { enabled: true, time: 0, unit: 's' } // 5
})
}
tempData[key] = {
name: tempData[key],
type:'influence',
unit:unit,
base:0,
bias: getBias(cells[i].changesettings[j].formula) || 0,
sources:tempSources,
expression:cells[i].changesettings[j].formula
}
}
}
}
devices.push({
deviceId:cells[i].id,
name:cells[i].deviceInfo.name,
type:cells[i].deviceInfo.type,
properties:{},
material: cells[i].materialInfo != null ? {
materialId:cells[i].id,
name:cells[i].materialInfo.name,
properties:tempData
}:{}
})
}
}
const topology = {
projectId: projectInfo.value.projectId,
name: projectInfo.value.name,
devices:devices,
pipelines:[],
systemboundaries:[],
globalDisplay:{
device:{
showProperties:[]
},
material:{
showProperties:[]
},
},
designData:cells
}
//
const saveData = {
projectId: projectInfo.value.projectId,
topology: JSON.stringify(topology)
}
updateProjects(saveData).then((res:any) => {
if(res === true){
ElMessage({
type: "success",
message: "保存成功",
});
}
});
//
return saveData
} catch (error) {
console.error('保存设计失败:', error)
return null
}
} }
</script> </script>
@ -1062,7 +1183,7 @@ function closeMaterialModel(e:any){ // 关闭物料信息弹窗
<div class="context-menu" v-if="isMenuShow" :style="{left: left +'px', top: top+'px'}"> <div class="context-menu" v-if="isMenuShow" :style="{left: left +'px', top: top+'px'}">
<img src="@/assets/x6/info.png" alt="图标" title="设备信息" style="cursor: pointer;" @click="EditdeviceClick"> <img src="@/assets/x6/info.png" alt="图标" title="设备信息" style="cursor: pointer;" @click="EditdeviceClick">
<img src="@/assets/x6/material.png" alt="图标" title="物料信息" style="cursor: pointer;" @click="MaterialModelClick"> <img src="@/assets/x6/material.png" alt="图标" title="物料信息" style="cursor: pointer;" @click="MaterialModelClick">
<img src="@/assets/x6/change.png" alt="图标" title="变动设置" style="cursor: pointer;"> <img src="@/assets/x6/change.png" alt="图标" title="变动设置" style="cursor: pointer;" @click="ChangesettingsClick">
<img src="@/assets/x6/copy.png" alt="图标" title="复制" style="cursor: pointer;" @click="copyNode"> <img src="@/assets/x6/copy.png" alt="图标" title="复制" style="cursor: pointer;" @click="copyNode">
<img src="@/assets/x6/del.png" alt="图标" title="删除" style="cursor: pointer;" <img src="@/assets/x6/del.png" alt="图标" title="删除" style="cursor: pointer;"
@click="deleteNode"> @click="deleteNode">
@ -1100,20 +1221,17 @@ function closeMaterialModel(e:any){ // 关闭物料信息弹窗
:deviceTypetype="deviceTypetype" ref="Editdevice" @closeEditdevice="closeEditdevice"/> :deviceTypetype="deviceTypetype" ref="Editdevice" @closeEditdevice="closeEditdevice"/>
</el-dialog> </el-dialog>
<!-- <el-dialog v-model="isEditdevice" :close-on-click-modal="false" :modal="false" draggable :before-close="dialogEditdevice" title="添加设备" append-to-body width="1050px">
<EditdeviceModel v-if="isEditdevice == true" :deviceId="nodeId" :deviceInfo="deviceInfo"
:deviceTypetype="deviceTypetype" ref="Editdevice" @closeEditdevice="closeEditdevice"/>
</el-dialog> -->
<!-- <el-dialog v-model="isEditdevice" :close-on-click-modal="false" :modal="false" draggable :before-close="dialogEditdevice" title="添加设备" append-to-body width="1050px">
<EditdeviceModel v-if="isEditdevice == true" :deviceId="nodeId" :deviceInfo="deviceInfo"
:deviceTypetype="deviceTypetype" ref="Editdevice" @closeEditdevice="closeEditdevice"/>
</el-dialog> -->
<el-dialog v-model="isMaterialModel" :close-on-click-modal="false" :modal="false" draggable :before-close="dialogMaterialModel" title="物料信息" append-to-body width="1014px"> <el-dialog v-model="isMaterialModel" :close-on-click-modal="false" :modal="false" draggable :before-close="dialogMaterialModel" title="物料信息" append-to-body width="1014px">
<MaterialModels v-if="isMaterialModel == true" :materiaId="nodeId" :materialInfo="materialInfo" :deviceInfo="deviceInfo" <MaterialModels v-if="isMaterialModel == true" :materialId="nodeId" :projectInfo="projectInfo"
:deviceTypetype="deviceTypetype" ref="MaterialModel" @closeMaterialModel="closeMaterialModel"/> :materialInfo="materialInfo" :deviceInfo="deviceInfo" :deviceTypetype="deviceTypetype" ref="MaterialModel" @closeMaterialModel="closeMaterialModel"/>
</el-dialog> </el-dialog>
<el-dialog v-model="isChangesettings" :close-on-click-modal="false" :modal="false" draggable :before-close="dialogChangesettings" title="变动设置" append-to-body width="1014px">
<ChangesettingsModels v-if="isChangesettings == true" :materialId="nodeId" :projectInfo="projectInfo" :changesettingsData="changesettingsData"
:materialInfo="materialInfo" :deviceInfo="deviceInfo" ref="ChangesettingsModel" @closeChangesettingsModel="closeChangesettingsModel"/>
</el-dialog>
</div> </div>
</template> </template>

View File

@ -215,7 +215,7 @@ function handleClick(item:any, index:any){
for(let i = 0; i < tempData.length; i++){ for(let i = 0; i < tempData.length; i++){
let attr = tempData[i] let attr = tempData[i]
ingredientData.value.push({ ingredientData.value.push({
key: attr.name, key: attr.key,
value: attr.value, value: attr.value,
unit: attr.unit, unit: attr.unit,
}) })
@ -443,6 +443,7 @@ function confirmMaterial(){
font-style: normal; font-style: normal;
font-size: 14px; font-size: 14px;
color: #333333; color: #333333;
cursor: pointer;
} }
.choiceMateria-left-item:hover{ .choiceMateria-left-item:hover{
background-color: #f5f8ff; background-color: #f5f8ff;