Преглед изворни кода

修改目录,如果需要转移到老系统 就方便了。

wukai пре 6 месеци
родитељ
комит
d0fe567467

+ 5 - 5
src/api/biz/algo.js → src/api/ripa/algo.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询算法管理列表
 export function listAlgo(query) {
     return request({
-        url: '/biz/algo/list',
+        url: '/ripa/algo/list',
         method: 'get',
         params: query
     })
@@ -12,7 +12,7 @@ export function listAlgo(query) {
 // 查询算法管理详细
 export function getAlgo(algoId) {
     return request({
-        url: '/biz/algo/detail?algoId=' + algoId,
+        url: '/ripa/algo/detail?algoId=' + algoId,
         method: 'get'
     })
 }
@@ -20,7 +20,7 @@ export function getAlgo(algoId) {
 // 新增算法管理
 export function addAlgo(data) {
     return request({
-        url: '/biz/algo',
+        url: '/ripa/algo',
         method: 'post',
         data: data
     })
@@ -29,7 +29,7 @@ export function addAlgo(data) {
 // 修改算法管理
 export function updateAlgo(data) {
     return request({
-        url: '/biz/algo/edit',
+        url: '/ripa/algo/edit',
         method: 'post',
         data: data
     })
@@ -38,7 +38,7 @@ export function updateAlgo(data) {
 // 删除算法管理
 export function delAlgo(algoId) {
     return request({
-        url: '/biz/algo/del?algoId=' + algoId,
+        url: '/ripa/algo/del?algoId=' + algoId,
         method: 'get'
     })
 }

+ 12 - 5
src/api/biz/analy.js → src/api/ripa/analy.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询模型指标分析列表
 export function listAnaly(query) {
     return request({
-        url: '/biz/analy/list',
+        url: '/ripa/analy/list',
         method: 'get',
         params: query
     })
@@ -12,7 +12,7 @@ export function listAnaly(query) {
 // 查询模型指标分析详细
 export function getAnaly(analyId) {
     return request({
-        url: '/biz/analy/detail?analyId=' + analyId,
+        url: '/ripa/analy/detail?analyId=' + analyId,
         method: 'get'
     })
 }
@@ -20,7 +20,7 @@ export function getAnaly(analyId) {
 // 新增模型指标分析
 export function addAnaly(data) {
     return request({
-        url: '/biz/analy',
+        url: '/ripa/analy',
         method: 'post',
         data: data
     })
@@ -29,7 +29,7 @@ export function addAnaly(data) {
 // 修改模型指标分析
 export function updateAnaly(data) {
     return request({
-        url: '/biz/analy/edit',
+        url: '/ripa/analy/edit',
         method: 'post',
         data: data
     })
@@ -38,7 +38,14 @@ export function updateAnaly(data) {
 // 删除模型指标分析
 export function delAnaly(analyId) {
     return request({
-        url: '/biz/analy/del?analyIds=' + analyId,
+        url: '/ripa/analy/del?analyIds=' + analyId,
         method: 'get'
     })
 }
+export function batchInsert(data) {
+    return request({
+        url: '/ripa/analy/insert',
+        method: 'post',
+        data: data
+    })
+}

+ 5 - 5
src/api/biz/data.js → src/api/ripa/data.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询算法数据样例管理列表
 export function listData(query) {
     return request({
-        url: '/biz/data/list',
+        url: '/ripa/data/list',
         method: 'get',
         params: query
     })
@@ -12,7 +12,7 @@ export function listData(query) {
 // 查询算法数据样例管理详细
 export function getData(dataId) {
     return request({
-        url: '/biz/data/detail?dataId=' + dataId,
+        url: '/ripa/data/detail?dataId=' + dataId,
         method: 'get'
     })
 }
@@ -20,7 +20,7 @@ export function getData(dataId) {
 // 新增算法数据样例管理
 export function addData(data) {
     return request({
-        url: '/biz/data',
+        url: '/ripa/data',
         method: 'post',
         data: data
     })
@@ -29,7 +29,7 @@ export function addData(data) {
 // 修改算法数据样例管理
 export function updateData(data) {
     return request({
-        url: '/biz/data/edit',
+        url: '/ripa/data/edit',
         method: 'post',
         data: data
     })
@@ -38,7 +38,7 @@ export function updateData(data) {
 // 删除算法数据样例管理
 export function delData(dataId) {
     return request({
-        url: '/biz/data/del?dataId=' + dataId,
+        url: '/ripa/data/del?dataId=' + dataId,
         method: 'get'
     })
 }

+ 7 - 7
src/api/biz/metrics.js → src/api/ripa/metrics.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询模型指标配置列表
 export function listMetrics(query) {
     return request({
-        url: '/biz/metrics/list',
+        url: '/ripa/metrics/list',
         method: 'get',
         params: query
     })
@@ -12,7 +12,7 @@ export function listMetrics(query) {
 // 查询模型指标配置详细
 export function getMetrics(autoId) {
     return request({
-        url: '/biz/metrics/detail?autoId=' + autoId,
+        url: '/ripa/metrics/detail?autoId=' + autoId,
         method: 'get'
     })
 }
@@ -20,7 +20,7 @@ export function getMetrics(autoId) {
 // 数据校验
 export function validateMetrics(autoId) {
     return request({
-        url: '/biz/metrics/validate?autoId=' + autoId,
+        url: '/ripa/metrics/validate?autoId=' + autoId,
         method: 'get'
     })
 }
@@ -28,7 +28,7 @@ export function validateMetrics(autoId) {
 // 新增模型指标配置
 export function addMetrics(data) {
     return request({
-        url: '/biz/metrics',
+        url: '/ripa/metrics',
         method: 'post',
         data: data
     })
@@ -37,7 +37,7 @@ export function addMetrics(data) {
 // 修改模型指标配置
 export function updateMetrics(data) {
     return request({
-        url: '/biz/metrics/edit',
+        url: '/ripa/metrics/edit',
         method: 'post',
         data: data
     })
@@ -46,14 +46,14 @@ export function updateMetrics(data) {
 // 删除模型指标配置
 export function delMetrics(autoId) {
     return request({
-        url: '/biz/metrics/del?autoIds=' + autoId,
+        url: '/ripa/metrics/del?autoIds=' + autoId,
         method: 'get'
     })
 }
 
 export function getObjMetrics(query) {
     return request({
-        url: '/biz/metrics/select',
+        url: '/ripa/metrics/select',
         method: 'get',
         params: query
     })

+ 6 - 6
src/api/biz/model.js → src/api/ripa/model.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询分析模型列表
 export function listModel(query) {
     return request({
-        url: '/biz/model/list',
+        url: '/ripa/model/list',
         method: 'get',
         params: query
     })
@@ -12,7 +12,7 @@ export function listModel(query) {
 // 查询分析模型详细
 export function getModel(modelId) {
     return request({
-        url: '/biz/model/detail?modelId=' + modelId,
+        url: '/ripa/model/detail?modelId=' + modelId,
         method: 'get'
     })
 }
@@ -20,7 +20,7 @@ export function getModel(modelId) {
 // 新增分析模型
 export function addModel(data) {
     return request({
-        url: '/biz/model',
+        url: '/ripa/model',
         method: 'post',
         data: data
     })
@@ -29,7 +29,7 @@ export function addModel(data) {
 // 修改分析模型
 export function updateModel(data) {
     return request({
-        url: '/biz/model/edit',
+        url: '/ripa/model/edit',
         method: 'post',
         data: data
     })
@@ -38,7 +38,7 @@ export function updateModel(data) {
 // 删除分析模型
 export function delModel(modelId) {
     return request({
-        url: '/biz/model/del?modelId=' + modelId,
+        url: '/ripa/model/del?modelId=' + modelId,
         method: 'get'
     })
 }
@@ -46,7 +46,7 @@ export function delModel(modelId) {
 // 查询模型下拉树结构
 export function modelTreeSelect() {
     return request({
-        url: '/biz/model/modelTree',
+        url: '/ripa/model/modelTree',
         method: 'get'
     })
 }

+ 5 - 5
src/api/biz/record.js → src/api/ripa/record.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询分析历史记录列表
 export function listRecord(query) {
     return request({
-        url: '/biz/record/list',
+        url: '/ripa/record/list',
         method: 'get',
         params: query
     })
@@ -12,7 +12,7 @@ export function listRecord(query) {
 // 查询分析历史记录详细
 export function getRecord(recordId) {
     return request({
-        url: '/biz/record/detail?recordId=' + recordId,
+        url: '/ripa/record/detail?recordId=' + recordId,
         method: 'get'
     })
 }
@@ -20,7 +20,7 @@ export function getRecord(recordId) {
 // 新增分析历史记录
 export function addRecord(data) {
     return request({
-        url: '/biz/record',
+        url: '/ripa/record',
         method: 'post',
         data: data
     })
@@ -29,7 +29,7 @@ export function addRecord(data) {
 // 修改分析历史记录
 export function updateRecord(data) {
     return request({
-        url: '/biz/record/edit',
+        url: '/ripa/record/edit',
         method: 'post',
         data: data
     })
@@ -38,7 +38,7 @@ export function updateRecord(data) {
 // 删除分析历史记录
 export function delRecord(recordId) {
     return request({
-        url: '/biz/record/del?recordIds=' + recordId,
+        url: '/ripa/record/del?recordIds=' + recordId,
         method: 'get'
     })
 }

+ 6 - 6
src/router/index.js

@@ -79,26 +79,26 @@ export const constantRoutes = [
             //交易2025新增页面--start
             {
                 path: prefix + '/model',
-                component: () => import('@/views/biz/model/index')
+                component: () => import('@/views/ripa/model/index')
             },
             {
                 path: prefix + '/metrics',
-                component: () => import('@/views/biz/metrics/index')
+                component: () => import('@/views/ripa/metrics/index')
             },
             {
                 path: prefix + '/algo',
-                component: () => import('@/views/biz/algo/index')
+                component: () => import('@/views/ripa/algo/index')
             },
             {
                 path: prefix + '/algo/data',
-                component: () => import('@/views/biz/data/index')
+                component: () => import('@/views/ripa/data/index')
             },
             {
                 path: prefix + '/dsa',
-                component: () => import('@/views/biz/analy/index')
+                component: () => import('@/views/ripa/analy/index')
             }, {
                 path: prefix + '/dsa/record',
-                component: () => import('@/views/biz/record/index')
+                component: () => import('@/views/ripa/record/index')
             },
             //交易2025新增页面--end
             {

+ 0 - 338
src/views/biz/analy/index.vue

@@ -1,338 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="指标自动ID" prop="autoId">
-        <el-input
-          v-model="queryParams.autoId"
-          placeholder="请输入指标自动ID"
-          clearable
-          @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="算法ID" prop="algoId">
-        <el-input
-          v-model="queryParams.algoId"
-          placeholder="请输入算法ID"
-          clearable
-          @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="定时分析" prop="timeSwitch">
-        <el-select v-model="queryParams.timeSwitch" placeholder="请选择定时分析" clearable>
-          <el-option
-            v-for="dict in sys_yes_no"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="是否告警" prop="alarmWitch">
-        <el-select v-model="queryParams.alarmWitch" placeholder="请选择是否告警" clearable>
-          <el-option
-            v-for="dict in sys_yes_no"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
-        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
-      </el-form-item>
-    </el-form>
-
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-          type="primary"
-          plain
-          icon="Plus"
-          @click="handleAdd"
-        >新增</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="success"
-          plain
-          icon="Edit"
-          :disabled="single"
-          @click="handleUpdate"
-        >修改</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="danger"
-          plain
-          icon="Delete"
-          :disabled="multiple"
-          @click="handleDelete"
-        >删除</el-button>
-      </el-col>
-      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-
-    <el-table v-loading="loading" :data="analyList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-<!--      <el-table-column label="分析ID" align="center" prop="analyId" />-->
-      <el-table-column label="指标自动ID" align="center" prop="autoId" />
-      <el-table-column label="算法ID" align="center" prop="algoId" />
-      <el-table-column label="定时分析" align="center" prop="timeSwitch">
-        <template #default="scope">
-          <dict-tag :options="sys_yes_no" :value="scope.row.timeSwitch"/>
-        </template>
-      </el-table-column>
-      <el-table-column label="执行周期" align="center" prop="scheduleCycle" />
-      <el-table-column label="上次执行时间" align="center" prop="lastTime" width="180">
-        <template #default="scope">
-          <span>{{ parseTime(scope.row.lastTime, '{y}-{m}-{d} {h}:{mi}:{s}') }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="是否告警" align="center" prop="alarmWitch">
-        <template #default="scope">
-          <dict-tag :options="sys_yes_no" :value="scope.row.alarmWitch"/>
-        </template>
-      </el-table-column>
-      <el-table-column label="告警关键字" align="center" prop="alarmKey" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-        <template #default="scope">
-          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)">修改</el-button>
-          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <pagination
-      v-show="total>0"
-      :total="total"
-      v-model:page="queryParams.pageNum"
-      v-model:limit="queryParams.pageSize"
-      @pagination="getList"
-    />
-
-    <!-- 添加或修改模型指标分析对话框 -->
-    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
-      <el-form ref="analyRef" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="指标自动ID" prop="autoId">
-          <el-input v-model="form.autoId" placeholder="请输入指标自动ID" />
-        </el-form-item>
-        <el-form-item label="算法ID" prop="algoId">
-          <el-input v-model="form.algoId" placeholder="请输入算法ID" />
-        </el-form-item>
-        <el-form-item label="定时分析" prop="timeSwitch">
-          <el-select v-model="form.timeSwitch" placeholder="请选择定时分析">
-            <el-option
-              v-for="dict in sys_yes_no"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="执行周期" prop="scheduleCycle">
-          <el-input v-model="form.scheduleCycle" placeholder="请输入执行周期" />
-        </el-form-item>
-        <el-form-item label="上次执行时间" prop="lastTime">
-          <el-date-picker clearable
-            v-model="form.lastTime"
-            type="date"
-            value-format="YYYY-MM-DD"
-            placeholder="请选择上次执行时间">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="是否告警" prop="alarmWitch">
-          <el-select v-model="form.alarmWitch" placeholder="请选择是否告警">
-            <el-option
-              v-for="dict in sys_yes_no"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="告警关键字" prop="alarmKey">
-          <el-input v-model="form.alarmKey" placeholder="请输入告警关键字" />
-        </el-form-item>
-        <el-form-item label="告警内容">
-          <editor v-model="form.alarmContent" :min-height="192"/>
-        </el-form-item>
-        <el-form-item label="备注" prop="remark">
-          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </div>
-</template>
-
-<script setup name="Analy">
-    import { listAnaly, getAnaly, delAnaly, addAnaly, updateAnaly } from "@/api/biz/analy";
-
-    const { proxy } = getCurrentInstance();
-const { sys_yes_no } = proxy.useDict('sys_yes_no');
-
-const analyList = ref([]);
-const open = ref(false);
-const loading = ref(true);
-const showSearch = ref(true);
-const ids = ref([]);
-const single = ref(true);
-const multiple = ref(true);
-const total = ref(0);
-const title = ref("");
-
-const data = reactive({
-  form: {},
-  queryParams: {
-    pageNum: 1,
-    pageSize: 10,
-    autoId: null,
-    algoId: null,
-    timeSwitch: null,
-    scheduleCycle: null,
-    lastTime: null,
-    alarmWitch: null,
-    alarmKey: null,
-    alarmContent: null,
-    createBy: null,
-    createTime: null,
-    updateBy: null,
-    updateTime: null,
-    remark: null
-  },
-  rules: {
-    timeSwitch: [
-      { required: true, message: "定时分析不能为空", trigger: "change" }
-    ],
-    alarmKey: [
-      { required: true, message: "告警关键字不能为空", trigger: "blur" }
-    ],
-    alarmContent: [
-      { required: true, message: "告警内容不能为空", trigger: "blur" }
-    ],
-  }
-});
-
-const { queryParams, form, rules } = toRefs(data);
-
-/** 查询模型指标分析列表 */
-function getList() {
-  loading.value = true;
-  listAnaly(queryParams.value).then(response => {
-    analyList.value = response.rows;
-    total.value = response.total;
-    loading.value = false;
-  });
-}
-
-// 取消按钮
-function cancel() {
-  open.value = false;
-  reset();
-}
-
-// 表单重置
-function reset() {
-  form.value = {
-    analyId: null,
-    autoId: null,
-    algoId: null,
-    timeSwitch: null,
-    scheduleCycle: null,
-    lastTime: null,
-    alarmWitch: null,
-    alarmKey: null,
-    alarmContent: null,
-    createBy: null,
-    createTime: null,
-    updateBy: null,
-    updateTime: null,
-    remark: null
-  };
-  proxy.resetForm("analyRef");
-}
-
-/** 搜索按钮操作 */
-function handleQuery() {
-  queryParams.value.pageNum = 1;
-  getList();
-}
-
-/** 重置按钮操作 */
-function resetQuery() {
-  proxy.resetForm("queryRef");
-  handleQuery();
-}
-
-// 多选框选中数据
-function handleSelectionChange(selection) {
-  ids.value = selection.map(item => item.analyId);
-  single.value = selection.length != 1;
-  multiple.value = !selection.length;
-}
-
-/** 新增按钮操作 */
-function handleAdd() {
-  reset();
-  open.value = true;
-  title.value = "添加模型指标分析";
-}
-
-/** 修改按钮操作 */
-function handleUpdate(row) {
-  reset();
-  const _analyId = row.analyId || ids.value
-  getAnaly(_analyId).then(response => {
-    form.value = response.data;
-    open.value = true;
-    title.value = "修改模型指标分析";
-  });
-}
-
-/** 提交按钮 */
-function submitForm() {
-  proxy.$refs["analyRef"].validate(valid => {
-    if (valid) {
-      if (form.value.analyId != null) {
-        updateAnaly(form.value).then(response => {
-          proxy.$modal.msgSuccess("修改成功");
-          open.value = false;
-          getList();
-        });
-      } else {
-        addAnaly(form.value).then(response => {
-          proxy.$modal.msgSuccess("新增成功");
-          open.value = false;
-          getList();
-        });
-      }
-    }
-  });
-}
-
-/** 删除按钮操作 */
-function handleDelete(row) {
-  const _analyIds = row.analyId || ids.value;
-  proxy.$modal.confirm('是否确认删除模型指标分析编号为"' + _analyIds + '"的数据项?').then(function() {
-    return delAnaly(_analyIds);
-  }).then(() => {
-    getList();
-    proxy.$modal.msgSuccess("删除成功");
-  }).catch(() => {});
-}
-
-/** 导出按钮操作 */
-function handleExport() {
-  proxy.download('biz/analy/export', {
-    ...queryParams.value
-  }, `analy_${new Date().getTime()}.xlsx`)
-}
-
-getList();
-</script>

+ 5 - 5
src/views/biz/algo/index.vue → src/views/ripa/algo/index.vue

@@ -153,13 +153,13 @@
                   </el-tab-pane>
                 </el-tabs>
               </el-tab-pane>
-            </el-tabs>   
+            </el-tabs>
             <div class="data_exp_list" v-if="showExpList">
               <div v-for="item in explist">
                 <el-checkbox :key="item.dataId" :label="item.dataName" @change="selecedData(item)"></el-checkbox>
               </div>
             </div>
-            <div v-if="activeTabsName=='200'"><el-button @click="selectDataExp">生成数据样例</el-button><el-button type="primary" @click="checkJS">验 证</el-button></div>       
+            <div v-if="activeTabsName=='200'"><el-button @click="selectDataExp">生成数据样例</el-button><el-button type="primary" @click="checkJS">验 证</el-button></div>
         </el-form-item>
         <el-form-item label="算法验证结果" label-width="100px">
           <div class="width:100%;height:50px">{{ jsCheckResult }}</div>
@@ -197,8 +197,8 @@
 
 <script setup name="Algo">
 import {onUnmounted} from "vue"
-import { listAlgo, getAlgo, delAlgo, addAlgo, updateAlgo } from "@/api/biz/algo";
-import { listData, getData } from "@/api/biz/data";
+import { listAlgo, getAlgo, delAlgo, addAlgo, updateAlgo } from "@/api/ripa/algo";
+import { listData, getData } from "@/api/ripa/data";
 import { EditorView, keymap } from '@codemirror/view'
 import { EditorState } from '@codemirror/state'
 import { defaultKeymap } from '@codemirror/commands'
@@ -415,7 +415,7 @@ function handleAdd() {
   modelValue.value = '';
   setTimeout(() => {
     initEditor();
-  }, 300);  
+  }, 300);
 }
 
 /** 修改按钮操作 */

+ 412 - 0
src/views/ripa/analy/component/selectMetrics.vue

@@ -0,0 +1,412 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <!--部门数据-->
+      <el-col :span="4" :xs="24">
+        <div class="head-container">
+          <el-input
+              v-model="modelName"
+              placeholder="请输入模型名称"
+              clearable
+              prefix-icon="Search"
+              style="margin-bottom: 20px"
+          />
+        </div>
+        <div class="head-container">
+          <el-tree
+              :data="modelOptions"
+              :props="{ label: 'label', children: 'children' }"
+              :expand-on-click-node="false"
+              :filter-node-method="filterNode"
+              ref="deptTreeRef"
+              node-key="id"
+              highlight-current
+              default-expand-all
+              @node-click="handleNodeClick"
+          />
+        </div>
+      </el-col>
+      <!--用户数据-->
+      <el-col :span="20" :xs="24">
+        <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+          <el-form-item label="指标名称" prop="metricsName">
+            <el-input
+                v-model="queryParams.metricsName"
+                placeholder="请输入指标名称"
+                clearable
+                @keyup.enter="handleQuery"
+            />
+          </el-form-item>
+<!--          <el-form-item label="适用算法" prop="algoType">-->
+<!--            <el-select v-model="queryParams.algoType" placeholder="请选择适用算法类别" clearable>-->
+<!--              <el-option-->
+<!--                  v-for="dict in algo_type"-->
+<!--                  :key="dict.value"-->
+<!--                  :label="dict.label"-->
+<!--                  :value="dict.value"-->
+<!--              />-->
+<!--            </el-select>-->
+<!--          </el-form-item>-->
+          <el-form-item>
+            <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+            <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <!--        <el-row :gutter="10" class="mb8">-->
+        <!--          <el-col :span="1.5">-->
+        <!--            <el-button-->
+        <!--                type="primary"-->
+        <!--                plain-->
+        <!--                icon="Plus"-->
+        <!--                @click="handleAdd"-->
+        <!--            >导入指标-->
+        <!--            </el-button>-->
+        <!--          </el-col>-->
+        <!--          <el-col :span="1.5">-->
+        <!--            <el-button-->
+        <!--                type="danger"-->
+        <!--                plain-->
+        <!--                icon="Delete"-->
+        <!--                :disabled="multiple"-->
+        <!--                @click="handleDelete"-->
+        <!--            >删除指标</el-button>-->
+        <!--          </el-col>-->
+        <!--          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>-->
+        <!--        </el-row>-->
+
+        <el-table v-loading="loading" :data="metricsList" @selection-change="handleSelectionChange">
+          <el-table-column type="selection" width="55" align="center"/>
+          <el-table-column label="模型名称" align="center" prop="modelName"/>
+          <el-table-column label="指标名称" align="center" prop="metricsName"/>
+          <el-table-column label="对象类型" align="center" prop="objType"/>
+          <el-table-column label="对象名称" align="center" prop="objName"/>
+          <el-table-column label="适用算法" align="center" prop="algoType">
+            <template #default="scope">
+              <dict-tag :options="algo_type" :value="scope.row.algoType"/>
+            </template>
+          </el-table-column>
+          <el-table-column label="正态校验结果" align="center" prop="ntr"/>
+          <el-table-column label="方差校验结果" align="center" prop="hov"/>
+        </el-table>
+
+        <pagination
+            v-show="total>0"
+            :total="total"
+            v-model:page="queryParams.pageNum"
+            v-model:limit="queryParams.pageSize"
+            @pagination="getList"
+        />
+      </el-col>
+    </el-row>
+
+  </div>
+</template>
+
+<script setup name="Metrics">
+import {
+  addMetrics,
+  delMetrics,
+  getMetrics,
+  getObjMetrics,
+  listMetrics,
+  updateMetrics,
+  validateMetrics
+} from "@/api/ripa/metrics";
+import {modelTreeSelect} from "@/api/ripa/model";
+import "splitpanes/dist/splitpanes.css"
+
+const {proxy} = getCurrentInstance();
+const {algo_type} = proxy.useDict('algo_type');
+const metricsList = ref([]);
+const objMetricsList = ref([]);
+const open = ref(false);
+const msOpen = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const msList = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const msTotal = ref(0);
+const title = ref("");
+const msTitle = ref("");
+const modelName = ref("");
+const modelOptions = ref(undefined);
+const enabledModelOptions = ref(undefined);
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    modelId: null,
+    objMetricsId: null,
+    metricsName: null,
+    createBy: null,
+    createTime: null,
+    updateBy: null,
+    updateTime: null,
+    remark: null
+  },
+  msQueryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    objType: null,
+    objMetricsId: null,
+    metricsName: null,
+    objName: null
+  },
+  rules: {
+    algoType: [
+      {required: true, message: "适用算法类别不能为空", trigger: "change"}
+    ],
+  }
+});
+
+const {queryParams, form, rules, msQueryParams} = toRefs(data);
+// 你的选择逻辑...
+
+const filterNode = (value, data) => {
+  if (!value) return true;
+  return data.label.indexOf(value) !== -1;
+};
+
+/** 查询部门下拉树结构 */
+function getModelTree() {
+  modelTreeSelect().then(response => {
+    modelOptions.value = response.data;
+    enabledModelOptions.value = response.data;
+    handleQuery();
+  });
+};
+/** 根据名称筛选部门树 */
+watch(modelName, val => {
+  proxy.$refs["deptTreeRef"].filter(val);
+});
+
+/** 模型选择变更事件 */
+function handleModelChange(value) {
+  if (value) {
+    // 查找选中的部门信息
+    const selectedDept = findModelById(modelOptions.value, value);
+    if (selectedDept) {
+      form.value.modelId = selectedDept.id;
+    }
+  } else {
+    form.value.modelId = '';
+  }
+}
+
+/** 根据ID查找模型信息 */
+function findModelById(deptList, id) {
+  if (!deptList || !id) return null;
+  for (let i = 0; i < deptList.length; i++) {
+    const dept = deptList[i];
+    if (dept.id === id) {
+      return dept;
+    }
+    if (dept.children && dept.children.length) {
+      const found = findModelById(dept.children, id);
+      if (found) return found;
+    }
+  }
+  return null;
+}
+
+/** 节点单击事件 */
+function handleNodeClick(data) {
+  queryParams.value.modelId = data.id;
+  form.value.modelName = data.label;
+  form.value.modelId = data.id;
+  handleQuery();
+};
+
+/** 查询模型指标配置列表 */
+function getList() {
+  loading.value = true;
+  // 确保 params 对象存在
+  if (!queryParams.value.params) {
+    queryParams.value.params = {};
+  }
+  queryParams.value.params["algo"] = true;
+  listMetrics(queryParams.value).then(response => {
+    metricsList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+function getObjMetricsList() {
+  getObjMetrics(msQueryParams.value).then(response => {
+    objMetricsList.value = response.rows;
+    msTotal.value = response.total;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  msOpen.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    autoId: null,
+    modelId: null,
+    objMetricsId: null,
+    metricsName: null,
+    createBy: null,
+    createTime: null,
+    updateBy: null,
+    updateTime: null,
+    remark: null
+  };
+  proxy.resetForm("metricsRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+function handleMsQuery() {
+  msQueryParams.value.pageNum = 1;
+  getObjMetricsList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+function resetMsQuery() {
+  proxy.resetForm("msQueryRef");
+  handleMsQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.autoId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+//多选框选中数据
+function handleMsChange(selection) {
+  msList.value = selection;
+}
+
+/** 新增按钮操作 */
+function handleMsAdd() {
+  const newList = [];
+  for (let i = 0; i < msList.value.length; i++) {
+    const item = msList.value[i];
+    newList.push({
+      modelId: form.value.modelId,
+      objMetricsId: item.objMetricsId,
+      metricsName: item.metricsName,
+      objName: item.objName,
+      objType: item.objType
+    });
+  }
+  addMetrics(newList).then(response => {
+    proxy.$modal.msgSuccess("添加成功");
+    msOpen.value = false;
+    resetQuery();
+  });
+  console.log('New list:', newList);
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  if (!form.value.modelName) {
+    return proxy.$message.error("请先选择左侧模型")
+  }
+
+  getObjMetricsList()
+  msOpen.value = true;
+  msTitle.value = "\"" + form.value.modelName + "\"指标导入";
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _autoId = row.autoId || ids.value
+  getMetrics(_autoId).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = `“${form.value.metricsName}”指标配置`;
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["metricsRef"].validate(valid => {
+    if (valid) {
+      if (form.value.autoId != null) {
+        updateMetrics(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addMetrics(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _autoIds = row.autoId || ids.value;
+  proxy.$modal.confirm('是否确认删除模型指标配置编号为"' + _autoIds + '"的数据项?').then(function () {
+    return delMetrics(_autoIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {
+  });
+}
+
+function handleValidate() {
+  validateMetrics(form.value.autoId).then(response => {
+    proxy.$modal.msgSuccess("校验成功");
+    form.value = response.data;
+  });
+  // console.error(form.value);
+  // const _autoIds = row.autoId || ids.value;
+  // proxy.$modal.confirm('是否确认删除模型指标配置编号为"' + _autoIds + '"的数据项?').then(function () {
+  //   return delMetrics(_autoIds);
+  // }).then(() => {
+  //   getList();
+  //   proxy.$modal.msgSuccess("删除成功");
+  // }).catch(() => {
+  // });
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('biz/metrics/export', {
+    ...queryParams.value
+  }, `metrics_${new Date().getTime()}.xlsx`)
+}
+
+getModelTree()
+getList();
+
+// 暴露给父组件的方法
+defineExpose({
+  getSelectedData: () => {
+    return ids.value;
+  }
+});
+</script>

+ 480 - 0
src/views/ripa/analy/index.vue

@@ -0,0 +1,480 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <!--      <el-form-item label="指标自动ID" prop="autoId">-->
+      <!--        <el-input-->
+      <!--          v-model="queryParams.autoId"-->
+      <!--          placeholder="请输入指标自动ID"-->
+      <!--          clearable-->
+      <!--          @keyup.enter="handleQuery"-->
+      <!--        />-->
+      <!--      </el-form-item>-->
+      <el-form-item label="算法名称" prop="algoId">
+        <el-select v-model="queryParams.algoId" placeholder="请选择算法" style="width: 260px" clearable
+                   filterable remote reserve-keyword>
+          <el-option
+              v-for="dict in algoList"
+              :key="dict.algoId"
+              :label="dict.algoName"
+              :value="dict.algoId"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="定时分析" prop="timeSwitch">
+        <el-select v-model="queryParams.timeSwitch" placeholder="请选择定时分析" clearable>
+          <el-option
+              v-for="dict in sys_yes_no"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="是否告警" prop="alarmWitch">
+        <el-select v-model="queryParams.alarmWitch" placeholder="请选择是否告警" clearable>
+          <el-option
+              v-for="dict in sys_yes_no"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+            type="primary"
+            plain
+            icon="Plus"
+            @click="handleSelect"
+        >选择指标
+        </el-button>
+      </el-col>
+      <!--      <el-col :span="1.5">-->
+      <!--        <el-button-->
+      <!--            type="success"-->
+      <!--            plain-->
+      <!--            icon="Edit"-->
+      <!--            :disabled="single"-->
+      <!--            @click="handleUpdate"-->
+      <!--        >修改-->
+      <!--        </el-button>-->
+      <!--      </el-col>-->
+      <el-col :span="1.5">
+        <el-button
+            type="danger"
+            plain
+            icon="Delete"
+            :disabled="multiple"
+            @click="handleDelete"
+        >删除
+        </el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="analyList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center"/>
+      <!--      <el-table-column label="分析ID" align="center" prop="analyId" />-->
+      <el-table-column label="算法名称" align="center" prop="algoName"/>
+      <el-table-column label="模型名称" align="center" prop="modelName"/>
+      <el-table-column label="指标名称" align="center" prop="metricsName"/>
+      <el-table-column label="对象类型" align="center" prop="objType"/>
+      <el-table-column label="对象名称" align="center" prop="objName"/>
+      <el-table-column label="是否告警" align="center" prop="alarmWitch">
+        <template #default="scope">
+          <dict-tag :options="sys_yes_no" :value="scope.row.alarmWitch"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="定时分析" align="center" prop="timeSwitch">
+        <template #default="scope">
+          <dict-tag :options="sys_yes_no" :value="scope.row.timeSwitch"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="执行周期" align="center" prop="scheduleCycle"/>
+      <el-table-column label="上次执行时间" align="center" prop="lastTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.lastTime, '{y}-{m}-{d} {h}:{mi}:{s}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="告警关键字" align="center" prop="alarmKey"/>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template #default="scope">
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)">配置算法</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="total>0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+
+    <!-- 添加或修改模型指标分析对话框 -->
+    <el-dialog :title="title" v-model="open" width="1000px" append-to-body>
+      <el-form ref="analyRef" :model="form" :rules="rules" label-width="120px">
+        <el-row :gutter="20">
+          <el-col :span="10" :xs="24">
+            <el-form-item label="算法名称">
+              {{ form.algoName }}
+            </el-form-item>
+            <el-form-item label="模型名称">
+              {{ form.modelName }}
+            </el-form-item>
+            <el-form-item label="指标名称">
+              {{ form.metricsName }}
+            </el-form-item>
+            <el-form-item label="对象类型">
+              {{ form.objType }}
+            </el-form-item>
+            <el-form-item label="对象名称">
+              {{ form.objName }}
+            </el-form-item>
+          </el-col>
+          <el-col :span="14" :xs="24">
+            <!--          <el-table-column label="算法名称" align="center" prop="algoName"/>-->
+            <!--          <el-table-column label="模型名称" align="center" prop="modelName"/>-->
+            <!--          <el-table-column label="指标名称" align="center" prop="metricsName"/>-->
+            <!--          <el-table-column label="对象类型" align="center" prop="objType"/>-->
+            <!--          <el-table-column label="对象名称" align="center" prop="objName"/>-->
+            <!--          <el-input v-model="form.autoId" placeholder="请输入指标自动ID"/>-->
+            <el-form-item label="指标自动ID" prop="autoId">
+              <el-text v-model="form.autoId" placeholder="请输入指标自动ID"/>
+            </el-form-item>
+            <el-form-item label="算法名称" prop="algoId">
+              <el-select v-model="form.algoId" placeholder="请选择算法" style="width: 260px" clearable
+                         filterable remote reserve-keyword>
+                <el-option
+                    v-for="dict in algoList"
+                    :key="dict.algoId"
+                    :label="dict.algoName"
+                    :value="dict.algoId"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="定时分析" prop="timeSwitch">
+              <el-select v-model="form.timeSwitch" placeholder="请选择定时分析">
+                <el-option
+                    v-for="dict in sys_yes_no"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="执行周期(天)" prop="scheduleCycle">
+              <el-input-number v-model="form.scheduleCycle" placeholder="请输入执行周期" :min="1"/>
+            </el-form-item>
+            <!--        <el-form-item label="上次执行时间" prop="lastTime">-->
+            <!--          <el-date-picker clearable-->
+            <!--                          v-model="form.lastTime"-->
+            <!--                          type="date"-->
+            <!--                          value-format="YYYY-MM-DD"-->
+            <!--                          placeholder="请选择上次执行时间">-->
+            <!--          </el-date-picker>-->
+            <!--        </el-form-item>-->
+            <el-form-item label="是否告警" prop="alarmWitch">
+              <el-select v-model="form.alarmWitch" placeholder="请选择是否告警">
+                <el-option
+                    v-for="dict in sys_yes_no"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="告警关键字" prop="alarmKey" v-if="form.alarmWitch === 'Y'">
+              <el-input v-model="form.alarmKey" placeholder="请输入告警包含关键字"/>
+            </el-form-item>
+
+            <!--                    <el-form-item label="告警内容">-->
+            <!--                      <editor v-model="form.alarmContent" :min-height="192"/>-->
+            <!--                    </el-form-item>-->
+            <el-form-item label="备注" prop="remark">
+              <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+    <!-- 添加或修改业务模型对话框 -->
+    <el-dialog :title="titleS" v-model="openS" width="1300" append-to-body>
+      <select-metrics ref="selectMetricsRef" style="height: 600px; overflow-y: auto;"/>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="selectOK">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="Analy">
+import {addAnaly, batchInsert, delAnaly, getAnaly, listAnaly, updateAnaly} from "@/api/ripa/analy";
+import {listAlgo} from "@/api/ripa/algo";
+import selectMetrics from "./component/selectMetrics.vue"
+
+const {proxy} = getCurrentInstance();
+const {sys_yes_no} = proxy.useDict('sys_yes_no');
+// 添加这行确保组件被视为已使用
+const _unused = selectMetrics; // 防止IDE认为组件未被使用
+const analyList = ref([]);
+const algoList = ref([]);
+const open = ref(false);
+const openS = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
+const titleS = ref("");
+const selectMetricsRef = ref(null);
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    autoId: null,
+    algoId: null,
+    timeSwitch: null,
+    scheduleCycle: null,
+    lastTime: null,
+    alarmWitch: null,
+    alarmKey: null,
+    alarmContent: null,
+    createBy: null,
+    createTime: null,
+    updateBy: null,
+    updateTime: null,
+    remark: null
+  },
+  rules: {
+    algoId: [
+      { required: true, message: "算法不能为空", trigger: "blur" }
+    ],
+    alarmKey: [
+      {
+        required: true,
+        message: "告警关键字不能为空",
+        trigger: "blur",
+        validator: (rule, value, callback) => {
+          // 只有当 alarmWitch 为 'Y' 时才验证
+          if (form.value.alarmWitch === 'Y' && (!value || value.trim() === '')) {
+            callback(new Error('告警关键字不能为空'));
+          } else {
+            callback();
+          }
+        }
+      }
+    ]
+  }
+});
+
+const {queryParams, form, rules} = toRefs(data);
+
+/** 选择指标确定按钮 */
+function selectOK() {
+  try {
+    // 调用子组件的方法获取选中的数据
+    const selectedIds = selectMetricsRef.value.getSelectedData();
+
+    if (!selectedIds || selectedIds.length === 0) {
+      proxy.$modal.msgWarning("请先选择指标");
+      return;
+    }
+
+    const analyDataList = selectedIds.map(id => ({
+      autoId: id
+    }));
+
+    // 显示加载状态
+    proxy.$modal.loading("正在处理...");
+
+    batchInsert(analyDataList)
+        .then(response => {
+          proxy.$modal.closeLoading();
+          proxy.$modal.msgSuccess("操作成功");
+          getList();
+          openS.value = false;
+        })
+        .catch(error => {
+          proxy.$modal.closeLoading();
+          console.error('操作失败:', error);
+          proxy.$modal.msgError("操作失败: " + (error.message || "请检查网络连接或联系管理员"));
+        });
+  } catch (error) {
+    proxy.$modal.closeLoading();
+    console.error('发生错误:', error);
+    proxy.$modal.msgError("发生错误: " + error.message);
+  }
+}
+
+function getAlgoList() {
+  listAlgo({
+    algoOk: '0',
+    pageNum: 1,
+    pageSize: 9999
+  }).then(response => {
+    algoList.value = response.rows;
+  });
+}
+
+/** 查询模型指标分析列表 */
+function getList() {
+  loading.value = true;
+  listAnaly(queryParams.value).then(response => {
+    analyList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  openS.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    analyId: null,
+    autoId: null,
+    algoId: null,
+    timeSwitch: null,
+    scheduleCycle: 7,
+    lastTime: null,
+    alarmWitch: null,
+    alarmKey: null,
+    alarmContent: null,
+    createBy: null,
+    createTime: null,
+    updateBy: null,
+    updateTime: null,
+    remark: null
+  };
+  proxy.resetForm("analyRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.analyId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加模型指标分析";
+}
+
+/** 修改按钮操作 */
+function handleSelect() {
+  openS.value = true;
+  titleS.value = "修改模型指标分析";
+  // reset();
+  // const _analyId = row.analyId || ids.value
+  // getAnaly(_analyId).then(response => {
+  //   form.value = response.data;
+  // });
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _analyId = row.analyId || ids.value
+  getAnaly(_analyId).then(response => {
+    form.value = response.data;
+    if (!form.value.scheduleCycle) {
+      form.value.scheduleCycle = 7;
+    }
+    if (!form.value.alarmWitch) {
+      form.value.alarmWitch = 'Y';
+    }
+    if (!form.value.timeSwitch) {
+      form.value.timeSwitch = 'Y';
+    }
+    open.value = true;
+    title.value = "修改模型指标分析";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["analyRef"].validate(valid => {
+    if (valid) {
+      if (form.value.analyId != null) {
+        updateAnaly(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addAnaly(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _analyIds = row.analyId || ids.value;
+  proxy.$modal.confirm('是否确认删除模型指标分析编号为"' + _analyIds + '"的数据项?').then(function () {
+    return delAnaly(_analyIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {
+  });
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('biz/analy/export', {
+    ...queryParams.value
+  }, `analy_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+getAlgoList();
+</script>

+ 479 - 0
src/views/ripa/analy/index.vue.bak

@@ -0,0 +1,479 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <!--部门数据-->
+      <el-col :span="4" :xs="24">
+        <div class="head-container">
+          <el-input
+              v-model="algoName"
+              placeholder="请输入算法名称"
+              clearable
+              prefix-icon="Search"
+              style="margin-bottom: 20px"
+          />
+        </div>
+        <div class="head-container">
+          <el-table v-loading="loading" :data="algoList" @selection-change="handleSelectionChange">
+            <el-table-column type="selection" width="55" align="center" />
+            <!--      <el-table-column label="算法ID" align="center" prop="algoId" />-->
+            <el-table-column label="算法名称" align="center" prop="algoName" />
+<!--            <el-table-column label="算法描述" align="center" prop="algoDesc" />-->
+<!--            <el-table-column label="算法脚本" align="center" prop="algoScript" show-overflow-tooltip/>-->
+<!--            <el-table-column label="算法是否正确" align="center" prop="algoOk">-->
+<!--              <template #default="scope">-->
+<!--                <dict-tag :options="sys_common_status" :value="scope.row.algoOk"/>-->
+<!--              </template>-->
+<!--            </el-table-column>-->
+<!--            <el-table-column label="算法类别" align="center" prop="algoType">-->
+<!--              <template #default="scope">-->
+<!--                <dict-tag :options="algo_type" :value="scope.row.algoType"/>-->
+<!--              </template>-->
+<!--            </el-table-column>-->
+<!--            <el-table-column label="算法参数" align="center" prop="algoPara">-->
+<!--              <template #default="scope">-->
+<!--                <dict-tag :options="algo_para" :value="scope.row.algoPara"/>-->
+<!--              </template>-->
+<!--            </el-table-column>-->
+            <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+              <template #default="scope">
+                <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)">修改</el-button>
+                <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </el-col>
+      <!--用户数据-->
+      <el-col :span="20" :xs="24">
+        <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+          <!--      <el-form-item label="指标自动ID" prop="autoId">-->
+          <!--        <el-input-->
+          <!--          v-model="queryParams.autoId"-->
+          <!--          placeholder="请输入指标自动ID"-->
+          <!--          clearable-->
+          <!--          @keyup.enter="handleQuery"-->
+          <!--        />-->
+          <!--      </el-form-item>-->
+          <!--      <el-form-item label="算法ID" prop="algoId">-->
+          <!--        <el-input-->
+          <!--          v-model="queryParams.algoId"-->
+          <!--          placeholder="请输入算法ID"-->
+          <!--          clearable-->
+          <!--          @keyup.enter="handleQuery"-->
+          <!--        />-->
+          <!--      </el-form-item>-->
+          <el-form-item label="定时分析" prop="timeSwitch">
+            <el-select v-model="queryParams.timeSwitch" placeholder="请选择定时分析" clearable>
+              <el-option
+                  v-for="dict in sys_yes_no"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="是否告警" prop="alarmWitch">
+            <el-select v-model="queryParams.alarmWitch" placeholder="请选择是否告警" clearable>
+              <el-option
+                  v-for="dict in sys_yes_no"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+            <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button
+                type="primary"
+                plain
+                icon="Plus"
+                @click="handleSelect"
+            >选择指标
+            </el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+                type="success"
+                plain
+                icon="Edit"
+                :disabled="single"
+                @click="handleUpdate"
+            >修改
+            </el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+                type="danger"
+                plain
+                icon="Delete"
+                :disabled="multiple"
+                @click="handleDelete"
+            >删除
+            </el-button>
+          </el-col>
+          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+
+        <el-table v-loading="loading" :data="analyList" @selection-change="handleSelectionChange">
+          <el-table-column type="selection" width="55" align="center"/>
+          <!--      <el-table-column label="分析ID" align="center" prop="analyId" />-->
+          <el-table-column label="指标自动ID" align="center" prop="autoId"/>
+          <el-table-column label="算法ID" align="center" prop="algoId"/>
+          <el-table-column label="定时分析" align="center" prop="timeSwitch">
+            <template #default="scope">
+              <dict-tag :options="sys_yes_no" :value="scope.row.timeSwitch"/>
+            </template>
+          </el-table-column>
+          <el-table-column label="执行周期" align="center" prop="scheduleCycle"/>
+          <el-table-column label="上次执行时间" align="center" prop="lastTime" width="180">
+            <template #default="scope">
+              <span>{{ parseTime(scope.row.lastTime, '{y}-{m}-{d} {h}:{mi}:{s}') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="是否告警" align="center" prop="alarmWitch">
+            <template #default="scope">
+              <dict-tag :options="sys_yes_no" :value="scope.row.alarmWitch"/>
+            </template>
+          </el-table-column>
+          <el-table-column label="告警关键字" align="center" prop="alarmKey"/>
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+            <template #default="scope">
+              <el-button link type="primary" icon="Edit" @click="handleSelect(scope.row)">选择指标</el-button>
+              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)">修改</el-button>
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <pagination
+            v-show="total>0"
+            :total="total"
+            v-model:page="queryParams.pageNum"
+            v-model:limit="queryParams.pageSize"
+            @pagination="getList"
+        />
+      </el-col>
+    </el-row>
+    <!-- 添加或修改模型指标分析对话框 -->
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+      <el-form ref="analyRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="指标自动ID" prop="autoId">
+          <el-input v-model="form.autoId" placeholder="请输入指标自动ID"/>
+        </el-form-item>
+        <el-form-item label="算法ID" prop="algoId">
+          <el-input v-model="form.algoId" placeholder="请输入算法ID"/>
+        </el-form-item>
+        <el-form-item label="定时分析" prop="timeSwitch">
+          <el-select v-model="form.timeSwitch" placeholder="请选择定时分析">
+            <el-option
+                v-for="dict in sys_yes_no"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="执行周期" prop="scheduleCycle">
+          <el-input v-model="form.scheduleCycle" placeholder="请输入执行周期"/>
+        </el-form-item>
+        <el-form-item label="上次执行时间" prop="lastTime">
+          <el-date-picker clearable
+                          v-model="form.lastTime"
+                          type="date"
+                          value-format="YYYY-MM-DD"
+                          placeholder="请选择上次执行时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="是否告警" prop="alarmWitch">
+          <el-select v-model="form.alarmWitch" placeholder="请选择是否告警">
+            <el-option
+                v-for="dict in sys_yes_no"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="告警关键字" prop="alarmKey">
+          <el-input v-model="form.alarmKey" placeholder="请输入告警关键字"/>
+        </el-form-item>
+        <el-form-item label="告警内容">
+          <editor v-model="form.alarmContent" :min-height="192"/>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"/>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+    <!-- 添加或修改业务模型对话框 -->
+    <el-dialog :title="titleS" v-model="openS" width="1300" append-to-body>
+      <select-metrics ref="selectMetricsRef" style="height: 600px; overflow-y: auto;"/>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="selectOK">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="Analy">
+import {addAnaly, batchInsert, delAnaly, getAnaly, listAnaly, updateAnaly} from "@/api/biz/analy";
+import { listAlgo} from "@/api/biz/algo";
+const {proxy} = getCurrentInstance();
+const {sys_yes_no} = proxy.useDict('sys_yes_no');
+
+const algoList = ref([]);
+const analyList = ref([]);
+const open = ref(false);
+const openS = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
+const titleS = ref("");
+const selectMetricsRef = ref(null);
+const modelName = ref("");
+const algoOptions = ref(undefined);
+const enabledModelOptions = ref(undefined);
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    autoId: null,
+    algoId: null,
+    timeSwitch: null,
+    scheduleCycle: null,
+    lastTime: null,
+    alarmWitch: null,
+    alarmKey: null,
+    alarmContent: null,
+    createBy: null,
+    createTime: null,
+    updateBy: null,
+    updateTime: null,
+    remark: null
+  },
+  rules: {
+    timeSwitch: [
+      {required: true, message: "定时分析不能为空", trigger: "change"}
+    ],
+    alarmKey: [
+      {required: true, message: "告警关键字不能为空", trigger: "blur"}
+    ],
+    alarmContent: [
+      {required: true, message: "告警内容不能为空", trigger: "blur"}
+    ],
+  }
+});
+
+const {queryParams, form, rules} = toRefs(data);
+const filterNode = (value, data) => {
+  if (!value) return true;
+  return data.label.indexOf(value) !== -1;
+};
+function getAlgoList() {
+  loading.value = true;
+  listAlgo(queryParams.value).then(response => {
+    algoList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+/** 查询部门下拉树结构 */
+function getModelTree() {
+  algoSelect().then(response => {
+    modelOptions.value = response.data;
+    enabledModelOptions.value = response.data;
+    handleQuery();
+  });
+};
+/** 根据名称筛选部门树 */
+watch(modelName, val => {
+  proxy.$refs["deptTreeRef"].filter(val);
+});
+/** 选择指标确定按钮 */
+function selectOK() {
+  try {
+    // 调用子组件的方法获取选中的数据
+    const selectedIds = selectMetricsRef.value.getSelectedData();
+
+    if (!selectedIds || selectedIds.length === 0) {
+      proxy.$modal.msgWarning("请先选择指标");
+      return;
+    }
+
+    const analyDataList = selectedIds.map(id => ({
+      autoId: id
+    }));
+
+    // 显示加载状态
+    proxy.$modal.loading("正在处理...");
+
+    batchInsert(analyDataList)
+        .then(response => {
+          proxy.$modal.closeLoading();
+          proxy.$modal.msgSuccess("操作成功");
+          getList();
+          openS.value = false;
+        })
+        .catch(error => {
+          proxy.$modal.closeLoading();
+          console.error('操作失败:', error);
+          proxy.$modal.msgError("操作失败: " + (error.message || "请检查网络连接或联系管理员"));
+        });
+  } catch (error) {
+    proxy.$modal.closeLoading();
+    console.error('发生错误:', error);
+    proxy.$modal.msgError("发生错误: " + error.message);
+  }
+}
+
+/** 查询模型指标分析列表 */
+function getList() {
+  loading.value = true;
+  listAnaly(queryParams.value).then(response => {
+    analyList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  openS.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    analyId: null,
+    autoId: null,
+    algoId: null,
+    timeSwitch: null,
+    scheduleCycle: null,
+    lastTime: null,
+    alarmWitch: null,
+    alarmKey: null,
+    alarmContent: null,
+    createBy: null,
+    createTime: null,
+    updateBy: null,
+    updateTime: null,
+    remark: null
+  };
+  proxy.resetForm("analyRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.analyId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加模型指标分析";
+}
+
+/** 修改按钮操作 */
+function handleSelect() {
+  openS.value = true;
+  titleS.value = "修改模型指标分析";
+  // reset();
+  // const _analyId = row.analyId || ids.value
+  // getAnaly(_analyId).then(response => {
+  //   form.value = response.data;
+  // });
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _analyId = row.analyId || ids.value
+  getAnaly(_analyId).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改模型指标分析";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["analyRef"].validate(valid => {
+    if (valid) {
+      if (form.value.analyId != null) {
+        updateAnaly(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addAnaly(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _analyIds = row.analyId || ids.value;
+  proxy.$modal.confirm('是否确认删除模型指标分析编号为"' + _analyIds + '"的数据项?').then(function () {
+    return delAnaly(_analyIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {
+  });
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('biz/analy/export', {
+    ...queryParams.value
+  }, `analy_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+getAlgoList();
+</script>

+ 0 - 0
src/views/biz/data/index.vue → src/views/ripa/data/index.vue


+ 2 - 2
src/views/biz/metrics/index.vue → src/views/ripa/metrics/index.vue

@@ -209,8 +209,8 @@ import {
   listMetrics,
   updateMetrics,
   validateMetrics
-} from "@/api/biz/metrics";
-import {modelTreeSelect} from "@/api/biz/model";
+} from "@/api/ripa/metrics";
+import {modelTreeSelect} from "@/api/ripa/model";
 import "splitpanes/dist/splitpanes.css"
 
 const {proxy} = getCurrentInstance();

+ 1 - 1
src/views/biz/model/index.vue → src/views/ripa/model/index.vue

@@ -111,7 +111,7 @@
 
 <script setup name="Model">
 
-import {addModel, delModel, getModel, listModel, updateModel} from "@/api/biz/model";
+import {addModel, delModel, getModel, listModel, updateModel} from "@/api/ripa/model";
 
 const {proxy} = getCurrentInstance();
 

+ 1 - 1
src/views/biz/record/index.vue → src/views/ripa/record/index.vue

@@ -177,7 +177,7 @@
 </template>
 
 <script setup name="Record">
-    import { listRecord, getRecord, delRecord, addRecord, updateRecord } from "@/api/biz/record";
+    import { listRecord, getRecord, delRecord, addRecord, updateRecord } from "@/api/ripa/record";
 
     const { proxy } = getCurrentInstance();
 const { sys_yes_no } = proxy.useDict('sys_yes_no');

+ 2 - 2
vite.config.js

@@ -25,13 +25,13 @@ export default defineConfig(({ mode, command }) => {
     },
     // vite 相关配置
     server: {
-      port: 8080,
+      port: 80,
       host: true,
       open: true,
       proxy: {
         // https://cn.vitejs.dev/config/#server-proxy
         '/dev-api': {
-          target: 'http://192.168.1.66:18080',
+          target: 'http://localhost:18081',
           changeOrigin: true,
           rewrite: (p) => p.replace(/^\/dev-api/, '')
         }