ソースを参照

feat: 接口联调

haifeng.zhang 3 週間 前
コミット
d9ada133eb

+ 9 - 0
src/api/manage.ts

@@ -36,6 +36,15 @@ export const getAssessmentPageList = params => {
     }
   );
 };
+export const getPageScoreInfoByAssessment = data => {
+  return http.request<templateInfo>(
+    "post",
+    `/assessment/pageScoreInfoByAssessment`,
+    {
+      data
+    }
+  );
+};
 // 删除考核信息
 export const getDelAssessment = id => {
   return http.request<templateInfo>("get", `/assessment/delAssessment/${id}`);

+ 135 - 47
src/views/draw/children/worker/workerRank.vue

@@ -1,64 +1,152 @@
 <script setup lang="ts">
 defineOptions({
-  name: "workerRank"
+  name: "AssessmentRank"
 });
-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);
-};
+import { ref, onMounted } from "vue";
+import { Search } from "@element-plus/icons-vue";
+import {
+  getAssessmentPageList,
+  getPageScoreInfoByAssessment
+} from "@/api/manage";
+import { ElMessage } from "element-plus";
 
-const rankTableRef = ref();
-const seachParams = ref();
-const lengthData = ref();
-const getPersonDimensionChartsListApi = async () => {
-  const { code, data } = await getChartsList({
-    ...seachParams.value,
-    type: 0
-  });
+// 考核活动点击交互
+const activityList: any = ref([]);
+const activeActivity = ref(0);
+const handleActiveActivity = (item: any, index: number) => {
+  activeActivity.value = index;
+  getPageScoreInfoByAssessmentApi(item);
+};
 
-  if (code == 200) {
-    if (data.length > 0) {
-      lengthData.value = data.length;
-      setTimeout(() => {
-        nextTick(() => {
-          rankTableRef.value && rankTableRef.value.init(data, "科室", "姓名");
-        });
-      }, 500);
+// 考核活动数据
+const getAssessmentPageListApi = async (name = "") => {
+  const params: {
+    pageNumber: number;
+    pageSize: number;
+    assessment_type: number;
+    name?: string;
+  } = {
+    pageNumber: 1,
+    pageSize: 999999,
+    assessment_type: 0 // 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);
   }
-
-  // console.log(res);
 };
-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);
   }
 };
 </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 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>
+    <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>
-        <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>
+      </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" />
+        <el-table-column prop="deptName" label="科室" min-width="150" />
+        <el-table-column prop="userName" 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>

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

@@ -0,0 +1,64 @@
+<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>

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

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

+ 14 - 9
src/views/evaluate/children/change/manage/addExam.vue

@@ -27,11 +27,11 @@ const dialogVisibleAdd = ref(false);
 const titleHeader = ref<any>("发起考核");
 // 季度 半年
 const ElPickerRef = ref();
-const form = reactive({
+const form: any = reactive({
   name: "",
   cycle: "月度",
   cycleValue: "",
-  isMatrixing: 1,
+  scoreConversion: null,
   assessmentType: null,
   listArr: [
     {
@@ -46,7 +46,7 @@ const form = reactive({
 const rules = reactive({
   name: [{ required: true, message: "请输入考核名称", trigger: "blur" }],
   cycle: [{ required: true, message: "请选择考核周期", trigger: "change" }],
-  isMatrixing: [
+  scoreConversion: [
     { required: true, message: "请选择是否支持得分换算", trigger: "blur" }
   ]
 });
@@ -110,7 +110,12 @@ const saveDepartment = () => {
         item => item.assessmentObjectId && item.assessmentObjectName
       );
       delete form.listArr;
-      const { code, msg } = await postAddAssessment(form);
+      const { code, msg } = await postAddAssessment({
+        ...form,
+        scoreConversion: form.scoreConversion
+          ? Number(form.scoreConversion)
+          : null
+      });
       if (code === 200) {
         ElMessage({
           message: "添加成功",
@@ -131,7 +136,7 @@ const open = (item: any, index: string) => {
     name: "",
     cycle: "月度",
     cycleValue: "",
-    isMatrixing: 1,
+    scoreConversion: null,
     assessmentType: null,
     listArr: [
       {
@@ -501,10 +506,10 @@ const idList = ref([]);
             </template>
           </el-dropdown>
         </el-form-item>
-        <el-form-item label="是否支持得分换算" prop="isMatrixing">
-          <el-radio-group v-model="form.isMatrixing">
-            <el-radio :label="1">是</el-radio>
-            <el-radio :label="2">否</el-radio>
+        <el-form-item label="是否支持得分换算" prop="scoreConversion">
+          <el-radio-group v-model="form.scoreConversion">
+            <el-radio label="1">是</el-radio>
+            <el-radio label="0">否</el-radio>
           </el-radio-group>
         </el-form-item>
         <el-form-item label="被考核类型">

+ 21 - 6
src/views/indexData/index.vue

@@ -28,20 +28,34 @@ const params = reactive({
     sourceValue: "",
     deptName: "",
     userName: "",
-    time: []
+    startTime: "",
+    endTime: ""
   },
+  sourceTime: [],
   records: [],
   total: 0
 });
 
 // 获取列表数据
 const getList = async () => {
+  if (params.sourceTime && params.sourceTime.length) {
+    params.params.startTime = params.sourceTime[0];
+    params.params.endTime = params.sourceTime[1];
+  } else {
+    params.params.startTime = "";
+    params.params.endTime = "";
+  }
   const { code, data } = await getPageList(params.params);
   if (code === 200) {
     params.records = data.records;
     params.total = data.totalRow;
   }
 };
+const updateList = () => {
+  params.params.pageNumber = 1;
+  params.params.pageSize = 10;
+  getList();
+};
 const handleSizeChange = val => {
   params.params.pageSize = val;
   getList();
@@ -124,7 +138,7 @@ const showLogs = row => {
                 :prefix-icon="Search"
                 clearable
                 placeholder="搜索指标名称"
-                @change="getList"
+                @change="updateList"
               />
             </div>
             <div class="flex mr-2">
@@ -134,7 +148,7 @@ const showLogs = row => {
                 :prefix-icon="Search"
                 clearable
                 placeholder="搜索部门名称"
-                @change="getList"
+                @change="updateList"
               />
             </div>
             <div class="flex mr-2">
@@ -144,17 +158,18 @@ const showLogs = row => {
                 :prefix-icon="Search"
                 clearable
                 placeholder="搜索员工名称"
-                @change="getList"
+                @change="updateList"
               />
             </div>
             <div class="flex mr-2">
               <el-date-picker
-                v-model="params.params.time"
+                v-model="params.sourceTime"
                 type="daterange"
                 range-separator="至"
                 start-placeholder="数据开始日期"
                 end-placeholder="数据结束日期"
-                @change="getList"
+                value-format="x"
+                @change="updateList"
               />
             </div>
           </div>