Browse Source

更新指标管理首页数据

hsh 11 tháng trước cách đây
mục cha
commit
5105b85352

+ 18 - 0
src/api/target-management/target-dict.js

@@ -87,4 +87,22 @@ export function selectScoreCyclePermissions() {
         method: 'get',
         params: { },
     })
+}
+
+// 查询指标得分明细(指标的父子级)
+export function selectTargetDictScoreById(data){
+    return request({
+        url: '/targetManagement/selectTargetDictScoreById',
+        method: 'post',
+        data,
+    })
+}
+
+// 查询指标得分汇总(指标的第二级得分)相关信息
+export function selectTargetTotalScoreInfo(data){
+    return request({
+        url: '/targetManagement/selectTargetTotalScoreInfo',
+        method: 'post',
+        data,
+    })
 }

+ 25 - 10
src/views/target-management/target-dict/TargetDictConfig.vue

@@ -883,6 +883,12 @@ const saveTargetDictResult = () => {
 }
 
 // -------------------- 指标统计结果查询 --------------------
+const queryData = ref({
+  id: '',
+  pid: '',
+  startTime: '',
+  endTime: '',
+})
 let QtResultData = ref([])
 const queryTargetReportResult = () => {
 
@@ -896,6 +902,11 @@ const queryTargetReportResult = () => {
     return
   }
 
+  if (queryData.value.startTime === '' || queryData.value.endTime === '') {
+    queryData.value.startTime = sqlForm.startTime
+    queryData.value.endTime = sqlForm.endTime
+  }
+
   if (isShowHandWrite.value) {
     isShowHandWrite.value = false
   }
@@ -903,15 +914,9 @@ const queryTargetReportResult = () => {
     isShowTargetResult.value = false
   }
 
-  let queryData = {
-    id: '',
-    pid: '',
-    startTime: '',
-    endTime: '',
-  }
-  queryData.id = ruleForm.value.id
-  queryData.pid = ruleForm.value.pid
-  selectTargetReportResult(queryData)
+  queryData.value.id = ruleForm.value.id
+  queryData.value.pid = ruleForm.value.pid
+  selectTargetReportResult(queryData.value)
     .then((res: any) => {
       if (isShowQtResult.value === false) {
         isShowQtResult.value = true
@@ -947,6 +952,8 @@ const cycleFormat = () => {
   if(reportCycle){
     sqlForm.startTime = reportCycle[0].startYear
     sqlForm.endTime = reportCycle[0].endYear
+    queryData.value.startTime = reportCycle[0].startYear
+    queryData.value.endTime = reportCycle[0].endYear
     let params = {
       id: ruleForm.value.id,
       reportCycle: cycle.value
@@ -993,7 +1000,15 @@ const callSaveTargetReportScore = () => {
     });
     return
   }
-
+  if (/^(([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/.test(zbScore.value) === false) {
+    ElMessage({
+      type: "warning",
+      message: "填写数据格式不正确,请确认!",
+      duration: 2500,
+      showClose: true,
+    });
+    return
+  }
   if (zbScore.value > ruleForm.value.score) {
     ElMessage({
       type: "info",

+ 225 - 290
src/views/target-management/target-home/TargetHomePage.vue

@@ -1,256 +1,253 @@
 <template>
+  <div class="layout_container">
+<!--    <div style="background-color: #fff;">-->
     <div style="background-color: #fff;">
+      <div class="layout_main layout_container">
         <div class="cl-dv">
-            <div class="cl-sn">
-                <el-card class="el-cd1" shadow="hover">
-                    <template #header>
-                        <div>
-                            <span>本年度责任指标</span>
-                        </div>
-                    </template>
-                    <div>
-                        <i class="iconfont icon-zhantie"></i> 99 / 100
-                    </div>
-                </el-card>
-            </div>
-            <div class="cl-sn">
-                <el-card class="el-cd2" shadow="hover">
-                    <template #header>
-                        <div>
-                            <span>本年度填报指标</span>
-                        </div>
-                    </template>
-                    <div>
-                        <i class="iconfont icon-zhantie"></i> 99 / 100
-                    </div>
-                </el-card>
-            </div>
-            <div class="cl-sn">
-                <el-card class="el-cd3" shadow="hover">
-                    <template #header>
-                        <div>
-                            <span>本年度指标总分</span>
-                        </div>
-                    </template>
-                    <div>
-                        <i class="iconfont icon-zhantie"></i> 998 / 1000 分
-                    </div>
-                </el-card>
-            </div>
-            <div class="cl-sn">
-                <el-card class="el-cd4" shadow="hover">
-                    <template #header>
-                        <div>
-                            <span>本年度责任指标不合格项</span>
-                        </div>
-                    </template>
-                    <div>
-                        <i class="iconfont icon-zhantie"></i> 123
-                    </div>
-                </el-card>
-            </div>
+          <div class="cl-sn">
+            <el-card class="el-cd1" shadow="hover">
+              <template #header>
+                <div>
+                  <span>本年度责任指标</span>
+                </div>
+              </template>
+              <div>
+                <i class="iconfont icon-zhantie"></i> 99 / 100
+              </div>
+            </el-card>
+          </div>
+          <div class="cl-sn">
+            <el-card class="el-cd2" shadow="hover">
+              <template #header>
+                <div>
+                  <span>本年度填报指标</span>
+                </div>
+              </template>
+              <div>
+                <i class="iconfont icon-zhantie"></i> 99 / 100
+              </div>
+            </el-card>
+          </div>
+          <div class="cl-sn">
+            <el-card class="el-cd3" shadow="hover">
+              <template #header>
+                <div>
+                  <span>本年度指标总分</span>
+                </div>
+              </template>
+              <div>
+                <i class="iconfont icon-zhantie"></i> 998 / 1000 分
+              </div>
+            </el-card>
+          </div>
+          <div class="cl-sn">
+            <el-card class="el-cd4" shadow="hover">
+              <template #header>
+                <div>
+                  <span>本年度责任指标不合格项</span>
+                </div>
+              </template>
+              <div>
+                <i class="iconfont icon-zhantie"></i> 123
+              </div>
+            </el-card>
+          </div>
         </div>
-        <div style="margin-top: 5px;">
+        <div style="margin-top: 2px;">
+          <div class="layout_display_flex_y">
             <el-row :gutter="24">
-                <el-col :span="12">
-                    <div style="width: 100%; height: 400px" id="main"></div>
-                </el-col>
-                <el-col :span="12">
-                    <div style="width: 100%; height: 400px" id="rcpie"></div>
-                </el-col>
+              <el-col :span="12">
+                <div style="width: 100%; height: 410px" id="main"></div>
+              </el-col>
+              <el-col :span="12">
+                <div style="width: 100%; height: 410px" id="pie"></div>
+              </el-col>
             </el-row>
+          </div>
         </div>
-        <div style="margin-top: 5px; calc(100% - 450);">
-            <page-layer>
-                <template #header height="55px;">
-                    <el-date-picker v-model="dateRange" type="monthrange" range-separator="至" start-placeholder="开始月份"
-                        end-placeholder="结束月份" style="width: 320px"></el-date-picker>
-                    <el-cascader v-model="queryData.dataInfo" :options="targetTreeData" style="width: 720px"
-                        :props="{ value: 'id', label: 'label', children: 'children', expandTrigger: 'hover' }"
-                        @change="handleChange" :clearable="true" :filterable="true" placeholder="请选择指标">
-                    </el-cascader>
-                    <el-button type="primary" icon="Search" @click="query" style="margin-left: 10px">查询</el-button>
-                </template>
-                <template #main>
-                    <el-tabs type="border-card" v-model="queryData.selectType" @tab-click="handleClick">
-                        <el-tab-pane label="数据" name="first">
-                            <el-table :data="targetInfos" :height="tableHeight" border highlight-current-row
-                                row-key="childKey" stripe>
-                                <el-table-column type="index" label="序号" align="center"
-                                    header-align="center"></el-table-column>
-                                <el-table-column label="指标名称" prop="t_name" align="left" header-align="center"
-                                    width="160"></el-table-column>
-                                <el-table-column label="评审方法" prop="t_method" align="left" header-align="center" width="180"
-                                    show-overflow-tooltip></el-table-column>
-                                <el-table-column label="计分细则" prop="t_rule" align="left" header-align="center" width="280"
-                                    show-overflow-tooltip></el-table-column>
-                                <el-table-column label="分数" prop="t_score" align="right" header-align="center"
-                                    width="80"></el-table-column>
-                                <el-table-column label="指标结果" prop="t_result" header-align="center">
-                                    <el-table-column label="2019年" prop="t_y1" align="right"
-                                        header-align="center"></el-table-column>
-                                    <el-table-column label="2020年" prop="t_y2" align="right"
-                                        header-align="center"></el-table-column>
-                                    <el-table-column label="2021年" prop="t_y3" align="right"
-                                        header-align="center"></el-table-column>
-                                    <el-table-column label="2022年" prop="t_y4" align="right"
-                                        header-align="center"></el-table-column>
-                                </el-table-column>
-                                <el-table-column label="负责人" prop="t_manager" align="center"
-                                    header-align="center"></el-table-column>
-                                <el-table-column label="完成状态" prop="t_state" align="center"
-                                    header-align="center"></el-table-column>
-                            </el-table>
-                        </el-tab-pane>
-                    </el-tabs>
-                </template>
-            </page-layer>
+        <div class="layout_main layout_overflow_auto" style="margin-top: 5px;">
+          <div class="layout_display_flex_y">
+            <header>
+              <el-form ref="upFormRef" label-width="100px" :model="queryData" class="demo-ruleForm" :size="'default'">
+                <el-row>
+                  <el-col :span="6">
+                    <el-form-item label="年度周期" prop="reportCycle">
+                      <el-select v-model="queryData.reportCycle" placeholder="请选择年度周期" clearable style="width: 100%" @change="cycleFormat">
+                        <el-option v-for="item in reportCycleList" :key="item.reportCycle"
+                                   :label="item.yearRange" :value="item.reportCycle" selected>
+                          <span style="float: left">{{ item.yearRange }}</span>
+                          <span style="float: right; padding-left: 4px; color: var(--el-text-color-secondary); font-size: 13px;">
+                            {{ item.remark }}</span>
+                        </el-option>
+                      </el-select>
+                    </el-form-item>
+                  </el-col>
+                  <el-col :span="6">
+                    <el-form-item label="开始年份">
+                      <el-form-item prop="startTime"><el-input v-model="queryData.startTime" disabled /></el-form-item>
+                    </el-form-item>
+                  </el-col>
+                  <el-col :span="6">
+                    <el-form-item label="结束年份">
+                      <el-form-item prop="endTime"><el-input v-model="queryData.endTime" disabled /></el-form-item>
+                    </el-form-item>
+                  </el-col>
+<!--                  <el-button type="primary" icon="Search" @click="query" style="margin-left: 10px">查询</el-button>-->
+                </el-row>
+                <el-row>
+                  <el-col :span="24">
+                    <el-form-item label="指标" prop="target">
+                      <el-cascader v-model="queryData.dataInfo" :options="targetTreeData" style="width: 100%"
+                                   :props="{ value: 'id', label: 'label', children: 'children', expandTrigger: 'hover' }"
+                                   @change="handleChange" :clearable="true" :filterable="true" placeholder="请选择指标">
+                      </el-cascader>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+              </el-form>
+            </header>
+            <div class="layout_display_flex layout_overflow_auto" style="height: 280px">
+              <div class="layout_display_flex_y layout_el-table">
+                <el-table :data="targetInfos" border highlight-current-row row-key="childKey" stripe>
+                  <el-table-column type="index" label="序号" align="center" header-align="center"></el-table-column>
+                  <el-table-column label="指标名称" prop="t_name" align="left" header-align="center" width="240" show-overflow-tooltip></el-table-column>
+                  <el-table-column label="评审方法" prop="t_method" align="left" header-align="center" show-overflow-tooltip></el-table-column>
+                  <el-table-column label="计分细则" prop="t_rule" align="left" header-align="center" width="240" show-overflow-tooltip></el-table-column>
+                  <el-table-column label="得分/满分" prop="t_score" align="right" header-align="center" width="80"></el-table-column>
+                  <el-table-column label="指标结果" prop="t_result" header-align="center">
+                    <template v-for="col in y">
+                      <el-table-column :label="(yearInfo + col - 1) + '年'" :prop="'t_' + (yearInfo + col - 1)" width="80" align="right" header-align="center"></el-table-column>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="负责人" prop="t_manager" width="80" align="center" header-align="center"></el-table-column>
+                </el-table>
+              </div>
+            </div>
+          </div>
         </div>
+      </div>
     </div>
+  </div>
 </template>
 <script setup name="TargetHomePage">
-import PageLayer from '@/layout/PageLayer.vue'
 import { ElMessage } from 'element-plus'
-import { ref, reactive, onMounted, nextTick } from 'vue'
+import { ref, onMounted, nextTick} from 'vue'
 import { highBarsUtils, highBarsNiceUtils } from '@/utils/high-charts'
-import { getDateRangeFormatDate, formatDatetime } from '@/utils/date'
-import { clone } from '../../../utils/clone'
-import { selectTargetDictTree } from '../../../api/target-management/target-dict'
+import { clone } from '@/utils/clone'
+import { selectTargetDictTree,selectScoreCycle, selectTargetDictScoreById, selectTargetTotalScoreInfo } from '@/api/target-management/target-dict'
 
 const dateRange = ref([])
 const targetInfos = ref([])
-const tableHeight = window.innerHeight - 620
-const dateS = getDateRangeFormatDate(dateRange.value)
 const targetTreeData = ref()
-const queryData = reactive({
-    startTime: dateS.startTime,
-    endTime: dateS.endTime,
-    targetType: 't1',
-    selectType: 'first',
-    dataInfo: null,
+// 得分年份
+const reportCycleList = ref([])
+// 年度周期
+const y = ref(4)
+// 开始年份
+const yearInfo = ref(2021)
+const queryData = ref({
+  startTime: '2021',
+  endTime: '2024',
+  id: '21',
+  pid: 'B11',
+  bigId: 'B1',
+  targetType: 't1',
+  reportCycle: 'Y1', // 年度周期
+  selectType: 'first',
+  dataInfo: ['B1','B11','21'],
 })
 
 const handleChange = (value) => {
+  queryData.value.id = value[value.length - 1]
+  queryData.value.pid = value[value.length - 2]
+  queryData.value.bigId = value[0]
+  query()
 }
 
-const queryParam = reactive({
-    id: '', // 指标编码
-    name: '', // 指标名称
-    pid: '', // 父级编码
-    sort: '', // 指标序号
-    type: '', // 对接类型
-    state: '', // 状态
-    openTime: '', // 启用时间
-    deptId: '', // 责任科室id
-    source: '', // 数据来源
-    calcChild: '', // 计算分子sql
-    calcMom: '', // 计算分母sql
-    isLeaf: '', //是否叶子节点(0:否, 1:是)
+const queryParam = ref({
+  id: '', // 指标编码
+  name: '', // 指标名称
+  pid: '', // 父级编码
+  sort: '', // 指标序号
+  type: '', // 对接类型
+  state: '', // 状态
+  openTime: '', // 启用时间
+  deptId: '', // 责任科室id
+  source: '', // 数据来源
+  calcChild: '', // 计算分子sql
+  calcMom: '', // 计算分母sql
+  isLeaf: '', //是否叶子节点(0:否, 1:是)
 })
 
-const qeryTargetDictTree = () => {
-    queryParam.id = '';
-    queryParam.pid = '';
-    selectTargetDictTree(queryParam)
-        .then((res) => {
-            targetTreeData.value = clone(res[0].children)
-        });
-}
-
-const handleClick = (tab, event) => {
-    if (!dateRange.value) {
-        ElMessage({
-            message: '请选择时间范围!',
-            type: 'warning',
-            duration: 2500,
-            showClose: true,
-        })
-        return
-    }
-
-    if (!queryData.dataInfo) {
-        ElMessage({
-            message: '请选择指标!',
-            type: 'warning',
-            duration: 2500,
-            showClose: true,
-        })
-        return
-    }
-
-    queryData.setlType = queryData.dataInfo[0]
-    queryData.insurType = queryData.dataInfo[1]
-
-    queryData.startTime = formatDatetime(dateRange.value[0])
-    queryData.endTime = formatDatetime(dateRange.value[1])
-
-    // 查询哪个tab页面
-    queryData.selectType = tab.props.name
-
-    if (queryData.selectType === 'first') {
-        targetInfos.value = [
-            {
-                t_name: '核定床位数', t_method: '核定床位数(≥500张)', t_rule: '核定床位数(≥500张)记1分',
-                t_score: 1, t_y1: '3', t_y2: '8', t_y3: '12', t_y4: '24', t_manager: 'xxx', t_state: '已完成'
-            },
-            {
-                t_name: '实际开放床位数', t_method: '实际开放床位数(≥500张)', t_rule: '实际开放床位数(≥500张)记3分',
-                t_score: 1, t_y1: '90', t_y2: '124', t_y3: '145', t_y4: '165', t_manager: 'xxx', t_state: '已完成'
-            },
-            {
-                t_name: '平均床位使用率', t_method: '平均床位使用率(≥93%)', t_rule: '平均床位使用率(≥93%)记6分',
-                t_score: 1, t_y1: '93%', t_y2: '90%', t_y3: '96%', t_y4: '98%', t_manager: 'xxx', t_state: '已完成'
-            }
-        ]
-    }
-
+const queryTargetDictTree = () => {
+  queryParam.value.id = '';
+  queryParam.value.pid = '';
+  selectTargetDictTree(queryParam.value)
+    .then((res) => {
+        targetTreeData.value = clone(res[0].children)
+    });
 }
 
+const XNames = ref(['第一章', '第二章', '第三章', '第四章', '第五章'])
+const TNames = ref(['总分', '得分'])
+const unit = ref('分')
+const titleName = ref('单位:分')
+const title = ref('2021-2024 指标得分情况统计')
+const statusInfos = ref({
+  zflag: true, // 柱子是否显示数据
+  toolBoxFlag: false, // 是否显示下载,切换标签
+})
+const infoData = ref([])
 onMounted(() => {
+  nextTick(async () => {
+    queryTargetDictTree()
+    queryScoreCycle()
+    query()
+    await queryTargetTotalScoreInfo()
+  })
+  highBarsNiceUtils(pie)
+})
 
-    nextTick(async () => {
-        qeryTargetDictTree()
-    })
+const queryScoreCycle = () => {
+  selectScoreCycle()
+    .then((res) => {
+      reportCycleList.value = res
+    });
+}
 
-    let Tnames = ['资源配置与运行数据', '医疗服务能力与医院质量安全指标', '重点专业质量控制指标', '单病种(术种)质量控制指标', '重点医疗技术临床应用质量控制指标']
-    let Xnames = ['2019', '2020', '2021', '2022', '2023']
-    let infoData = [{
-        name: '资源配置与运行数据',
-        data: [240, 270, 280, 290, 300]
-    },
-    {
-        name: '医疗服务能力与医院质量安全指标',
-        data: [260, 280, 270, 230, 270]
-    },
-    {
-        name: '重点专业质量控制指标',
-        data: [240, 230, 270, 280, 270]
-    },
-    {
-        name: '单病种(术种)质量控制指标',
-        data: [100, 90, 100, 90, 110]
-    },
-    {
-        name: '重点医疗技术临床应用质量控制指标',
-        data: [25, 27, 22, 28, 30]
-    }]
-    let unit = '分' 
-    let titleName = '单位:' + unit
-    let name = '指标得分情况统计'
-    let statusInfos = {
-        zflag: false, // 柱子是否显示数据
-        toolBoxFlag: false, // 是否显示下载,切换标签
-    }
+const queryTargetTotalScoreInfo = () => {
+  selectTargetTotalScoreInfo(queryData.value)
+    .then((res) => {
+      if(res){
+        infoData.value = clone(res.infoData)
+        highBarsUtils(main, title.value, TNames.value, XNames.value, infoData.value, titleName.value, unit.value, 1, statusInfos.value)
+      }
+    });
+}
 
-    highBarsUtils(main, name, Tnames, Xnames, infoData, titleName, unit, 1, statusInfos)
+// 年度周期变化
+const cycleFormat = () => {
+  let reportCycle = reportCycleList.value.filter((item) => {
+    return item.reportCycle === queryData.value.reportCycle
+  })
+  if(reportCycle){
+    queryData.value.startTime = reportCycle[0].startYear
+    queryData.value.endTime = reportCycle[0].endYear
 
-    highBarsNiceUtils(rcpie)
-})
+    // 拼接结果显示的表头信息
+    yearInfo.value = Number.parseInt(reportCycle[0].startYear)
+    // 柱状图标题变化
+    title.value =  reportCycle[0].yearRange + ' 指标得分情况统计'
+  }
+  queryTargetTotalScoreInfo()
+  highBarsNiceUtils(pie)
+  query()
+}
 
 const query = () => {
-    if (!dateRange.value) {
+    if (!queryData.value.reportCycle) {
         ElMessage({
-            message: '请选择时间范围!',
+            message: '请选择年度周期!',
             type: 'warning',
             duration: 2500,
             showClose: true,
@@ -258,7 +255,7 @@ const query = () => {
         return
     }
 
-    if (!queryData.dataInfo) {
+    if (!queryData.value.dataInfo) {
         ElMessage({
             message: '请选择指标!',
             type: 'warning',
@@ -268,73 +265,11 @@ const query = () => {
         return
     }
 
-    if (queryData.selectType === 'first') {
-        targetInfos.value = [
-            {
-                t_name: '核定床位数', t_method: '核定床位数(≥500张)', t_rule: '核定床位数(≥500张)记1分',
-                t_score: 1, t_y1: '3', t_y2: '8', t_y3: '12', t_y4: '24', t_manager: 'xxx', t_state: '已完成'
-            },
-            {
-                t_name: '实际开放床位数', t_method: '实际开放床位数(≥500张)', t_rule: '实际开放床位数(≥500张)记3分',
-                t_score: 1, t_y1: '90', t_y2: '124', t_y3: '145', t_y4: '165', t_manager: 'xxx', t_state: '已完成'
-            },
-            {
-                t_name: '平均床位使用率', t_method: '平均床位使用率(≥93%)', t_rule: '平均床位使用率(≥93%)记6分',
-                t_score: 1, t_y1: '93%', t_y2: '90%', t_y3: '96%', t_y4: '98%', t_manager: 'xxx', t_state: '已完成'
-            }
-        ]
-    }
-
-
-}
+    selectTargetDictScoreById(queryData.value)
+      .then((res) => {
+        targetInfos.value = res
+      });
 
-function initTargetOptions() {
-    return [
-        {
-            value: 't1',
-            label: '第一章 资源配置与运行数据指标(300分)',
-            children: [
-                {
-                    value: 'a1',
-                    label: '床位配置(10分)',
-                },
-                {
-                    value: 'a2',
-                    label: '卫生技术人员配备(60分)',
-                },
-                {
-                    value: 'a3',
-                    label: '相关科室资源配置(60分)',
-                },
-                {
-                    value: 'a4',
-                    label: '运行指标(150分)',
-                },
-                {
-                    value: 'a5',
-                    label: '科研指标(20分)',
-                }
-            ],
-        },
-        {
-            value: 't2',
-            label: '第二章 医疗服务能力与医院质量安全指标(280分)',
-            children: [
-                {
-                    value: 'b1',
-                    label: '医疗服务能力(80分)',
-                },
-                {
-                    value: 'b2',
-                    label: '医院质量指标(80分)',
-                },
-                {
-                    value: 'b3',
-                    label: '医疗安全指标(年度医院获得性指标)(120分)',
-                },
-            ],
-        },
-    ]
 }
 </script>
 <style lang="scss" scoped>
@@ -351,25 +286,25 @@ function initTargetOptions() {
         .el-cd1 {
             background-color: blue;
             color: #fff;
-            border-bottom: 0px solid blue;
+            border-bottom: 0 solid blue;
         }
 
         .el-cd2 {
             background-color: blueviolet;
             color: #fff;
-            border-bottom: 0px solid blueviolet;
+            border-bottom: 0 solid blueviolet;
         }
 
         .el-cd3 {
             background-color: #049481;
             color: #fff;
-            border-bottom: 0px solid #049481;
+            border-bottom: 0 solid #049481;
         }
 
         .el-cd4 {
             background-color: brown;
             color: #fff;
-            border-bottom: 0px solid brown;
+            border-bottom: 0 solid brown;
         }
     }
 }