liriming
2025-03-03 d6fd1acfe3cae8ec7e9b2abee436e1fce1025ec2
模拟调整
已添加5个文件
660 ■■■■■ 文件已修改
src/api/model/sche/adjust/index.ts 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/model/sche/result/index.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/model/sche/adjust/AdjustConfigForm.vue 269 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/model/sche/adjust/index.vue 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/model/sche/adjust/result/index.vue 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/model/sche/adjust/index.ts
对比新文件
@@ -0,0 +1,39 @@
import request from '@/config/axios'
export interface AdjustConfigVO {
  id: string
  scheduleModelId: string
  remark: string
  status: number
  adjustConfigDetList: []
}
export interface AdjustConfigPageReqVO extends PageParam {
  modelCode?: string
  modelName?: string
}
// 查询AdjustConfig列表
export const getAdjustConfigPage = (params: AdjustConfigPageReqVO) => {
  return request.get({ url: '/model/sche/adjust/page', params })
}
// 查询AdjustConfig详情
export const getAdjustConfig = (id: number) => {
  return request.get({ url: '/model/sche/adjust/get?id=' + id})
}
// 新增AdjustConfig
export const createAdjustConfig = (data: AdjustConfigVO) => {
  return request.post({ url: '/model/sche/adjust/create', data })
}
// 修改AdjustConfig
export const updateAdjustConfig = (data: AdjustConfigVO) => {
  return request.put({ url: '/model/sche/adjust/update', data })
}
// 删除AdjustConfig
export const deleteAdjustConfig = (id: number) => {
  return request.delete({ url: '/model/sche/adjust/delete?id=' + id })
}
src/api/model/sche/result/index.ts
对比新文件
@@ -0,0 +1,15 @@
import request from '@/config/axios'
export interface StAdjustResultPageReqVO extends PageParam {
  configId?: string
}
// 查询AdjustResult列表
export const getAdjustResultPage = (params: StAdjustResultPageReqVO) => {
  return request.get({ url: '/model/sche/adjust-result/page', params })
}
// 查询AdjustResult详情
export const getAdjustResult = (id: string) => {
  return request.get({ url: '/model/sche/adjust-result/get?id=' + id})
}
src/views/model/sche/adjust/AdjustConfigForm.vue
对比新文件
@@ -0,0 +1,269 @@
<template>
  <Dialog v-model="dialogVisible" :title="dialogTitle" width="65%">
    <el-form
      ref="formRef"
      v-loading="formLoading"
      :model="dataForm"
      :rules="formRules"
      label-width="120px"
    >
      <el-row>
        <el-col :span="12">
          <el-form-item label="调度模型" prop="scheduleModelId">
            <el-select v-model="dataForm.scheduleModelId" clearable placeholder="请选择调度模型">
              <el-option
                v-for="item in scheduleModelList"
                :key="item.id"
                :label="item.modelName"
                :value="item.id"
              />
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="状态" prop="status">
            <el-select
              v-model="dataForm.status"
              placeholder="请选择"
              clearable
              style="width: 100%">
              <el-option
                v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
                :key="dict.value"
                :label="dict.label"
                :value="dict.value"
              />
            </el-select>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="24">
          <el-form-item label="备注" prop="remark">
            <el-input v-model="dataForm.remark" placeholder="请输入备注"/>
          </el-form-item>
        </el-col>
      </el-row>
      <el-divider content-position="left">配置</el-divider>
      <el-button
        @click="addAdjustConfigDet()"
        type="primary"
        size="small">
        添加
      </el-button>
      <el-table
        :data="dataForm.adjustConfigDetList"
        border
        style="width: 100%; margin-top: 5px;">
        <el-table-column prop="sort" label="执行顺序" align="center" width="90px"/>
        <el-table-column label="预测项类型" align="center" width="220px">
          <template #default="scope">
            <el-select v-model="scope.row.itemTypeId" placeholder="请选择" @change="changeitemTypeId(scope.row)">
              <el-option
                v-for="dict in getStrDictOptions(DICT_TYPE.MODEL_PARAM_TYPE)"
                :key="dict.value"
                :label="dict.label"
                :value="dict.value"
              />
            </el-select>
          </template>
        </el-table-column>
        <el-table-column label="预测项名" align="center" width="300px">
          <template #default="scope">
            <el-select v-if="scope.row.itemTypeId === 'NormalItem'"
                       v-model="scope.row.predictItemId"
                       placeholder="请选择"
                       filterable
                       style="width: 100%">
              <el-option-group
                v-for="group in modelparamListMap['NormalItem']"
                :key="group.value"
                :label="group.label"
              >
                <el-option
                  v-for="item in group.children"
                  :key="item.value"
                  :label="item.label"
                  :value="item.value"
                />
              </el-option-group>
            </el-select>
            <el-select v-else
                       v-model="scope.row.predictItemId"
                       filterable
                       placeholder="请选择">
              <el-option
                v-for="(item, index) in modelparamListMap[scope.row.itemTypeId]"
                :key="index"
                :label="item.name"
                :value="item.id"/>
            </el-select>
          </template>
        </el-table-column>
        <el-table-column label="输出KEY" align="center">
          <template #default="scope">
            <el-input v-model="scope.row.outKey" placeholder="输出KEY"/>
          </template>
        </el-table-column>
        <el-table-column label="输出名称" align="center">
          <template #default="scope">
            <el-input v-model="scope.row.outName" placeholder="输出名称"/>
          </template>
        </el-table-column>
        <el-table-column label="参数排序" align="center" width="105px">
          <template #default="scope">
            <el-input v-model="scope.row.modelParamOrder" placeholder="参数排序"/>
          </template>
        </el-table-column>
        <el-table-column label="输入排序" align="center" width="105px">
          <template #default="scope">
            <el-input v-model="scope.row.modelParamPortOrder" placeholder="输入排序"/>
          </template>
        </el-table-column>
        <el-table-column prop="" label="操作" align="center" width="100px">
          <template #default="scope">
            <el-button
              @click="deleteAdjustConfigDet(scope.$index, dataForm.adjustConfigDetList)"
              type="text"
              size="small">
              删除
            </el-button>
          </template>
        </el-table-column>
      </el-table>
    </el-form>
    <template #footer>
      <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
      <el-button @click="dialogVisible = false">取 消</el-button>
    </template>
  </Dialog>
