Pārlūkot izejas kodu

feat: 代码暂存

haifeng.zhang 1 mēnesi atpakaļ
vecāks
revīzija
c43bd9653b

+ 164 - 0
src/components/rankTable/assessmentRank.vue

@@ -0,0 +1,164 @@
+<script setup lang="ts">
+defineOptions({
+  name: "AssessmentRank"
+});
+
+import { ref } from "vue";
+</script>
+
+<template>
+  <div class="assessment-rank">
+    <div class="fixed-columns">
+      <table>
+        <tbody>
+          <tr>
+            <td colspan="2" class="td-back">科室</td>
+          </tr>
+          <tr>
+            <td colspan="2" class="td-back">医生</td>
+          </tr>
+          <tr>
+            <td colspan="2" class="td-back">排名</td>
+          </tr>
+          <tr>
+            <td rowspan="2" class="td-back">运营效率</td>
+            <td class="td-back">医疗服务收入占比</td>
+          </tr>
+          <tr>
+            <td class="td-back">医保各种检查反馈及时性</td>
+          </tr>
+          <tr>
+            <td rowspan="2" class="td-back">医疗质量与安全</td>
+            <td class="td-back">耗材点评</td>
+          </tr>
+          <tr>
+            <td class="td-back">VTE管理</td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <div class="scrollable-columns">
+      <table>
+        <tbody>
+          <tr>
+            <td>神经外科</td>
+            <td>神经内科</td>
+            <td>内分泌</td>
+            <td>泌尿外科</td>
+            <td>消化内科</td>
+            <td>心血管内科1</td>
+            <td>心血管内科1</td>
+            <td>心血管内科1</td>
+          </tr>
+          <tr>
+            <td>李医生1</td>
+            <td>李医生2</td>
+            <td>李医生3</td>
+            <td>李医生4</td>
+            <td>李医生5</td>
+            <td>李医生6</td>
+            <td>李医生7</td>
+            <td>李医生8</td>
+          </tr>
+          <tr>
+            <td>1</td>
+            <td>2</td>
+            <td>3</td>
+            <td>4</td>
+            <td>5</td>
+            <td>6</td>
+            <td>7</td>
+            <td>8</td>
+          </tr>
+          <tr>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+          </tr>
+          <tr>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+          </tr>
+          <tr>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+          </tr>
+          <tr>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+            <td>1</td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+  </div>
+</template>
+
+<style scoped lang="scss">
+.assessment-rank {
+  box-sizing: border-box;
+  display: flex;
+  width: calc(100% - 40px);
+  margin-top: 20px;
+  overflow: hidden;
+  border-right: 1px solid #ccc;
+  box-shadow: 5px 0 10px -5px #ccc;
+
+  table {
+    width: 100%;
+    table-layout: fixed;
+  }
+
+  td {
+    padding: 10px;
+    border: 1px solid #ccc;
+  }
+
+  .fixed-columns {
+    flex-shrink: 0;
+    width: 30%;
+    background-color: #f9f9f9;
+    box-shadow: 5px 0 10px -5px #ccc;
+
+    td {
+      position: sticky;
+      left: 0;
+      z-index: 2;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+      background-color: #f9f9f9;
+    }
+  }
+
+  .scrollable-columns {
+    overflow-x: auto;
+
+    td {
+      width: 200px;
+    }
+  }
+}
+</style>

+ 11 - 0
src/routerList/draw.ts

