Bladeren bron

feat: 考核

ystl_myq 7 maanden geleden
bovenliggende
commit
2d1a785028

BIN
node_modules.zip


+ 14 - 2
src/api/download.ts

@@ -40,8 +40,9 @@ export const postUpdateDeptApi = async data => {
 };
 
 // 考核指标下载
-export const assessmentDownloadDataRosterTemplateApi = async () => {
+export const assessmentDownloadDataRosterTemplateApi = async type => {
   const token = localStorage.getItem("token") || "";
+  const params = { type };
   try {
     const response = await axios.get(
       FLIE_URL + "/assessment/downloadAssessmentTemplate",
@@ -49,7 +50,8 @@ export const assessmentDownloadDataRosterTemplateApi = async () => {
         responseType: "blob", // 确保接收的是二进制数据
         headers: {
           satoken: token // 将 token 添加到请求头
-        }
+        },
+        params
       }
     );
     // 创建 Blob 对象并生成下载链接
@@ -69,3 +71,13 @@ export const assessmentDownloadDataRosterTemplateApi = async () => {
     ElMessage.error("模板下载失败,请重试");
   }
 };
+// 上传
+export const postImportAssessmentTemplate = async data => {
+  const token = localStorage.getItem("token") || "";
+  return axios.post(`${FLIE_URL}/assessment/importAssessmentTemplate`, data, {
+    headers: {
+      "Content-Type": "multipart/form-data", // 指定内容类型
+      satoken: token // 将 Token 添加到请求头
+    }
+  });
+};

+ 52 - 49
src/components/echarts/radar.vue

@@ -13,55 +13,58 @@ const chartRef = ref();
 const { setOptions } = useECharts(chartRef, { theme });
 
 // 根据配置项渲染ECharts
-setOptions({
-  tooltip: {},
-  legend: {
-    // icon: "arrow",
-    itemWidth: 25,
-    itemHeight: 4,
-    data: ["得分率"],
-    top: 10,
-    left: "left"
-  },
-  radar: {
-    radius: "70%", // 调整半径以使雷达图更大
-    indicator: [
-      { name: "数量" },
-      { name: "科研" },
-      { name: "教学" },
-      { name: "强度" },
-      { name: "难度" },
-      { name: "质量" },
-      { name: "效率" }
-    ],
-    axisName: {
-      color: "black"
-    }
-  },
-  series: [
-    {
-      name: "得分率",
-      type: "radar",
-      areaStyle: {
-        normal: {
-          color: "rgba(0, 128, 255, 0.2)" // 设置内部填充颜色和透明度
-        }
-      },
-      lineStyle: {
-        normal: {
-          width: 1, // 设置线条宽度为 1
-          color: "rgba(0, 128, 255, 1)" // 设置线条颜色
-        }
-      },
-      data: [
-        {
-          value: [30, 60, 90, 120, 150, 160, 10],
-          name: "支出"
-        }
-      ]
-    }
-  ]
-});
+const initChart = item => {
+  setOptions({
+    tooltip: {},
+    legend: {
+      // icon: "arrow",
+      itemWidth: 25,
+      itemHeight: 4,
+      data: ["得分率"],
+      top: 10,
+      left: "left"
+    },
+    radar: {
+      radius: "70%", // 调整半径以使雷达图更大
+      indicator: [
+        { name: "数量" },
+        { name: "科研" },
+        { name: "教学" },
+        { name: "强度" },
+        { name: "难度" },
+        { name: "质量" },
+        { name: "效率" }
+      ],
+      axisName: {
+        color: "black"
+      }
+    },
+    series: [
+      {
+        name: "得分率",
+        type: "radar",
+        areaStyle: {
+          normal: {
+            color: "rgba(0, 128, 255, 0.2)" // 设置内部填充颜色和透明度
+          }
+        },
+        lineStyle: {
+          normal: {
+            width: 1, // 设置线条宽度为 1
+            color: "rgba(0, 128, 255, 1)" // 设置线条颜色
+          }
+        },
+        data: [
+          {
+            value: [30, 60, 90, 120, 150, 160, 10],
+            name: "支出"
+          }
+        ]
+      }
+    ]
+  });
+};
+defineExpose({ initChart });
 </script>
 
 <template>

+ 107 - 33
src/components/import/index.vue

@@ -1,7 +1,12 @@
 <script setup lang="ts">
 import { ref, onMounted } from "vue";
 import { useRoute, useRouter } from "vue-router";
-import { assessmentDownloadDataRosterTemplateApi } from "@/api/download";
+import * as XLSX from "xlsx";
+import {
+  assessmentDownloadDataRosterTemplateApi,
+  postImportAssessmentTemplate
+} from "@/api/download";
+import { ElMessage } from "element-plus";
 defineOptions({
   name: "IndexDefineImport"
 });
@@ -10,35 +15,98 @@ const router = useRouter();
 const emit = defineEmits(["handleImport"]);
 const uploadShow = ref(true);
 const query = ref({});
+const fileDocument = ref<File | null>(null); // 存储文件
+
 onMounted(() => {
-  console.log("111", route.query);
+  // assessmentType
   Object.assign(query.value, route.query);
+  console.log("111", query.value);
 });
-const uploadFile = () => {
-  uploadShow.value = !uploadShow.value;
+const uploadFile = () => {};
+const tableHeaders = ref<any>([]);
+const tableData = ref<any>([
+  { name: "" },
+  { defin: "" },
+  { caliber: "" },
+  { type: "" },
+  { from: "" }
+]);
+const handleUploadChange = (file: File) => {
+  fileDocument.value = file; // 保存文件
+  const reader = new FileReader();
+  let fileType = file.name.slice(-4);
+  console.log("文件", file.name.slice(-4));
+  if (fileType == "xlsx") {
+    reader.onload = e => {
+      const data = new Uint8Array(e.target?.result as ArrayBuffer);
+      const workbook = XLSX.read(data, { type: "array" }); // 读取 Excel 文件
+      const firstSheetName = workbook.SheetNames[0]; // 获取第一个工作表名
+      const worksheet = workbook.Sheets[firstSheetName]; // 获取第一个工作表
+      const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); // 将工作表转为 JSON
+
+      if (jsonData.length > 0) {
+        tableHeaders.value = jsonData[0]; // 表头
+        tableData.value = jsonData.slice(1).map(row => {
+          const rowData = {};
+          tableHeaders.value.forEach((header, index) => {
+            rowData[header] = row[index] !== undefined ? row[index] : null; // 填充缺失值
+          });
+          return rowData;
+        });
+        console.log("表头", tableHeaders.value);
+        ElMessage.success("文件上传成功");
+        uploadShow.value = false; // 隐藏上传区域,显示数据表
+      } else {
+        ElMessage.error("文件为空或格式不正确");
+      }
+    };
+  } else {
+    ElMessage.error("请上传xlsx文件");
+  }
+
+  reader.readAsArrayBuffer(file); // 读取文件为 ArrayBuffer
 };
-const tableData = [
-  {
-    date: "2016-05-03",
-    name: "Tom",
-    address: "No. 189, Grove St, Los Angeles"
-  },
-  {
-    date: "2016-05-02",
-    name: "Tom",
-    address: "No. 189, Grove St, Los Angeles"
-  },
-  {
-    date: "2016-05-04",
-    name: "Tom",
-    address: "No. 189, Grove St, Los Angeles"
-  },
-  {
-    date: "2016-05-01",
-    name: "Tom",
-    address: "No. 189, Grove St, Los Angeles"
+// 上传
+const postImportAssessmentTemplateApi = async data => {
+  if (!fileDocument.value) {
+    ElMessage.error("请先上传文件");
+    return;
   }
-];
+  try {
+    const formData = new FormData();
+    formData.append("file", fileDocument.value); // 将文件添加到表单数据
+
+    // 调用 API 上传文件
+    const { data } = await postImportAssessmentTemplate({
+      formData,
+      type: route.query.assessmentType,
+      assessmentId: route.query.id
+    });
+    console.log("dsada", data);
+    if (data.code === 200) {
+      // 根据后端返回的 code 判断是否成功
+      ElMessage.success("文件上传并导入成功");
+      // 重置上传状态
+      // uploadShow.value = true;
+      // $router.push("/IndexDefine/children/define");
+      router.back();
+      uploadShow.value = !uploadShow.value;
+      tableHeaders.value = []; // 清空表头
+      tableData.value = [
+        { name: "" },
+        { defin: "" },
+        { caliber: "" },
+        { type: "" },
+        { from: "" }
+      ]; // 清空表格数据
+    } else {
+      ElMessage.error(data.msg);
+    }
+  } catch (error) {
+    ElMessage.error("上传失败,请重试");
+    console.error(error);
+  }
+};
 const backDefine = () => {
   router.back();
 };
@@ -52,7 +120,9 @@ const backDefine = () => {
         <p class="text-xs mt-2 text">根据提升信息完善表格内容</p>
         <el-button
           class="mt-2"
-          @click="assessmentDownloadDataRosterTemplateApi()"
+          @click="
+            assessmentDownloadDataRosterTemplateApi(route.query.assessmentType)
+          "
           ><el-icon><Download /></el-icon>下载空的模板表格</el-button
         >
       </div>
@@ -66,7 +136,8 @@ const backDefine = () => {
             class="upload-demo"
             drag
             action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
-            multiple
+            :before-upload="file => handleUploadChange(file)"
+            :show-file-list="false"
           >
             <el-icon class="el-icon--upload"><upload-filled /></el-icon>
             <div class="el-upload__text">
@@ -81,16 +152,19 @@ const backDefine = () => {
             style="width: 100%"
             max-height="250"
           >
-            <el-table-column prop="date" label="指标编号" width="180" />
-            <el-table-column prop="name" label="指标名称" width="180" />
-            <el-table-column prop="address" label="指标分类" />
-            <el-table-column prop="address" label="指标定义" />
-            <el-table-column prop="address" label="指标口径" />
+            <el-table-column
+              v-for="header in tableHeaders"
+              :key="header"
+              :label="header"
+              :prop="header"
+            />
           </el-table>
         </div>
         <div class="float-right">
           <el-button @click="backDefine">取消</el-button>
-          <el-button type="primary" @click="uploadFile">确认</el-button>
+          <el-button type="primary" @click="postImportAssessmentTemplateApi"
+            >确认</el-button
+          >
         </div>
         <p class="h-11 no-select">.</p>
       </div>

+ 0 - 3
src/router/utils.ts

@@ -283,8 +283,6 @@ function initRouter() {
           addAuths(cleanEmptyChildren(menuDataList), btnList.value);
           handleAsyncRoutes(cloneDeep(cleanEmptyChildren(menuDataList)));
           storageLocal().setItem(key, cleanEmptyChildren(menuDataList));
-          console.log("指标没有了2222", cleanEmptyChildren(menuDataList));
-
           resolve(router);
         });
       });
@@ -295,7 +293,6 @@ function initRouter() {
         let menuDataList = matchAndMerge(data, muenList);
         addAuths(cleanEmptyChildren(menuDataList), btnList.value);
         handleAsyncRoutes(cloneDeep(cleanEmptyChildren(menuDataList)));
-        console.log("指标没有了1111", cleanEmptyChildren(menuDataList));
         resolve(router);
       });
     });