</template>
<script lang="ts" setup>
import * as AdjustConfigApi from '@/api/model/sche/adjust'
import * as MmItemType from "@/api/model/pre/type";
import * as ScheduleModelApi from "@/api/model/sche/model";
import {DICT_TYPE, getIntDictOptions, getStrDictOptions} from "@/utils/dict";
defineOptions({name: 'AdjustConfigForm'})
const {t} = useI18n() // 国际化
const message = useMessage() // 消息弹窗
const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') // 弹窗的标题
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const formType = ref('') // 表单的类型:create - 新增;update - 修改
const itemTypeList = ref([])
const itemTypeMap = ref({})
const scheduleModelList = ref([] as ScheduleModelApi.ScheduleModelVO[])
const modelparamListMap = ref({})
const dataForm = ref({
  id: undefined,
  scheduleModelId: undefined,
  status: undefined,
  remark: undefined,
  adjustConfigDetList: [],
})
const formRules = reactive({
  scheduleModelId: [{required: true, message: '调度模型不能为空', trigger: 'blur'}],
  status: [{required: true, message: '状态不能为空', trigger: 'blur'}],
})
const formRef = ref() // 表单 Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
  dialogVisible.value = true
  dialogTitle.value = t('action.' + type)
  formType.value = type
  resetForm()
  // 修改时,设置数据
  if (id) {
    formLoading.value = true
    try {
      dataForm.value = await AdjustConfigApi.getAdjustConfig(id)
    } finally {
      formLoading.value = false
    }
  }
  // 加载调度模型列表
  scheduleModelList.value = await ScheduleModelApi.getScheduleModelList()
  // 加载参数列表
  modelparamListMap.value = await ScheduleModelApi.getModelParamList()
  // 获取预测项类型列表
  itemTypeList.value = await MmItemType.getItemTypeList()
  itemTypeList.value.forEach(function (value) {
    itemTypeMap[value.id] = value.itemtypename
  })
}
defineExpose({open}) // 提供 open 方法,用于打开弹窗
/** 提交表单 */
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
const submitForm = async () => {
  // 校验表单
  if (!formRef) return
  const valid = await formRef.value.validate()
  if (!valid) return
  // 提交请求
  formLoading.value = true
  try {
    const data = dataForm.value as unknown as AdjustConfigApi.AdjustConfigVO
    if (formType.value === 'create') {
      await AdjustConfigApi.createAdjustConfig(data)
      message.success(t('common.createSuccess'))
    } else {
      await AdjustConfigApi.updateAdjustConfig(data)
      message.success(t('common.updateSuccess'))
    }
    dialogVisible.value = false
    // 发送操作成功的事件
    emit('success')
  } finally {
    formLoading.value = false
  }
}
function changeitemTypeId(row) {
  row.predictItemId = ''
}
function addAdjustConfigDet() {
  if (!dataForm.value.adjustConfigDetList) {
    dataForm.value.adjustConfigDetList = []
  }
  dataForm.value.adjustConfigDetList.push({})
  orderDet(dataForm.value.adjustConfigDetList)
}
function deleteAdjustConfigDet(index: string, rows) {
  if (!rows || rows.length === 1) {
    message.error('不能全部删除!')
    return
  }
  rows.splice(index, 1)
  orderDet(rows)
}
function orderDet(list) {
  list.sort((a, b) => a.sort - b.sort);
  let sort = 1
  list.forEach(function (value) {
    value.sort = sort
    sort++
  })
}
/** 重置表单 */
const resetForm = () => {
  dataForm.value = {
    id: undefined,
    scheduleModelId: undefined,
    status: undefined,
    remark: undefined,
    adjustConfigDetList: [],
  }
  formRef.value?.resetFields()
}
</script>
src/views/model/sche/adjust/index.vue
对比新文件
@@ -0,0 +1,184 @@
<template>
  <!-- 搜索 -->
  <ContentWrap>
    <el-form
      class="-mb-15px"
      :model="queryParams"
      ref="queryFormRef"
      :inline="true"
      label-width="68px"
    >
      <el-form-item label="模型代码" prop="modelCode">
        <el-input
          v-model="queryParams.modelCode"
          placeholder="请输入模型代码"
          clearable
          @keyup.enter="handleQuery"
          class="!w-240px"
        />
      </el-form-item>
      <el-form-item label="模型名称" prop="modelName">
        <el-input
          v-model="queryParams.modelName"
          placeholder="请输入模型名称"
          clearable
          @keyup.enter="handleQuery"
          class="!w-240px"
        />
      </el-form-item>
      <el-form-item>
        <el-button @click="handleQuery">
          <Icon icon="ep:search" class="mr-5px" />
          搜索
        </el-button>
        <el-button @click="resetQuery">
          <Icon icon="ep:refresh" class="mr-5px" />
          重置
        </el-button>
        <el-button
          type="primary"
          plain
          @click="openForm('create')"
          v-hasPermi="['sche:adjust:create']"
        >
          <Icon icon="ep:plus" class="mr-5px" />
          新增
        </el-button>
      </el-form-item>
    </el-form>
  </ContentWrap>
  <!-- 列表 -->
  <ContentWrap>
    <el-table v-loading="loading" :data="list">
      <el-table-column type="selection" header-align="center" align="center" fixed="left" width="50"/>
      <el-table-column label="模型编码" align="center" prop="modelCode" min-width="100"/>
      <el-table-column label="模型名称" header-align="center" align="left" prop="modelName" min-width="100"/>
      <el-table-column label="状态" align="center" prop="status">
        <template #default="scope">
          <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
        </template>
      </el-table-column>
      <el-table-column label="备注" header-align="center" align="left" prop="remark" min-width="160" />
      <el-table-column label="操作" align="center" min-width="100" fixed="right">
        <template #default="scope">
          <el-button
            link
            type="primary"
            @click="openForm('update', scope.row.id)"
            v-hasPermi="['sche:adjust:update']"
          >
            编辑
          </el-button>
          <el-button
            link
            type="primary"
            @click="openResultList(scope.row.id)"
          >
            调整记录
          </el-button>
          <el-button
            link
            type="danger"
            @click="handleDelete(scope.row.id)"
            v-hasPermi="['sche:adjust:delete']"
          >
            删除
          </el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- 分页 -->
    <Pagination
      :total="total"
      v-model:page="queryParams.pageNo"
      v-model:limit="queryParams.pageSize"
      @pagination="getList"
    />
  </ContentWrap>
  <!-- 表单弹窗:添加/修改 -->
  <AdjustConfigForm ref="formRef" @success="getList" />
  <!-- 表单弹窗:添加/修改 -->
  <ResultList ref="resultRef" />