@@ -42,6 +42,17 @@ export default {
           }
         },
         {
+          path: "/draw/children/worker/workerRankModal",
+          name: "workerRankModal",
+          component: () =>
+            import("@/views/draw/children/worker/workerRank.vue"),
+          meta: {
+            title: "员工排行榜",
+            showParent: true,
+            keepAlive: false
+          }
+        },
+        {
           path: "/draw/children/department/departmentDrank",
           name: "departmentDrank",
           component: () =>

+ 23 - 5
src/views/draw/children/worker/workerRank.vue

@@ -3,9 +3,17 @@ defineOptions({
   name: "workerRank"
 });
 import rankTableDraw from "@/components/rankTable/index.vue";
+import assessmentRank from "@/components/rankTable/assessmentRank.vue";
 import { getPersonDimensionChartsList, getChartsList } from "@/api/draw";
 import seachData from "./componements/seach.vue";
 import { ref, nextTick } from "vue";
+
+// tab逻辑
+const activeName = ref("0");
+const handleClick = (tab, event) => {
+  console.log(tab, event);
+};
+
 const rankTableRef = ref();
 const seachParams = ref();
 const lengthData = ref();
@@ -20,7 +28,7 @@ const getPersonDimensionChartsListApi = async () => {
       lengthData.value = data.length;
       setTimeout(() => {
         nextTick(() => {
-          rankTableRef.value.init(data, "科室", "姓名");
+          rankTableRef.value && rankTableRef.value.init(data, "科室", "姓名");
         });
       }, 500);
     }
@@ -38,9 +46,19 @@ const init = (item, type) => {
 
 <template>
   <div class="w-full">
-    <div class="mb-2 flex gap-2 justify-between flex-wrap">
-      <seachData @handClick="init" />
-    </div>
-    <rankTableDraw v-if="lengthData > 0" ref="rankTableRef" />
+    <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
+      <el-tab-pane label="科室维度" name="0">
+        <div class="mb-2 flex gap-2 justify-between flex-wrap">
+          <seachData @handClick="init" />
+        </div>
+        <rankTableDraw v-if="lengthData > 0" ref="rankTableRef" />
+      </el-tab-pane>
+      <el-tab-pane label="指标维度" name="1">
+        <div class="mb-2 flex gap-2 justify-between flex-wrap">
+          <seachData @handClick="init" />
+        </div>
+        <assessmentRank ref="rankTableRef2" />
+      </el-tab-pane>
+    </el-tabs>
   </div>
 </template>

+ 159 - 0
src/views/draw/children/worker/workerRank2.vue

@@ -0,0 +1,159 @@
+<script setup lang="ts">
+defineOptions({
+  name: "AssessmentRank"
+});
+
+import { ref, onMounted } from "vue";
+import { Search } from "@element-plus/icons-vue";
+
+// 考核活动点击交互
+const activityList = ref([
+  {
+    id: 1,
+    name: "考核活动1"
+  },
+  {
+    id: 2,
+    name: "考核活动2"
+  },
+  {
+    id: 3,
+    name: "考核活动3"
+  },
+  {
+    id: 4,
+    name: "考核活动4"
+  },
+  {
+    id: 5,
+    name: "考核活动5"
+  }
+]);
+const activeActivity = ref(0);
+const handleActiveActivity = (index: number) => {
+  activeActivity.value = index;
+};
+
+interface AssessmentItem {
+  rank: number;
+  templateName: string;
+  department: string;
+  employee: string;
+  score: number;
+}
+
+const searchKeyword = ref("");
+const averageScore = ref(3.6);
+const tableData = ref<AssessmentItem[]>([
+  {
+    rank: 1,
+    templateName: "临床科室(内科)考核",
+    department: "呼吸内科",
+    employee: "李医生1",
+    score: 1.62
+  },
+  {
+    rank: 2,
+    templateName: "临床科室(内科)考核",
+    department: "消化内科",
+    employee: "李医生2",
+    score: 2.62
+  },
+  {
+    rank: 3,
+    templateName: "临床(床位不足103k)科室",
+    department: "风湿免疫科",
+    employee: "李医生3",
+    score: 3.62
+  },
+  {
+    rank: 4,
+    templateName: "临床科室(内科)考核",
+    department: "内分泌科",
+    employee: "李医生4",
+    score: 4.62
+  },
+  {
+    rank: 5,
+    templateName: "临床科室(内科)考核",
+    department: "心血管内科",
+    employee: "李医生5",
+    score: 5.62
+  }
+]);
+
+const handleSearch = () => {
+  // 实现搜索逻辑
+  console.log("Searching for:", searchKeyword.value);
+};
+</script>
+
+<template>
+  <div class="assessment-rank flex">
+    <div class="search-section mr-4">
+      <el-input
+        v-model="searchKeyword"
+        placeholder="考核活动名称"
+        class="w-64"
+        :suffix-icon="Search"
+        @keyup.enter="handleSearch"
+      />
+      <p
+        v-for="(item, index) in activityList"
+        :key="item.id"
+        class="mt-4 cursor-pointer overflow-hidden text-ellipsis whitespace-nowrap"
+        :style="{ color: activeActivity === index ? '#0052d9' : '#333' }"
+        @click="handleActiveActivity(index)"
+      >
+        {{ item.name }}
+      </p>
+    </div>
+    <el-card class="w-full">
+      <template #header>
+        <div class="flex justify-between items-center">
+          <span class="text-base font-medium">平均得分: </span>
+          <span>{{ averageScore }}</span>
+        </div>
+      </template>
+
+      <el-table :data="tableData" style="width: 100%" border>
+        <el-table-column prop="rank" label="排名" width="80" align="center" />
+        <el-table-column prop="templateName" label="考核模板" min-width="200" />
+        <el-table-column prop="department" label="科室" min-width="150" />
+        <el-table-column prop="employee" label="员工" min-width="150" />
+        <el-table-column
+          prop="score"
+          label="实际得分"
+          width="120"
+          align="right"
+        >
+          <template #default="scope">
+            <span
+              :class="{
+                'text-red-500': scope.row.score < averageScore,
+                'text-green-500': scope.row.score >= averageScore
+              }"
+            >
+              {{ scope.row.score }}
+            </span>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-card>
+  </div>
+</template>
+
+<style scoped lang="scss">
+.assessment-rank {
+  padding: 20px 0;
+}
+
+.search-section {
+  flex-shrink: 0;
+  width: 200px;
+}
+
+:deep(.el-card__header) {
+  padding: 15px 20px;
+}
+</style>

+ 46 - 0
src/views/draw/children/worker/workerRankOld.vue

@@ -0,0 +1,46 @@
+<script setup lang="ts">
+defineOptions({
+  name: "workerRank"
+});
+import rankTableDraw from "@/components/rankTable/index.vue";
+import { getPersonDimensionChartsList, getChartsList } from "@/api/draw";
+import seachData from "./componements/seach.vue";
+import { ref, nextTick } from "vue";
+const rankTableRef = ref();
+const seachParams = ref();
+const lengthData = ref();
+const getPersonDimensionChartsListApi = async () => {
+  const { code, data } = await getChartsList({
+    ...seachParams.value,
+    type: 0
+  });
+
+  if (code == 200) {
+    if (data.length > 0) {
+      lengthData.value = data.length;
+      setTimeout(() => {
+        nextTick(() => {
+          rankTableRef.value.init(data, "科室", "姓名");
+        });
+      }, 500);
+    }
+  }
+
+  // console.log(res);
+};
+const init = (item, type) => {
+  seachParams.value = item;
+  if (Number(type)) {
+    getPersonDimensionChartsListApi();
+  }
+};
+</script>
+
+<template>
+  <div class="w-full">
+    <div class="mb-2 flex gap-2 justify-between flex-wrap">
+      <seachData @handClick="init" />
+    </div>
+    <rankTableDraw v-if="lengthData > 0" ref="rankTableRef" />
+  </div>
+</template>

+ 12 - 1
src/views/evaluate/children/change/manage/addExam.vue

@@ -31,6 +31,7 @@ const form = reactive({
   name: "",
   cycle: "月度",
   cycleValue: "",
+  isMatrixing: 1,
   assessmentType: null,
   listArr: [
     {
@@ -44,7 +45,10 @@ const form = reactive({
 });
 const rules = reactive({
   name: [{ required: true, message: "请输入考核名称", trigger: "blur" }],
-  cycle: [{ required: true, message: "请选择考核周期", trigger: "change" }]
+  cycle: [{ required: true, message: "请选择考核周期", trigger: "change" }],
+  isMatrixing: [
+    { required: true, message: "请选择是否支持得分换算", trigger: "blur" }
+  ]
 });
 const formLeftRules = reactive({
   left: [{ required: true, message: "请选择考核指标", trigger: "blur" }],
@@ -127,6 +131,7 @@ const open = (item: any, index: string) => {
     name: "",
     cycle: "月度",
     cycleValue: "",
+    isMatrixing: 1,
     assessmentType: null,
     listArr: [
       {
@@ -496,6 +501,12 @@ const idList = ref([]);
             </template>
           </el-dropdown>
         </el-form-item>
+        <el-form-item label="是否支持得分换算" prop="isMatrixing">
+          <el-radio-group v-model="form.isMatrixing">
+            <el-radio :label="1">是</el-radio>
+            <el-radio :label="2">否</el-radio>
+          </el-radio-group>
+        </el-form-item>
         <el-form-item label="被考核类型">
           <el-select
             v-model="form.assessmentType"

+ 31 - 9
src/views/indexData/index.vue

@@ -2,7 +2,7 @@
  * @Author: zhanghaifeng
  * @Date: 2025-01-03 13:57:58
  * @LastEditors: zhanghaifeng
- * @LastEditTime: 2025-01-14 15:21:08
+ * @LastEditTime: 2025-04-22 16:12:11
  * @Description: 指标数据
  * @FilePath: /hospital-project/src/views/indexData/index.vue
 -->
@@ -27,7 +27,8 @@ const params = reactive({
     pageSize: 10,
     sourceValue: "",
     deptName: "",
-    userName: ""
+    userName: "",
+    time: []
   },
   records: [],
   total: 0
@@ -126,15 +127,36 @@ const showLogs = row => {
                 @change="getList"
               />
             </div>
-            <!--暂时注释,产品说下一期迭代-->
-            <!-- <div class="flex mr-2">
-              <el-input v-model="params.params.deptName" style="width: 200px" :prefix-icon="Search" clearable
-                placeholder="搜索部门名称" @change="getList" />
+            <div class="flex mr-2">
+              <el-input
+                v-model="params.params.deptName"
+                style="width: 200px"
+                :prefix-icon="Search"
+                clearable
+                placeholder="搜索部门名称"
+                @change="getList"
+              />
+            </div>
+            <div class="flex mr-2">
+              <el-input
+                v-model="params.params.userName"
+                style="width: 200px"
+                :prefix-icon="Search"
+                clearable
+                placeholder="搜索员工名称"
+                @change="getList"
+              />
             </div>
             <div class="flex mr-2">
-              <el-input v-model="params.params.userName" style="width: 200px" :prefix-icon="Search" clearable
-                placeholder="搜索员工名称" @change="getList" />
-            </div> -->
+              <el-date-picker
+                v-model="params.params.time"
+                type="daterange"
+                range-separator="至"
+                start-placeholder="数据开始日期"
+                end-placeholder="数据结束日期"
+                @change="getList"
+              />
+            </div>
           </div>
           <div class="flex pt-2 mr-6">
             <Auth :value="['批量导入']">