浏览代码

feat: 1.2提测

haifeng.zhang 3 周之前
父节点
当前提交
714cdc20d0
共有 29 个文件被更改,包括 2552 次插入972 次删除
  1. 10 0
      src/api/draw.ts
  2. 5 1
      src/components/rankTable/index.vue
  3. 12 1
      src/layout/components/sidebar/vertical.vue
  4. 37 5
      src/routerList/draw.ts
  5. 61 181
      src/views/draw/children/department/componements/seach.vue
  6. 265 0
      src/views/draw/children/department/componements/seachOld.vue
  7. 93 0
      src/views/draw/children/department/dataDetail.vue
  8. 1 1
      src/views/draw/children/department/departmentDrank.vue
  9. 157 29
      src/views/draw/children/department/departmentRank.vue
  10. 46 0
      src/views/draw/children/department/departmentRankOld.vue
  11. 68 209
      src/views/draw/children/head/componements/seach.vue
  12. 286 0
      src/views/draw/children/head/componements/seachOld.vue
  13. 93 0
      src/views/draw/children/head/dataDetail.vue
  14. 1 1
      src/views/draw/children/head/headDrank.vue
  15. 159 30
      src/views/draw/children/head/headRank.vue
  16. 45 0
      src/views/draw/children/head/headRankOld.vue
  17. 70 179
      src/views/draw/children/health/componements/seach.vue
  18. 254 0
      src/views/draw/children/health/componements/seachOld.vue
  19. 93 0
      src/views/draw/children/health/dataDetail.vue
  20. 1 1
      src/views/draw/children/health/healthDrank.vue
  21. 159 30
      src/views/draw/children/health/healthRank.vue
  22. 45 0
      src/views/draw/children/health/healthRankOld.vue
  23. 60 219
      src/views/draw/children/worker/componements/seach.vue
  24. 321 0
      src/views/draw/children/worker/componements/seachOld.vue
  25. 93 0
      src/views/draw/children/worker/dataDetail.vue
  26. 1 1
      src/views/draw/children/worker/workerDrak.vue
  27. 26 3
      src/views/draw/children/worker/workerRank.vue
  28. 0 64
      src/views/draw/children/worker/workerRank1.vue
  29. 90 17
      src/views/evaluate/children/change/mould/message.vue

+ 10 - 0
src/api/draw.ts

@@ -43,6 +43,16 @@ type quotaList = {
   code: number;
   msg: string;
 };