</template>
<script lang="ts" setup>
import * as AdjustConfigApi from '@/api/model/sche/adjust'
import AdjustConfigForm from './AdjustConfigForm.vue'
import ResultList from '@/views/model/sche/adjust/result/index.vue'
import {reactive} from "vue";
import {DICT_TYPE} from "@/utils/dict";
defineOptions({name: 'AdjustConfig'})
const message = useMessage() // 消息弹窗
const {t} = useI18n() // 国际化
const loading = ref(true) // 列表的加载中
const total = ref(0) // 列表的总页数
const list = ref([]) // 列表的数据
const queryParams = reactive({
  pageNo: 1,
  pageSize: 10,
  modelCode: undefined,
  modelName: undefined,
  status: undefined,
})
const queryFormRef = ref() // 搜索的表单
const exportLoading = ref(false) // 导出的加载中
/** 查询列表 */
const getList = async () => {
  loading.value = true
  try {
    const page = await AdjustConfigApi.getAdjustConfigPage(queryParams)
    list.value = page.list
    total.value = page.total
  } finally {
    loading.value = false
  }
}
/** 搜索按钮操作 */
const handleQuery = () => {
  queryParams.pageNo = 1
  getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
  queryFormRef.value.resetFields()
  handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
  formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
  try {
    // 删除的二次确认
    await message.delConfirm()
    // 发起删除
    await AdjustConfigApi.deleteAdjustConfig(id)
    message.success(t('common.delSuccess'))
    // 刷新列表
    await getList()
  } catch {
  }
}
/** 调用日志查看 */
const resultRef = ref()
const openResultList = (id?: string) => {
  resultRef.value.open(id)
}
/** 初始化 **/
onMounted(async () => {
  await getList()
})
</script>
src/views/model/sche/adjust/result/index.vue
对比新文件
@@ -0,0 +1,153 @@
<template>
  <el-drawer
    v-model="drawer"
    size="50%"
    title="调整记录"
    :direction="direction"
    :before-close="handleClose"
  >
    <!-- 搜索 -->
    <ContentWrap>
      <el-form
        class="-mb-15px"
        :model="queryParams"
        ref="queryFormRef"
        :inline="true"
        label-width="68px"
      >
        <el-form-item>
          <el-date-picker
            v-model="queryParams.startTime"
            format="YYYY-MM-DD HH:mm:00"
            value-format="YYYY-MM-DD HH:mm:00"
            type="datetime"
            placeholder="选择日期时间"
          />
        </el-form-item>
        <el-form-item>
          <el-date-picker
            v-model="queryParams.endTime"
            format="YYYY-MM-DD HH:mm:00"
            value-format="YYYY-MM-DD HH:mm:00"
            type="datetime"
            placeholder="选择日期时间"
          />
        </el-form-item>
        <el-form-item>
          <el-button @click="handleQuery">
            <Icon icon="ep:search" class="mr-5px" />
            搜索
          </el-button>
          <el-button @click="resetQuery">
            <Icon icon="ep:refresh" class="mr-5px" />
            重置
          </el-button>
        </el-form-item>
      </el-form>
    </ContentWrap>
    <!-- 列表 -->
    <ContentWrap>
      <el-table v-loading="loading" :data="list">
        <el-table-column
          prop="outputName"
          label="预测项输出"
          header-align="center"
          align="left"
        />
        <el-table-column
          prop="adjustTime"
          label="模拟调整时间"
          header-align="center"
          align="center"
          :formatter="dateFormatter"
        />
        <el-table-column
          prop="adjustValue"
          label="模拟调整值"
          header-align="center"
          align="center"
        />
        <el-table-column
          prop="jsonValue"
          label="模拟调整结果"
          header-align="center"
          align="center"
        />
      </el-table>
      <!-- 分页 -->
      <Pagination
        :total="total"
        v-model:page="queryParams.pageNo"
        v-model:limit="queryParams.pageSize"
        @pagination="getList"
      />
    </ContentWrap>
  </el-drawer>
