潘志宝
2025-02-28 4a859a6d69984c77fa8166255c65f5a94eb0bd71
src/views/model/sche/model/ScheduleModelForm.vue
@@ -103,7 +103,7 @@
          width="100"
          align="center">
          <template #default="scope">
            <el-input v-model="scope.row.modelparamportorder" maxlength="5" clearable :disabled="true"
            <el-input v-model="scope.row.modelparamportorder" maxlength="5" clearable
                      style="width:100%; hight:100%"/>
          </template>
        </el-table-column>
@@ -210,6 +210,7 @@
        <el-table-column
          prop=""
          label="键"
          min-width="150"
          align="center">
          <template #default="scope">
            <el-input v-model="scope.row.key" maxlength="20" clearable :disabled="true"
@@ -219,6 +220,7 @@
        <el-table-column
          prop=""
          label="名称"
          min-width="150"
          align="center">
          <template #default="scope">
            <el-input v-model="scope.row.name" maxlength="20" clearable :disabled="true"
@@ -228,6 +230,7 @@
        <el-table-column
          prop=""
          label="类型"
          min-width="100"
          align="center">
          <template #default="scope">
            <el-select v-model="scope.row.valuetype" placeholder="请选择" :disabled="true">
@@ -243,34 +246,99 @@
        <el-table-column
          prop=""
          label="值"
          min-width="300"
          align="center">
          <template #default="scope">
            <el-input v-model="scope.row.value" maxlength="256" clearable  :disabled="scope.row.key === 'pyFile'"
            <el-input v-model="scope.row.value" maxlength="256" clearable
                      :disabled="scope.row.key === 'pyFile_BAK'"
                      style="width:100%;hight:100%"/>
          </template>
        </el-table-column>
<!--        <el-table-column-->
<!--          prop=""-->
<!--          label="操作"-->
<!--          width="100"-->
<!--          align="center">-->
<!--          <template #default="scope">-->
<!--            <el-button-->
<!--              @click.prevent="addRow(scope.$index, formData.settingList)"-->
<!--              link-->
<!--              type="primary"-->
<!--              size="small">-->
<!--              添加-->
<!--            </el-button>-->
<!--            <el-button-->
<!--              @click.prevent="deleteRow(scope.$index, formData.settingList)"-->
<!--              link-->
<!--              type="primary"-->
<!--              size="small">-->
<!--              删除-->
<!--            </el-button>-->
<!--          </template>-->
<!--        </el-table-column>-->
      </el-table>
      <el-divider content-position="left">模型下发配置</el-divider>
      <el-row :gutter="20">
        <el-col :span="4">
          <el-button type="primary" size="small" @click="addRowOut()" >新增</el-button>
        </el-col>
      </el-row>
      <el-table
        :data="formData.modelOut"
        border
        style="width: 100%; margin-top: 5px;">
        <el-table-column prop="resultKey" label="输出key" align="center" min-width="100">
          <template #default="scope">
            <el-input size="mini" v-model="scope.row.resultKey" style="width:100%;height:100%"/>
          </template>
        </el-table-column>
        <el-table-column prop="resultType" label="数据类型" align="center" min-width="150">
          <template #default="scope">
            <el-select v-model="scope.row.resultType" placeholder="请选择">
              <el-option
                v-for="dict in getStrDictOptions(DICT_TYPE.RESULT_TYPE)"
                :key="dict.value"
                :label="dict.label"
                :value="dict.value"
              />
            </el-select>
          </template>
        </el-table-column>
        <el-table-column prop="resultPort" label="角标1" align="center" min-width="100">
          <template #default="scope">
            <el-input-number :min="0" clearable controls-position="right" size="mini" v-model="scope.row.resultPort" style="width:100%;height:100%"/>
          </template>
        </el-table-column>
        <el-table-column prop="resultIndex" label="角标2" align="center" min-width="100">
          <template #default="scope">
            <el-input-number :min="0" clearable controls-position="right" size="mini" v-model="scope.row.resultIndex" style="width:100%;height:100%"/>
          </template>
        </el-table-column>
        <el-table-column prop="isWrite" label="是否下发" align="center" min-width="100">
          <template #default="scope">
            <el-switch size="small" v-model="scope.row.isWrite" :active-value="1"
                       :inactive-value="0"/>
          </template>
        </el-table-column>
        <el-table-column
          prop=""
          label="测点名称"
          align="center" min-width="200">
          <template #default="scope">
            <el-select v-model="scope.row.pointNo"
                       filterable
                       placeholder="请选择">
              <el-option
                v-for="(item, index) in modelparamListMap['DATAPOINT']"
                :key="index"
                :label="item.name"
                :value="item.itemNo"/>
            </el-select>
          </template>
        </el-table-column>
        <el-table-column prop="disturbancePointNo’" label="无扰切换点位" align="center" min-width="200">
          <template #default="scope">
            <el-select v-model="scope.row.disturbancePointNo"
                       clearable
                       filterable
                       placeholder="请选择">
              <el-option
                v-for="(item, index) in modelparamListMap['DATAPOINT']"
                :key="index"
                :label="item.name"
                :value="item.itemNo"/>
            </el-select>
          </template>
        </el-table-column>
        <el-table-column label="操作" fixed="right" header-align="center" align="center" width="100">
          <template #default="scope">
            <el-button
              @click="deleteModelOutRow(scope.$index)"
              key="danger"
              type="danger"
              link
            >删除
            </el-button>
          </template>
        </el-table-column>
      </el-table>
    </el-form>
    <template #footer>