+// 指标
+export const getAssessmentIndName = (params?: any) => {
+  return http.request<addDeptList>(
+    "get",
+    "/specialPortrait/getAssessmentIndName",
+    {
+      params
+    }
+  );
+};
 // 所有考核
 export const getAssessmentList = (params?: any) => {
   return http.request<addDeptList>(

+ 5 - 1
src/components/rankTable/index.vue

@@ -109,7 +109,11 @@ const init = (item, deptNames, names) => {
   if ($route.name != "workerDrak") {
     averageData(item.averageSore);
   }
-  if ($route.name == "healthDrank" || $route.name == "healthRank") {
+  if (
+    $route.name == "healthDrank" ||
+    $route.name == "healthRank" ||
+    $route.name == "healthDataDetail"
+  ) {
     tabTitle.value = "医疗组";
   } else {
     tabTitle.value = "科室";

+ 12 - 1
src/layout/components/sidebar/vertical.vue

@@ -122,7 +122,18 @@ onBeforeUnmount(() => {
           />
         </el-menu>
       </el-scrollbar>
-      <div v-if="route.name != 'Welcome' && route.name != 'evaluateNewAdd'">
+      <div
+        v-if="
+          ![
+            'Welcome',
+            'evaluateNewAdd',
+            'workerDataDetail',
+            'departmentDataDetail',
+            'headDataDetail',
+            'healthDataDetail'
+          ].includes(route.name)
+        "
+      >
         <CenterCollapse
           v-if="device !== 'mobile' && (isShow || isCollapse)"
           :is-active="pureApp.sidebar.opened"

+ 37 - 5
src/routerList/draw.ts

@@ -42,14 +42,14 @@ export default {
           }
         },
         {
-          path: "/draw/children/worker/workerRankModal",
-          name: "workerRankModal",
+          path: "/draw/children/worker/dataDetail",
+          name: "workerDataDetail",
           component: () =>
-            import("@/views/draw/children/worker/workerRank.vue"),
+            import("@/views/draw/children/worker/dataDetail.vue"),
           meta: {
-            title: "员工排行榜",
+            title: "考核模版数据明细",
             showParent: true,
-            keepAlive: false
+            showLink: false
           }
         },
         {
@@ -75,6 +75,17 @@ export default {
           }
         },
         {
+          path: "/draw/children/department/dataDetail",
+          name: "departmentDataDetail",
+          component: () =>
+            import("@/views/draw/children/department/dataDetail.vue"),
+          meta: {
+            title: "考核模版数据明细",
+            showParent: true,
+            showLink: false
+          }
+        },
+        {
           path: "/draw/children/head/headDrank",
           name: "headDrank",
           component: () => import("@/views/draw/children/head/headDrank.vue"),
@@ -95,6 +106,16 @@ export default {
           }
         },
         {
+          path: "/draw/children/head/dataDetail",
+          name: "headDataDetail",
+          component: () => import("@/views/draw/children/head/dataDetail.vue"),
+          meta: {
+            title: "考核模版数据明细",
+            showParent: true,
+            showLink: false
+          }
+        },
+        {
           path: "/draw/children/health/healthDrank",
           name: "healthDrank",
           component: () =>
@@ -115,6 +136,17 @@ export default {
             showParent: true,
             keepAlive: false
           }
+        },
+        {
+          path: "/draw/children/health/dataDetail",
+          name: "healthDataDetail",
+          component: () =>
+            import("@/views/draw/children/health/dataDetail.vue"),
+          meta: {
+            title: "考核模版数据明细",
+            showParent: true,
+            showLink: false
+          }
         }
       ]
     }

+ 61 - 181
src/views/draw/children/department/componements/seach.vue

@@ -1,18 +1,16 @@
 <script setup>
-import { ref, reactive, nextTick } from "vue";
-import { getTemplateInfoList } from "@/api/templateInfo";
-import { userPageWhitOrganization } from "@/api/userSetting";
-import { getAssessmentPageList } from "@/api/manage";
-import { postListTree } from "@/api/department";
-import {
-  getAssessmentList,
-  getModelListByAssessmentId,
-  getUserListObjectByModelId
-} from "@/api/draw";
-import { useRouter, useRoute } from "vue-router";
+import { ref, reactive, onMounted } from "vue";
+import { useRoute } from "vue-router";
+import { getUserListObjectByModelId, getAssessmentIndName } from "@/api/draw";
 
+const props = defineProps({
+  // 行数
+  activeName: {
+    type: String,
+    default: "0"
+  }
+});
 const $emit = defineEmits(["handClick"]);
-
 const dataList = reactive({
   teplist: [],
   personList: [],
@@ -22,41 +20,48 @@ const dataList = reactive({
     assessmentId: "",
     assessmentModelId: "",
     deptCode: "",
-    assessmentObjectId: ""
+    assessmentObjectId: "",
+    indName: ""
   }
 });
 
-// 考核模板
-const getTemplateInfoListApi = async selectedItem => {
-  const { data, code } = await getModelListByAssessmentId(selectedItem);
-  if (code === 200) {
-    dataList.teplist = data;
-  }
-};
-// 员工
-const userPageWhitOrganizationApi = async (selectedItem, type) => {
+// 部门
+const postListTreeApi = async selectedItem => {
   const { data, code } = await getUserListObjectByModelId({
     type: 1,
     assessmentId: selectedItem.assessmentId,
     modelId: selectedItem.assessmentModelId
   });
   if (code === 200) {
-    dataList.personList = data;
+    dataList.deptList = data;
   }
 };
 
-// 部门
-const postListTreeApi = async selectedItem => {
-  const { data, code } = await getUserListObjectByModelId({
-    type: 1,
-    assessmentId: selectedItem.assessmentId,
-    modelId: selectedItem.assessmentModelId
+// 指标
+const route = useRoute();
+const assessmentList = ref([]);
+const getAssessmentIndNameApi = async () => {
+  const { data, code } = await getAssessmentIndName({
+    assessmentId: route.query.id
   });
   if (code === 200) {
-    dataList.deptList = data;
+    assessmentList.value = data;
   }
 };
-// ----------------------------
+
+onMounted(() => {
+  dataList.params.assessmentId = route.query.id;
+  dataList.params.assessmentModelId = route.query.mid;
+  init.assessmentName = route.query.name;
+  init.assessmentModelName = route.query.mname;
+  postListTreeApi({
+    assessmentId: route.query.id,
+    assessmentModelId: route.query.mid
+  });
+  getAssessmentIndNameApi();
+});
+
+// -----------------------------------
 const init = reactive({
   assessmentName: "",
   assessmentModelName: "",
@@ -64,198 +69,73 @@ const init = reactive({
   assessmentObjectName: "",
   dimensionName: ""
 });
-const handClickInit1 = value => {
-  if (value) {
-    const selectedItem = dataList.magList.find(item => item.id === value);
-    init.assessmentName = selectedItem.name;
-    localStorage.setItem("fileName", selectedItem.name);
-    getTemplateInfoListApi(selectedItem);
-  }
-  Object.assign(dataList.params, {
-    assessmentModelId: "",
-    assessmentObjectId: ""
-  });
-  $emit(
-    "handClick",
-    {
-      ...dataList.params,
-      ...init
-    },
-    0
-  );
-};
-const handClickInit2 = value => {
+const handClickInit3 = value => {
   if (value) {
-    const selectedItem = dataList.teplist.find(
-      item => item.assessmentModelId === value
+    const selectedItem = dataList.deptList.find(
+      item => item.assessmentObjectId === value
     );
-    init.assessmentModelName = selectedItem.assessmentModelName;
-    userPageWhitOrganizationApi(selectedItem, 0);
-    postListTreeApi(selectedItem);
+    init.assessmentObjectName = selectedItem.assessmentObjectName;
   }
 
-  Object.assign(dataList.params, {
-    assessmentObjectId: ""
-  });
   $emit(
     "handClick",
     {
       ...dataList.params,
       ...init
     },
-    0
+    1
   );
 };
-
-const handClickInit3 = value => {
-  if (value) {
-    const selectedItem = dataList.deptList.find(
-      item => item.assessmentObjectId === value
-    );
-    init.assessmentObjectName = selectedItem.assessmentObjectName;
-    // init.deptName = value.deptName;
-  }
-
+const handClickInit5 = value => {
   $emit(
     "handClick",
     {
       ...dataList.params,
-      ...init
+      ...init,
+      indName: value
     },
-    1
+    "1"
   );
 };
-
-const route = useRoute();
-const getSearchFrom = () => {
-  if (Object.keys(route.query).length > 0) {
-    console.log("路由", route.query);
-    const {
-      assessmentId,
-      assessmentModelId,
-      assessmentObjectId,
-      assessmentName,
-      assessmentModelName,
-      assessmentObjectName
-    } = route.query;
-    const obj = ["assessmentId", "assessmentModelId", "assessmentObjectId"];
-    const initObj = [
-      "assessmentName",
-      "assessmentModelName",
-      "assessmentObjectName"
-    ];
-    obj.map(item => {
-      dataList.params[item] = route.query[item];
-    });
-    initObj.map(item => {
-      init[item] = route.query[item];
-    });
-    const selectedItem = dataList.magList.find(
-      item => item.id === assessmentId
-    );
-    getTemplateInfoListApi(selectedItem);
-
-    setTimeout(() => {
-      const selectedItems = dataList.teplist.find(
-        item => item.assessmentModelId === assessmentModelId
-      );
-      console.log("selectedItems", selectedItems);
-      userPageWhitOrganizationApi(selectedItems, 1);
-      postListTreeApi(selectedItems, 1);
-      setTimeout(() => {
-        $emit(
-          "handClick",
-          {
-            ...dataList.params,
-            ...init
-          },
-          1
-        );
-      }, 100);
-    }, 300);
-  }
-};
-
-// 考核活动
-const getAssessmentPageListApi = async () => {
-  const { data, code } = await getAssessmentList({
-    type: 1
-  });
-  if (code === 200) {
-    dataList.magList = data;
-    getSearchFrom();
-  }
-};
-getAssessmentPageListApi();
-
-// 清除条件
-const handClickClear1 = () => {
-  dataList.teplist = [];
-  dataList.deptList = [];
-};
-const handClickClear2 = () => {
-  dataList.deptList = [];
-  dataList.params.assessmentObjectId = "";
-};
 </script>
 
 <template>
   <div class="w-full">
     <div class="mb-2 flex gap-2 justify-between flex-wrap">
       <div class="w-[100%] flex mt-2">
-        <div class="flex mr-2">
-          <div class="text-sm leading-8 mr-3">考核活动</div>
-          <el-select
-            v-model="dataList.params.assessmentId"
-            clearable
-            filterable
-            placeholder="请选择"
-            style="width: 200px"
-            @change="handClickInit1"
-            @clear="handClickClear1"
-          >
-            <el-option
-              v-for="item in dataList.magList"
-              :key="item.id"
-              :label="item.name"
-              :value="item.id"
-            />
-          </el-select>
-        </div>
-        <div class="flex mr-2">
-          <div class="text-sm leading-8 mr-3">考核模板</div>
+        <div v-if="props.activeName === '0'" class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">科室</div>
           <el-select
-            v-model="dataList.params.assessmentModelId"
+            v-model="dataList.params.assessmentObjectId"
             clearable
             filterable
             placeholder="请选择"
             style="width: 200px"
-            @change="handClickInit2"
-            @clear="handClickClear2"
+            @change="handClickInit3"
           >
             <el-option
-              v-for="item in dataList.teplist"
-              :key="item.assessmentModelId"
-              :label="item.assessmentModelName"
-              :value="item.assessmentModelId"
+              v-for="item in dataList.deptList"
+              :key="item.assessmentObjectId"
+              :label="item.assessmentObjectName"
+              :value="item.assessmentObjectId"
             />
           </el-select>
         </div>
-        <div class="flex mr-2">
-          <div class="text-sm leading-8 mr-3">科室</div>
+        <div v-else class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">指标</div>
           <el-select
-            v-model="dataList.params.assessmentObjectId"
+            v-model="dataList.params.indName"
             clearable
             filterable
             placeholder="请选择"
             style="width: 200px"
-            @change="handClickInit3"
+            @change="handClickInit5"
           >
             <el-option
-              v-for="item in dataList.deptList"
-              :key="item.assessmentObjectId"
-              :label="item.assessmentObjectName"
-              :value="item.assessmentObjectId"
+              v-for="(item, idx) in assessmentList"
+              :key="idx"
+              :label="item"
+              :value="item"
             />
           </el-select>
         </div>

+ 265 - 0
src/views/draw/children/department/componements/seachOld.vue

@@ -0,0 +1,265 @@
+<script setup>
+import { ref, reactive, nextTick } from "vue";
+import { getTemplateInfoList } from "@/api/templateInfo";
+import { userPageWhitOrganization } from "@/api/userSetting";
+import { getAssessmentPageList } from "@/api/manage";
+import { postListTree } from "@/api/department";
+import {
+  getAssessmentList,
+  getModelListByAssessmentId,
+  getUserListObjectByModelId
+} from "@/api/draw";
+import { useRouter, useRoute } from "vue-router";
+
+const $emit = defineEmits(["handClick"]);
+
+const dataList = reactive({
+  teplist: [],
+  personList: [],
+  magList: [],
+  deptList: [],
+  params: {
+    assessmentId: "",
+    assessmentModelId: "",
+    deptCode: "",
+    assessmentObjectId: ""
+  }
+});
+
+// 考核模板
+const getTemplateInfoListApi = async selectedItem => {
+  const { data, code } = await getModelListByAssessmentId(selectedItem);
+  if (code === 200) {
+    dataList.teplist = data;
+  }
+};
+// 员工
+const userPageWhitOrganizationApi = async (selectedItem, type) => {
+  const { data, code } = await getUserListObjectByModelId({
+    type: 1,
+    assessmentId: selectedItem.assessmentId,
+    modelId: selectedItem.assessmentModelId
+  });
+  if (code === 200) {
+    dataList.personList = data;
+  }
+};
+
+// 部门
+const postListTreeApi = async selectedItem => {
+  const { data, code } = await getUserListObjectByModelId({
+    type: 1,
+    assessmentId: selectedItem.assessmentId,
+    modelId: selectedItem.assessmentModelId
+  });
+  if (code === 200) {
+    dataList.deptList = data;
+  }
+};
+// ----------------------------
+const init = reactive({
+  assessmentName: "",
+  assessmentModelName: "",
+  deptName: "",
+  assessmentObjectName: "",
+  dimensionName: ""
+});
+const handClickInit1 = value => {
+  if (value) {
+    const selectedItem = dataList.magList.find(item => item.id === value);
+    init.assessmentName = selectedItem.name;
+    localStorage.setItem("fileName", selectedItem.name);
+    getTemplateInfoListApi(selectedItem);
+  }
+  Object.assign(dataList.params, {
+    assessmentModelId: "",
+    assessmentObjectId: ""
+  });
+  $emit(
+    "handClick",
+    {
+      ...dataList.params,
+      ...init
+    },
+    0
+  );
+};
+const handClickInit2 = value => {
+  if (value) {
+    const selectedItem = dataList.teplist.find(
+      item => item.assessmentModelId === value
+    );
+    init.assessmentModelName = selectedItem.assessmentModelName;
+    userPageWhitOrganizationApi(selectedItem, 0);
+    postListTreeApi(selectedItem);
+  }
+
+  Object.assign(dataList.params, {
+    assessmentObjectId: ""
+  });
+  $emit(
+    "handClick",
+    {
+      ...dataList.params,
+      ...init
+    },
+    0
+  );
+};
+
+const handClickInit3 = value => {
+  if (value) {
+    const selectedItem = dataList.deptList.find(
+      item => item.assessmentObjectId === value
+    );
+    init.assessmentObjectName = selectedItem.assessmentObjectName;
+    // init.deptName = value.deptName;
+  }
+
+  $emit(
+    "handClick",
+    {
+      ...dataList.params,
+      ...init
+    },
+    1
+  );
+};
+
+const route = useRoute();
+const getSearchFrom = () => {
+  if (Object.keys(route.query).length > 0) {
+    console.log("路由", route.query);
+    const {
+      assessmentId,
+      assessmentModelId,
+      assessmentObjectId,
+      assessmentName,
+      assessmentModelName,
+      assessmentObjectName
+    } = route.query;
+    const obj = ["assessmentId", "assessmentModelId", "assessmentObjectId"];
+    const initObj = [
+      "assessmentName",
+      "assessmentModelName",
+      "assessmentObjectName"
+    ];
+    obj.map(item => {
+      dataList.params[item] = route.query[item];
+    });
+    initObj.map(item => {
+      init[item] = route.query[item];
+    });
+    const selectedItem = dataList.magList.find(
+      item => item.id === assessmentId
+    );
+    getTemplateInfoListApi(selectedItem);
+
+    setTimeout(() => {
+      const selectedItems = dataList.teplist.find(
+        item => item.assessmentModelId === assessmentModelId
+      );
+      console.log("selectedItems", selectedItems);
+      userPageWhitOrganizationApi(selectedItems, 1);
+      postListTreeApi(selectedItems, 1);
+      setTimeout(() => {
+        $emit(
+          "handClick",
+          {
+            ...dataList.params,
+            ...init
+          },
+          1
+        );
+      }, 100);
+    }, 300);
+  }
+};
+
+// 考核活动
+const getAssessmentPageListApi = async () => {
+  const { data, code } = await getAssessmentList({
+    type: 1
+  });
+  if (code === 200) {
+    dataList.magList = data;
+    getSearchFrom();
+  }
+};
+getAssessmentPageListApi();
+
+// 清除条件
+const handClickClear1 = () => {
+  dataList.teplist = [];
+  dataList.deptList = [];
+};
+const handClickClear2 = () => {
+  dataList.deptList = [];
+  dataList.params.assessmentObjectId = "";
+};
+</script>
+
+<template>
+  <div class="w-full">
+    <div class="mb-2 flex gap-2 justify-between flex-wrap">
+      <div class="w-[100%] flex mt-2">
+        <div class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">考核活动</div>
+          <el-select
+            v-model="dataList.params.assessmentId"
+            clearable
+            filterable
+            placeholder="请选择"
+            style="width: 200px"
+            @change="handClickInit1"
+            @clear="handClickClear1"
+          >
+            <el-option
+              v-for="item in dataList.magList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            />
+          </el-select>
+        </div>
+        <div class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">考核模板</div>
+          <el-select
+            v-model="dataList.params.assessmentModelId"
+            clearable
+            filterable
+            placeholder="请选择"
+            style="width: 200px"
+            @change="handClickInit2"
+            @clear="handClickClear2"
+          >
+            <el-option
+              v-for="item in dataList.teplist"
+              :key="item.assessmentModelId"
+              :label="item.assessmentModelName"
+              :value="item.assessmentModelId"
+            />
+          </el-select>
+        </div>
+        <div class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">科室</div>
+          <el-select
+            v-model="dataList.params.assessmentObjectId"
+            clearable
+            filterable
+            placeholder="请选择"
+            style="width: 200px"
+            @change="handClickInit3"
+          >
+            <el-option
+              v-for="item in dataList.deptList"
+              :key="item.assessmentObjectId"
+              :label="item.assessmentObjectName"
+              :value="item.assessmentObjectId"
+            />
+          </el-select>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>

+ 93 - 0
src/views/draw/children/department/dataDetail.vue

@@ -0,0 +1,93 @@
+<script setup lang="ts">
+defineOptions({
+  name: "departmentDataDetail"
+});
+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";
+import { useRouter } from "vue-router";
+import { useAppStoreHook } from "@/store/modules/app";
+
+// tab逻辑
+const activeName = ref("0");
+const handleClick = val => {
+  activeName.value = val;
+};
+
+const rankTableRef = ref();
+const seachParams = ref();
+const lengthData = ref();
+const getPersonDimensionChartsListApi = async () => {
+  const { code, data } = await getChartsList({
+    ...seachParams.value,
+    type: 1
+  });
+
+  if (code == 200) {
+    if (data.length > 0) {
+      lengthData.value = data.length;
+      setTimeout(() => {
+        nextTick(() => {
+          rankTableRef.value && rankTableRef.value.init(data, "科室", "姓名");
+        });
+      }, 500);
+    }
+  }
+
+  // console.log(res);
+};
+const init = (item, type) => {
+  seachParams.value = item;
+  if (Number(type)) {
+    getPersonDimensionChartsListApi();
+  }
+};
+
+// 返回上一页
+const router = useRouter();
+const backChange = () => {
+  useAppStoreHook().toggleSideBar(true, "打开");
+  router.push("/draw/children/department/departmentRank");
+};
+</script>
+
+<template>
+  <div class="w-full">
+    <div class="flex mb20">
+      <el-text class="cursor-pointer" @click="backChange">
+        <el-icon>
+          <ArrowLeft />
+        </el-icon>
+        返回
+      </el-text>
+      <!-- <el-radio-group v-model="activeName" @change="handleClick">
+        <el-radio-button value="0">科室维度</el-radio-button>
+        <el-radio-button value="1">指标维度</el-radio-button>
+      </el-radio-group> -->
+    </div>
+    <div v-if="activeName === '0'">
+      <div class="mb-2 flex gap-2 justify-between flex-wrap">
+        <seachData :activeName="activeName" @handClick="init" />
+      </div>
+      <rankTableDraw v-if="lengthData > 0" ref="rankTableRef" />
+    </div>
+    <!-- <div v-else-if="activeName === '1'">
+      <div class="mb-2 flex gap-2 justify-between flex-wrap">
+        <seachData :activeName="activeName" @handClick="init" />
+      </div>
+      <assessmentRank ref="rankTableRef2" />
+    </div> -->
+  </div>
+</template>
+<style lang="scss" scoped>
+.cursor-pointer {
+  margin-right: 23px;
+}
+
+.mb20 {
+  padding-top: 20px;
+  margin-bottom: 20px;
+}
+</style>

+ 1 - 1
src/views/draw/children/department/departmentDrank.vue

@@ -10,7 +10,7 @@ import barDimEcharts from "@/components/echarts/barDim.vue";
 import rankTable from "@/components/rankTable/draw.vue";
 import personList from "@/components/personList/index.vue";
 import qvanping from "@/assets/rank/qvanping@2x.png";
-import seachData from "./componements/seach.vue";
+import seachData from "./componements/seachOld.vue";
 import {
   getPersonDimensionChartsList,
   getPersonDimensionChartsRanking,

+ 157 - 29
src/views/draw/children/department/departmentRank.vue

@@ -2,45 +2,173 @@
 defineOptions({
   name: "departmentRank"
 });
-import rankTableDraw from "@/components/rankTable/index.vue";
-import seachData from "./componements/seach.vue";
-import { getChartsList } from "@/api/draw";
-
-import { ref, nextTick } from "vue";
-const rankTableRef = ref();
-const seachParams = ref();
-const lengthData = ref(0);
-const getPersonDimensionChartsListApi = async () => {
-  const { code, data } = await getChartsList({
-    ...seachParams.value,
-    type: 1
-  });
 
-  if (code == 200) {
-    if (data.length > 0) {
-      lengthData.value = data.length;
+import { ref, onMounted } from "vue";
+import { Search } from "@element-plus/icons-vue";
+import {
+  getAssessmentPageList,
+  getPageScoreInfoByAssessment
+} from "@/api/manage";
+import { ElMessage } from "element-plus";
+import { useRouter } from "vue-router";
+import { useAppStoreHook } from "@/store/modules/app";
+
+// 考核活动点击交互
+const activityList: any = ref([]);
+const activeActivity = ref(0);
+const handleActiveActivity = (item: any, index: number) => {
+  activeActivity.value = index;
+  getPageScoreInfoByAssessmentApi(item);
+};
 
-      setTimeout(() => {
-        nextTick(() => {
-          rankTableRef.value.init(data, "科室", "姓名");
-        });
-      }, 500);
+// 考核活动数据
+const getAssessmentPageListApi = async (name = "") => {
+  const params: {
+    pageNumber: number;
+    pageSize: number;
+    assessmentType: number;
+    name?: string;
+  } = {
+    pageNumber: 1,
+    pageSize: 999999,
+    assessmentType: 1 // 0:员工,1:部门,2:医疗组,3:部门负责人
+  };
+  if (name) {
+    params.name = name;
+  }
+  const { code, msg, data } = await getAssessmentPageList(params);
+  if (code === 200) {
+    activityList.value = data.records || [];
+    if (activityList.value && activityList.value.length) {
+      handleActiveActivity(activityList.value[0], 0);
     }
+  } else {
+    ElMessage.error(msg);
   }
 };
-const init = (item, type) => {
-  seachParams.value = item;
-  if (Number(type)) {
-    getPersonDimensionChartsListApi();
+onMounted(() => {
+  getAssessmentPageListApi();
+});
+const handleSearch = () => {
+  getAssessmentPageListApi(searchKeyword.value);
+};
+
+// 右侧列表
+const searchKeyword = ref("");
+const averageScore = ref<number | string>(0);
+const tableData = ref<any>([]);
+const getPageScoreInfoByAssessmentApi = async (obj: any = {}) => {
+  const params = {
+    assessmentId: obj.id,
+    assessmentType: `${obj.assessmentType}`
+  };
+  const { code, msg, data = [] } = await getPageScoreInfoByAssessment(params);
+  if (code === 200) {
+    tableData.value = data;
+    if (tableData.value.length) {
+      let allCount = 0;
+      tableData.value.forEach(item => {
+        allCount += item.score ? Number(item.score) : 0;
+      });
+      let resultNum: number | string = allCount / tableData.value.length;
+      if (
+        resultNum.toString().split(".")[1] &&
+        resultNum.toString().split(".")[1].length > 3
+      ) {
+        resultNum = resultNum.toFixed(3);
+      }
+      averageScore.value = resultNum;
+    }
+  } else {
+    ElMessage.error(msg);
   }
 };
+
+// 跳转到数据明细
+const router = useRouter();
+const toDetail = (row: any = {}) => {
+  router.push({
+    path: "/draw/children/department/dataDetail",
+    query: {
+      mid: row.templateId,
+      id: activityList.value[activeActivity.value].id,
+      mname: row.templateName,
+      name: activityList.value[activeActivity.value].name
+    }
+  });
+  useAppStoreHook().toggleSideBar(false, "关闭");
+};
 </script>
 
 <template>
-  <div class="w-full">
-    <div class="mb-2 flex gap-2 justify-between flex-wrap">
-      <seachData @handClick="init" />
+  <div class="assessment-rank flex">
+    <div class="search-section mr-4">
+      <el-input
+        v-model="searchKeyword"
+        placeholder="考核活动名称"
+        class="w-64"
+        :suffix-icon="Search"
+        clearable
+        @keyup.enter="handleSearch"
+      />
+      <div class="search-section-list">
+        <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(item, index)"
+        >
+          {{ item.name }}
+        </p>
+      </div>
     </div>
-    <rankTableDraw v-if="lengthData > 0" ref="rankTableRef" />
+    <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 type="index" label="排名" width="80" align="center" />
+        <el-table-column prop="templateName" label="考核模板" min-width="200">
+          <template #default="{ row }">
+            <el-button type="primary" link @click="toDetail(row)">
+              {{ row.templateName }}
+            </el-button>
+          </template>
+        </el-table-column>
+        <el-table-column prop="deptName" label="科室" min-width="150" />
+        <el-table-column
+          prop="score"
+          label="实际得分"
+          width="120"
+          align="right"
+        />
+      </el-table>
+    </el-card>
   </div>
 </template>
+
+<style scoped lang="scss">
+.assessment-rank {
+  padding: 20px 0;
+}
+
+.search-section {
+  flex-shrink: 0;
+  width: 200px;
+
+  .search-section-list {
+    height: calc(100vh - 250px);
+    margin-top: 20px;
+    overflow: auto;
+  }
+}
+
+:deep(.el-card__header) {
+  padding: 15px 20px;
+}
+</style>

+ 46 - 0
src/views/draw/children/department/departmentRankOld.vue

@@ -0,0 +1,46 @@
+<script setup lang="ts">
+defineOptions({
+  name: "departmentRank"
+});
+import rankTableDraw from "@/components/rankTable/index.vue";
+import seachData from "./componements/seach.vue";
+import { getChartsList } from "@/api/draw";
+
+import { ref, nextTick } from "vue";
+const rankTableRef = ref();
+const seachParams = ref();
+const lengthData = ref(0);
+const getPersonDimensionChartsListApi = async () => {
+  const { code, data } = await getChartsList({
+    ...seachParams.value,
+    type: 1
+  });
+
+  if (code == 200) {
+    if (data.length > 0) {
+      lengthData.value = data.length;
+
+      setTimeout(() => {
+        nextTick(() => {
+          rankTableRef.value.init(data, "科室", "姓名");
+        });
+      }, 500);
+    }
+  }
+};
+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>

+ 68 - 209
src/views/draw/children/head/componements/seach.vue

@@ -1,82 +1,67 @@
 <script setup>
-import { ref, reactive } from "vue";
-import { getTemplateInfoList } from "@/api/templateInfo";
-import { userPageWhitOrganization, getLeaderList } from "@/api/userSetting";
-import { getAssessmentPageList } from "@/api/manage";
-import { postListTree } from "@/api/department";
-import {
-  getAssessmentList,
-  getModelListByAssessmentId,
-  getUserListObjectByModelId
-} from "@/api/draw";
-import { useRouter, useRoute } from "vue-router";
-const $emit = defineEmits(["handClick"]);
+import { ref, reactive, onMounted } from "vue";
+import { useRoute } from "vue-router";
+import { getUserListObjectByModelId, getAssessmentIndName } from "@/api/draw";
 
+const props = defineProps({
+  // 行数
+  activeName: {
+    type: String,
+    default: "0"
+  }
+});
+const $emit = defineEmits(["handClick"]);
 const dataList = reactive({
   teplist: [],
   personList: [],
   magList: [],
-  deptList: [],
   leaderList: [],
   params: {
     assessmentId: "",
     assessmentModelId: "",
     deptCode: "",
-    assessmentObjectId: ""
+    assessmentObjectId: "",
+    indName: ""
   }
 });
-// 考核模板
-const getTemplateInfoListApi = async selectedItem => {
-  const { data, code } = await getModelListByAssessmentId(selectedItem);
-  if (code === 200) {
-    dataList.teplist = data;
-  }
-};
-// getTemplateInfoListApi();
-// 员工
-const userPageWhitOrganizationApi = async () => {
-  const { data, code } = await userPageWhitOrganization({
-    pageNumber: 1,
-    pageSize: 1000
-  });
-  if (code === 200) {
-    dataList.personList = data.records;
-  }
-};
-// userPageWhitOrganizationApi();
-// 考核活动
-// const getAssessmentPageListApi = async () => {
-//   const { data, code } = await getAssessmentList({
-//     type: 3
-//   });
-//   if (code === 200) {
-//     dataList.magList = data;
-//   }
-//   console.log("await", data);
-// };
-// getAssessmentPageListApi();
-// 部门
-const postListTreeApi = async () => {
-  const { data, code } = await postListTree();
-  if (code === 200) {
-    dataList.deptList = data;
-  }
-  console.log("await", data);
-};
-postListTreeApi();
+
 // 科主任
-const getLeaderListApi = async selectedItem => {
+const postListTreeApi = async selectedItem => {
   const { data, code } = await getUserListObjectByModelId({
-    modelId: selectedItem.assessmentModelId,
+    type: 3,
     assessmentId: selectedItem.assessmentId,
-    type: 3
+    modelId: selectedItem.assessmentModelId
   });
   if (code === 200) {
     dataList.leaderList = data;
   }
 };
-// getLeaderListApi();
-// ----------------------------
+
+// 指标
+const route = useRoute();
+const assessmentList = ref([]);
+const getAssessmentIndNameApi = async () => {
+  const { data, code } = await getAssessmentIndName({
+    assessmentId: route.query.id
+  });
+  if (code === 200) {
+    assessmentList.value = data;
+  }
+};
+
+onMounted(() => {
+  dataList.params.assessmentId = route.query.id;
+  dataList.params.assessmentModelId = route.query.mid;
+  init.assessmentName = route.query.name;
+  init.assessmentModelName = route.query.mname;
+  postListTreeApi({
+    assessmentId: route.query.id,
+    assessmentModelId: route.query.mid
+  });
+  getAssessmentIndNameApi();
+});
+
+// -----------------------------------
 const init = reactive({
   assessmentName: "",
   assessmentModelName: "",
@@ -84,199 +69,73 @@ const init = reactive({
   assessmentObjectName: "",
   dimensionName: ""
 });
-const handClickInit1 = value => {
-  if (value) {
-    const selectedItem = dataList.magList.find(item => item.id === value);
-    init.assessmentName = selectedItem.name;
-    localStorage.setItem("fileName", selectedItem.name);
-    getTemplateInfoListApi(selectedItem);
-  }
-  Object.assign(dataList.params, {
-    assessmentModelId: "",
-    assessmentObjectId: ""
-  });
-  $emit("handClick", {
-    ...dataList.params,
-    ...init
-  }),
-    "0";
-};
-const handClickInit2 = value => {
+const handClickInit3 = value => {
   if (value) {
-    const selectedItem = dataList.teplist.find(
-      item => item.assessmentModelId === value
+    const selectedItem = dataList.leaderList.find(
+      item => item.assessmentObjectId === value
     );
-    init.assessmentModelName = selectedItem.assessmentModelName;
-    getLeaderListApi(selectedItem);
+    init.assessmentObjectName = selectedItem.assessmentObjectName;
   }
-  Object.assign(dataList.params, {
-    assessmentObjectId: ""
-  });
+
   $emit(
     "handClick",
     {
       ...dataList.params,
       ...init
     },
-    "0"
+    1
   );
 };
-const handClickInit3 = value => {
-  if (value) {
-    const selectedItem = dataList.leaderList.find(
-      item => item.assessmentObjectId === value
-    );
-    init.assessmentObjectName = selectedItem.assessmentObjectName;
-  }
+const handClickInit5 = value => {
   $emit(
     "handClick",
     {
       ...dataList.params,
-      ...init
+      ...init,
+      indName: value
     },
     "1"
   );
 };
-
-const route = useRoute();
-const getSearchFrom = () => {
-  if (Object.keys(route.query).length > 0) {
-    const {
-      assessmentId,
-      assessmentModelId,
-      assessmentObjectId,
-      assessmentName,
-      assessmentModelName,
-      assessmentObjectName
-    } = route.query;
-    const obj = ["assessmentId", "assessmentModelId", "assessmentObjectId"];
-    const initObj = [
-      "assessmentName",
-      "assessmentModelName",
-      "assessmentObjectName"
-    ];
-    obj.map(item => {
-      dataList.params[item] = route.query[item];
-    });
-    initObj.map(item => {
-      init[item] = route.query[item];
-    });
-    const selectedItem = dataList.magList.find(
-      item => item.id === assessmentId
-    );
-    getTemplateInfoListApi(selectedItem);
-    setTimeout(() => {
-      const selectedItems = dataList.teplist.find(
-        item => item.assessmentModelId === assessmentModelId
-      );
-      // userPageWhitOrganizationApi(selectedItems);
-      getLeaderListApi(selectedItems);
-      setTimeout(() => {
-        $emit(
-          "handClick",
-          {
-            ...dataList.params,
-            ...init
-          },
-          1
-        );
-      }, 100);
-    }, 300);
-  }
-};
-
-// 考核活动
-const getAssessmentPageListApi = async () => {
-  const { data, code } = await getAssessmentList({
-    type: 3
-  });
-  if (code === 200) {
-    dataList.magList = data;
-    getSearchFrom();
-  }
-};
-getAssessmentPageListApi();
-// 清除条件
-const handClickClear1 = () => {
-  dataList.teplist = [];
-  dataList.leaderList = [];
-};
-const handClickClear2 = () => {
-  dataList.leaderList = [];
-};
 </script>
 
 <template>
   <div class="w-full">
     <div class="mb-2 flex gap-2 justify-between flex-wrap">
       <div class="w-[100%] flex mt-2">
-        <div class="flex mr-2">
-          <div class="text-sm leading-8 mr-3">考核活动</div>
-          <el-select
-            v-model="dataList.params.assessmentId"
-            clearable
-            filterable
-            placeholder="请选择"
-            style="width: 200px"
-            @change="handClickInit1"
-            @clear="handClickClear1"
-          >
-            <el-option
-              v-for="item in dataList.magList"
-              :key="item.id"
-              :label="item.name"
-              :value="item.id"
-            />
-          </el-select>
-        </div>
-        <div class="flex mr-2">
-          <div class="text-sm leading-8 mr-3">考核模板</div>
+        <div v-if="props.activeName === '0'" class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">科主任</div>
           <el-select
-            v-model="dataList.params.assessmentModelId"
+            v-model="dataList.params.assessmentObjectId"
             clearable
             filterable
             placeholder="请选择"
             style="width: 200px"
-            @change="handClickInit2"
-            @clear="handClickClear2"
+            @change="handClickInit3"
           >
             <el-option
-              v-for="item in dataList.teplist"
-              :key="item.assessmentModelId"
-              :label="item.assessmentModelName"
-              :value="item.assessmentModelId"
+              v-for="item in dataList.leaderList"
+              :key="item.assessmentObjectId"
+              :label="item.assessmentObjectName"
+              :value="item.assessmentObjectId"
             />
           </el-select>
         </div>
-        <div class="flex mr-2">
-          <div class="text-sm leading-8 mr-3">科主任</div>
-          <!-- <el-tree-select
-            v-model="dataList.params.deptCode"
-            :data="dataList.deptList"
-            check-strictly
-            filterable
-            clearable
-            :props="{
-              label: 'deptName',
-              value: 'deptCode',
-              children: 'childrenRes'
-            }"
-            style="width: 200px"
-            @change="handClickInit3"
-          /> -->
+        <div v-else class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">指标</div>
           <el-select
-            v-model="dataList.params.assessmentObjectId"
+            v-model="dataList.params.indName"
             clearable
             filterable
             placeholder="请选择"
             style="width: 200px"
-            @change="handClickInit3"
+            @change="handClickInit5"
           >
             <el-option
-              v-for="item in dataList.leaderList"
-              :key="item.assessmentObjectId"
-              :label="item.assessmentObjectName"
-              :value="item.assessmentObjectId"
+              v-for="(item, idx) in assessmentList"
+              :key="idx"
+              :label="item"
+              :value="item"
             />
           </el-select>
         </div>

+ 286 - 0
src/views/draw/children/head/componements/seachOld.vue

@@ -0,0 +1,286 @@
+<script setup>
+import { ref, reactive } from "vue";
+import { getTemplateInfoList } from "@/api/templateInfo";
+import { userPageWhitOrganization, getLeaderList } from "@/api/userSetting";
+import { getAssessmentPageList } from "@/api/manage";
+import { postListTree } from "@/api/department";
+import {
+  getAssessmentList,
+  getModelListByAssessmentId,
+  getUserListObjectByModelId
+} from "@/api/draw";
+import { useRouter, useRoute } from "vue-router";
+const $emit = defineEmits(["handClick"]);
+
+const dataList = reactive({
+  teplist: [],
+  personList: [],
+  magList: [],
+  deptList: [],
+  leaderList: [],
+  params: {
+    assessmentId: "",
+    assessmentModelId: "",
+    deptCode: "",
+    assessmentObjectId: ""
+  }
+});
+// 考核模板
+const getTemplateInfoListApi = async selectedItem => {
+  const { data, code } = await getModelListByAssessmentId(selectedItem);
+  if (code === 200) {
+    dataList.teplist = data;
+  }
+};
+// getTemplateInfoListApi();
+// 员工
+const userPageWhitOrganizationApi = async () => {
+  const { data, code } = await userPageWhitOrganization({
+    pageNumber: 1,
+    pageSize: 1000
+  });
+  if (code === 200) {
+    dataList.personList = data.records;
+  }
+};
+// userPageWhitOrganizationApi();
+// 考核活动
+// const getAssessmentPageListApi = async () => {
+//   const { data, code } = await getAssessmentList({
+//     type: 3
+//   });
+//   if (code === 200) {
+//     dataList.magList = data;
+//   }
+//   console.log("await", data);
+// };
+// getAssessmentPageListApi();
+// 部门
+const postListTreeApi = async () => {
+  const { data, code } = await postListTree();
+  if (code === 200) {
+    dataList.deptList = data;
+  }
+  console.log("await", data);
+};
+postListTreeApi();
+// 科主任
+const getLeaderListApi = async selectedItem => {
+  const { data, code } = await getUserListObjectByModelId({
+    modelId: selectedItem.assessmentModelId,
+    assessmentId: selectedItem.assessmentId,
+    type: 3
+  });
+  if (code === 200) {
+    dataList.leaderList = data;
+  }
+};
+// getLeaderListApi();
+// ----------------------------
+const init = reactive({
+  assessmentName: "",
+  assessmentModelName: "",
+  deptName: "",
+  assessmentObjectName: "",
+  dimensionName: ""
+});
+const handClickInit1 = value => {
+  if (value) {
+    const selectedItem = dataList.magList.find(item => item.id === value);
+    init.assessmentName = selectedItem.name;
+    localStorage.setItem("fileName", selectedItem.name);
+    getTemplateInfoListApi(selectedItem);
+  }
+  Object.assign(dataList.params, {
+    assessmentModelId: "",
+    assessmentObjectId: ""
+  });
+  $emit("handClick", {
+    ...dataList.params,
+    ...init
+  }),
+    "0";
+};
+const handClickInit2 = value => {
+  if (value) {
+    const selectedItem = dataList.teplist.find(
+      item => item.assessmentModelId === value
+    );
+    init.assessmentModelName = selectedItem.assessmentModelName;
+    getLeaderListApi(selectedItem);
+  }
+  Object.assign(dataList.params, {
+    assessmentObjectId: ""
+  });
+  $emit(
+    "handClick",
+    {
+      ...dataList.params,
+      ...init
+    },
+    "0"
+  );
+};
+const handClickInit3 = value => {
+  if (value) {
+    const selectedItem = dataList.leaderList.find(
+      item => item.assessmentObjectId === value
+    );
+    init.assessmentObjectName = selectedItem.assessmentObjectName;
+  }
+  $emit(
+    "handClick",
+    {
+      ...dataList.params,
+      ...init
+    },
+    "1"
+  );
+};
+
+const route = useRoute();
+const getSearchFrom = () => {
+  if (Object.keys(route.query).length > 0) {
+    const {
+      assessmentId,
+      assessmentModelId,
+      assessmentObjectId,
+      assessmentName,
+      assessmentModelName,
+      assessmentObjectName
+    } = route.query;
+    const obj = ["assessmentId", "assessmentModelId", "assessmentObjectId"];
+    const initObj = [
+      "assessmentName",
+      "assessmentModelName",
+      "assessmentObjectName"
+    ];
+    obj.map(item => {
+      dataList.params[item] = route.query[item];
+    });
+    initObj.map(item => {
+      init[item] = route.query[item];
+    });
+    const selectedItem = dataList.magList.find(
+      item => item.id === assessmentId
+    );
+    getTemplateInfoListApi(selectedItem);
+    setTimeout(() => {
+      const selectedItems = dataList.teplist.find(
+        item => item.assessmentModelId === assessmentModelId
+      );
+      // userPageWhitOrganizationApi(selectedItems);
+      getLeaderListApi(selectedItems);
+      setTimeout(() => {
+        $emit(
+          "handClick",
+          {
+            ...dataList.params,
+            ...init
+          },
+          1
+        );
+      }, 100);
+    }, 300);
+  }
+};
+
+// 考核活动
+const getAssessmentPageListApi = async () => {
+  const { data, code } = await getAssessmentList({
+    type: 3
+  });
+  if (code === 200) {
+    dataList.magList = data;
+    getSearchFrom();
+  }
+};
+getAssessmentPageListApi();
+// 清除条件
+const handClickClear1 = () => {
+  dataList.teplist = [];
+  dataList.leaderList = [];
+};
+const handClickClear2 = () => {
+  dataList.leaderList = [];
+};
+</script>
+
+<template>
+  <div class="w-full">
+    <div class="mb-2 flex gap-2 justify-between flex-wrap">
+      <div class="w-[100%] flex mt-2">
+        <div class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">考核活动</div>
+          <el-select
+            v-model="dataList.params.assessmentId"
+            clearable
+            filterable
+            placeholder="请选择"
+            style="width: 200px"
+            @change="handClickInit1"
+            @clear="handClickClear1"
+          >
+            <el-option
+              v-for="item in dataList.magList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            />
+          </el-select>
+        </div>
+        <div class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">考核模板</div>
+          <el-select
+            v-model="dataList.params.assessmentModelId"
+            clearable
+            filterable
+            placeholder="请选择"
+            style="width: 200px"
+            @change="handClickInit2"
+            @clear="handClickClear2"
+          >
+            <el-option
+              v-for="item in dataList.teplist"
+              :key="item.assessmentModelId"
+              :label="item.assessmentModelName"
+              :value="item.assessmentModelId"
+            />
+          </el-select>
+        </div>
+        <div class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">科主任</div>
+          <!-- <el-tree-select
+            v-model="dataList.params.deptCode"
+            :data="dataList.deptList"
+            check-strictly
+            filterable
+            clearable
+            :props="{
+              label: 'deptName',
+              value: 'deptCode',
+              children: 'childrenRes'
+            }"
+            style="width: 200px"
+            @change="handClickInit3"
+          /> -->
+          <el-select
+            v-model="dataList.params.assessmentObjectId"
+            clearable
+            filterable
+            placeholder="请选择"
+            style="width: 200px"
+            @change="handClickInit3"
+          >
+            <el-option
+              v-for="item in dataList.leaderList"
+              :key="item.assessmentObjectId"
+              :label="item.assessmentObjectName"
+              :value="item.assessmentObjectId"
+            />
+          </el-select>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>

+ 93 - 0
src/views/draw/children/head/dataDetail.vue

@@ -0,0 +1,93 @@
+<script setup lang="ts">
+defineOptions({
+  name: "headDataDetail"
+});
+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";
+import { useRouter } from "vue-router";
+import { useAppStoreHook } from "@/store/modules/app";
+
+// tab逻辑
+const activeName = ref("0");
+const handleClick = val => {
+  activeName.value = val;
+};
+
+const rankTableRef = ref();
+const seachParams = ref();
+const lengthData = ref();
+const getPersonDimensionChartsListApi = async () => {
+  const { code, data } = await getChartsList({
+    ...seachParams.value,
+    type: 3
+  });
+
+  if (code == 200) {
+    if (data.length > 0) {
+      lengthData.value = data.length;
+      setTimeout(() => {
+        nextTick(() => {
+          rankTableRef.value && rankTableRef.value.init(data, "科室", "姓名");
+        });
+      }, 500);
+    }
+  }
+
+  // console.log(res);
+};
+const init = (item, type) => {
+  seachParams.value = item;
+  if (Number(type)) {
+    getPersonDimensionChartsListApi();
+  }
+};
+
+// 返回上一页
+const router = useRouter();
+const backChange = () => {
+  useAppStoreHook().toggleSideBar(true, "打开");
+  router.push("/draw/children/head/headRank");
+};
+</script>
+
+<template>
+  <div class="w-full">
+    <div class="flex mb20">
+      <el-text class="cursor-pointer" @click="backChange">
+        <el-icon>
+          <ArrowLeft />
+        </el-icon>
+        返回
+      </el-text>
+      <!-- <el-radio-group v-model="activeName" @change="handleClick">
+        <el-radio-button value="0">科室维度</el-radio-button>
+        <el-radio-button value="1">指标维度</el-radio-button>
+      </el-radio-group> -->
+    </div>
+    <div v-if="activeName === '0'">
+      <div class="mb-2 flex gap-2 justify-between flex-wrap">
+        <seachData :activeName="activeName" @handClick="init" />
+      </div>
+      <rankTableDraw v-if="lengthData > 0" ref="rankTableRef" />
+    </div>
+    <!-- <div v-else-if="activeName === '1'">
+      <div class="mb-2 flex gap-2 justify-between flex-wrap">
+        <seachData :activeName="activeName" @handClick="init" />
+      </div>
+      <assessmentRank ref="rankTableRef2" />
+    </div> -->
+  </div>
+</template>
+<style lang="scss" scoped>
+.cursor-pointer {
+  margin-right: 23px;
+}
+
+.mb20 {
+  padding-top: 20px;
+  margin-bottom: 20px;
+}
+</style>

+ 1 - 1
src/views/draw/children/head/headDrank.vue

@@ -10,7 +10,7 @@ import barDimEcharts from "@/components/echarts/barDim.vue";
 import rankTable from "@/components/rankTable/draw.vue";
 import personList from "@/components/personList/index.vue";
 import qvanping from "@/assets/rank/qvanping@2x.png";
-import seachData from "./componements/seach.vue";
+import seachData from "./componements/seachOld.vue";
 import {
   getPersonDimensionChartsList,
   getPersonDimensionChartsRanking,

+ 159 - 30
src/views/draw/children/head/headRank.vue

@@ -1,45 +1,174 @@
 <script setup lang="ts">
 defineOptions({
-  name: "healthRank"
+  name: "headRank"
 });
-import rankTableDraw from "@/components/rankTable/index.vue";
-import seachData from "./componements/seach.vue";
-import { getChartsList } from "@/api/draw";
-
-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: 3
-  });
 
-  if (code == 200) {
-    if (data.length > 0) {
-      lengthData.value = data.length;
-      setTimeout(() => {
-        nextTick(() => {
-          rankTableRef.value.init(data, "科室", "姓名");
-        });
-      }, 500);
+import { ref, onMounted } from "vue";
+import { Search } from "@element-plus/icons-vue";
+import {
+  getAssessmentPageList,
+  getPageScoreInfoByAssessment
+} from "@/api/manage";
+import { ElMessage } from "element-plus";
+import { useRouter } from "vue-router";
+import { useAppStoreHook } from "@/store/modules/app";
+
+// 考核活动点击交互
+const activityList: any = ref([]);
+const activeActivity = ref(0);
+const handleActiveActivity = (item: any, index: number) => {
+  activeActivity.value = index;
+  getPageScoreInfoByAssessmentApi(item);
+};
+
+// 考核活动数据
+const getAssessmentPageListApi = async (name = "") => {
+  const params: {
+    pageNumber: number;
+    pageSize: number;
+    assessmentType: number;
+    name?: string;
+  } = {
+    pageNumber: 1,
+    pageSize: 999999,
+    assessmentType: 3 // 0:员工,1:部门,2:医疗组,3:部门负责人
+  };
+  if (name) {
+    params.name = name;
+  }
+  const { code, msg, data } = await getAssessmentPageList(params);
+  if (code === 200) {
+    activityList.value = data.records || [];
+    if (activityList.value && activityList.value.length) {
+      handleActiveActivity(activityList.value[0], 0);
     }
+  } else {
+    ElMessage.error(msg);
   }
 };
-const init = (item, type) => {
-  seachParams.value = item;
-  if (Number(type)) {
-    getPersonDimensionChartsListApi();
+onMounted(() => {
+  getAssessmentPageListApi();
+});
+const handleSearch = () => {
+  getAssessmentPageListApi(searchKeyword.value);
+};
+
+// 右侧列表
+const searchKeyword = ref("");
+const averageScore = ref<number | string>(0);
+const tableData = ref<any>([]);
+const getPageScoreInfoByAssessmentApi = async (obj: any = {}) => {
+  const params = {
+    assessmentId: obj.id,
+    assessmentType: `${obj.assessmentType}`
+  };
+  const { code, msg, data = [] } = await getPageScoreInfoByAssessment(params);
+  if (code === 200) {
+    tableData.value = data;
+    if (tableData.value.length) {
+      let allCount = 0;
+      tableData.value.forEach(item => {
+        allCount += item.score ? Number(item.score) : 0;
+      });
+      let resultNum: number | string = allCount / tableData.value.length;
+      if (
+        resultNum.toString().split(".")[1] &&
+        resultNum.toString().split(".")[1].length > 3
+      ) {
+        resultNum = resultNum.toFixed(3);
+      }
+      averageScore.value = resultNum;
+    }
+  } else {
+    ElMessage.error(msg);
   }
 };
+
+// 跳转到数据明细
+const router = useRouter();
+const toDetail = (row: any = {}) => {
+  router.push({
+    path: "/draw/children/head/dataDetail",
+    query: {
+      mid: row.templateId,
+      id: activityList.value[activeActivity.value].id,
+      mname: row.templateName,
+      name: activityList.value[activeActivity.value].name
+    }
+  });
+  useAppStoreHook().toggleSideBar(false, "关闭");
+};
 </script>
 
 <template>
-  <div class="w-full">
-    <div class="mb-2 flex gap-2 justify-between flex-wrap">
-      <seachData @handClick="init" />
+  <div class="assessment-rank flex">
+    <div class="search-section mr-4">
+      <el-input
+        v-model="searchKeyword"
+        placeholder="考核活动名称"
+        class="w-64"
+        :suffix-icon="Search"
+        clearable
+        @keyup.enter="handleSearch"
+      />
+      <div class="search-section-list">
+        <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(item, index)"
+        >
+          {{ item.name }}
+        </p>
+      </div>
     </div>
-    <rankTableDraw v-if="lengthData > 0" ref="rankTableRef" />
+    <el-card v-if="activityList.length" 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 type="index" label="排名" width="80" align="center" />
+        <el-table-column prop="templateName" label="考核模板" min-width="200">
+          <template #default="{ row }">
+            <el-button type="primary" link @click="toDetail(row)">
+              {{ row.templateName }}
+            </el-button>
+          </template>
+        </el-table-column>
+        <el-table-column prop="deptName" label="科室" min-width="150" />
+        <el-table-column
+          prop="score"
+          label="实际得分"
+          width="120"
+          align="right"
+        />
+      </el-table>
+    </el-card>
   </div>
 </template>
+
+<style scoped lang="scss">
+.assessment-rank {
+  padding: 20px 0;
+}
+
+.search-section {
+  flex-shrink: 0;
+  width: 200px;
+
+  .search-section-list {
+    height: calc(100vh - 250px);
+    margin-top: 20px;
+    overflow: auto;
+  }
+}
+
+:deep(.el-card__header) {
+  padding: 15px 20px;
+}
+</style>

+ 45 - 0
src/views/draw/children/head/headRankOld.vue

@@ -0,0 +1,45 @@
+<script setup lang="ts">
+defineOptions({
+  name: "healthRank"
+});
+import rankTableDraw from "@/components/rankTable/index.vue";
+import seachData from "./componements/seach.vue";
+import { getChartsList } from "@/api/draw";
+
+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: 3
+  });
+
+  if (code == 200) {
+    if (data.length > 0) {
+      lengthData.value = data.length;
+      setTimeout(() => {
+        nextTick(() => {
+          rankTableRef.value.init(data, "科室", "姓名");
+        });
+      }, 500);
+    }
+  }
+};
+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>

+ 70 - 179
src/views/draw/children/health/componements/seach.vue

@@ -1,62 +1,67 @@
 <script setup>
-import { ref, reactive } from "vue";
-import { getTemplateInfoList } from "@/api/templateInfo";
-import { userPageWhitOrganization } from "@/api/userSetting";
-import { getAssessmentPageList } from "@/api/manage";
-import { postListTree } from "@/api/department";
-import { postPageGroup } from "@/api/userGroup";
-import {
-  getAssessmentList,
-  getModelListByAssessmentId,
-  getUserListObjectByModelId
-} from "@/api/draw";
-import { useRouter, useRoute } from "vue-router";
-const $emit = defineEmits(["handClick"]);
+import { ref, reactive, onMounted } from "vue";
+import { useRoute } from "vue-router";
+import { getUserListObjectByModelId, getAssessmentIndName } from "@/api/draw";
 
+const props = defineProps({
+  // 行数
+  activeName: {
+    type: String,
+    default: "0"
+  }
+});
+const $emit = defineEmits(["handClick"]);
 const dataList = reactive({
   teplist: [],
-  userList: [],
+  personList: [],
   magList: [],
+  userList: [],
   params: {
     assessmentId: "",
     assessmentModelId: "",
     deptCode: "",
-    assessmentObjectId: ""
+    assessmentObjectId: "",
+    indName: ""
   }
 });
-// 考核模板
-const getTemplateInfoListApi = async selectedItem => {
-  const { data, code } = await getModelListByAssessmentId(selectedItem);
-  if (code === 200) {
-    dataList.teplist = data;
-  }
-};
-// getTemplateInfoListApi();
 
-// 考核活动
-// const getAssessmentPageListApi = async () => {
-//   const { data, code } = await getAssessmentList({
-//     type: 2
-//   });
-//   if (code === 200) {
-//     dataList.magList = data;
-//   }
-//   console.log("await", data);
-// };
-// getAssessmentPageListApi();
-// 用户组-用户组-医疗组
-const postPageGroupApi = async selectedItem => {
-  console.log("selectedItem", selectedItem);
+// 部门
+const postListTreeApi = async selectedItem => {
   const { data, code } = await getUserListObjectByModelId({
-    modelId: selectedItem.assessmentModelId,
+    type: 2,
     assessmentId: selectedItem.assessmentId,
-    type: 2
+    modelId: selectedItem.assessmentModelId
   });
   if (code === 200) {
     dataList.userList = data;
   }
 };
-// -----------------------
+
+// 指标
+const route = useRoute();
+const assessmentList = ref([]);
+const getAssessmentIndNameApi = async () => {
+  const { data, code } = await getAssessmentIndName({
+    assessmentId: route.query.id
+  });
+  if (code === 200) {
+    assessmentList.value = data;
+  }
+};
+
+onMounted(() => {
+  dataList.params.assessmentId = route.query.id;
+  dataList.params.assessmentModelId = route.query.mid;
+  init.assessmentName = route.query.name;
+  init.assessmentModelName = route.query.mname;
+  postListTreeApi({
+    assessmentId: route.query.id,
+    assessmentModelId: route.query.mid
+  });
+  getAssessmentIndNameApi();
+});
+
+// -----------------------------------
 const init = reactive({
   assessmentName: "",
   assessmentModelName: "",
@@ -64,187 +69,73 @@ const init = reactive({
   assessmentObjectName: "",
   dimensionName: ""
 });
-const handClickInit1 = value => {
-  if (value) {
-    const selectedItem = dataList.magList.find(item => item.id === value);
-    init.assessmentName = selectedItem.name;
-    localStorage.setItem("fileName", selectedItem.name);
-    getTemplateInfoListApi(selectedItem);
-  }
-  Object.assign(dataList.params, {
-    assessmentModelId: "",
-    assessmentObjectId: ""
-  });
-  $emit(
-    "handClick",
-    {
-      ...dataList.params,
-      ...init
-    },
-    "0"
-  );
-};
-const handClickInit2 = value => {
+const handClickInit3 = value => {
   if (value) {
-    const selectedItem = dataList.teplist.find(
-      item => item.assessmentModelId === value
+    const selectedItem = dataList.userList.find(
+      item => item.assessmentObjectId === value
     );
-    init.assessmentModelName = selectedItem.assessmentModelName;
-    postPageGroupApi(selectedItem);
+    init.assessmentObjectName = selectedItem.assessmentObjectName;
   }
-  Object.assign(dataList.params, {
-    assessmentObjectId: ""
-  });
+
   $emit(
     "handClick",
     {
       ...dataList.params,
       ...init
     },
-    "0"
+    1
   );
 };
-const handClickInit3 = value => {
-  if (value) {
-    const selectedItem = dataList.userList.find(
-      item => item.assessmentObjectId === value
-    );
-    init.assessmentObjectName = selectedItem.assessmentObjectName;
-  }
+const handClickInit5 = value => {
   $emit(
     "handClick",
     {
       ...dataList.params,
-      ...init
+      ...init,
+      indName: value
     },
     "1"
   );
 };
-
-const route = useRoute();
-const getSearchFrom = () => {
-  if (Object.keys(route.query).length > 0) {
-    const {
-      assessmentId,
-      assessmentModelId,
-      assessmentObjectId,
-      assessmentName,
-      assessmentModelName,
-      assessmentObjectName
-    } = route.query;
-    const obj = ["assessmentId", "assessmentModelId", "assessmentObjectId"];
-    const initObj = [
-      "assessmentName",
-      "assessmentModelName",
-      "assessmentObjectName"
-    ];
-    obj.map(item => {
-      dataList.params[item] = route.query[item];
-    });
-    initObj.map(item => {
-      init[item] = route.query[item];
-    });
-    const selectedItem = dataList.magList.find(
-      item => item.id === assessmentId
-    );
-    getTemplateInfoListApi(selectedItem);
-    setTimeout(() => {
-      const selectedItems = dataList.teplist.find(
-        item => item.assessmentModelId === assessmentModelId
-      );
-      postPageGroupApi(selectedItems);
-      setTimeout(() => {
-        $emit(
-          "handClick",
-          {
-            ...dataList.params,
-            ...init
-          },
-          1
-        );
-      }, 100);
-    }, 300);
-  }
-};
-
-// 考核活动
-const getAssessmentPageListApi = async () => {
-  const { data, code } = await getAssessmentList({
-    type: 2
-  });
-  if (code === 200) {
-    dataList.magList = data;
-    getSearchFrom();
-  }
-};
-getAssessmentPageListApi();
-// 清除条件
-const handClickClear1 = () => {
-  dataList.teplist = [];
-  dataList.userList = [];
-};
-const handClickClear2 = () => {
-  dataList.userList = [];
-};
 </script>
 
 <template>
   <div class="w-full">
     <div class="mb-2 flex gap-2 justify-between flex-wrap">
       <div class="w-[100%] flex mt-2">
-        <div class="flex mr-2">
-          <div class="text-sm leading-8 mr-3">考核活动</div>
-          <el-select
-            v-model="dataList.params.assessmentId"
-            clearable
-            filterable
-            placeholder="请选择"
-            style="width: 200px"
-            @change="handClickInit1"
-            @clear="handClickClear1"
-          >
-            <el-option
-              v-for="item in dataList.magList"
-              :key="item.id"
-              :label="item.name"
-              :value="item.id"
-            />
-          </el-select>
-        </div>
-        <div class="flex mr-2">
-          <div class="text-sm leading-8 mr-3">考核模板</div>
+        <div v-if="props.activeName === '0'" class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">医疗组</div>
           <el-select
-            v-model="dataList.params.assessmentModelId"
+            v-model="dataList.params.assessmentObjectId"
             clearable
             filterable
             placeholder="请选择"
             style="width: 200px"
-            @change="handClickInit2"
-            @clear="handClickClear2"
+            @change="handClickInit3"
           >
             <el-option
-              v-for="item in dataList.teplist"
-              :key="item.assessmentModelId"
-              :label="item.assessmentModelName"
-              :value="item.assessmentModelId"
+              v-for="item in dataList.userList"
+              :key="item.assessmentObjectId"
+              :label="item.assessmentObjectName"
+              :value="item.assessmentObjectId"
             />
           </el-select>
         </div>
-        <div class="flex mr-2">
-          <div class="text-sm leading-8 mr-3">医疗组</div>
+        <div v-else class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">指标</div>
           <el-select
-            v-model="dataList.params.assessmentObjectId"
+            v-model="dataList.params.indName"
             clearable
             filterable
             placeholder="请选择"
             style="width: 200px"
-            @change="handClickInit3"
+            @change="handClickInit5"
           >
             <el-option
-              v-for="item in dataList.userList"
-              :key="item.assessmentObjectId"
-              :label="item.assessmentObjectName"
-              :value="item.assessmentObjectId"
+              v-for="(item, idx) in assessmentList"
+              :key="idx"
+              :label="item"
+              :value="item"
             />
           </el-select>
         </div>

+ 254 - 0
src/views/draw/children/health/componements/seachOld.vue

@@ -0,0 +1,254 @@
+<script setup>
+import { ref, reactive } from "vue";
+import { getTemplateInfoList } from "@/api/templateInfo";
+import { userPageWhitOrganization } from "@/api/userSetting";
+import { getAssessmentPageList } from "@/api/manage";
+import { postListTree } from "@/api/department";
+import { postPageGroup } from "@/api/userGroup";
+import {
+  getAssessmentList,
+  getModelListByAssessmentId,
+  getUserListObjectByModelId
+} from "@/api/draw";
+import { useRouter, useRoute } from "vue-router";
+const $emit = defineEmits(["handClick"]);
+
+const dataList = reactive({
+  teplist: [],
+  userList: [],
+  magList: [],
+  params: {
+    assessmentId: "",
+    assessmentModelId: "",
+    deptCode: "",
+    assessmentObjectId: ""
+  }
+});
+// 考核模板
+const getTemplateInfoListApi = async selectedItem => {
+  const { data, code } = await getModelListByAssessmentId(selectedItem);
+  if (code === 200) {
+    dataList.teplist = data;
+  }
+};
+// getTemplateInfoListApi();
+
+// 考核活动
+// const getAssessmentPageListApi = async () => {
+//   const { data, code } = await getAssessmentList({
+//     type: 2
+//   });
+//   if (code === 200) {
+//     dataList.magList = data;
+//   }
+//   console.log("await", data);
+// };
+// getAssessmentPageListApi();
+// 用户组-用户组-医疗组
+const postPageGroupApi = async selectedItem => {
+  console.log("selectedItem", selectedItem);
+  const { data, code } = await getUserListObjectByModelId({
+    modelId: selectedItem.assessmentModelId,
+    assessmentId: selectedItem.assessmentId,
+    type: 2
+  });
+  if (code === 200) {
+    dataList.userList = data;
+  }
+};
+// -----------------------
+const init = reactive({
+  assessmentName: "",
+  assessmentModelName: "",
+  deptName: "",
+  assessmentObjectName: "",
+  dimensionName: ""
+});
+const handClickInit1 = value => {
+  if (value) {
+    const selectedItem = dataList.magList.find(item => item.id === value);
+    init.assessmentName = selectedItem.name;
+    localStorage.setItem("fileName", selectedItem.name);
+    getTemplateInfoListApi(selectedItem);
+  }
+  Object.assign(dataList.params, {
+    assessmentModelId: "",
+    assessmentObjectId: ""
+  });
+  $emit(
+    "handClick",
+    {
+      ...dataList.params,
+      ...init
+    },
+    "0"
+  );
+};
+const handClickInit2 = value => {
+  if (value) {
+    const selectedItem = dataList.teplist.find(
+      item => item.assessmentModelId === value
+    );
+    init.assessmentModelName = selectedItem.assessmentModelName;
+    postPageGroupApi(selectedItem);
+  }
+  Object.assign(dataList.params, {
+    assessmentObjectId: ""
+  });
+  $emit(
+    "handClick",
+    {
+      ...dataList.params,
+      ...init
+    },
+    "0"
+  );
+};
+const handClickInit3 = value => {
+  if (value) {
+    const selectedItem = dataList.userList.find(
+      item => item.assessmentObjectId === value
+    );
+    init.assessmentObjectName = selectedItem.assessmentObjectName;
+  }
+  $emit(
+    "handClick",
+    {
+      ...dataList.params,
+      ...init
+    },
+    "1"
+  );
+};
+
+const route = useRoute();
+const getSearchFrom = () => {
+  if (Object.keys(route.query).length > 0) {
+    const {
+      assessmentId,
+      assessmentModelId,
+      assessmentObjectId,
+      assessmentName,
+      assessmentModelName,
+      assessmentObjectName
+    } = route.query;
+    const obj = ["assessmentId", "assessmentModelId", "assessmentObjectId"];
+    const initObj = [
+      "assessmentName",
+      "assessmentModelName",
+      "assessmentObjectName"
+    ];
+    obj.map(item => {
+      dataList.params[item] = route.query[item];
+    });
+    initObj.map(item => {
+      init[item] = route.query[item];
+    });
+    const selectedItem = dataList.magList.find(
+      item => item.id === assessmentId
+    );
+    getTemplateInfoListApi(selectedItem);
+    setTimeout(() => {
+      const selectedItems = dataList.teplist.find(
+        item => item.assessmentModelId === assessmentModelId
+      );
+      postPageGroupApi(selectedItems);
+      setTimeout(() => {
+        $emit(
+          "handClick",
+          {
+            ...dataList.params,
+            ...init
+          },
+          1
+        );
+      }, 100);
+    }, 300);
+  }
+};
+
+// 考核活动
+const getAssessmentPageListApi = async () => {
+  const { data, code } = await getAssessmentList({
+    type: 2
+  });
+  if (code === 200) {
+    dataList.magList = data;
+    getSearchFrom();
+  }
+};
+getAssessmentPageListApi();
+// 清除条件
+const handClickClear1 = () => {
+  dataList.teplist = [];
+  dataList.userList = [];
+};
+const handClickClear2 = () => {
+  dataList.userList = [];
+};
+</script>
+
+<template>
+  <div class="w-full">
+    <div class="mb-2 flex gap-2 justify-between flex-wrap">
+      <div class="w-[100%] flex mt-2">
+        <div class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">考核活动</div>
+          <el-select
+            v-model="dataList.params.assessmentId"
+            clearable
+            filterable
+            placeholder="请选择"
+            style="width: 200px"
+            @change="handClickInit1"
+            @clear="handClickClear1"
+          >
+            <el-option
+              v-for="item in dataList.magList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            />
+          </el-select>
+        </div>
+        <div class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">考核模板</div>
+          <el-select
+            v-model="dataList.params.assessmentModelId"
+            clearable
+            filterable
+            placeholder="请选择"
+            style="width: 200px"
+            @change="handClickInit2"
+            @clear="handClickClear2"
+          >
+            <el-option
+              v-for="item in dataList.teplist"
+              :key="item.assessmentModelId"
+              :label="item.assessmentModelName"
+              :value="item.assessmentModelId"
+            />
+          </el-select>
+        </div>
+        <div class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">医疗组</div>
+          <el-select
+            v-model="dataList.params.assessmentObjectId"
+            clearable
+            filterable
+            placeholder="请选择"
+            style="width: 200px"
+            @change="handClickInit3"
+          >
+            <el-option
+              v-for="item in dataList.userList"
+              :key="item.assessmentObjectId"
+              :label="item.assessmentObjectName"
+              :value="item.assessmentObjectId"
+            />
+          </el-select>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>

+ 93 - 0
src/views/draw/children/health/dataDetail.vue

@@ -0,0 +1,93 @@
+<script setup lang="ts">
+defineOptions({
+  name: "healthDataDetail"
+});
+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";
+import { useRouter } from "vue-router";
+import { useAppStoreHook } from "@/store/modules/app";
+
+// tab逻辑
+const activeName = ref("0");
+const handleClick = val => {
+  activeName.value = val;
+};
+
+const rankTableRef = ref();
+const seachParams = ref();
+const lengthData = ref();
+const getPersonDimensionChartsListApi = async () => {
+  const { code, data } = await getChartsList({
+    ...seachParams.value,
+    type: 2
+  });
+
+  if (code == 200) {
+    if (data.length > 0) {
+      lengthData.value = data.length;
+      setTimeout(() => {
+        nextTick(() => {
+          rankTableRef.value && rankTableRef.value.init(data, "科室", "姓名");
+        });
+      }, 500);
+    }
+  }
+
+  // console.log(res);
+};
+const init = (item, type) => {
+  seachParams.value = item;
+  if (Number(type)) {
+    getPersonDimensionChartsListApi();
+  }
+};
+
+// 返回上一页
+const router = useRouter();
+const backChange = () => {
+  useAppStoreHook().toggleSideBar(true, "打开");
+  router.push("/draw/children/health/healthRank");
+};
+</script>
+
+<template>
+  <div class="w-full">
+    <div class="flex mb20">
+      <el-text class="cursor-pointer" @click="backChange">
+        <el-icon>
+          <ArrowLeft />
+        </el-icon>
+        返回
+      </el-text>
+      <!-- <el-radio-group v-model="activeName" @change="handleClick">
+        <el-radio-button value="0">科室维度</el-radio-button>
+        <el-radio-button value="1">指标维度</el-radio-button>
+      </el-radio-group> -->
+    </div>
+    <div v-if="activeName === '0'">
+      <div class="mb-2 flex gap-2 justify-between flex-wrap">
+        <seachData :activeName="activeName" @handClick="init" />
+      </div>
+      <rankTableDraw v-if="lengthData > 0" ref="rankTableRef" />
+    </div>
+    <!-- <div v-else-if="activeName === '1'">
+      <div class="mb-2 flex gap-2 justify-between flex-wrap">
+        <seachData :activeName="activeName" @handClick="init" />
+      </div>
+      <assessmentRank ref="rankTableRef2" />
+    </div> -->
+  </div>
+</template>
+<style lang="scss" scoped>
+.cursor-pointer {
+  margin-right: 23px;
+}
+
+.mb20 {
+  padding-top: 20px;
+  margin-bottom: 20px;
+}
+</style>

+ 1 - 1
src/views/draw/children/health/healthDrank.vue

@@ -10,7 +10,7 @@ import barDimEcharts from "@/components/echarts/barDim.vue";
 import rankTable from "@/components/rankTable/draw.vue";
 import personList from "@/components/personList/index.vue";
 import qvanping from "@/assets/rank/qvanping@2x.png";
-import seachData from "./componements/seach.vue";
+import seachData from "./componements/seachOld.vue";
 import {
   getPersonDimensionChartsList,
   getPersonDimensionChartsRanking,

+ 159 - 30
src/views/draw/children/health/healthRank.vue

@@ -1,45 +1,174 @@
 <script setup lang="ts">
 defineOptions({
-  name: "headRank"
+  name: "healthRank"
 });
-import rankTableDraw from "@/components/rankTable/index.vue";
-import seachData from "./componements/seach.vue";
-import { getPersonDimensionChartsList, getChartsList } from "@/api/draw";
-
-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: 2
-  });
 
-  if (code == 200) {
-    if (data.length > 0) {
-      lengthData.value = data.length;
-      setTimeout(() => {
-        nextTick(() => {
-          rankTableRef.value.init(data, "科室", "姓名");
-        });
-      }, 500);
+import { ref, onMounted } from "vue";
+import { Search } from "@element-plus/icons-vue";
+import {
+  getAssessmentPageList,
+  getPageScoreInfoByAssessment
+} from "@/api/manage";
+import { ElMessage } from "element-plus";
+import { useRouter } from "vue-router";
+import { useAppStoreHook } from "@/store/modules/app";
+
+// 考核活动点击交互
+const activityList: any = ref([]);
+const activeActivity = ref(0);
+const handleActiveActivity = (item: any, index: number) => {
+  activeActivity.value = index;
+  getPageScoreInfoByAssessmentApi(item);
+};
+
+// 考核活动数据
+const getAssessmentPageListApi = async (name = "") => {
+  const params: {
+    pageNumber: number;
+    pageSize: number;
+    assessmentType: number;
+    name?: string;
+  } = {
+    pageNumber: 1,
+    pageSize: 999999,
+    assessmentType: 2 // 0:员工,1:部门,2:医疗组,3:部门负责人
+  };
+  if (name) {
+    params.name = name;
+  }
+  const { code, msg, data } = await getAssessmentPageList(params);
+  if (code === 200) {
+    activityList.value = data.records || [];
+    if (activityList.value && activityList.value.length) {
+      handleActiveActivity(activityList.value[0], 0);
     }
+  } else {
+    ElMessage.error(msg);
   }
 };
-const init = (item, type) => {
-  seachParams.value = item;
-  if (Number(type)) {
-    getPersonDimensionChartsListApi();
+onMounted(() => {
+  getAssessmentPageListApi();
+});
+const handleSearch = () => {
+  getAssessmentPageListApi(searchKeyword.value);
+};
+
+// 右侧列表
+const searchKeyword = ref("");
+const averageScore = ref<number | string>(0);
+const tableData = ref<any>([]);
+const getPageScoreInfoByAssessmentApi = async (obj: any = {}) => {
+  const params = {
+    assessmentId: obj.id,
+    assessmentType: `${obj.assessmentType}`
+  };
+  const { code, msg, data = [] } = await getPageScoreInfoByAssessment(params);
+  if (code === 200) {
+    tableData.value = data;
+    if (tableData.value.length) {
+      let allCount = 0;
+      tableData.value.forEach(item => {
+        allCount += item.score ? Number(item.score) : 0;
+      });
+      let resultNum: number | string = allCount / tableData.value.length;
+      if (
+        resultNum.toString().split(".")[1] &&
+        resultNum.toString().split(".")[1].length > 3
+      ) {
+        resultNum = resultNum.toFixed(3);
+      }
+      averageScore.value = resultNum;
+    }
+  } else {
+    ElMessage.error(msg);
   }
 };
+
+// 跳转到数据明细
+const router = useRouter();
+const toDetail = (row: any = {}) => {
+  router.push({
+    path: "/draw/children/health/dataDetail",
+    query: {
+      mid: row.templateId,
+      id: activityList.value[activeActivity.value].id,
+      mname: row.templateName,
+      name: activityList.value[activeActivity.value].name
+    }
+  });
+  useAppStoreHook().toggleSideBar(false, "关闭");
+};
 </script>
 
 <template>
-  <div class="w-full">
-    <div class="mb-2 flex gap-2 justify-between flex-wrap">
-      <seachData @handClick="init" />
+  <div class="assessment-rank flex">
+    <div class="search-section mr-4">
+      <el-input
+        v-model="searchKeyword"
+        placeholder="考核活动名称"
+        class="w-64"
+        :suffix-icon="Search"
+        clearable
+        @keyup.enter="handleSearch"
+      />
+      <div class="search-section-list">
+        <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(item, index)"
+        >
+          {{ item.name }}
+        </p>
+      </div>
     </div>
-    <rankTableDraw v-if="lengthData > 0" ref="rankTableRef" />
+    <el-card v-if="activityList.length" 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 type="index" label="排名" width="80" align="center" />
+        <el-table-column prop="templateName" label="考核模板" min-width="200">
+          <template #default="{ row }">
+            <el-button type="primary" link @click="toDetail(row)">
+              {{ row.templateName }}
+            </el-button>
+          </template>
+        </el-table-column>
+        <el-table-column prop="groupName" label="医疗组" min-width="150" />
+        <el-table-column
+          prop="score"
+          label="实际得分"
+          width="120"
+          align="right"
+        />
+      </el-table>
+    </el-card>
   </div>
 </template>
+
+<style scoped lang="scss">
+.assessment-rank {
+  padding: 20px 0;
+}
+
+.search-section {
+  flex-shrink: 0;
+  width: 200px;
+
+  .search-section-list {
+    height: calc(100vh - 250px);
+    margin-top: 20px;
+    overflow: auto;
+  }
+}
+
+:deep(.el-card__header) {
+  padding: 15px 20px;
+}
+</style>

+ 45 - 0
src/views/draw/children/health/healthRankOld.vue

@@ -0,0 +1,45 @@
+<script setup lang="ts">
+defineOptions({
+  name: "headRank"
+});
+import rankTableDraw from "@/components/rankTable/index.vue";
+import seachData from "./componements/seach.vue";
+import { getPersonDimensionChartsList, getChartsList } from "@/api/draw";
+
+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: 2
+  });
+
+  if (code == 200) {
+    if (data.length > 0) {
+      lengthData.value = data.length;
+      setTimeout(() => {
+        nextTick(() => {
+          rankTableRef.value.init(data, "科室", "姓名");
+        });
+      }, 500);
+    }
+  }
+};
+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>

+ 60 - 219
src/views/draw/children/worker/componements/seach.vue

@@ -1,18 +1,15 @@
 <script setup>
-import { ref, reactive } from "vue";
-import { getTemplateInfoList } from "@/api/templateInfo";
-import { userPageWhitOrganization } from "@/api/userSetting";
-import { getAssessmentPageList } from "@/api/manage";
-import { postListTree } from "@/api/department";
-import {
-  getAssessmentList,
-  getModelListByAssessmentId,
-  getUserListObjectByModelId,
-  getDeptListByUserList
-} from "@/api/draw";
-import { useRouter, useRoute } from "vue-router";
+import { ref, reactive, onMounted } from "vue";
+import { useRoute } from "vue-router";
+import { getUserListObjectByModelId, getAssessmentIndName } from "@/api/draw";
 
-const value = ref("");
+const props = defineProps({
+  // 行数
+  activeName: {
+    type: String,
+    default: "0"
+  }
+});
 const $emit = defineEmits(["handClick"]);
 const dataList = reactive({
   teplist: [],
@@ -23,20 +20,13 @@ const dataList = reactive({
     assessmentId: "",
     assessmentModelId: "",
     deptCode: "",
-    assessmentObjectId: ""
+    assessmentObjectId: "",
+    indName: ""
   }
 });
 
-// 搜索框----------------------------------------------------
-// 考核模版
-const getTemplateInfoListApi = async selectedItem => {
-  const { data, code } = await getModelListByAssessmentId(selectedItem);
-  if (code === 200) {
-    dataList.teplist = data;
-  }
-};
-// getTemplateInfoListApi();
 // 员工
+const userCodeList = ref([]);
 const userPageWhitOrganizationApi = async (selectedItem, type) => {
   let assessmentId;
   if (type) {
@@ -59,36 +49,36 @@ const userPageWhitOrganizationApi = async (selectedItem, type) => {
         userCodeList.value.push(item.assessmentObjectId);
       }
     });
-    getDeptListByUserListApi();
   }
 };
 
-// 部门
-// const postListTreeApi = async selectedItem => {
-//   const { data, code } = await getUserListObjectByModelId({
-//     modelId: selectedItem.assessmentModelId,
-//     type: 1,
-//     assessmentId: selectedItem.assessmentId
-//   });
-//   if (code === 200) {
-//     dataList.deptList = data;
-//   }
-// };
-const userCodeList = ref([]);
-const getDeptListByUserListApi = async () => {
-  const { data, code } = await getDeptListByUserList(userCodeList.value);
+// 指标
+const route = useRoute();
+const assessmentList = ref([]);
+const getAssessmentIndNameApi = async () => {
+  const { data, code } = await getAssessmentIndName({
+    assessmentId: route.query.id
+  });
   if (code === 200) {
-    const uniqueDeptCodes = {};
-    dataList.deptList = data.filter(item => {
-      if (!uniqueDeptCodes[item.deptCode]) {
-        uniqueDeptCodes[item.deptCode] = true;
-        return true; // 保留该项
-      }
-      return false; // 过滤掉重复项
-    });
+    assessmentList.value = data;
   }
 };
-// postListTreeApi();
+
+onMounted(() => {
+  dataList.params.assessmentId = route.query.id;
+  dataList.params.assessmentModelId = route.query.mid;
+  init.assessmentName = route.query.name;
+  init.assessmentModelName = route.query.mname;
+  userPageWhitOrganizationApi(
+    {
+      assessmentId: route.query.id,
+      assessmentModelId: route.query.mid
+    },
+    0
+  );
+  getAssessmentIndNameApi();
+});
+
 // -----------------------------------
 const init = reactive({
   assessmentName: "",
@@ -97,56 +87,12 @@ const init = reactive({
   assessmentObjectName: "",
   dimensionName: ""
 });
-const handClickInit1 = value => {
-  if (value) {
-    const selectedItem = dataList.magList.find(item => item.id === value);
-    init.assessmentName = selectedItem.name;
-    localStorage.setItem("fileName", selectedItem.name);
-    getTemplateInfoListApi(selectedItem);
-  }
-  Object.assign(dataList.params, {
-    assessmentModelId: "",
-    deptCode: "",
-    assessmentObjectId: ""
-  });
-  $emit(
-    "handClick",
-    {
-      ...dataList.params,
-      ...init
-    },
-    "0"
-  );
-};
-const handClickInit2 = value => {
-  if (value) {
-    const selectedItem = dataList.teplist.find(
-      item => item.assessmentModelId === value
-    );
-    init.assessmentModelName = selectedItem.assessmentModelName;
-    userPageWhitOrganizationApi(selectedItem, 0);
-    // postListTreeApi(selectedItem);
-  }
-  Object.assign(dataList.params, {
-    deptCode: "",
-    assessmentObjectId: ""
-  });
-  $emit(
-    "handClick",
-    {
-      ...dataList.params,
-      ...init
-    },
-    "0"
-  );
-};
-const handClickInit3 = value => {
+const handClickInit4 = value => {
   if (value) {
     const selectedItem = dataList.personList.find(
-      item => item.deptCode === value
+      item => item.assessmentObjectId === value
     );
-    init.deptName = selectedItem?.deptName;
-    // init.deptName = value.deptName;
+    init.assessmentObjectName = selectedItem.assessmentObjectName;
   }
   $emit(
     "handClick",
@@ -154,164 +100,59 @@ const handClickInit3 = value => {
       ...dataList.params,
       ...init
     },
-    "0"
+    "1"
   );
 };
-const handClickInit4 = value => {
-  if (value) {
-    const selectedItem = dataList.personList.find(
-      item => item.assessmentObjectId === value
-    );
-    init.assessmentObjectName = selectedItem.assessmentObjectName;
-  }
+const handClickInit5 = value => {
   $emit(
     "handClick",
     {
       ...dataList.params,
-      ...init
+      ...init,
+      indName: value
     },
     "1"
   );
 };
-const route = useRoute();
-const getSearchFrom = () => {
-  if (Object.keys(route.query).length > 0) {
-    const {
-      assessmentId,
-      assessmentModelId,
-      assessmentObjectId,
-      assessmentName,
-      assessmentModelName,
-      assessmentObjectName
-    } = route.query;
-    dataList.params.assessmentId = assessmentId;
-    dataList.params.assessmentModelId = assessmentModelId;
-    dataList.params.assessmentObjectId = assessmentObjectId;
-    init.assessmentName = assessmentName;
-    init.assessmentModelName = assessmentModelName;
-    init.assessmentObjectName = assessmentObjectName;
-    const selectedItem = dataList.magList.find(
-      item => item.id === assessmentId
-    );
-    getTemplateInfoListApi(selectedItem);
-    userPageWhitOrganizationApi(selectedItem, 1);
-    setTimeout(() => {
-      $emit(
-        "handClick",
-        {
-          ...dataList.params,
-          ...init
-        },
-        1
-      );
-    }, 100);
-  }
-};
-
-// 考核活动
-const getAssessmentPageListApi = async () => {
-  const { data, code } = await getAssessmentList({
-    type: 0
-  });
-  if (code === 200) {
-    dataList.magList = data;
-    getSearchFrom();
-  }
-};
-if (route.query) {
-  getAssessmentPageListApi();
-}
-// 清除条件
-const handClickClear1 = () => {
-  dataList.teplist = [];
-  dataList.deptList = [];
-  dataList.personList = [];
-};
-const handClickClear2 = () => {
-  dataList.deptList = [];
-  dataList.personList = [];
-};
-const handClickClear3 = () => {
-  dataList.personList = [];
-};
 </script>
 
 <template>
   <div class="w-full">
     <div class="mb-2 flex gap-2 justify-between flex-wrap">
       <div class="w-[100%] flex mt-2">
-        <div class="flex mr-2">
-          <div class="text-sm leading-8 mr-3">考核活动</div>
-          <el-select
-            v-model="dataList.params.assessmentId"
-            clearable
-            filterable
-            placeholder="请选择"
-            style="width: 200px"
-            @change="handClickInit1"
-            @clear="handClickClear1"
-          >
-            <el-option
-              v-for="item in dataList.magList"
-              :key="item.id"
-              :label="item.name"
-              :value="item.id"
-            />
-          </el-select>
-        </div>
-        <div class="flex mr-2">
-          <div class="text-sm leading-8 mr-3">考核模板</div>
-          <el-select
-            v-model="dataList.params.assessmentModelId"
-            clearable
-            filterable
-            placeholder="请选择"
-            style="width: 200px"
-            @change="handClickInit2"
-            @clear="handClickClear2"
-          >
-            <el-option
-              v-for="item in dataList.teplist"
-              :key="item.assessmentModelId"
-              :label="item.assessmentModelName"
-              :value="item.assessmentModelId"
-            />
-          </el-select>
-        </div>
-        <div class="flex mr-2">
-          <div class="text-sm leading-8 mr-3">科室</div>
+        <div v-if="props.activeName === '0'" class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">员工</div>
           <el-select
-            v-model="dataList.params.deptCode"
+            v-model="dataList.params.assessmentObjectId"
             clearable
             filterable
             placeholder="请选择"
             style="width: 200px"
-            @change="handClickInit3"
-            @clear="handClickClear3"
+            @change="handClickInit4"
           >
             <el-option
-              v-for="item in dataList.deptList"
-              :key="item.deptCode"
-              :label="item.deptName"
-              :value="item.deptCode"
+              v-for="item in dataList.personList"
+              :key="item.assessmentObjectId"
+              :label="item.assessmentObjectName"
+              :value="item.assessmentObjectId"
             />
           </el-select>
         </div>
-        <div class="flex mr-2">
-          <div class="text-sm leading-8 mr-3">员工</div>
+        <div v-else class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">指标</div>
           <el-select
-            v-model="dataList.params.assessmentObjectId"
+            v-model="dataList.params.indName"
             clearable
             filterable
             placeholder="请选择"
             style="width: 200px"
-            @change="handClickInit4"
+            @change="handClickInit5"
           >
             <el-option
-              v-for="item in dataList.personList"
-              :key="item.assessmentObjectId"
-              :label="item.assessmentObjectName"
-              :value="item.assessmentObjectId"
+              v-for="(item, idx) in assessmentList"
+              :key="idx"
+              :label="item"
+              :value="item"
             />
           </el-select>
         </div>

+ 321 - 0
src/views/draw/children/worker/componements/seachOld.vue

@@ -0,0 +1,321 @@
+<script setup>
+import { ref, reactive } from "vue";
+import { getTemplateInfoList } from "@/api/templateInfo";
+import { userPageWhitOrganization } from "@/api/userSetting";
+import { getAssessmentPageList } from "@/api/manage";
+import { postListTree } from "@/api/department";
+import {
+  getAssessmentList,
+  getModelListByAssessmentId,
+  getUserListObjectByModelId,
+  getDeptListByUserList
+} from "@/api/draw";
+import { useRouter, useRoute } from "vue-router";
+
+const value = ref("");
+const $emit = defineEmits(["handClick"]);
+const dataList = reactive({
+  teplist: [],
+  personList: [],
+  magList: [],
+  deptList: [],
+  params: {
+    assessmentId: "",
+    assessmentModelId: "",
+    deptCode: "",
+    assessmentObjectId: ""
+  }
+});
+
+// 搜索框----------------------------------------------------
+// 考核模版
+const getTemplateInfoListApi = async selectedItem => {
+  const { data, code } = await getModelListByAssessmentId(selectedItem);
+  if (code === 200) {
+    dataList.teplist = data;
+  }
+};
+// getTemplateInfoListApi();
+// 员工
+const userPageWhitOrganizationApi = async (selectedItem, type) => {
+  let assessmentId;
+  if (type) {
+    assessmentId = selectedItem.id;
+  } else {
+    assessmentId = selectedItem.assessmentId;
+  }
+  const { data, code } = await getUserListObjectByModelId({
+    modelId: selectedItem?.assessmentModelId,
+    assessmentId,
+    type: 0
+  });
+  if (code === 200) {
+    dataList.personList = data;
+    data.map(item => {
+      if (
+        item.assessmentObjectId &&
+        item.assessmentObjectId.substring(0, 4) == "user"
+      ) {
+        userCodeList.value.push(item.assessmentObjectId);
+      }
+    });
+    getDeptListByUserListApi();
+  }
+};
+
+// 部门
+// const postListTreeApi = async selectedItem => {
+//   const { data, code } = await getUserListObjectByModelId({
+//     modelId: selectedItem.assessmentModelId,
+//     type: 1,
+//     assessmentId: selectedItem.assessmentId
+//   });
+//   if (code === 200) {
+//     dataList.deptList = data;
+//   }
+// };
+const userCodeList = ref([]);
+const getDeptListByUserListApi = async () => {
+  const { data, code } = await getDeptListByUserList(userCodeList.value);
+  if (code === 200) {
+    const uniqueDeptCodes = {};
+    dataList.deptList = data.filter(item => {
+      if (!uniqueDeptCodes[item.deptCode]) {
+        uniqueDeptCodes[item.deptCode] = true;
+        return true; // 保留该项
+      }
+      return false; // 过滤掉重复项
+    });
+  }
+};
+// postListTreeApi();
+// -----------------------------------
+const init = reactive({
+  assessmentName: "",
+  assessmentModelName: "",
+  deptName: "",
+  assessmentObjectName: "",
+  dimensionName: ""
+});
+const handClickInit1 = value => {
+  if (value) {
+    const selectedItem = dataList.magList.find(item => item.id === value);
+    init.assessmentName = selectedItem.name;
+    localStorage.setItem("fileName", selectedItem.name);
+    getTemplateInfoListApi(selectedItem);
+  }
+  Object.assign(dataList.params, {
+    assessmentModelId: "",
+    deptCode: "",
+    assessmentObjectId: ""
+  });
+  $emit(
+    "handClick",
+    {
+      ...dataList.params,
+      ...init
+    },
+    "0"
+  );
+};
+const handClickInit2 = value => {
+  if (value) {
+    const selectedItem = dataList.teplist.find(
+      item => item.assessmentModelId === value
+    );
+    init.assessmentModelName = selectedItem.assessmentModelName;
+    userPageWhitOrganizationApi(selectedItem, 0);
+    // postListTreeApi(selectedItem);
+  }
+  Object.assign(dataList.params, {
+    deptCode: "",
+    assessmentObjectId: ""
+  });
+  $emit(
+    "handClick",
+    {
+      ...dataList.params,
+      ...init
+    },
+    "0"
+  );
+};
+const handClickInit3 = value => {
+  if (value) {
+    const selectedItem = dataList.personList.find(
+      item => item.deptCode === value
+    );
+    init.deptName = selectedItem?.deptName;
+    // init.deptName = value.deptName;
+  }
+  $emit(
+    "handClick",
+    {
+      ...dataList.params,
+      ...init
+    },
+    "0"
+  );
+};
+const handClickInit4 = value => {
+  if (value) {
+    const selectedItem = dataList.personList.find(
+      item => item.assessmentObjectId === value
+    );
+    init.assessmentObjectName = selectedItem.assessmentObjectName;
+  }
+  $emit(
+    "handClick",
+    {
+      ...dataList.params,
+      ...init
+    },
+    "1"
+  );
+};
+const route = useRoute();
+const getSearchFrom = () => {
+  if (Object.keys(route.query).length > 0) {
+    const {
+      assessmentId,
+      assessmentModelId,
+      assessmentObjectId,
+      assessmentName,
+      assessmentModelName,
+      assessmentObjectName
+    } = route.query;
+    dataList.params.assessmentId = assessmentId;
+    dataList.params.assessmentModelId = assessmentModelId;
+    dataList.params.assessmentObjectId = assessmentObjectId;
+    init.assessmentName = assessmentName;
+    init.assessmentModelName = assessmentModelName;
+    init.assessmentObjectName = assessmentObjectName;
+    const selectedItem = dataList.magList.find(
+      item => item.id === assessmentId
+    );
+    getTemplateInfoListApi(selectedItem);
+    userPageWhitOrganizationApi(selectedItem, 1);
+    setTimeout(() => {
+      $emit(
+        "handClick",
+        {
+          ...dataList.params,
+          ...init
+        },
+        1
+      );
+    }, 100);
+  }
+};
+
+// 考核活动
+const getAssessmentPageListApi = async () => {
+  const { data, code } = await getAssessmentList({
+    type: 0
+  });
+  if (code === 200) {
+    dataList.magList = data;
+    getSearchFrom();
+  }
+};
+if (route.query) {
+  getAssessmentPageListApi();
+}
+// 清除条件
+const handClickClear1 = () => {
+  dataList.teplist = [];
+  dataList.deptList = [];
+  dataList.personList = [];
+};
+const handClickClear2 = () => {
+  dataList.deptList = [];
+  dataList.personList = [];
+};
+const handClickClear3 = () => {
+  dataList.personList = [];
+};
+</script>
+
+<template>
+  <div class="w-full">
+    <div class="mb-2 flex gap-2 justify-between flex-wrap">
+      <div class="w-[100%] flex mt-2">
+        <div class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">考核活动</div>
+          <el-select
+            v-model="dataList.params.assessmentId"
+            clearable
+            filterable
+            placeholder="请选择"
+            style="width: 200px"
+            @change="handClickInit1"
+            @clear="handClickClear1"
+          >
+            <el-option
+              v-for="item in dataList.magList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            />
+          </el-select>
+        </div>
+        <div class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">考核模板</div>
+          <el-select
+            v-model="dataList.params.assessmentModelId"
+            clearable
+            filterable
+            placeholder="请选择"
+            style="width: 200px"
+            @change="handClickInit2"
+            @clear="handClickClear2"
+          >
+            <el-option
+              v-for="item in dataList.teplist"
+              :key="item.assessmentModelId"
+              :label="item.assessmentModelName"
+              :value="item.assessmentModelId"
+            />
+          </el-select>
+        </div>
+        <div class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">科室</div>
+          <el-select
+            v-model="dataList.params.deptCode"
+            clearable
+            filterable
+            placeholder="请选择"
+            style="width: 200px"
+            @change="handClickInit3"
+            @clear="handClickClear3"
+          >
+            <el-option
+              v-for="item in dataList.deptList"
+              :key="item.deptCode"
+              :label="item.deptName"
+              :value="item.deptCode"
+            />
+          </el-select>
+        </div>
+        <div class="flex mr-2">
+          <div class="text-sm leading-8 mr-3">员工</div>
+          <el-select
+            v-model="dataList.params.assessmentObjectId"
+            clearable
+            filterable
+            placeholder="请选择"
+            style="width: 200px"
+            @change="handClickInit4"
+          >
+            <el-option
+              v-for="item in dataList.personList"
+              :key="item.assessmentObjectId"
+              :label="item.assessmentObjectName"
+              :value="item.assessmentObjectId"
+            />
+          </el-select>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>

+ 93 - 0
src/views/draw/children/worker/dataDetail.vue

@@ -0,0 +1,93 @@
+<script setup lang="ts">
+defineOptions({
+  name: "workerDataDetail"
+});
+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";
+import { useRouter } from "vue-router";
+import { useAppStoreHook } from "@/store/modules/app";
+
+// tab逻辑
+const activeName = ref("0");
+const handleClick = val => {
+  activeName.value = val;
+};
+
+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 && rankTableRef.value.init(data, "科室", "姓名");
+        });
+      }, 500);
+    }
+  }
+
+  // console.log(res);
+};
+const init = (item, type) => {
+  seachParams.value = item;
+  if (Number(type)) {
+    getPersonDimensionChartsListApi();
+  }
+};
+
+// 返回上一页
+const router = useRouter();
+const backChange = () => {
+  useAppStoreHook().toggleSideBar(true, "打开");
+  router.push("/draw/children/worker/workerRank");
+};
+</script>
+
+<template>
+  <div class="w-full">
+    <div class="flex mb20">
+      <el-text class="cursor-pointer" @click="backChange">
+        <el-icon>
+          <ArrowLeft />
+        </el-icon>
+        返回
+      </el-text>
+      <!-- <el-radio-group v-model="activeName" @change="handleClick">
+        <el-radio-button value="0">科室维度</el-radio-button>
+        <el-radio-button value="1">指标维度</el-radio-button>
+      </el-radio-group> -->
+    </div>
+    <div v-if="activeName === '0'">
+      <div class="mb-2 flex gap-2 justify-between flex-wrap">
+        <seachData :activeName="activeName" @handClick="init" />
+      </div>
+      <rankTableDraw v-if="lengthData > 0" ref="rankTableRef" />
+    </div>
+    <!-- <div v-else-if="activeName === '1'">
+      <div class="mb-2 flex gap-2 justify-between flex-wrap">
+        <seachData :activeName="activeName" @handClick="init" />
+      </div>
+      <assessmentRank ref="rankTableRef2" />
+    </div> -->
+  </div>
+</template>
+<style lang="scss" scoped>
+.cursor-pointer {
+  margin-right: 23px;
+}
+
+.mb20 {
+  padding-top: 20px;
+  margin-bottom: 20px;
+}
+</style>

+ 1 - 1
src/views/draw/children/worker/workerDrak.vue

@@ -10,7 +10,7 @@ import barDimEcharts from "@/components/echarts/barDim.vue";
 import rankTable from "@/components/rankTable/draw.vue";
 import personList from "@/components/personList/index.vue";
 import qvanping from "@/assets/rank/qvanping@2x.png";
-import seachData from "./componements/seach.vue";
+import seachData from "./componements/seachOld.vue";
 import {
   getPersonDimensionChartsList,
   getPersonDimensionChartsRanking,

+ 26 - 3
src/views/draw/children/worker/workerRank.vue

@@ -10,6 +10,8 @@ import {
   getPageScoreInfoByAssessment
 } from "@/api/manage";
 import { ElMessage } from "element-plus";
+import { useRouter } from "vue-router";
+import { useAppStoreHook } from "@/store/modules/app";
 
 // 考核活动点击交互
 const activityList: any = ref([]);
@@ -24,12 +26,12 @@ const getAssessmentPageListApi = async (name = "") => {
   const params: {
     pageNumber: number;
     pageSize: number;
-    assessment_type: number;
+    assessmentType: number;
     name?: string;
   } = {
     pageNumber: 1,
     pageSize: 999999,
-    assessment_type: 0 // 0:员工,1:部门,2:医疗组,3:部门负责人
+    assessmentType: 0 // 0:员工,1:部门,2:医疗组,3:部门负责人
   };
   if (name) {
     params.name = name;
@@ -81,6 +83,21 @@ const getPageScoreInfoByAssessmentApi = async (obj: any = {}) => {
     ElMessage.error(msg);
   }
 };
+
+// 跳转到数据明细
+const router = useRouter();
+const toDetail = (row: any = {}) => {
+  router.push({
+    path: "/draw/children/worker/dataDetail",
+    query: {
+      mid: row.templateId,
+      id: activityList.value[activeActivity.value].id,
+      mname: row.templateName,
+      name: activityList.value[activeActivity.value].name
+    }
+  });
+  useAppStoreHook().toggleSideBar(false, "关闭");
+};
 </script>
 
 <template>
@@ -116,7 +133,13 @@ const getPageScoreInfoByAssessmentApi = async (obj: any = {}) => {
 
       <el-table :data="tableData" style="width: 100%" border>
         <el-table-column type="index" label="排名" width="80" align="center" />
-        <el-table-column prop="templateName" label="考核模板" min-width="200" />
+        <el-table-column prop="templateName" label="考核模板" min-width="200">
+          <template #default="{ row }">
+            <el-button type="primary" link @click="toDetail(row)">
+              {{ row.templateName }}
+            </el-button>
+          </template>
+        </el-table-column>
         <el-table-column prop="deptName" label="科室" min-width="150" />
         <el-table-column prop="userName" label="员工" min-width="150" />
         <el-table-column

+ 0 - 64
src/views/draw/children/worker/workerRank1.vue

@@ -1,64 +0,0 @@
-<script setup lang="ts">
-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();
-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 && 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">
-    <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>

+ 90 - 17
src/views/evaluate/children/change/mould/message.vue

@@ -42,6 +42,7 @@ const form = reactive({
   cycle: "月度",
   cycleValue: "",
   assessmentType: null,
+  scoreConversion: null,
   assessmentObjectList: [
     {
       assessmentObjectId: "",
@@ -332,40 +333,76 @@ onMounted(() => {
 
 <template>
   <div class="w-[500px] m-auto">
-    <el-form :model="form" label-width="auto" style="max-width: 600px" :rules="rules" label-position="top">
+    <el-form
+      :model="form"
+      label-width="auto"
+      style="max-width: 600px"
+      :rules="rules"
+      label-position="top"
+    >
       <el-form-item label="考核名称" prop="name">
         <el-input v-model="form.name" :disabled="btn" placeholder="请输入" />
       </el-form-item>
       <el-form-item label="考核周期">
-        <el-radio-group v-model="form.cycle" disabled @change="handleRegionChange">
+        <el-radio-group
+          v-model="form.cycle"
+          disabled
+          @change="handleRegionChange"
+        >
           <el-radio value="月度" size="large">月度</el-radio>
           <el-radio value="季度" size="large">季度</el-radio>
           <el-radio value="半年" size="large">半年</el-radio>
           <el-radio value="年度" size="large">年度</el-radio>
           <el-radio value="日期" size="large">日期</el-radio>
         </el-radio-group>
-        <el-date-picker v-if="timeType === '月度' || timeType === '日期' || timeType === '年度'
-          " v-model="form.cycleValue" disabled :type="pickerType" :format="format" placeholder="请选择" />
-        <el-dropdown v-else-if="timeType === '季度' || timeType === '半年'" trigger="click">
+        <el-date-picker
+          v-if="
+            timeType === '月度' || timeType === '日期' || timeType === '年度'
+          "
+          v-model="form.cycleValue"
+          disabled
+          :type="pickerType"
+          :format="format"
+          placeholder="请选择"
+        />
+        <el-dropdown
+          v-else-if="timeType === '季度' || timeType === '半年'"
+          trigger="click"
+        >
           <span class="el-dropdown-link navbar-bg-hover select-none">
-            <el-input v-model="form.cycleValue" style="width: 240px" placeholder="请选择" :prefix-icon="Calendar" disabled />
+            <el-input
+              v-model="form.cycleValue"
+              style="width: 240px"
+              placeholder="请选择"
+              :prefix-icon="Calendar"
+              disabled
+            />
           </span>
           <template #dropdown>
             <el-dropdown-menu class="setting" style="width: 300px">
               <div class="flex justify-between align-center text-base mt-4">
-                <div class="cursor-pointer ml-4 text-xs pt-2" @click="decreaseYear">
+                <div
+                  class="cursor-pointer ml-4 text-xs pt-2"
+                  @click="decreaseYear"
+                >
                   <el-icon>
                     <DArrowLeft />
                   </el-icon>
                 </div>
                 <div>{{ yearTime }}</div>
-                <div class="cursor-pointer mr-4 text-xs pt-2" @click="increaseYear">
+                <div
+                  class="cursor-pointer mr-4 text-xs pt-2"
+                  @click="increaseYear"
+                >
                   <el-icon>
                     <DArrowRight />
                   </el-icon>
                 </div>
               </div>
-              <div v-if="quarterValue" class="flex justify-center align-center mt-5 mb-5">
+              <div
+                v-if="quarterValue"
+                class="flex justify-center align-center mt-5 mb-5"
+              >
                 <el-dropdown-item @click="monthOne('一季度')">
                   一季度
                 </el-dropdown-item>
@@ -391,18 +428,36 @@ onMounted(() => {
           </template>
         </el-dropdown>
       </el-form-item>
+      <el-form-item label="是否支持得分换算" prop="scoreConversion">
+        <el-radio-group v-model="form.scoreConversion" disabled>
+          <el-radio label="1">是</el-radio>
+          <el-radio label="0">否</el-radio>
+        </el-radio-group>
+      </el-form-item>
       <el-form-item label="被考核类型">
-        <el-select v-model="form.assessmentType" placeholder="请选择被考核类型" disabled>
+        <el-select
+          v-model="form.assessmentType"
+          placeholder="请选择被考核类型"
+          disabled
+        >
           <el-option label="员工" :value="0" />
           <el-option label="部门" :value="1" />
           <el-option label="医疗" :value="2" />
           <el-option label="部门负责人" :value="3" />
         </el-select>
       </el-form-item>
-      <el-form-item label="被考核对象与模板设置" prop="form1" label-position="top">
+      <el-form-item
+        label="被考核对象与模板设置"
+        prop="form1"
+        label-position="top"
+      >
         <div class="w-full flex">
           <div class="w-1/3">
-            <el-form label-position="top" :model="form.assessmentObjectList" :rules="formLeftRules">
+            <el-form
+              label-position="top"
+              :model="form.assessmentObjectList"
+              :rules="formLeftRules"
+            >
               <el-form-item label="被考核对象" prop="left">
                 <div class="w-full mt-1 flex flex-wrap">
                   <!-- 人员,负责人 -->
@@ -422,8 +477,11 @@ onMounted(() => {
                   {{
                     console.log("assessmentObjectList", assessmentObjectList)
                   }}
-                  <div v-for="(item, index) in assessmentObjectList" :key="index"
-                    class="text-gray-400 w-full flex flex-wrap object mt-1">
+                  <div
+                    v-for="(item, index) in assessmentObjectList"
+                    :key="index"
+                    class="text-gray-400 w-full flex flex-wrap object mt-1"
+                  >
                     <div v-for="(it, id) in item" :key="id" class="h-6">
                       {{ it.assessmentObjectName }},
                     </div>
@@ -433,7 +491,11 @@ onMounted(() => {
             </el-form>
           </div>
           <div class="w-1/2 ml-7">
-            <el-form label-position="top" :model="form.assessmentObjectList" :rules="formRightRules">
+            <el-form
+              label-position="top"
+              :model="form.assessmentObjectList"
+              :rules="formRightRules"
+            >
               <el-form-item label="考核模板" prop="right">
                 <div class="w-full flex flex-wrap mt-1 aaa">
                   <!-- <el-select
@@ -450,7 +512,11 @@ onMounted(() => {
                       :value="itemTmp.assessmentModelId"
                     />
                   </el-select> -->
-                  <div v-for="(item, index) in assessmentModelList" :key="index" class="text-gray-400">
+                  <div
+                    v-for="(item, index) in assessmentModelList"
+                    :key="index"
+                    class="text-gray-400"
+                  >
                     <div class="mt-2">{{ item.assessmentModelName }}</div>
                   </div>
                 </div>
@@ -460,7 +526,14 @@ onMounted(() => {
         </div>
       </el-form-item>
     </el-form>
-    <el-button v-if="btn" class="float-right mt-4" type="warning" @click="btnShow" :disabled="bistatus == 0">编辑</el-button>
+    <el-button
+      v-if="btn"
+      class="float-right mt-4"
+      type="warning"
+      :disabled="bistatus == 0"
+      @click="btnShow"
+      >编辑</el-button
+    >
     <div v-else class="float-right mt-4">
       <el-button @click="handleClose">取消</el-button>
       <el-button type="primary" @click="saveDepartment"> 确认 </el-button>