</template>
<script lang="ts" setup>
import type { DrawerProps } from 'element-plus'
import * as AdjustResult from "@/api/model/sche/result";
import {reactive, ref} from "vue";
import {dateFormatter} from "@/utils/formatTime";
defineOptions({name: 'ResultList'})
const drawer = ref(false)
const direction = ref<DrawerProps['direction']>('rtl')
const loading = ref(true) // 列表的加载中
const total = ref(0) // 列表的总页数
const list = ref([]) // 列表的数据
const queryParams = reactive({
  pageNo: 1,
  pageSize: 10,
  configId: undefined,
  startTime: undefined,
  endTime: undefined,
})
const queryFormRef = ref() // 搜索的表单
/** 查询列表 */
const getList = async () => {
  loading.value = true
  try {
    const page = await AdjustResult.getAdjustResultPage(queryParams)
    list.value = page.list
    total.value = page.total
  } finally {
    loading.value = false
  }
}
/** 搜索按钮操作 */
const handleQuery = () => {
  queryParams.pageNo = 1
  getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
  queryFormRef.value.resetFields()
  handleQuery()
}
/** 打开弹窗 */
const open = async (id?: string) => {
  resetForm()
  drawer.value = true
  queryParams.configId = id
  if (id) {
    getList()
  }
}
defineExpose({open}) // 提供 open 方法,用于打开弹窗
/** 重置表单 */
const resetForm = () => {
  queryParams.pageNo = 1
  queryParams.pageSize = 10
  queryParams.configId = ''
}
const handleClose = (done: () => void) => {
  drawer.value = false
}
</script>