@@ -284,6 +352,9 @@
  import * as ScheduleModelApi from '@/api/model/sche/model'
  import { CommonStatusEnum } from '@/utils/constants'
  import * as MpkApi from "@/api/model/mpk/mpk";
  import {generateUUID} from "@/utils";
  import { ElMessage,ElMessageBox } from 'element-plus'
  import { Refresh } from '@element-plus/icons-vue'
  defineOptions({ name: 'ScheduleModelForm' })
@@ -306,8 +377,15 @@
    resultStrId: undefined,
    invocation: undefined,
    status: CommonStatusEnum.ENABLE,
    paramList: [],
    settingList: []
    paramList: [{
      modelparamportorder: 1 + '',
      modelparamorder: '1',
      modelparamtype: '',
      modelparamid: '',
      datalength: 0
    }],
    settingList: [],
    modelOut: []
  })
  const formRules = reactive({
    modelCode: [{ required: true, message: '模型编号不能为空', trigger: 'blur' }],
@@ -378,6 +456,21 @@
    if (!formRef) return
    const valid = await formRef.value.validate()
    if (!valid) return
    //校验模型输入
    formData.value.paramList.forEach(e => {
      if (e.modelparamid == undefined || e.modelparamid == '') {
        message.error("输入数据异常")
        throw new Error('输入数据异常');
      }
      // ind_ascii类型输出的序号必须是1,且所在端口序号最大为1(一个ind_ascii类型输入独占一个端口)
      if (e.modelparamtype === 'IND_ASCII') {
        if (e.modelparamorder != 1 || formData.value.paramList.filter(p => p.modelparamportorder === e.modelparamportorder).length != 1) {
          message.error("输入数据异常:IND_ASCII类型输入独占一个端口")
          throw new Error('输入数据异常:IND_ASCII类型输入独占一个端口');
        }
      }
    })
    // 提交请求
    formLoading.value = true
    try {
@@ -412,8 +505,15 @@
      resultStrId: undefined,
      invocation: undefined,
      status: CommonStatusEnum.ENABLE,
      paramList: [],
      settingList: []
      paramList: [{
        modelparamportorder: 1 + '',
        modelparamorder: '1',
        modelparamtype: '',
        modelparamid: '',
        datalength: 0
      }],
      settingList: [],
      modelOut: []
    }
    formRef.value?.resetFields()
  }
@@ -440,23 +540,39 @@
  const changeModel = async () => {
    // 校验
    if (model.value && model.value.length > 0) {
      const modelInfo = model.value[0]
      const methodInfo = model.value[1]
      formData.value.modelName = modelInfo.pyChineseName
      formData.value.className = modelInfo.pkgName + '.impl.' + modelInfo.pyName + 'Impl';
      formData.value.methodName = methodInfo.methodName
      formData.value.portLength = methodInfo.dataLength
      // 参数构造
      let paramStructure = []
      for (let i = 0; i < methodInfo.dataLength; i++) {
        paramStructure.push('[[D')
      }
      if (methodInfo.model === 1) {
        paramStructure.push('java.util.HashMap')
      }
      ElMessageBox.confirm(
        '是否更新输入参数?',
        '提示',
        {confirmButtonText: '是', cancelButtonText: '否', type: 'success',icon: markRaw(Refresh),closeOnClickModal:false,closeOnPressEscape:false}
      ).then(() => {
        relevanceModel(true)
      }).catch(() => {
        relevanceModel(false)
      })
    }else {
      message.error("请先选择模型")
    }
  }
  function relevanceModel(refreshParam) {
    const modelInfo = model.value[0]
    const methodInfo = model.value[1]
    formData.value.modelName = modelInfo.pyChineseName
    formData.value.className = modelInfo.pkgName + '.impl.' + modelInfo.pyName + 'Impl';
    formData.value.methodName = methodInfo.methodName
    formData.value.portLength = methodInfo.dataLength
    // 参数构造
    let paramStructure = []
    for (let i = 0; i < methodInfo.dataLength; i++) {
      paramStructure.push('[[D')
    }
    if (methodInfo.model === 1) {
      paramStructure.push('java.util.HashMap')
      formData.value.paramStructure = paramStructure.join(',')
      formData.value.modelPath = modelInfo.pyModule
    }
    paramStructure.push('java.util.HashMap')
    formData.value.paramStructure = paramStructure.join(',')
    formData.value.modelPath = modelInfo.pyModule
    if (refreshParam) {
      // 输入参数
      let paramList = []
      for (let i = 0; i < methodInfo.dataLength; i++) {
@@ -468,26 +584,42 @@
          datalength: 0
        })
      }
      formData.value.paramList = paramList
      // 设置参数
      let settingList = []
      methodInfo.methodSettings.forEach(e => {
        settingList.push({
          key: e.settingKey,
          value: e.value,
          valuetype: e.valueType,
          name: e.name
        })
      })
      formData.value.settingList = settingList
      modelPopover.value.hide()
    }else {
      message.error("请先选择模型")
    }
    // 设置参数
    let settingList = []
    methodInfo.methodSettings.forEach(e => {
      settingList.push({
        key: e.settingKey,
        value: e.value,
        valuetype: e.valueType,
        name: e.name
      })
    })
    formData.value.settingList = settingList
    modelPopover.value.hide()
  }
  function changeModelparamtype(row) {
    row.modelparamid = ''
  }
  const addRowOut= function () {
    if(formData.value.modelOut===undefined) {
      formData.value.modelOut = []
    }
    formData.value.modelOut.push({
      id: generateUUID(),
      resultKey: undefined,
      resultType: "double[][]",
      port: 0,
      index: 0,
      isWrite: 1,
      pointNo:undefined,
      sort:undefined,
      disturbancePointNo:undefined,
    })
  }
  const deleteModelOutRow = function (index) {
    formData.value.modelOut.splice(index, 1)
  }
</script>