Răsfoiți Sursa

feat: 健康度配置开发

zhangwenya 1 an în urmă
părinte
comite
7f509c2712

+ 19 - 4
src/api/hl/bm.js

@@ -51,7 +51,7 @@ export function selectBm(modelId) {
     })
 }
 
-export function addBmModel(modelId,query) {
+export function addBmModel(modelId, query) {
     return request({
         url: '/hl/bm/obj/add/' + modelId,
         method: 'get',
@@ -60,7 +60,7 @@ export function addBmModel(modelId,query) {
 }
 
 // 一健巡检--模型列表
-export function getCheckList(){
+export function getCheckList() {
     return request({
         url: '/hl/bm/check/list',
         method: 'get'
@@ -68,9 +68,9 @@ export function getCheckList(){
 }
 
 // 一健巡检--按模型ID巡检
-export function getCheckModel(modelId){
+export function getCheckModel(modelId) {
     return request({
-        url: '/hl/bm/check/'+modelId,
+        url: '/hl/bm/check/' + modelId,
         method: 'get'
     })
 }
@@ -82,3 +82,18 @@ export function getBmConfig(modelId){
         method: 'get'
     })
 }
+
+// 日健康度历史记录
+export function dayHistory() {
+    return request({
+        url: 'hl/bm/day/history',
+        method: 'get',
+    })
+}// 健康度历史记录
+export function timeHistory() {
+    return request({
+        url: 'hl/bm/time/history',
+        method: 'get',
+    })
+}
+

+ 44 - 0
src/api/hl/hc.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询模型健康度分类列表
+export function listHc(query) {
+    return request({
+        url: '/hl/hc/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询模型健康度分类详细
+export function getHc(hlClassId) {
+    return request({
+        url: '/hl/hc/' + hlClassId,
+        method: 'get'
+    })
+}
+
+// 新增模型健康度分类
+export function addHc(data) {
+    return request({
+        url: '/hl/hc',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改模型健康度分类
+export function updateHc(data) {
+    return request({
+        url: '/hl/hc',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除模型健康度分类
+export function delHc(hlClassId) {
+    return request({
+        url: '/hl/hc/' + hlClassId,
+        method: 'delete'
+    })
+}

+ 44 - 0
src/api/hl/hcs.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询模型健康度分类得分列表
+export function listHcs(query) {
+    return request({
+        url: '/hl/hcs/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询模型健康度分类得分详细
+export function getHcs(scoreClassId) {
+    return request({
+        url: '/hl/hcs/' + scoreClassId,
+        method: 'get'
+    })
+}
+
+// 新增模型健康度分类得分
+export function addHcs(data) {
+    return request({
+        url: '/hl/hcs',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改模型健康度分类得分
+export function updateHcs(data) {
+    return request({
+        url: '/hl/hcs',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除模型健康度分类得分
+export function delHcs(scoreClassId) {
+    return request({
+        url: '/hl/hcs/' + scoreClassId,
+        method: 'delete'
+    })
+}

+ 67 - 0
src/api/hl/hm.js

@@ -0,0 +1,67 @@
+import request from '@/utils/request'
+
+// 查询业务模型健康度指标列表
+export function listHm(query) {
+    return request({
+        url: '/hl/hm/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询业务模型健康度指标详细
+export function getHm(hlMetricsId) {
+    return request({
+        url: '/hl/hm/' + hlMetricsId,
+        method: 'get'
+    })
+}
+
+// 新增业务模型健康度指标
+export function addHm(data) {
+    return request({
+        url: '/hl/hm',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改业务模型健康度指标
+export function updateHm(data) {
+    return request({
+        url: '/hl/hm',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除业务模型健康度指标
+export function delHm(hlMetricsId) {
+    return request({
+        url: '/hl/hm/' + hlMetricsId,
+        method: 'delete'
+    })
+}
+
+
+export function hmList(hlClassId) {
+    return request({
+        url: '/hl/hm/list/'+hlClassId,
+        method: 'get'
+    })
+}
+
+export function hmSelectList(hlClassId) {
+    return request({
+        url: '/hl/hm/select/'+hlClassId,
+        method: 'get'
+    })
+}
+
+export function addHmModel(hlClassId, query) {
+    return request({
+        url: '/hl/hm/add/' + hlClassId,
+        method: 'get',
+        params: query
+    })
+}

+ 44 - 0
src/api/hl/hms.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询业务模型健康度指标得分列表
+export function listHms(query) {
+    return request({
+        url: '/hl/hms/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询业务模型健康度指标得分详细
+export function getHms(scoreMetricsId) {
+    return request({
+        url: '/hl/hms/' + scoreMetricsId,
+        method: 'get'
+    })
+}
+
+// 新增业务模型健康度指标得分
+export function addHms(data) {
+    return request({
+        url: '/hl/hms',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改业务模型健康度指标得分
+export function updateHms(data) {
+    return request({
+        url: '/hl/hms',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除业务模型健康度指标得分
+export function delHms(scoreMetricsId) {
+    return request({
+        url: '/hl/hms/' + scoreMetricsId,
+        method: 'delete'
+    })
+}

+ 44 - 0
src/api/hl/hmsd.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询业务模型健康度得分指标明细列表
+export function listHmsd(query) {
+    return request({
+        url: '/hl/hmsd/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询业务模型健康度得分指标明细详细
+export function getHmsd(scoreDetailId) {
+    return request({
+        url: '/hl/hmsd/' + scoreDetailId,
+        method: 'get'
+    })
+}
+
+// 新增业务模型健康度得分指标明细
+export function addHmsd(data) {
+    return request({
+        url: '/hl/hmsd',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改业务模型健康度得分指标明细
+export function updateHmsd(data) {
+    return request({
+        url: '/hl/hmsd',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除业务模型健康度得分指标明细
+export function delHmsd(scoreDetailId) {
+    return request({
+        url: '/hl/hmsd/' + scoreDetailId,
+        method: 'delete'
+    })
+}

+ 45 - 0
src/api/hl/ho.js

@@ -1,4 +1,5 @@
 import request from '@/utils/request'
+
 export function hlClassList(hlClassId) {
     return request({
         url: '/hl/ho/list/' + hlClassId,
@@ -27,3 +28,47 @@ export function addHoList(hlClassId,query){
         params: query
     })
 }
+
+
+// 查询模型健康度对象列表
+export function listHo(query) {
+    return request({
+        url: '/hl/ho/list',
+        method: 'get',
+        params: query
+    })
+}
+
+export function getHo(hlObjId) {
+    return request({
+        url: '/hl/ho/' + hlObjId,
+        method: 'get'
+    })
+}
+
+// 新增模型健康度对象
+export function addHo(data) {
+    return request({
+        url: '/hl/ho',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改模型健康度对象
+export function updateHo(data) {
+    return request({
+        url: '/hl/ho',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除模型健康度对象
+export function delHo(hlObjId) {
+    return request({
+        url: '/hl/ho/' + hlObjId,
+        method: 'delete'
+    })
+}
+

+ 44 - 0
src/api/hl/hs.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询健康度分数记录列表
+export function listHs(query) {
+    return request({
+        url: '/hl/hs/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询健康度分数记录详细
+export function getHs(hlScoreId) {
+    return request({
+        url: '/hl/hs/' + hlScoreId,
+        method: 'get'
+    })
+}
+
+// 新增健康度分数记录
+export function addHs(data) {
+    return request({
+        url: '/hl/hs',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改健康度分数记录
+export function updateHs(data) {
+    return request({
+        url: '/hl/hs',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除健康度分数记录
+export function delHs(hlScoreId) {
+    return request({
+        url: '/hl/hs/' + hlScoreId,
+        method: 'delete'
+    })
+}

+ 81 - 0
src/views/hl/bm/component/dayHealth.vue

@@ -0,0 +1,81 @@
+<template>
+  <el-table
+      :data="hlsData"
+      border
+      style="width: 100%;"
+  >
+    <el-table-column label="ID" width="80" align="center">
+      <template #default="scope">
+        {{scope.row.hlScoreId || scope.row.dayId}}
+      </template>
+    </el-table-column>
+    <el-table-column prop="updateTime" label="评分时间">
+      <template #default="scope">
+        <span v-if="scope.row.hlDate">{{ parseTime(scope.row.hlDate, '{y}-{m}-{d}')}}</span>
+        <span v-else>
+          {{scope.row.updateTime}}
+        </span>
+      </template>
+    </el-table-column>
+    <el-table-column prop="hlScore" label="健康度得分" width="200"  align="center" />
+    <el-table-column label="操作" width="100" align="center">
+      <template #default="scope">
+        <el-button type="text" plain icon="Tickets" @click="handleHistoryDetails(scope.row)">明细</el-button>
+      </template>
+    </el-table-column>
+  </el-table>
+  <pagination
+      v-show="total>0"
+      :total="total"
+      v-model:page="params.pageNum"
+      v-model:limit="params.pageSize"
+      @pagination="getHlsData"
+  />
+
+  <el-dialog :title="title" v-model="open" width="1200px" append-to-body style="margin-top:2px!important">
+    <health-setting :modelId="hlScoreId" :details="true" :dialogType="dialogType"/>
+  </el-dialog>
+
+</template>
+<script setup lang="ts">
+import {hlsList} from "@/api/hl/hlScore"
+import {hlDayList} from "@/api/hl/hlDay"
+import {onMounted, watch} from "vue"
+import healthSetting from "./healthSetting.vue"
+const props = defineProps(['modelId','dialogType'])
+const hlsData = ref([])
+const total = ref(0)
+const open = ref(false)
+const title = ref("")
+const hlScoreId = ref(0)
+const params=reactive({
+  pageNum: 1,
+  pageSize: 10,
+})
+
+onMounted(()=>{
+  getHlsData()
+})
+
+function handleHistoryDetails(row){
+  if(props.dialogType === 'history'){
+    title.value = "历史健康度明细"
+    hlScoreId.value = row.hlScoreId
+  }else{
+    title.value = "日健康度明细"
+    hlScoreId.value = row.dayId
+  }
+  open.value = true
+}
+
+function getHlsData(){
+  const request = props.dialogType === 'history' ? hlsList : hlDayList
+  request(props.modelId,params).then(res=>{
+    hlsData.value = res.rows
+    total.value = res.total
+  })
+}
+
+</script>
+<style scoped lang="scss">
+</style>

+ 43 - 6
src/views/hl/bm/component/healthSetting.vue

@@ -16,21 +16,33 @@
     </el-table-column>
     <el-table-column label="分值" width="120" align="center">
       <template #default="scope">
-        <el-input v-model="scope.row.hlScore" size="small"  />
+        <el-input v-model="scope.row.hlScore" @blur="changeHlRow(scope.row)"/>
       </template>
     </el-table-column>
-    <el-table-column label="指标细项" width="120" align="center">
+    <el-table-column label="指标细项" width="155" align="center">
       <template #default="scope">
+        <el-select v-model="scope.row.scoreType" placeholder="请选择细项分" clearable @change="changeHlRow(scope.row)">
+          <el-option
+              v-for="dict in metrics_small_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+          />
+        </el-select>
       </template>
     </el-table-column>
-    <el-table-column label="操作" width="220">
+    <el-table-column label="操作" width="210">
       <template #default="scope">
-        <el-button type="primary" link icon="Position">健康指标管理</el-button>
-        <el-button type="primary" link icon="delete">删除</el-button>
+        <el-button type="primary" link icon="Position" @click="hcClassManage(scope.row)">健康指标管理</el-button>
+        <el-button type="primary" link icon="delete" @click="delBc(scope.row)">删除</el-button>
       </template>
     </el-table-column>
   </el-table>
 
+  <el-dialog title="健康指标管理" v-model="visibleHcMange" width="800">
+    <hm-list :hmRow="hmRow" v-if="visibleHcMange"/>
+  </el-dialog>
+
   <el-dialog title="选择对象" v-model="visible" >
     <el-button type="primary" plain @click="handleAddHl">选择对象</el-button>
     <el-table :data="hlData" border style="width: 100%;margin-top:10px;">
@@ -61,10 +73,12 @@
 <script setup lang="ts">
 import {getBmConfig} from "@/api/hl/bm"
 import {hlClassList,deleteHlClass,selectHlList,addHoList} from "@/api/hl/ho"
+import {updateHc,delHc} from "@/api/hl/hc"
 import {onMounted} from "vue";
+import hmList from "./widget/hmList.vue"
 const {proxy} = getCurrentInstance()
 const props = defineProps(['modelId'])
-const {biz_type} = proxy.useDict('biz_type');
+const {biz_type,metrics_small_type} = proxy.useDict('biz_type','metrics_small_type');
 const bmConfigData = ref([])
 const hlData = ref([])
 const selectHlData = ref([])
@@ -72,11 +86,34 @@ const visible = ref(false)
 const hlId = ref(null)
 const hlIds = ref([])
 const visibleHl = ref(false)
+const visibleHcMange = ref(false)
+const hmRow = ref({})
 
 onMounted(()=>{
   bmConfigList(props.modelId)
 })
 
+async function delBc(row){
+  await delHc(row.hlClassId)
+  await bmConfigList(props.modelId)
+}
+
+function hcClassManage(row){
+  visibleHcMange.value = true
+  hmRow.value=row;
+}
+
+function changeHlRow(row){
+  let count = 0
+  bmConfigData.value.forEach(p=>{
+    count += Number(p.hlScore)
+  })
+  if(count>100){
+    return proxy.$message.error("健康分值不能超过100")
+  }
+  updateHc(row)
+}
+
 function handleSelectionChange(selection){
   hlIds.value = selection.map(item => item.objId);
 }

+ 8 - 68
src/views/hl/bm/component/historyHealth.vue

@@ -1,79 +1,19 @@
 <template>
-  <el-table
-      :data="hlsData"
-      border
-      style="width: 100%;"
-  >
-    <el-table-column label="ID" width="80" align="center">
-      <template #default="scope">
-        {{scope.row.hlScoreId || scope.row.dayId}}
-      </template>
-    </el-table-column>
-    <el-table-column prop="updateTime" label="评分时间">
-      <template #default="scope">
-        <span v-if="scope.row.hlDate">{{ parseTime(scope.row.hlDate, '{y}-{m}-{d}')}}</span>
-        <span v-else>
-          {{scope.row.updateTime}}
-        </span>
-      </template>
-    </el-table-column>
-    <el-table-column prop="hlScore" label="健康度得分" width="200"  align="center" />
-    <el-table-column label="操作" width="100" align="center">
-      <template #default="scope">
-        <el-button type="text" plain icon="Tickets" @click="handleHistoryDetails(scope.row)">明细</el-button>
-      </template>
-    </el-table-column>
-  </el-table>
-  <pagination
-      v-show="total>0"
-      :total="total"
-      v-model:page="params.pageNum"
-      v-model:limit="params.pageSize"
-      @pagination="getHlsData"
-  />
-
-  <el-dialog :title="title" v-model="open" width="1200px" append-to-body style="margin-top:2px!important">
-    <health-setting :modelId="hlScoreId" :details="true" :dialogType="dialogType"/>
-  </el-dialog>
-
+  history {{modelId}}
 </template>
 <script setup lang="ts">
 import {hlsList} from "@/api/hl/hlScore"
-import {hlDayList} from "@/api/hl/hlDay"
-import {onMounted, watch} from "vue"
-import healthSetting from "./healthSetting.vue"
-const props = defineProps(['modelId','dialogType'])
-const hlsData = ref([])
-const total = ref(0)
-const open = ref(false)
-const title = ref("")
-const hlScoreId = ref(0)
-const params=reactive({
-  pageNum: 1,
-  pageSize: 10,
-})
+import {onMounted} from "vue";
+const {proxy} = getCurrentInstance()
+const props = defineProps(['modelId'])
 
 onMounted(()=>{
-  getHlsData()
+  getHlList()
 })
 
-function handleHistoryDetails(row){
-  if(props.dialogType === 'history'){
-    title.value = "历史健康度明细"
-    hlScoreId.value = row.hlScoreId
-  }else{
-    title.value = "日健康度明细"
-    hlScoreId.value = row.dayId
-  }
-  open.value = true
-}
-
-function getHlsData(){
-  const request = props.dialogType === 'history' ? hlsList : hlDayList
-  request(props.modelId,params).then(res=>{
-    hlsData.value = res.rows
-    total.value = res.total
-  })
+async function getHlList(){
+ const res =  await hlsList(props.modelId,{})
+  console.log(res)
 }
 
 </script>

+ 105 - 0
src/views/hl/bm/component/widget/hmList.vue

@@ -0,0 +1,105 @@
+<template>
+  <el-button type="primary" plain @click="changeHm">选择指标</el-button>
+  <el-table :data="hmData" border style="width: 100%;margin-top:10px;">
+    <el-table-column prop="metricsName" label="指标名称" />
+    <el-table-column prop="metricsCode" label="指标编码" width="120"/>
+    <el-table-column prop="hlMetricsName" label="健康度分值"  width="120">
+      <template #default="scope">
+        <el-input v-model="scope.row.hlScore" v-if="Number(hmRow.scoreType) === 2" @blur="changeHmRow(scope.row)"/>
+        <span v-else>{{scope.row.hlScore}}</span>
+      </template>
+    </el-table-column>
+    <el-table-column prop="hlMetricsName" label="评分标准"  width="180">
+      <template #default="scope">
+        <el-select v-model="scope.row.hlStand" placeholder="请选择评分标准" clearable @change="changeHmRow(scope.row)">
+          <el-option
+              v-for="dict in score_stand"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+          />
+        </el-select>
+      </template>
+    </el-table-column>
+    <el-table-column prop="hlMetricsName" label="操作"  width="120">
+      <template #default="scope">
+        <el-button type="primary" link icon="delete" @click="handleDeleteRow(scope.row)">删除</el-button>
+      </template>
+    </el-table-column>
+  </el-table>
+
+  <el-dialog title="选择指标" v-model="visibleHm">
+    <el-table :data="selectHmData" border style="width: 100%;margin-top:10px;" max-height="60vh" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column prop="metricsName" label="指标名称" />
+      <el-table-column prop="metricsCode" label="指标编码" width="120"/>
+    </el-table>
+    <div class="btn-row">
+      <el-button type="primary" @click="handleHmAdd">添加</el-button>
+      <el-button @click="visibleHm=false">取消</el-button>
+    </div>
+  </el-dialog>
+
+</template>
+<script setup lang="ts">
+import {hmList,updateHm,delHm,hmSelectList,addHmModel} from "@/api/hl/hm"
+import {onMounted} from "vue";
+const {proxy} = getCurrentInstance()
+const props = defineProps(['hmRow'])
+const { score_stand } = proxy.useDict('score_stand');
+const hmData = ref([])
+const visibleHm = ref(false)
+const selectHmData = ref([])
+const hmIds = ref([])
+
+onMounted(()=>{
+  getHmList()
+})
+
+async function changeHm(){
+  visibleHm.value = true
+  hmIds.value = []
+  const res  = await  hmSelectList(props.hmRow.hlClassId)
+  selectHmData.value = res.data
+}
+
+function handleSelectionChange(selection){
+  hmIds.value = selection.map(item => item.metricsId)
+}
+
+async function handleHmAdd(){
+  if(hmIds.value.length===0) return proxy.$message.error("请选择指标")
+  await addHmModel(props.hmRow.hlClassId,{ids:hmIds.value.join(",")})
+  visibleHm.value = false
+  await getHmList()
+}
+
+function changeHmRow(row){
+  let count = 0;
+  hmData.value.forEach(p=>{
+    count += Number(p.hlScore)
+  })
+  if(count>props.hmRow.hlScore){
+    return proxy.$message.error("健康度总分值不能超过"+props.hmRow.hlScore)
+  }
+  updateHm(row)
+}
+
+async function getHmList(){
+  const res = await hmList(props.hmRow.hlClassId)
+  hmData.value = res.data
+}
+
+async function handleDeleteRow(row){
+  await delHm(row.hlMetricsId)
+  await getHmList()
+}
+
+</script>
+<style scoped lang="scss">
+.btn-row{
+  margin-top: 20px;
+  display: flex;
+  justify-content: center;
+}
+</style>

+ 2 - 3
src/views/hl/bm/index.vue

@@ -86,9 +86,8 @@
 
 <script setup name="Bm">
 
-import {addBm, delBm, listBm, updateBm} from "@/api/hl/bm";
+import {addBm, delBm, listBm, updateBm,timeHistory,dayHistory} from "@/api/hl/bm";
 import {history} from "@/api/hl/hlScore";
-import {history as dayHistory} from "@/api/hl/hlDay";
 import addBmInfo from "./component/addBm.vue"
 import healthSetting from "./component/healthSetting.vue"
 import historyHealth from "./component/historyHealth.vue"
@@ -266,7 +265,7 @@ function initChatLeft(res, tag) {
 
 /** 查询业务模型列表 */
 function getList() {
-  history().then(response => {
+  timeHistory().then(response => {
     proxy.$nextTick(() => {
       initChatLeft(response, 'left');
     })

+ 354 - 0
src/views/hl/hc/index.vue

@@ -0,0 +1,354 @@
+<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="modelId">
+        <el-input
+          v-model="queryParams.modelId"
+          placeholder="请输入模型ID"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="业务类型" prop="objType">
+        <el-select v-model="queryParams.objType" placeholder="请选择业务类型" clearable>
+          <el-option
+            v-for="dict in biz_type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="细项分" prop="scoreType">
+        <el-select v-model="queryParams.scoreType" placeholder="请选择细项分" clearable>
+          <el-option
+            v-for="dict in metrics_small_type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="健康度分值" prop="hlScore">
+        <el-input
+          v-model="queryParams.hlScore"
+          placeholder="请输入健康度分值"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建人" prop="createBy">
+        <el-input
+          v-model="queryParams.createBy"
+          placeholder="请输入创建人"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker clearable
+          v-model="queryParams.createTime"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择创建时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="更新人" prop="updateBy">
+        <el-input
+          v-model="queryParams.updateBy"
+          placeholder="请输入更新人"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="更新时间" prop="updateTime">
+        <el-date-picker clearable
+          v-model="queryParams.updateTime"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择更新时间">
+        </el-date-picker>
+      </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"
+          v-hasPermi="['hl:hc:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="Edit"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['hl:hc:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="Delete"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['hl:hc:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="Download"
+          @click="handleExport"
+          v-hasPermi="['hl:hc:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="hcList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="健康度分类ID" align="center" prop="hlClassId" />
+      <el-table-column label="模型ID" align="center" prop="modelId" />
+      <el-table-column label="业务类型" align="center" prop="objType">
+        <template #default="scope">
+          <dict-tag :options="biz_type" :value="scope.row.objType"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="细项分" align="center" prop="scoreType">
+        <template #default="scope">
+          <dict-tag :options="metrics_small_type" :value="scope.row.scoreType"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="健康度分值" align="center" prop="hlScore" />
+      <el-table-column label="创建人" align="center" prop="createBy" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{mi}:{s}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="更新人" align="center" prop="updateBy" />
+      <el-table-column label="更新时间" align="center" prop="updateTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {h}:{mi}:{s}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark" />
+      <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)" v-hasPermi="['hl:hc:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['hl:hc:remove']">删除</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="hcRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="模型ID" prop="modelId">
+          <el-input v-model="form.modelId" placeholder="请输入模型ID" />
+        </el-form-item>
+        <el-form-item label="业务类型" prop="objType">
+          <el-select v-model="form.objType" placeholder="请选择业务类型">
+            <el-option
+              v-for="dict in biz_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="细项分" prop="scoreType">
+          <el-select v-model="form.scoreType" placeholder="请选择细项分">
+            <el-option
+              v-for="dict in metrics_small_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="健康度分值" prop="hlScore">
+          <el-input v-model="form.hlScore" placeholder="请输入健康度分值" />
+        </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="Hc">
+    import { listHc, getHc, delHc, addHc, updateHc } from "@/api/hl/hc";
+
+    const { proxy } = getCurrentInstance();
+const { metrics_small_type, biz_type } = proxy.useDict('metrics_small_type', 'biz_type');
+
+const hcList = 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,
+    modelId: null,
+    objType: null,
+    scoreType: null,
+    hlScore: null,
+    createBy: null,
+    createTime: null,
+    updateBy: null,
+    updateTime: null,
+    remark: null
+  },
+  rules: {
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询模型健康度分类列表 */
+function getList() {
+  loading.value = true;
+  listHc(queryParams.value).then(response => {
+    hcList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    hlClassId: null,
+    modelId: null,
+    objType: null,
+    scoreType: null,
+    hlScore: null,
+    createBy: null,
+    createTime: null,
+    updateBy: null,
+    updateTime: null,
+    remark: null
+  };
+  proxy.resetForm("hcRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.hlClassId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加模型健康度分类";
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _hlClassId = row.hlClassId || ids.value
+  getHc(_hlClassId).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改模型健康度分类";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["hcRef"].validate(valid => {
+    if (valid) {
+      if (form.value.hlClassId != null) {
+        updateHc(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addHc(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _hlClassIds = row.hlClassId || ids.value;
+  proxy.$modal.confirm('是否确认删除模型健康度分类编号为"' + _hlClassIds + '"的数据项?').then(function() {
+    return delHc(_hlClassIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('hl/hc/export', {
+    ...queryParams.value
+  }, `hc_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+</script>

+ 396 - 0
src/views/hl/hcs/index.vue

@@ -0,0 +1,396 @@
+<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="hlScoreId">
+        <el-input
+          v-model="queryParams.hlScoreId"
+          placeholder="请输入健康度分数记录ID"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="模型ID" prop="modelId">
+        <el-input
+          v-model="queryParams.modelId"
+          placeholder="请输入模型ID"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="业务类型" prop="objType">
+        <el-select v-model="queryParams.objType" placeholder="请选择业务类型" clearable>
+          <el-option
+            v-for="dict in biz_type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="细项分" prop="scoreType">
+        <el-select v-model="queryParams.scoreType" placeholder="请选择细项分" clearable>
+          <el-option
+            v-for="dict in metrics_small_type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="健康度分值" prop="hlScore">
+        <el-input
+          v-model="queryParams.hlScore"
+          placeholder="请输入健康度分值"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="扣分" prop="loseScore">
+        <el-input
+          v-model="queryParams.loseScore"
+          placeholder="请输入扣分"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="得分" prop="score">
+        <el-input
+          v-model="queryParams.score"
+          placeholder="请输入得分"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建人" prop="createBy">
+        <el-input
+          v-model="queryParams.createBy"
+          placeholder="请输入创建人"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker clearable
+          v-model="queryParams.createTime"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择创建时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="更新人" prop="updateBy">
+        <el-input
+          v-model="queryParams.updateBy"
+          placeholder="请输入更新人"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="更新时间" prop="updateTime">
+        <el-date-picker clearable
+          v-model="queryParams.updateTime"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择更新时间">
+        </el-date-picker>
+      </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"
+          v-hasPermi="['hl:hcs:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="Edit"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['hl:hcs:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="Delete"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['hl:hcs:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="Download"
+          @click="handleExport"
+          v-hasPermi="['hl:hcs:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="hcsList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="健康度分类ID" align="center" prop="scoreClassId" />
+      <el-table-column label="健康度分数记录ID" align="center" prop="hlScoreId" />
+      <el-table-column label="模型ID" align="center" prop="modelId" />
+      <el-table-column label="业务类型" align="center" prop="objType">
+        <template #default="scope">
+          <dict-tag :options="biz_type" :value="scope.row.objType"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="细项分" align="center" prop="scoreType">
+        <template #default="scope">
+          <dict-tag :options="metrics_small_type" :value="scope.row.scoreType"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="健康度分值" align="center" prop="hlScore" />
+      <el-table-column label="扣分" align="center" prop="loseScore" />
+      <el-table-column label="得分" align="center" prop="score" />
+      <el-table-column label="创建人" align="center" prop="createBy" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{mi}:{s}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="更新人" align="center" prop="updateBy" />
+      <el-table-column label="更新时间" align="center" prop="updateTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {h}:{mi}:{s}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark" />
+      <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)" v-hasPermi="['hl:hcs:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['hl:hcs:remove']">删除</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="hcsRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="健康度分数记录ID" prop="hlScoreId">
+          <el-input v-model="form.hlScoreId" placeholder="请输入健康度分数记录ID" />
+        </el-form-item>
+        <el-form-item label="模型ID" prop="modelId">
+          <el-input v-model="form.modelId" placeholder="请输入模型ID" />
+        </el-form-item>
+        <el-form-item label="业务类型" prop="objType">
+          <el-select v-model="form.objType" placeholder="请选择业务类型">
+            <el-option
+              v-for="dict in biz_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="细项分" prop="scoreType">
+          <el-select v-model="form.scoreType" placeholder="请选择细项分">
+            <el-option
+              v-for="dict in metrics_small_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="健康度分值" prop="hlScore">
+          <el-input v-model="form.hlScore" placeholder="请输入健康度分值" />
+        </el-form-item>
+        <el-form-item label="扣分" prop="loseScore">
+          <el-input v-model="form.loseScore" placeholder="请输入扣分" />
+        </el-form-item>
+        <el-form-item label="得分" prop="score">
+          <el-input v-model="form.score" placeholder="请输入得分" />
+        </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="Hcs">
+    import { listHcs, getHcs, delHcs, addHcs, updateHcs } from "@/api/hl/hcs";
+
+    const { proxy } = getCurrentInstance();
+const { metrics_small_type, biz_type } = proxy.useDict('metrics_small_type', 'biz_type');
+
+const hcsList = 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,
+    hlScoreId: null,
+    modelId: null,
+    objType: null,
+    scoreType: null,
+    hlScore: null,
+    loseScore: null,
+    score: null,
+    createBy: null,
+    createTime: null,
+    updateBy: null,
+    updateTime: null,
+    remark: null
+  },
+  rules: {
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询模型健康度分类得分列表 */
+function getList() {
+  loading.value = true;
+  listHcs(queryParams.value).then(response => {
+    hcsList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    scoreClassId: null,
+    hlScoreId: null,
+    modelId: null,
+    objType: null,
+    scoreType: null,
+    hlScore: null,
+    loseScore: null,
+    score: null,
+    createBy: null,
+    createTime: null,
+    updateBy: null,
+    updateTime: null,
+    remark: null
+  };
+  proxy.resetForm("hcsRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.scoreClassId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加模型健康度分类得分";
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _scoreClassId = row.scoreClassId || ids.value
+  getHcs(_scoreClassId).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改模型健康度分类得分";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["hcsRef"].validate(valid => {
+    if (valid) {
+      if (form.value.scoreClassId != null) {
+        updateHcs(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addHcs(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _scoreClassIds = row.scoreClassId || ids.value;
+  proxy.$modal.confirm('是否确认删除模型健康度分类得分编号为"' + _scoreClassIds + '"的数据项?').then(function() {
+    return delHcs(_scoreClassIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('hl/hcs/export', {
+    ...queryParams.value
+  }, `hcs_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+</script>

+ 341 - 0
src/views/hl/hm/index.vue

@@ -0,0 +1,341 @@
+<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="hlClassId">
+        <el-input
+            v-model="queryParams.hlClassId"
+            placeholder="请输入健康度分类ID"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="指标ID" prop="metricsId">
+        <el-input
+            v-model="queryParams.metricsId"
+            placeholder="请输入指标ID"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="健康度分值" prop="hlScore">
+        <el-input
+            v-model="queryParams.hlScore"
+            placeholder="请输入健康度分值"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="评分标准" prop="hlStand">
+        <el-select v-model="queryParams.hlStand" placeholder="请选择评分标准" clearable>
+          <el-option
+              v-for="dict in score_stand"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="创建人" prop="createBy">
+        <el-input
+            v-model="queryParams.createBy"
+            placeholder="请输入创建人"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker clearable
+                        v-model="queryParams.createTime"
+                        type="date"
+                        value-format="YYYY-MM-DD"
+                        placeholder="请选择创建时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="更新人" prop="updateBy">
+        <el-input
+            v-model="queryParams.updateBy"
+            placeholder="请输入更新人"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="更新时间" prop="updateTime">
+        <el-date-picker clearable
+                        v-model="queryParams.updateTime"
+                        type="date"
+                        value-format="YYYY-MM-DD"
+                        placeholder="请选择更新时间">
+        </el-date-picker>
+      </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"
+            v-hasPermi="['hl:hm:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="success"
+            plain
+            icon="Edit"
+            :disabled="single"
+            @click="handleUpdate"
+            v-hasPermi="['hl:hm:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="danger"
+            plain
+            icon="Delete"
+            :disabled="multiple"
+            @click="handleDelete"
+            v-hasPermi="['hl:hm:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="warning"
+            plain
+            icon="Download"
+            @click="handleExport"
+            v-hasPermi="['hl:hm:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="hmList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="指标明细ID" align="center" prop="hlMetricsId" />
+      <el-table-column label="健康度分类ID" align="center" prop="hlClassId" />
+      <el-table-column label="指标ID" align="center" prop="metricsId" />
+      <el-table-column label="健康度分值" align="center" prop="hlScore" />
+      <el-table-column label="评分标准" align="center" prop="hlStand">
+        <template #default="scope">
+          <dict-tag :options="score_stand" :value="scope.row.hlStand"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建人" align="center" prop="createBy" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{mi}:{s}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="更新人" align="center" prop="updateBy" />
+      <el-table-column label="更新时间" align="center" prop="updateTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {h}:{mi}:{s}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark" />
+      <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)" v-hasPermi="['hl:hm:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['hl:hm:remove']">删除</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="hmRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="健康度分类ID" prop="hlClassId">
+          <el-input v-model="form.hlClassId" placeholder="请输入健康度分类ID" />
+        </el-form-item>
+        <el-form-item label="指标ID" prop="metricsId">
+          <el-input v-model="form.metricsId" placeholder="请输入指标ID" />
+        </el-form-item>
+        <el-form-item label="健康度分值" prop="hlScore">
+          <el-input v-model="form.hlScore" placeholder="请输入健康度分值" />
+        </el-form-item>
+        <el-form-item label="评分标准" prop="hlStand">
+          <el-select v-model="form.hlStand" placeholder="请选择评分标准">
+            <el-option
+                v-for="dict in score_stand"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+            ></el-option>
+          </el-select>
+        </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="Hm">
+import { listHm, getHm, delHm, addHm, updateHm } from "@/api/hl/hm";
+
+const { proxy } = getCurrentInstance();
+const { score_stand } = proxy.useDict('score_stand');
+
+const hmList = 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,
+    hlClassId: null,
+    metricsId: null,
+    hlScore: null,
+    hlStand: null,
+    createBy: null,
+    createTime: null,
+    updateBy: null,
+    updateTime: null,
+    remark: null
+  },
+  rules: {
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询业务模型健康度指标列表 */
+function getList() {
+  loading.value = true;
+  listHm(queryParams.value).then(response => {
+    hmList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    hlMetricsId: null,
+    hlClassId: null,
+    metricsId: null,
+    hlScore: null,
+    hlStand: null,
+    createBy: null,
+    createTime: null,
+    updateBy: null,
+    updateTime: null,
+    remark: null
+  };
+  proxy.resetForm("hmRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.hlMetricsId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加业务模型健康度指标";
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _hlMetricsId = row.hlMetricsId || ids.value
+  getHm(_hlMetricsId).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改业务模型健康度指标";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["hmRef"].validate(valid => {
+    if (valid) {
+      if (form.value.hlMetricsId != null) {
+        updateHm(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addHm(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _hlMetricsIds = row.hlMetricsId || ids.value;
+  proxy.$modal.confirm('是否确认删除业务模型健康度指标编号为"' + _hlMetricsIds + '"的数据项?').then(function() {
+    return delHm(_hlMetricsIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('hl/hm/export', {
+    ...queryParams.value
+  }, `hm_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+</script>

+ 355 - 0
src/views/hl/hms/index.vue

@@ -0,0 +1,355 @@
+<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="scoreClassId">
+        <el-input
+          v-model="queryParams.scoreClassId"
+          placeholder="请输入健康度分类ID"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="指标ID" prop="metricsId">
+        <el-input
+          v-model="queryParams.metricsId"
+          placeholder="请输入指标ID"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="健康度分值" prop="hlScore">
+        <el-input
+          v-model="queryParams.hlScore"
+          placeholder="请输入健康度分值"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="评分标准" prop="hlStand">
+        <el-input
+          v-model="queryParams.hlStand"
+          placeholder="请输入评分标准"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="扣分" prop="loseScore">
+        <el-input
+          v-model="queryParams.loseScore"
+          placeholder="请输入扣分"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="得分" prop="score">
+        <el-input
+          v-model="queryParams.score"
+          placeholder="请输入得分"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建人" prop="createBy">
+        <el-input
+          v-model="queryParams.createBy"
+          placeholder="请输入创建人"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker clearable
+          v-model="queryParams.createTime"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择创建时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="更新人" prop="updateBy">
+        <el-input
+          v-model="queryParams.updateBy"
+          placeholder="请输入更新人"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="更新时间" prop="updateTime">
+        <el-date-picker clearable
+          v-model="queryParams.updateTime"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择更新时间">
+        </el-date-picker>
+      </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"
+          v-hasPermi="['hl:hms:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="Edit"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['hl:hms:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="Delete"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['hl:hms:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="Download"
+          @click="handleExport"
+          v-hasPermi="['hl:hms:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="hmsList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="指标明细ID" align="center" prop="scoreMetricsId" />
+      <el-table-column label="健康度分类ID" align="center" prop="scoreClassId" />
+      <el-table-column label="指标ID" align="center" prop="metricsId" />
+      <el-table-column label="健康度分值" align="center" prop="hlScore" />
+      <el-table-column label="评分标准" align="center" prop="hlStand" />
+      <el-table-column label="扣分" align="center" prop="loseScore" />
+      <el-table-column label="得分" align="center" prop="score" />
+      <el-table-column label="创建人" align="center" prop="createBy" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{mi}:{s}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="更新人" align="center" prop="updateBy" />
+      <el-table-column label="更新时间" align="center" prop="updateTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {h}:{mi}:{s}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark" />
+      <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)" v-hasPermi="['hl:hms:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['hl:hms:remove']">删除</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="hmsRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="健康度分类ID" prop="scoreClassId">
+          <el-input v-model="form.scoreClassId" placeholder="请输入健康度分类ID" />
+        </el-form-item>
+        <el-form-item label="指标ID" prop="metricsId">
+          <el-input v-model="form.metricsId" placeholder="请输入指标ID" />
+        </el-form-item>
+        <el-form-item label="健康度分值" prop="hlScore">
+          <el-input v-model="form.hlScore" placeholder="请输入健康度分值" />
+        </el-form-item>
+        <el-form-item label="评分标准" prop="hlStand">
+          <el-input v-model="form.hlStand" placeholder="请输入评分标准" />
+        </el-form-item>
+        <el-form-item label="扣分" prop="loseScore">
+          <el-input v-model="form.loseScore" placeholder="请输入扣分" />
+        </el-form-item>
+        <el-form-item label="得分" prop="score">
+          <el-input v-model="form.score" placeholder="请输入得分" />
+        </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="Hms">
+    import { listHms, getHms, delHms, addHms, updateHms } from "@/api/hl/hms";
+
+    const { proxy } = getCurrentInstance();
+
+const hmsList = 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,
+    scoreClassId: null,
+    metricsId: null,
+    hlScore: null,
+    hlStand: null,
+    loseScore: null,
+    score: null,
+    createBy: null,
+    createTime: null,
+    updateBy: null,
+    updateTime: null,
+    remark: null
+  },
+  rules: {
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询业务模型健康度指标得分列表 */
+function getList() {
+  loading.value = true;
+  listHms(queryParams.value).then(response => {
+    hmsList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    scoreMetricsId: null,
+    scoreClassId: null,
+    metricsId: null,
+    hlScore: null,
+    hlStand: null,
+    loseScore: null,
+    score: null,
+    createBy: null,
+    createTime: null,
+    updateBy: null,
+    updateTime: null,
+    remark: null
+  };
+  proxy.resetForm("hmsRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.scoreMetricsId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加业务模型健康度指标得分";
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _scoreMetricsId = row.scoreMetricsId || ids.value
+  getHms(_scoreMetricsId).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改业务模型健康度指标得分";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["hmsRef"].validate(valid => {
+    if (valid) {
+      if (form.value.scoreMetricsId != null) {
+        updateHms(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addHms(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _scoreMetricsIds = row.scoreMetricsId || ids.value;
+  proxy.$modal.confirm('是否确认删除业务模型健康度指标得分编号为"' + _scoreMetricsIds + '"的数据项?').then(function() {
+    return delHms(_scoreMetricsIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('hl/hms/export', {
+    ...queryParams.value
+  }, `hms_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+</script>

+ 241 - 0
src/views/hl/hmsd/index.vue

@@ -0,0 +1,241 @@
+<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="scoreMetricsId">
+        <el-input
+          v-model="queryParams.scoreMetricsId"
+          placeholder="请输入指标明细ID"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="ID" prop="objMetricsId">
+        <el-input
+          v-model="queryParams.objMetricsId"
+          placeholder="请输入ID"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </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"
+          v-hasPermi="['hl:hmsd:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="Edit"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['hl:hmsd:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="Delete"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['hl:hmsd:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="Download"
+          @click="handleExport"
+          v-hasPermi="['hl:hmsd:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="hmsdList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="指标明细ID" align="center" prop="scoreDetailId" />
+      <el-table-column label="指标明细ID" align="center" prop="scoreMetricsId" />
+      <el-table-column label="ID" align="center" prop="objMetricsId" />
+      <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)" v-hasPermi="['hl:hmsd:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['hl:hmsd:remove']">删除</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="hmsdRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="指标明细ID" prop="scoreMetricsId">
+          <el-input v-model="form.scoreMetricsId" placeholder="请输入指标明细ID" />
+        </el-form-item>
+        <el-form-item label="ID" prop="objMetricsId">
+          <el-input v-model="form.objMetricsId" placeholder="请输入ID" />
+        </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="Hmsd">
+    import { listHmsd, getHmsd, delHmsd, addHmsd, updateHmsd } from "@/api/hl/hmsd";
+
+    const { proxy } = getCurrentInstance();
+
+const hmsdList = 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,
+    scoreMetricsId: null,
+    objMetricsId: null
+  },
+  rules: {
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询业务模型健康度得分指标明细列表 */
+function getList() {
+  loading.value = true;
+  listHmsd(queryParams.value).then(response => {
+    hmsdList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    scoreDetailId: null,
+    scoreMetricsId: null,
+    objMetricsId: null
+  };
+  proxy.resetForm("hmsdRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.scoreDetailId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加业务模型健康度得分指标明细";
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _scoreDetailId = row.scoreDetailId || ids.value
+  getHmsd(_scoreDetailId).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改业务模型健康度得分指标明细";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["hmsdRef"].validate(valid => {
+    if (valid) {
+      if (form.value.scoreDetailId != null) {
+        updateHmsd(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addHmsd(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _scoreDetailIds = row.scoreDetailId || ids.value;
+  proxy.$modal.confirm('是否确认删除业务模型健康度得分指标明细编号为"' + _scoreDetailIds + '"的数据项?').then(function() {
+    return delHmsd(_scoreDetailIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('hl/hmsd/export', {
+    ...queryParams.value
+  }, `hmsd_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+</script>

+ 299 - 0
src/views/hl/ho/index.vue

@@ -0,0 +1,299 @@
+<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="hlClassId">
+        <el-input
+          v-model="queryParams.hlClassId"
+          placeholder="请输入健康度分类ID"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="对象ID" prop="objId">
+        <el-input
+          v-model="queryParams.objId"
+          placeholder="请输入对象ID"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建人" prop="createBy">
+        <el-input
+          v-model="queryParams.createBy"
+          placeholder="请输入创建人"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker clearable
+          v-model="queryParams.createTime"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择创建时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="更新人" prop="updateBy">
+        <el-input
+          v-model="queryParams.updateBy"
+          placeholder="请输入更新人"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="更新时间" prop="updateTime">
+        <el-date-picker clearable
+          v-model="queryParams.updateTime"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择更新时间">
+        </el-date-picker>
+      </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"
+          v-hasPermi="['hl:ho:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="Edit"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['hl:ho:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="Delete"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['hl:ho:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="Download"
+          @click="handleExport"
+          v-hasPermi="['hl:ho:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="hoList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="健康度对象ID" align="center" prop="hlObjId" />
+      <el-table-column label="健康度分类ID" align="center" prop="hlClassId" />
+      <el-table-column label="对象ID" align="center" prop="objId" />
+      <el-table-column label="创建人" align="center" prop="createBy" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{mi}:{s}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="更新人" align="center" prop="updateBy" />
+      <el-table-column label="更新时间" align="center" prop="updateTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {h}:{mi}:{s}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark" />
+      <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)" v-hasPermi="['hl:ho:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['hl:ho:remove']">删除</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="hoRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="健康度分类ID" prop="hlClassId">
+          <el-input v-model="form.hlClassId" placeholder="请输入健康度分类ID" />
+        </el-form-item>
+        <el-form-item label="对象ID" prop="objId">
+          <el-input v-model="form.objId" placeholder="请输入对象ID" />
+        </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="Ho">
+    import { listHo, getHo, delHo, addHo, updateHo } from "@/api/hl/ho";
+
+    const { proxy } = getCurrentInstance();
+
+const hoList = 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,
+    hlClassId: null,
+    objId: null,
+    createBy: null,
+    createTime: null,
+    updateBy: null,
+    updateTime: null,
+    remark: null
+  },
+  rules: {
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询模型健康度对象列表 */
+function getList() {
+  loading.value = true;
+  listHo(queryParams.value).then(response => {
+    hoList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    hlObjId: null,
+    hlClassId: null,
+    objId: null,
+    createBy: null,
+    createTime: null,
+    updateBy: null,
+    updateTime: null,
+    remark: null
+  };
+  proxy.resetForm("hoRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.hlObjId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加模型健康度对象";
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _hlObjId = row.hlObjId || ids.value
+  getHo(_hlObjId).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改模型健康度对象";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["hoRef"].validate(valid => {
+    if (valid) {
+      if (form.value.hlObjId != null) {
+        updateHo(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addHo(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _hlObjIds = row.hlObjId || ids.value;
+  proxy.$modal.confirm('是否确认删除模型健康度对象编号为"' + _hlObjIds + '"的数据项?').then(function() {
+    return delHo(_hlObjIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('hl/ho/export', {
+    ...queryParams.value
+  }, `ho_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+</script>

+ 325 - 0
src/views/hl/hs/index.vue

@@ -0,0 +1,325 @@
+<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="modelId">
+        <el-input
+          v-model="queryParams.modelId"
+          placeholder="请输入模型ID"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="健康度分值" prop="hlScore">
+        <el-input
+          v-model="queryParams.hlScore"
+          placeholder="请输入健康度分值"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="日期" prop="hlDate">
+        <el-date-picker clearable
+          v-model="queryParams.hlDate"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择日期">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="创建人" prop="createBy">
+        <el-input
+          v-model="queryParams.createBy"
+          placeholder="请输入创建人"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker clearable
+          v-model="queryParams.createTime"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择创建时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="更新人" prop="updateBy">
+        <el-input
+          v-model="queryParams.updateBy"
+          placeholder="请输入更新人"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="更新时间" prop="updateTime">
+        <el-date-picker clearable
+          v-model="queryParams.updateTime"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择更新时间">
+        </el-date-picker>
+      </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"
+          v-hasPermi="['hl:hs:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="Edit"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['hl:hs:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="Delete"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['hl:hs:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="Download"
+          @click="handleExport"
+          v-hasPermi="['hl:hs:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="hsList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="健康度分数记录ID;" align="center" prop="hlScoreId" />
+      <el-table-column label="模型ID" align="center" prop="modelId" />
+      <el-table-column label="健康度分值" align="center" prop="hlScore" />
+      <el-table-column label="类型" align="center" prop="hlType" />
+      <el-table-column label="日期" align="center" prop="hlDate" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.hlDate, '{y}-{m}-{d} {h}:{mi}:{s}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建人" align="center" prop="createBy" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{mi}:{s}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="更新人" align="center" prop="updateBy" />
+      <el-table-column label="更新时间" align="center" prop="updateTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {h}:{mi}:{s}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark" />
+      <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)" v-hasPermi="['hl:hs:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['hl:hs:remove']">删除</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="hsRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="模型ID" prop="modelId">
+          <el-input v-model="form.modelId" placeholder="请输入模型ID" />
+        </el-form-item>
+        <el-form-item label="健康度分值" prop="hlScore">
+          <el-input v-model="form.hlScore" placeholder="请输入健康度分值" />
+        </el-form-item>
+        <el-form-item label="日期" prop="hlDate">
+          <el-date-picker clearable
+            v-model="form.hlDate"
+            type="date"
+            value-format="YYYY-MM-DD"
+            placeholder="请选择日期">
+          </el-date-picker>
+        </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="Hs">
+    import { listHs, getHs, delHs, addHs, updateHs } from "@/api/hl/hs";
+
+    const { proxy } = getCurrentInstance();
+
+const hsList = 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,
+    modelId: null,
+    hlScore: null,
+    hlType: null,
+    hlDate: null,
+    createBy: null,
+    createTime: null,
+    updateBy: null,
+    updateTime: null,
+    remark: null
+  },
+  rules: {
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询健康度分数记录列表 */
+function getList() {
+  loading.value = true;
+  listHs(queryParams.value).then(response => {
+    hsList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    hlScoreId: null,
+    modelId: null,
+    hlScore: null,
+    hlType: null,
+    hlDate: null,
+    createBy: null,
+    createTime: null,
+    updateBy: null,
+    updateTime: null,
+    remark: null
+  };
+  proxy.resetForm("hsRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.hlScoreId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加健康度分数记录";
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _hlScoreId = row.hlScoreId || ids.value
+  getHs(_hlScoreId).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改健康度分数记录";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["hsRef"].validate(valid => {
+    if (valid) {
+      if (form.value.hlScoreId != null) {
+        updateHs(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addHs(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _hlScoreIds = row.hlScoreId || ids.value;
+  proxy.$modal.confirm('是否确认删除健康度分数记录编号为"' + _hlScoreIds + '"的数据项?').then(function() {
+    return delHs(_hlScoreIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('hl/hs/export', {
+    ...queryParams.value
+  }, `hs_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+</script>