+ 9 - 0
src/views/draw/children/worker/componements/seach.vue

@@ -5,6 +5,7 @@ import { userPageWhitOrganization } from "@/api/userSetting";
 import { getAssessmentPageList } from "@/api/manage";
 import { postListTree } from "@/api/department";
 const value = ref("");
+const $emit = defineEmits(["handClick"]);
 const dataList = reactive({
   teplist: [],
   personList: [],
@@ -17,6 +18,10 @@ const dataList = reactive({
     assessmentObjectId: ""
   }
 });
+const handClickInit = () => {
+  $emit("handClick", dataList.params);
+};
+// 搜索框----------------------------------------------------
 // 考核模板
 const getTemplateInfoListApi = async () => {
   const { data, code } = await getTemplateInfoList({
@@ -96,6 +101,7 @@ const options = [
             filterable
             placeholder="请选择"
             style="width: 200px"
+            @change="handClickInit"
           >
             <el-option
               v-for="item in dataList.magList"
@@ -113,6 +119,7 @@ const options = [
             filterable
             placeholder="请选择"
             style="width: 200px"
+            @change="handClickInit"
           >
             <el-option
               v-for="item in dataList.teplist"
@@ -136,6 +143,7 @@ const options = [
               children: 'childrenRes'
             }"
             style="width: 200px"
+            @change="handClickInit"
           />
         </div>
         <div class="flex mr-2">
@@ -146,6 +154,7 @@ const options = [
             filterable
             placeholder="请选择"
             style="width: 200px"
+            @change="handClickInit"
           >
             <el-option
               v-for="item in dataList.personList"

+ 187 - 157
src/views/draw/children/worker/workerDrak.vue

@@ -12,12 +12,14 @@ import qvanping from "@/assets/rank/qvanping@2x.png";
 import seachData from "./componements/seach.vue";
 import {
   getPersonDimensionChartsList,
+  getPersonDimensionChartsRanking,
   getAssessmentList,
   getChartsList
 } from "@/api/draw";
 import type { TabsPaneContext } from "element-plus";
 const router = useRouter();
 const value = ref("");
+const rankTableRef = ref();
 const activeName = ref("1");
 // 柱状图
 const barEchartsRef = ref();
@@ -37,10 +39,21 @@ const params = reactive({
 });
 const getPersonDimensionChartsListApi = async () => {
   const { code, data } = await getPersonDimensionChartsList(params.params);
-  // barEchartsRef.value.setOption(data);
-  // console.log("data", data);
 };
-getPersonDimensionChartsListApi();
+// 雷达图
+// const drawRank = ref();
+const getPersonDimensionChartsRankingApi = async item => {
+  console.log("item", item);
+  const { code, data } = await getPersonDimensionChartsRanking({
+    ...item,
+    type: 0
+  });
+  if (code == 200) {
+    // drawRank.value = data;
+    rankTableRef.value.initChart(data);
+  }
+};
+// getPersonDimensionChartsListApi();
 // 维度表格
 const personListRef = ref();
 const barEchartsList = reactive({
@@ -104,180 +117,197 @@ const fullBig = (item: any) => {
 <template>
   <div class="w-[100%]">
     <div class="w-[100%]">
-      <seachData />
-      <div class="flex mr-2">
-        <radar />
-      </div>
-      <el-tabs
-        v-model="activeName"
-        class="demo-tabs"
-        :lazy="true"
-        @tab-click="handleClick"
-      >
-        <el-tab-pane label="总览" name="1">
-          <div class="flex mr-8">
-            <rankTable />
-          </div>
-          <!-- 总得分 -->
-          <div class="mt-5 pr-8 w-full h-60">
-            <barEcharts ref="barEchartsRef" :title="barEchartsList.zongfen" />
-          </div>
-          <!-- 维度得分 -->
-          <div class="mt-5 pr-8 w-full h-60 flex justify-between item-center">
-            <div class="w-1/2 h-full">
-              <barEcharts :title="barEchartsList.shuliang" />
-            </div>
-            <div class="w-1/2 h-full">
-              <barEcharts :title="barEchartsList.xiaolve" />
-            </div>
-          </div>
-          <div class="mt-5 pr-8 w-full h-60 flex justify-between item-center">
-            <div class="w-1/2 h-full">
-              <barEcharts
-                ref="barEchartsRef"
-                :title="barEchartsList.zhiliang"
-              />
-            </div>
-            <div class="w-1/2 h-full">
-              <barEcharts ref="barEchartsRef" :title="barEchartsList.nandu" />
-            </div>
-          </div>
-          <div class="mt-5 pr-8 w-full h-60 flex justify-between item-center">
-            <div class="w-1/2 h-full">
-              <barEcharts ref="barEchartsRef" :title="barEchartsList.qiandu" />
+      <seachData @handClick="getPersonDimensionChartsRankingApi" />
+      <div>
+        <div class="flex mr-2">
+          <radar ref="rankTableRef" />
+        </div>
+        <el-tabs
+          v-model="activeName"
+          class="demo-tabs"
+          :lazy="true"
+          @tab-click="handleClick"
+        >
+          <el-tab-pane label="总览" name="1">
+            <div class="flex mr-8">
+              <rankTable />
             </div>
-            <div class="w-1/2 h-full">
-              <barEcharts ref="barEchartsRef" :title="barEchartsList.jiaoxue" />
+            <!-- 总得分 -->
+            <div class="mt-5 pr-8 w-full h-60">
+              <barEcharts ref="barEchartsRef" :title="barEchartsList.zongfen" />
             </div>
-          </div>
-          <div class="mt-5 pr-8 w-full h-60 flex justify-between item-center">
-            <div class="w-1/2 h-full">
-              <barEcharts ref="barEchartsRef" :title="barEchartsList.keyan" />
-            </div>
-            <div class="w-1/2 h-full">
-              <!-- <barEcharts :title="barEchartsList.kexue" /> -->
-            </div>
-          </div>
-        </el-tab-pane>
-        <el-tab-pane label="数量" name="2" :lazy="true">
-          <div class="w-full">
-            <div class="flex justify-between">
-              <personList ref="personListRef" class="w-11/12" />
-              <div
-                class="w-[30px] h-[30px] mr-10 cursor-pointer"
-                @click="fullBig(barEchartsList.shuliang)"
-              >
-                <img class="w-full h-full" :src="qvanping" alt="" />
+            <!-- 维度得分 -->
+            <div class="mt-5 pr-8 w-full h-60 flex justify-between item-center">
+              <div class="w-1/2 h-full">
+                <barEcharts :title="barEchartsList.shuliang" />
               </div>
-            </div>
-            <div class="w-full h-60 mt-5 pr-8">
-              <barEcharts
-                ref="barEchartsRef"
-                :title="barEchartsList.shuliang"
-              />
-            </div>
-          </div>
-        </el-tab-pane>
-        <el-tab-pane label="效率" name="3" :lazy="true">
-          <div class="w-full">
-            <div class="flex justify-between">
-              <personList ref="personListRef" class="w-11/12" />
-              <div
-                class="w-[30px] h-[30px] mr-10 cursor-pointer"
-                @click="fullBig(barEchartsList.xiaolve)"
-              >
-                <img class="w-full h-full" :src="qvanping" alt="" />
+              <div class="w-1/2 h-full">
+                <barEcharts :title="barEchartsList.xiaolve" />
               </div>
             </div>
-            <div class="w-full h-60 mt-5 pr-8">
-              <barEcharts ref="barEchartsRef" :title="barEchartsList.xiaolve" />
-            </div>
-          </div>
-        </el-tab-pane>
-        <el-tab-pane label="质量" name="4" :lazy="true">
-          <div class="w-full">
-            <div class="flex justify-between">
-              <personList ref="personListRef" class="w-11/12" />
-              <div
-                class="w-[30px] h-[30px] mr-10 cursor-pointer"
-                @click="fullBig(barEchartsList.zhiliang)"
-              >
-                <img class="w-full h-full" :src="qvanping" alt="" />
+            <div class="mt-5 pr-8 w-full h-60 flex justify-between item-center">
+              <div class="w-1/2 h-full">
+                <barEcharts
+                  ref="barEchartsRef"
+                  :title="barEchartsList.zhiliang"
+                />
+              </div>
+              <div class="w-1/2 h-full">
+                <barEcharts ref="barEchartsRef" :title="barEchartsList.nandu" />
               </div>
             </div>
-            <div class="w-full h-60 mt-5 pr-8">
-              <barEcharts
-                ref="barEchartsRef"
-                :title="barEchartsList.zhiliang"
-              />
+            <div class="mt-5 pr-8 w-full h-60 flex justify-between item-center">
+              <div class="w-1/2 h-full">
+                <barEcharts
+                  ref="barEchartsRef"
+                  :title="barEchartsList.qiandu"
+                />
+              </div>
+              <div class="w-1/2 h-full">
+                <barEcharts
+                  ref="barEchartsRef"
+                  :title="barEchartsList.jiaoxue"
+                />
+              </div>
             </div>
-          </div>
-        </el-tab-pane>
-        <el-tab-pane label="难度" name="5" :lazy="true">
-          <div class="w-full">
-            <div class="flex justify-between">
-              <personList ref="personListRef" class="w-11/12" />
-              <div
-                class="w-[30px] h-[30px] mr-10 cursor-pointer"
-                @click="fullBig(barEchartsList.nandu)"
-              >
-                <img class="w-full h-full" :src="qvanping" alt="" />
+            <div class="mt-5 pr-8 w-full h-60 flex justify-between item-center">
+              <div class="w-1/2 h-full">
+                <barEcharts ref="barEchartsRef" :title="barEchartsList.keyan" />
+              </div>
+              <div class="w-1/2 h-full">
+                <!-- <barEcharts :title="barEchartsList.kexue" /> -->
               </div>
             </div>
-            <div class="w-full h-60 mt-5 pr-8">
-              <barEcharts ref="barEchartsRef" :title="barEchartsList.nandu" />
+          </el-tab-pane>
+          <el-tab-pane label="数量" name="2" :lazy="true">
+            <div class="w-full">
+              <div class="flex justify-between">
+                <personList ref="personListRef" class="w-11/12" />
+                <div
+                  class="w-[30px] h-[30px] mr-10 cursor-pointer"
+                  @click="fullBig(barEchartsList.shuliang)"
+                >
+                  <img class="w-full h-full" :src="qvanping" alt="" />
+                </div>
+              </div>
+              <div class="w-full h-60 mt-5 pr-8">
+                <barEcharts
+                  ref="barEchartsRef"
+                  :title="barEchartsList.shuliang"
+                />
+              </div>
             </div>
-          </div>
-        </el-tab-pane>
-        <el-tab-pane label="强度" name="6" :lazy="true">
-          <div class="w-full">
-            <div class="flex justify-between">
-              <personList ref="personListRef" class="w-11/12" />
-              <div
-                class="w-[30px] h-[30px] mr-10 cursor-pointer"
-                @click="fullBig(barEchartsList.qiandu)"
-              >
-                <img class="w-full h-full" :src="qvanping" alt="" />
+          </el-tab-pane>
+          <el-tab-pane label="效率" name="3" :lazy="true">
+            <div class="w-full">
+              <div class="flex justify-between">
+                <personList ref="personListRef" class="w-11/12" />
+                <div
+                  class="w-[30px] h-[30px] mr-10 cursor-pointer"
+                  @click="fullBig(barEchartsList.xiaolve)"
+                >
+                  <img class="w-full h-full" :src="qvanping" alt="" />
+                </div>
+              </div>
+              <div class="w-full h-60 mt-5 pr-8">
+                <barEcharts
+                  ref="barEchartsRef"
+                  :title="barEchartsList.xiaolve"
+                />
               </div>
             </div>
-            <div class="w-full h-60 mt-5 pr-8">
-              <barEcharts ref="barEchartsRef" :title="barEchartsList.qiandu" />
+          </el-tab-pane>
+          <el-tab-pane label="质量" name="4" :lazy="true">
+            <div class="w-full">
+              <div class="flex justify-between">
+                <personList ref="personListRef" class="w-11/12" />
+                <div
+                  class="w-[30px] h-[30px] mr-10 cursor-pointer"
+                  @click="fullBig(barEchartsList.zhiliang)"
+                >
+                  <img class="w-full h-full" :src="qvanping" alt="" />
+                </div>
+              </div>
+              <div class="w-full h-60 mt-5 pr-8">
+                <barEcharts
+                  ref="barEchartsRef"
+                  :title="barEchartsList.zhiliang"
+                />
+              </div>
             </div>
-          </div>
-        </el-tab-pane>
-        <el-tab-pane label="教学" name="7" :lazy="true">
-          <div class="w-full">
-            <div class="flex justify-between">
-              <personList ref="personListRef" class="w-11/12" />
-              <div
-                class="w-[30px] h-[30px] mr-10 cursor-pointer"
-                @click="fullBig(barEchartsList.jiaoxue)"
-              >
-                <img class="w-full h-full" :src="qvanping" alt="" />
+          </el-tab-pane>
+          <el-tab-pane label="难度" name="5" :lazy="true">
+            <div class="w-full">
+              <div class="flex justify-between">
+                <personList ref="personListRef" class="w-11/12" />
+                <div
+                  class="w-[30px] h-[30px] mr-10 cursor-pointer"
+                  @click="fullBig(barEchartsList.nandu)"
+                >
+                  <img class="w-full h-full" :src="qvanping" alt="" />
+                </div>
+              </div>
+              <div class="w-full h-60 mt-5 pr-8">
+                <barEcharts ref="barEchartsRef" :title="barEchartsList.nandu" />
               </div>
             </div>
-            <div class="w-full h-60 mt-5 pr-8">
-              <barEcharts ref="barEchartsRef" :title="barEchartsList.jiaoxue" />
+          </el-tab-pane>
+          <el-tab-pane label="强度" name="6" :lazy="true">
+            <div class="w-full">
+              <div class="flex justify-between">
+                <personList ref="personListRef" class="w-11/12" />
+                <div
+                  class="w-[30px] h-[30px] mr-10 cursor-pointer"
+                  @click="fullBig(barEchartsList.qiandu)"
+                >
+                  <img class="w-full h-full" :src="qvanping" alt="" />
+                </div>
+              </div>
+              <div class="w-full h-60 mt-5 pr-8">
+                <barEcharts
+                  ref="barEchartsRef"
+                  :title="barEchartsList.qiandu"
+                />
+              </div>
             </div>
-          </div>
-        </el-tab-pane>
-        <el-tab-pane label="科研" name="8" :lazy="true">
-          <div class="w-full">
-            <div class="flex justify-between">
-              <personList ref="personListRef" class="w-11/12" />
-              <div
-                class="w-[30px] h-[30px] mr-10 cursor-pointer"
-                @click="fullBig(barEchartsList.keyan)"
-              >
-                <img class="w-full h-full" :src="qvanping" alt="" />
+          </el-tab-pane>
+          <el-tab-pane label="教学" name="7" :lazy="true">
+            <div class="w-full">
+              <div class="flex justify-between">
+                <personList ref="personListRef" class="w-11/12" />
+                <div
+                  class="w-[30px] h-[30px] mr-10 cursor-pointer"
+                  @click="fullBig(barEchartsList.jiaoxue)"
+                >
+                  <img class="w-full h-full" :src="qvanping" alt="" />
+                </div>
+              </div>
+              <div class="w-full h-60 mt-5 pr-8">
+                <barEcharts
+                  ref="barEchartsRef"
+                  :title="barEchartsList.jiaoxue"
+                />
               </div>
             </div>
-            <div class="w-full h-60 mt-5 pr-8">
-              <barEcharts ref="barEchartsRef" :title="barEchartsList.keyan" />
+          </el-tab-pane>
+          <el-tab-pane label="科研" name="8" :lazy="true">
+            <div class="w-full">
+              <div class="flex justify-between">
+                <personList ref="personListRef" class="w-11/12" />
+                <div
+                  class="w-[30px] h-[30px] mr-10 cursor-pointer"
+                  @click="fullBig(barEchartsList.keyan)"
+                >
+                  <img class="w-full h-full" :src="qvanping" alt="" />
+                </div>
+              </div>
+              <div class="w-full h-60 mt-5 pr-8">
+                <barEcharts ref="barEchartsRef" :title="barEchartsList.keyan" />
+              </div>
             </div>
-          </div>
-        </el-tab-pane>
-      </el-tabs>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
     </div>
   </div>
 </template>

+ 6 - 1
src/views/evaluate/children/change/components/newAdd.vue

@@ -251,11 +251,16 @@ const importIndexDialog = row => {
 };
 const importIndexOne = async row => {
   // console.log("row", row);
+  let formula = JSON.stringify({
+    noConditionFormula: ""
+  });
   const res = await postAddRelationList([
     {
       dimId: row.id,
       indId: row.tpId,
-      tpId: ""
+      tpId: "",
+      formula,
+      scoreStandard: 0
     }
   ]);
   if (res.code === 200) {

+ 98 - 23
src/views/evaluate/children/change/components/settingIndexDrawer.vue

@@ -2,7 +2,7 @@
 import { ref, reactive } from "vue";
 import { ElMessageBox, ElMessage } from "element-plus";
 import { calculator } from "./evaluate";
-import { getIndexInfo } from "@/api/templateInfo";
+import { getIndexInfo, postUpdate } from "@/api/templateInfo";
 import { conditionVerify } from "@/api/formula";
 import type { DrawerProps, FormItemProps, FormProps } from "element-plus";
 // const itemLabelPosition = ref<FormItemProps["labelPosition"]>("");
@@ -44,13 +44,61 @@ const getIndexInfoApi = async id => {
   if (code === 200) {
     Object.assign(params, data);
     if (isValidJSON(data.formula)) {
-      params.formula = JSON.parse(data.formula);
+      if (params.formulaType == 0) {
+        params.formula = JSON.parse(data.formula);
+      } else if (params.formulaType == 1) {
+        let aa = JSON.parse(data.formula);
+        let bb = JSON.parse(aa.noConditionFormula);
+        Object.assign(addmanyChange, bb);
+      }
+    }
+    if (data.formula) {
+    } else {
+      Object.assign(params.formula, {
+        noConditionFormula: ""
+      });
     }
     console.log("params", params);
   } else {
     ElMessage.error(msg);
   }
 };
+// 指标信息
+// const getIndInfoApi = async id => {
+//   const { data, code, msg } = await getIndInfo(id);
+//   // console.log("1111", data);
+//   if (code === 200) {
+//     Object.assign(params, data);
+//     if (isValidJSON(data.formula)) {
+//       if (params.formulaType == 0) {
+//       }
+//     }
+//     console.log("params", params);
+//   } else {
+//     ElMessage.error(msg);
+//   }
+// };
+// 更新指标
+const postUpdateApi = async () => {
+  if (params.formulaType == 0) {
+    params.formula = JSON.stringify(params.formula);
+  } else {
+    params.formula.noConditionFormula = JSON.stringify(addmanyChange);
+    params.formula = JSON.stringify(params.formula);
+  }
+  const { msg, code } = await postUpdate(params);
+  if (code === 200) {
+    ElMessage({
+      message: "编辑成功",
+      type: "success"
+    });
+    disabledValue.value = true;
+    editShow.value = true;
+    drawer.value = !drawer.value;
+  } else {
+    ElMessage.error(msg);
+  }
+};
 // 公式验证
 const dialogFormVisibleFormula = ref(false);
 const formulaForm = ref([]);
@@ -147,18 +195,45 @@ function cancelClick() {
   editShow.value = true;
 }
 function confirmClick() {
-  console.log(1111);
-  disabledValue.value = true;
-  editShow.value = true;
-  drawer.value = !drawer.value;
-  ElMessage({
-    message: "保存成功",
-    type: "success"
-  });
+  postUpdateApi();
 }
 const open = row => {
   drawer.value = true;
   // console.log("row", row.id);
+  Object.assign(params, {
+    id: "",
+    tpId: "",
+    dimId: "",
+    indId: "",
+    valueInput: "",
+    scoreStandard: 0,
+    remark: "",
+    scoreRule: "",
+    targetValue: "",
+    finalValue: "",
+    formulaType: 0,
+    challengeValue: "",
+    startValue: "",
+    datasoure: "",
+    weight: "",
+    scoreValue: "",
+    formula: {
+      noConditionFormula: ""
+    }
+  });
+  Object.assign(addmanyChange, {
+    outerConditionValue: "",
+    innerConditionExpression: [
+      {
+        startValue: null,
+        endValue: null,
+        select: null,
+        comparisonStart: null,
+        comparisonEnd: null,
+        scoreRuleMoreInnerVO: []
+      }
+    ]
+  });
   getIndexInfoApi(row.id);
 };
 const editShow = ref(true);
@@ -298,19 +373,19 @@ const addmanyChange = reactive({
       comparisonStart: null,
       comparisonEnd: null,
       scoreRuleMoreInnerVO: [
-        {
-          innerConditionValue: null,
-          scoreRules: [
-            {
-              score: null,
-              startValue: null,
-              select: "",
-              endValue: null,
-              comparisonStart: null,
-              comparisonEnd: null
-            }
-          ]
-        }
+        // {
+        //   innerConditionValue: null,
+        //   scoreRules: [
+        //     {
+        //       score: null,
+        //       startValue: null,
+        //       select: "",
+        //       endValue: null,
+        //       comparisonStart: null,
+        //       comparisonEnd: null
+        //     }
+        //   ]
+        // }
       ]
     }
   ]

+ 12 - 4
src/views/evaluate/children/change/mould/manageObject.vue

@@ -79,7 +79,6 @@ onMounted(() => {
 // 指标分页查询
 const getAssessmentQuotaDetailsApi = async () => {
   const res = await getAssessmentQuotaDetails(initParams.indexParams);
-  console.log("getAssessmentQuotaDetailsApi", res);
   if (res.code === 200) {
     initParams.Indexlist = res.data.records;
     initParams.total1 = res.data.totalRow;
@@ -142,11 +141,17 @@ const changeSelection = val => {
     valSelection.value = true;
     delParams.assessmentId = messageData.value.id;
     addPersonParams.assessmentId = messageData.value.id;
+    let assessmentObjectId;
+    let assessmentObjectName;
     val.forEach((item, index) => {
       delParams.objectAddVoList.forEach((item1, index1) => {
         if (index == index1) {
-          item1.assessmentObjectId = item.id;
-          item1.assessmentObjectName = item.name;
+          assessmentObjectId = item.id;
+          assessmentObjectName = item.realName;
+          delParams.objectAddVoList.push({
+            assessmentObjectId,
+            assessmentObjectName
+          });
         }
       });
     });
@@ -202,7 +207,10 @@ const dialogVisibleAddShow = () => {
 };
 // 跳转对应科室
 const GoView = row => {
-  router.push("/evaluate/children/change/mould/view");
+  router.push({
+    name: "departmentDrank",
+    query: { ...messageData.value, deptId: row.deptId }
+  });
 };
 // 考核对象
 const objList = ref([]);