ystl_myq 7 månader sedan
förälder
incheckning
7ab3f0eaf5

+ 38 - 0
src/api/assessment.ts

@@ -0,0 +1,38 @@
+import { http } from "@/utils/http";
+// 部门
+type addDept = {
+  code: number;
+  msg: string;
+  data: boolean;
+};
+type addDeptList = {
+  code: number;
+  msg: string;
+  data: Array<any>;
+};
+// 添加考核信息
+export const postAddAssessment = data => {
+  return http.request<addDept>("post", "/assessment/addAssessment", { data });
+};
+// 添加考核信息
+export const postAddAssessmentObject = data => {
+  return http.request<addDept>("post", "/assessment/addAssessmentObject", {
+    data
+  });
+};
+// 批量删除被考核人
+export const delAssessmentObject = data => {
+  return http.request<addDept>("post", "/assessment/delAssessmentObject", {
+    data
+  });
+};
+// 考核信息详情(考核指标)
+export const getAssessmentQuotaDetails = params => {
+  return http.request<addDeptList>(
+    "get",
+    "/assessment/getAssessmentQuotaDetails",
+    {
+      params
+    }
+  );
+};

+ 28 - 0
src/api/department.ts

@@ -1,4 +1,5 @@
 import { http } from "@/utils/http";
+import { ref } from "vue";
 // 部门
 type addDept = {
   code: number;
@@ -27,3 +28,30 @@ export const postUpdateDept = data => {
 export const postDeptUserAdd = data => {
   return http.request<addDept>("post", "/sysDept/deptUserAdd", { data });
 };
+// 部门下树(包含用户信息)
+export const postListTreeWithUser = () => {
+  return http.request<addDeptList>("post", "/sysDept/listTreeWithUser");
+};
+export const treeDept = ref([]);
+export const postListTreeWithUserApi = async () => {
+  const res = await postListTreeWithUser();
+  treeDept.value = transformData(res.data);
+  console.log("过滤的数据.", treeDept.value);
+};
+const transformData = arr => {
+  return arr.map(item => {
+    const {
+      deptName: userName,
+      deptCode: userCode,
+      childrenRes,
+      ...rest
+    } = item;
+
+    return {
+      userName,
+      userCode,
+      childrenRes: childrenRes ? transformData(childrenRes) : [],
+      ...rest
+    };
+  });
+};

+ 31 - 0
src/api/download.ts

@@ -38,3 +38,34 @@ export const postUpdateDeptApi = async data => {
     }
   });
 };
+
+// 考核指标下载
+export const assessmentDownloadDataRosterTemplateApi = async () => {
+  const token = localStorage.getItem("token") || "";
+  try {
+    const response = await axios.get(
+      FLIE_URL + "/assessment/downloadAssessmentTemplate",
+      {
+        responseType: "blob", // 确保接收的是二进制数据
+        headers: {
+          satoken: token // 将 token 添加到请求头
+        }
+      }
+    );
+    // 创建 Blob 对象并生成下载链接
+    const blob = new Blob([response.data], {
+      type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+    });
+    const link = document.createElement("a");
+    link.href = URL.createObjectURL(blob);
+    link.download = "模板.xlsx"; // 文件名
+    document.body.appendChild(link);
+    link.click();
+    // 清理 DOM
+    document.body.removeChild(link);
+    URL.revokeObjectURL(link.href);
+    ElMessage.success("模板下载成功");
+  } catch (error) {
+    ElMessage.error("模板下载失败,请重试");
+  }
+};

+ 3 - 4
src/components/import/index.vue

@@ -1,6 +1,7 @@
 <script setup lang="ts">
 import { ref } from "vue";
 import { useRouter } from "vue-router";
+import { assessmentDownloadDataRosterTemplateApi } from "@/api/download";
 defineOptions({
   name: "IndexDefineImport"
 });
@@ -41,11 +42,9 @@ const backDefine = () => {
   <div>
     <div class="w-3/4 m-auto mt-4">
       <div class="w-full bg p-3">
-        <el-button class="float-right" @click="backDefine">返回</el-button>
         <h5>1.下载导入模板</h5>
-
         <p class="text-xs mt-2 text">根据提升信息完善表格内容</p>
-        <el-button class="mt-2"
+        <el-button class="mt-2" @click="assessmentDownloadDataRosterTemplateApi"
           ><el-icon><Download /></el-icon>下载空的模板表格</el-button
         >
       </div>
@@ -82,7 +81,7 @@ const backDefine = () => {
           </el-table>
         </div>
         <div class="float-right">
-          <el-button>取消</el-button>
+          <el-button @click="backDefine">取消</el-button>
           <el-button type="primary" @click="uploadFile">确认</el-button>
         </div>
         <p class="h-11 no-select">.</p>

+ 57 - 96
src/views/background/framework/roles/components/addPerson.vue

@@ -1,134 +1,95 @@
 <script setup lang="ts">
-import { ref, reactive } from "vue";
+import { ref, reactive, watch } from "vue";
 import { Search } from "@element-plus/icons-vue";
 import { ElMessageBox, ElMessage } from "element-plus";
+import { postAssignmentUser } from "@/api/userSetting";
+import { treeDept, postListTreeWithUserApi } from "@/api/department";
 const dialogVisibleAdd = ref(false);
+const $emit = defineEmits(["handeClick"]);
 const form = reactive({
-  name: "",
-  region: "",
-  date1: "",
-  date2: "",
-  delivery: false,
-  type: [],
-  resource: "",
-  desc: ""
+  sourceCodes: [],
+  targetCodes: [],
+  linkAction: "link",
+  correlatedModel: "userRole"
 });
+// const treeRef = ref();
+const filterText = ref("");
 const handleClose = () => {
-  ElMessageBox.confirm("确认关闭弹窗吗?")
-    .then(() => {
-      dialogVisibleAdd.value = !dialogVisibleAdd.value;
-      ElMessage({
-        message: "已关闭"
-      });
-    })
-    .catch(() => {
-      // catch error
-    });
+  dialogVisibleAdd.value = !dialogVisibleAdd.value;
 };
 // 添加部门保存
 const saveDepartment = () => {
-  dialogVisibleAdd.value = false;
-  ElMessage({
-    message: "添加成功",
-    type: "success"
-  });
+  postAssignmentUserApi();
 };
 const open = item => {
   dialogVisibleAdd.value = true;
-  console.log(item);
-};
-// 树选择
-const defaultProps = {
-  children: "children",
-  label: "label"
+  postListTreeWithUserApi();
+  form.sourceCodes.push(item.roleCode);
+  filterText.value = "";
+  console.log("来源", item);
 };
-const data = [
-  {
-    id: 1,
-    label: "Level one 1",
-    children: [
-      {
-        id: 4,
-        label: "Level two 1-1",
-        children: [
-          {
-            id: 9,
-            label: "Level three 1-1-1"
-          },
-          {
-            id: 10,
-            label: "Level three 1-1-2"
-          }
-        ]
-      }
-    ]
-  },
-  {
-    id: 2,
-    label: "Level one 2",
-    children: [
-      {
-        id: 5,
-        label: "Level two 2-1"
-      },
-      {
-        id: 6,
-        label: "Level two 2-2"
-      }
-    ]
-  },
-  {
-    id: 3,
-    label: "Level one 3",
-    children: [
-      {
-        id: 7,
-        label: "Level two 3-1"
-      },
-      {
-        id: 8,
-        label: "Level two 3-2"
-      }
-    ]
+const postAssignmentUserApi = async () => {
+  const { code, msg } = await postAssignmentUser(form);
+  if (code === 200) {
+    ElMessage({
+      message: "添加成功",
+      type: "success"
+    });
+    $emit("handeClick");
+    dialogVisibleAdd.value = false;
+  } else {
+    ElMessage({
+      message: msg,
+      type: "error"
+    });
   }
-];
-const tree = ref(null);
-
+};
+// 树选择
 const handleCheck = (node, checked) => {
-  // if (checked) {
-  //   tree.value.expandNode(node, true);
-  // } else {
-  //   tree.value.collapseNode(node, true);
-  // }
+  checked.checkedNodes.forEach(item => {
+    form.targetCodes.push(item.userCode);
+  });
 };
 defineExpose({
   open
 });
+// ---------------------
+const treeRef = ref();
+
+watch(filterText, val => {
+  treeRef.value!.filter(val);
+});
+
+const filterNode = (value: string, data: any) => {
+  if (!value) return true; // 如果没有过滤关键词,显示所有节点
+  return data.userName && data.userName.includes(value); // 使用 userName 进行匹配
+};
+
+const defaultProps = {
+  label: "userName",
+  value: "userCode",
+  children: "childrenRes"
+};
 </script>
 
 <template>
   <div>
-    <el-dialog
-      v-model="dialogVisibleAdd"
-      title="人员"
-      width="500"
-      :before-close="handleClose"
-    >
+    <el-dialog v-model="dialogVisibleAdd" title="人员" width="500">
       <el-input
+        v-model="filterText"
         placeholder="请搜索员工姓名"
         class="mb-2"
         :prefix-icon="Search"
       />
       <el-tree
-        ref="tree"
-        style="max-width: 600px"
-        :data="data"
+        ref="treeRef"
+        :data="treeDept"
         show-checkbox
         node-key="id"
         :props="defaultProps"
+        :filter-node-method="filterNode"
         @check="handleCheck"
       />
-      <!-- :default-expanded-keys="[2, 3]" :default-checked-keys="[5]" -->
       <template #footer>
         <div class="dialog-footer">
           <el-button @click="handleClose">取消</el-button>

+ 11 - 5
src/views/background/framework/roles/rolePower.vue

@@ -36,7 +36,8 @@ interface ApiResponse {
 const rolesList = reactive<any>({
   data: [],
   dataUser: [],
-  rolesName: ""
+  rolesName: "",
+  addPerson: {}
 });
 // 角色列表
 let pageSize = reactive({
@@ -80,11 +81,12 @@ postPageRoleApi();
 // 查看角色组
 const bgColor = ref(null);
 const lookRoles = item => {
-  // console.log(item);
+  console.log(item);
   paramsPageUser.roleName = item.roleName;
   paramsPageUser.roleCode = item.roleCode;
   bgColor.value = item.id;
   rolesList.rolesName = item.roleName;
+  Object.assign(rolesList.addPerson, item);
   postPageUserByRoleApi();
   // getMenuListApi();
   getMenuListCodeForRoleApi(item);
@@ -134,7 +136,7 @@ const activeName = ref("first");
 
 // 添加角色组成员
 const AddRolesPerson = () => {
-  addPersonRef.value.open();
+  addPersonRef.value.open(rolesList.addPerson);
   addPersonShow.value = true;
 };
 // 删除角色组成员
@@ -209,7 +211,11 @@ const handleCurrentChange = val => {
       @handleClick="postPageRoleApi"
     />
     <!-- 新增角色组成员 -->
-    <addPerson ref="addPersonRef" v-model="addPersonShow" />
+    <addPerson
+      ref="addPersonRef"
+      v-model="addPersonShow"
+      @handeClick="postPageUserByRoleApi"
+    />
     <!-- 主体内容 -->
     <div class="box-left">
       <div class="w-[100%]">
@@ -345,7 +351,7 @@ const handleCurrentChange = val => {
               </template>
             </el-table-column>
           </el-table>
-          <div>
+          <div class="h-[80px]">
             <div class="float-left mt-3 total">共{{ total }}条数据</div>
             <div class="absolute right-0 mr-20 mt-3">
               <el-pagination

+ 46 - 84
src/views/background/framework/users/components/addPerson.vue

@@ -1,106 +1,66 @@
 <script setup lang="ts">
-import { ref, reactive } from "vue";
+import { ref, reactive, watch } from "vue";
 import { Search } from "@element-plus/icons-vue";
 import { ElMessageBox, ElMessage } from "element-plus";
+import { treeDept, postListTreeWithUserApi } from "@/api/department";
+import { postAssignmentUser } from "@/api/userSetting";
+const $emit = defineEmits(["handleClick"]);
 const dialogVisibleAdd = ref(false);
+postListTreeWithUserApi();
 const form = reactive({
-  name: "",
-  region: "",
-  date1: "",
-  date2: "",
-  delivery: false,
-  type: [],
-  resource: "",
-  desc: ""
+  sourceCodes: [],
+  targetCodes: [],
+  linkAction: "link",
+  correlatedModel: "groupUser"
 });
 const handleClose = () => {
-  ElMessageBox.confirm("确认关闭弹窗吗?")
-    .then(() => {
-      dialogVisibleAdd.value = !dialogVisibleAdd.value;
-      ElMessage({
-        message: "已关闭"
-      });
-    })
-    .catch(() => {
-      // catch error
-    });
+  dialogVisibleAdd.value = !dialogVisibleAdd.value;
 };
+const filterText = ref("");
 // 添加部门保存
 const saveDepartment = () => {
-  dialogVisibleAdd.value = false;
-  ElMessage({
-    message: "添加成功",
-    type: "success"
-  });
+  postAssignmentUserApi();
 };
 const open = item => {
   dialogVisibleAdd.value = true;
-  console.log(item);
+  filterText.value = "";
+  form.sourceCodes.push(item.groupCode);
+};
+const postAssignmentUserApi = async () => {
+  const { code, msg } = await postAssignmentUser(form);
+  if (code == 200) {
+    $emit("handleClick");
+    ElMessage({
+      message: "添加成功",
+      type: "success"
+    });
+    dialogVisibleAdd.value = false;
+  } else {
+    ElMessage.error(msg);
+  }
 };
 // 树选择
 const defaultProps = {
-  children: "children",
-  label: "label"
+  label: "userName",
+  value: "userCode",
+  children: "childrenRes"
 };
-const data = [
-  {
-    id: 1,
-    label: "Level one 1",
-    children: [
-      {
-        id: 4,
-        label: "Level two 1-1",
-        children: [
-          {
-            id: 9,
-            label: "Level three 1-1-1"
-          },
-          {
-            id: 10,
-            label: "Level three 1-1-2"
-          }
-        ]
-      }
-    ]
-  },
-  {
-    id: 2,
-    label: "Level one 2",
-    children: [
-      {
-        id: 5,
-        label: "Level two 2-1"
-      },
-      {
-        id: 6,
-        label: "Level two 2-2"
-      }
-    ]
-  },
-  {
-    id: 3,
-    label: "Level one 3",
-    children: [
-      {
-        id: 7,
-        label: "Level two 3-1"
-      },
-      {
-        id: 8,
-        label: "Level two 3-2"
-      }
-    ]
-  }
-];
 const tree = ref(null);
 
 const handleCheck = (node, checked) => {
-  // if (checked) {
-  //   tree.value.expandNode(node, true);
-  // } else {
-  //   tree.value.collapseNode(node, true);
-  // }
+  checked.checkedNodes.forEach(item => {
+    form.targetCodes.push(item.userCode);
+  });
+};
+const filterNode = (value: string, data: any) => {
+  if (!value) return true; // 如果没有过滤关键词,显示所有节点
+  return data.userName && data.userName.includes(value); // 使用 userName 进行匹配
 };
+const treeRef = ref();
+
+watch(filterText, val => {
+  treeRef.value!.filter(val);
+});
 defineExpose({
   open
 });
@@ -115,17 +75,19 @@ defineExpose({
       :before-close="handleClose"
     >
       <el-input
+        v-model="filterText"
         placeholder="请搜索员工姓名"
         class="mb-2"
         :prefix-icon="Search"
       />
       <el-tree
-        ref="tree"
+        ref="treeRef"
         style="max-width: 600px"
-        :data="data"
+        :data="treeDept"
         show-checkbox
         node-key="id"
         :props="defaultProps"
+        :filter-node-method="filterNode"
         @check="handleCheck"
       />
       <!-- :default-expanded-keys="[2, 3]" :default-checked-keys="[5]" -->

+ 13 - 26
src/views/background/framework/users/index.vue

@@ -22,30 +22,9 @@ const addPersonShow = ref(false);
 // 编辑
 const editPersonRef = ref();
 const editPersonShow = ref(false);
+const addPersonClick = ref();
 // table表格
 const UserTable = ref();
-const tableData = [
-  {
-    date: "2016-05-03",
-    name: "Tom",
-    address: "No. 189"
-  },
-  {
-    date: "2016-05-02",
-    name: "Tom",
-    address: "No. 189"
-  },
-  {
-    date: "2016-05-04",
-    name: "Tom",
-    address: "No. 189"
-  },
-  {
-    date: "2016-05-01",
-    name: "Tom",
-    address: "No. 189"
-  }
-];
 const rolesList = reactive({
   data: [],
   rolesName: "",
@@ -53,7 +32,8 @@ const rolesList = reactive({
     pageNumber: 1,
     pageSize: 10,
     groupName: ""
-  }
+  },
+  addPerson: {}
 });
 const load = () => {
   rolesList.params.pageSize += 10;
@@ -80,7 +60,9 @@ const bgColor = ref(null);
 const lookRoles = item => {
   bgColor.value = item.id;
   rolesList.rolesName = item.groupName;
+  Object.assign(rolesList.addPerson, item);
   UserTable.value.handleNodeClick(item, "group");
+  addPersonClick.value = UserTable.value.handleNodeClick(item, "group");
 };
 // 标签选择
 const activeName = ref("first");
@@ -114,7 +96,7 @@ const deleteUsers = row => {
   });
 };
 const AddUsersPerson = () => {
-  addPersonRef.value.open();
+  addPersonRef.value.open(rolesList.addPerson);
 };
 const addUsersList = () => {
   addUsersRef.value.open();
@@ -143,6 +125,7 @@ const deltetePerson = row => {
         row.userCode,
         UserTable.value.postOrganizationUserPageApi
       );
+      UserTable.value.handleNodeClick(row, "group");
     })
     .catch(() => {
       ElMessage({
@@ -155,7 +138,11 @@ const deltetePerson = row => {
 <template>
   <div class="flex w-full h-full">
     <!-- 添加成员 -->
-    <addPerson ref="addPersonRef" v-model="addPersonShow" />
+    <addPerson
+      ref="addPersonRef"
+      v-model="addPersonShow"
+      @handleClick="postPageGroupApi"
+    />
     <!-- 添加用户组 -->
     <addUsers
       ref="addUsersRef"
@@ -166,7 +153,7 @@ const deltetePerson = row => {
     <editPerson
       ref="editPersonRef"
       v-model="editPersonShow"
-      @handleClick="postPageGroupApi"
+      @handleClick="addPersonClick"
     />
     <!-- 主体内容 -->
     <div class="box-left">

+ 19 - 7
src/views/evaluate/children/change/components/importIndex.vue

@@ -7,6 +7,7 @@ import { postAddRelationList } from "@/api/dimension";
 import { getSelectDictListtApi, select } from "@/api/select";
 import { getStateData, getStateType } from "@/config/tag";
 const dialogVisibleAdd = ref(false);
+const $emit = defineEmits(["handClickInit"]);
 const indexParams = reactive({
   params: {
     pageNumber: 1,
@@ -21,7 +22,8 @@ const indexParams = reactive({
     dimId: "",
     indId: "",
     tpId: ""
-  }
+  },
+  parentList: {}
 });
 const handleClose = () => {
   dialogVisibleAdd.value = !dialogVisibleAdd.value;
@@ -43,14 +45,23 @@ const saveDepartment = () => {
     .then(async () => {
       indexParams.tableIndex.forEach(async item => {
         indexParams.Relation.indId = item.id;
-        const { code, msg, data } = await postAddRelationList(
+        const { code, msg, data } = await postAddRelationList([
           indexParams.Relation
-        );
+        ]);
         if (code === 200) {
-          ElMessage({
-            message: "导入成功",
-            type: "success"
-          });
+          if (data.successList) {
+            $emit("handClickInit", indexParams.parentList);
+            ElMessage({
+              message: "导入成功",
+              type: "success"
+            });
+          }
+          if (data.failList) {
+            ElMessage({
+              message: "导入失败",
+              type: "success"
+            });
+          }
         } else {
           ElMessage.error(msg);
         }
@@ -63,6 +74,7 @@ const saveDepartment = () => {
 };
 const open = row => {
   console.log("item", row);
+  Object.assign(indexParams.parentList, row);
   indexParams.Relation.dimId = row.id;
   indexParams.Relation.tpId = row.tpId;
   dialogVisibleAdd.value = true;

+ 33 - 2
src/views/evaluate/children/change/components/newAdd.vue

@@ -10,6 +10,7 @@ import two2 from "@/assets/svg/1-1.svg";
 import { useRouter, useRoute } from "vue-router";
 import { Edit } from "@element-plus/icons-vue";
 import { ElMessageBox, ElMessage } from "element-plus";
+import { postAddRelationList } from "@/api/dimension";
 import {
   postAddDimension,
   getDimensionRemove,
@@ -234,12 +235,35 @@ const settingIndex = row => {
 const importIndexDialog = row => {
   importIndexRef.value.open(row);
 };
+const importIndexOne = async row => {
+  // console.log("row", row);
+  const res = await postAddRelationList([
+    {
+      dimId: row.id,
+      indId: row.tpId,
+      tpId: ""
+    }
+  ]);
+  if (res.code === 200) {
+    initializeTableData(row);
+    ElMessage({
+      type: "success",
+      message: "添加成功"
+    });
+  } else {
+    ElMessage.error(res.msg);
+  }
+};
 </script>
 
 <template>
   <div class="w-[100%]">
     <!-- 导入指标 -->
-    <importIndex ref="importIndexRef" v-model="importIndexShow" />
+    <importIndex
+      ref="importIndexRef"
+      v-model="importIndexShow"
+      @handClickInit="initializeTableData"
+    />
     <!-- 指标设置 -->
     <settingIndexDrawer
       ref="settingIndexDrawerRef"
@@ -389,7 +413,14 @@ const importIndexDialog = row => {
             </el-table-column>
           </el-table>
           <template #footer>
-            <el-button type="primary" link class="mr-4"> 添加指标 </el-button>
+            <el-button
+              type="primary"
+              link
+              class="mr-4"
+              @click="importIndexOne(item)"
+            >
+              添加指标
+            </el-button>
             <el-button type="primary" link @click="importIndexDialog(item)">
               导入指标
             </el-button>

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

@@ -14,6 +14,24 @@ const formLabelAlign = reactive({
   compute: "1",
   type: ""
 });
+const params = reactive({
+  id: "",
+  tpId: "",
+  dimId: "",
+  indId: "",
+  valueInput: "",
+  scoreStandard: "",
+  remark: "",
+  scoreRule: "",
+  targetValue: "",
+  finalValue: "",
+  challengeValue: "",
+  startValue: "",
+  datasoure: "",
+  weight: "",
+  scoreValue: "",
+  formula: ""
+});
 const handleClose = (done: () => void) => {
   ElMessageBox.confirm("配置项未保存,确认关闭", {
     type: "warning"
@@ -301,12 +319,11 @@ const addItemDataList = (index: number, itemListValue: string) => {
           >
             <el-form-item label="完成值录入人" label-position="top">
               <el-select v-model="formLabelAlign.grade" placeholder="请选择">
-                <el-option
-                  v-for="item in options"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value"
-                />
+                <el-option label="考核人" value="0" />
+                <el-option label="上级" value="1" />
+                <el-option label="指定人员" value="2" />
+                <el-option label="考核管理员" value="3" />
+                <el-option label="指标自动采集" value="4" />
               </el-select>
             </el-form-item>
             <el-form-item label="评分方式" label-position="top">

+ 95 - 82
src/views/evaluate/children/change/manage.vue

@@ -7,6 +7,7 @@ import { ref, reactive } from "vue";
 import addExam from "./manage/addExam.vue";
 import { ElMessage, ElMessageBox } from "element-plus";
 import { Search } from "@element-plus/icons-vue";
+import manageObject from "./mould/manageObject.vue";
 import dayjs from "dayjs";
 import {
   getAssessmentPageList,
@@ -14,6 +15,8 @@ import {
   postCopyAssessment
 } from "@/api/manage";
 import { assessmentStatus, getStateType } from "@/config/tag";
+const manageObjectRef = ref();
+const manageObjectShow = ref(false);
 const addExamRef = ref();
 const addExamShow = ref(false);
 const router = useRouter();
@@ -43,8 +46,11 @@ getAssessmentPageListApi();
 const handleRowClick = (row: any) => {
   console.log(row);
 };
+const manageObjectItme = ref({});
 const setEdit = (row: any) => {
-  router.push({ path: "/evaluate/children/change/mould/manageObject" });
+  // router.push({ path: "/evaluate/children/change/mould/manageObject" });\
+  manageObjectShow.value = true;
+  Object.assign(manageObjectItme.value, row);
 };
 // 删除
 const setDelete = (row: any) => {
@@ -98,91 +104,98 @@ const saveCopy = async () => {
 <template>
   <div class="w-[100%]">
     <!-- 发起考核 -->
-    <addExam ref="addExamRef" v-model="addExamShow" />
-    <div class="mb-2 flex gap-2 justify-between flex-wrap">
-      <div class="flex mt-2">
-        <div class="flex mr-2">
-          <el-input
-            v-model="params.params.name"
-            style="width: 500px"
-            placeholder="搜索考核模板"
-            :prefix-icon="Search"
-            clearable
-            @change="getAssessmentPageListApi"
-          />
+    <addExam
+      ref="addExamRef"
+      v-model="addExamShow"
+      @addHandClick="getAssessmentPageListApi"
+    />
+    <manageObject v-if="manageObjectShow" :message="manageObjectItme" />
+    <div v-else>
+      <div class="mb-2 flex gap-2 justify-between flex-wrap">
+        <div class="flex mt-2">
+          <div class="flex mr-2">
+            <el-input
+              v-model="params.params.name"
+              style="width: 500px"
+              placeholder="搜索考核模板"
+              :prefix-icon="Search"
+              clearable
+              @change="getAssessmentPageListApi"
+            />
+          </div>
+        </div>
+        <div class="flex pt-2 mr-6">
+          <el-button type="primary" class="mr-8" @click="newAdd"
+            >发起考核</el-button
+          >
         </div>
       </div>
-      <div class="flex pt-2 mr-6">
-        <el-button type="primary" class="mr-8" @click="newAdd"
-          >发起考核</el-button
+      <div class="mt-8">
+        <el-table
+          :data="params.tableData"
+          style="width: 100%"
+          max-height="250"
+          @row-click="handleRowClick"
         >
+          <el-table-column prop="name" label="考核名称" width="300" fixed />
+          <el-table-column prop="cycle" label="周期" />
+          <el-table-column prop="cycleValue" label="执行期" />
+          <el-table-column prop="name" label="考核模板" width="250" />
+          <el-table-column prop="assessmentStatus" label="状态">
+            <template #default="{ row }">
+              <el-tag :type="getStateType(row.assessmentStatus)">
+                {{ assessmentStatus(row.assessmentStatus) }}
+              </el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column prop="createUser" label="创建人" />
+          <el-table-column prop="updateTime" label="更新时间">
+            <template #default="{ row }">
+              <div v-if="row.updateTime">
+                {{ dayjs(row.updateTime).format("YYYY-MM-DD HH:mm:ss") }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" width="150" fixed="right">
+            <template #default="{ row }">
+              <!-- <el-button link :icon="Edit" /> -->
+              <el-dropdown trigger="click">
+                <span class="el-dropdown-link navbar-bg-hover select-none">
+                  <el-icon @click="setEdit(row)"><Edit /></el-icon>
+                </span>
+              </el-dropdown>
+              <el-dropdown class="ml-2" trigger="click">
+                <span class="el-dropdown-link navbar-bg-hover select-none">
+                  <el-icon><More /></el-icon>
+                </span>
+                <template #dropdown>
+                  <el-dropdown-menu class="setting">
+                    <el-dropdown-item @click="setDelete(row)">
+                      <el-text type="danger">删除</el-text>
+                    </el-dropdown-item>
+                    <el-dropdown-item @click="copyManage(row)">
+                      复制
+                    </el-dropdown-item>
+                  </el-dropdown-menu>
+                </template>
+              </el-dropdown>
+            </template>
+          </el-table-column>
+        </el-table>
       </div>
-    </div>
-    <div class="mt-8">
-      <el-table
-        :data="params.tableData"
-        style="width: 100%"
-        max-height="250"
-        @row-click="handleRowClick"
-      >
-        <el-table-column prop="name" label="考核名称" width="300" fixed />
-        <el-table-column prop="cycle" label="周期" />
-        <el-table-column prop="cycleValue" label="执行期" />
-        <el-table-column prop="name" label="考核模板" width="250" />
-        <el-table-column prop="assessmentStatus" label="状态">
-          <template #default="{ row }">
-            <el-tag :type="getStateType(row.assessmentStatus)">
-              {{ assessmentStatus(row.assessmentStatus) }}
-            </el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column prop="createUser" label="创建人" />
-        <el-table-column prop="updateTime" label="更新时间">
-          <template #default="{ row }">
-            <div v-if="row.updateTime">
-              {{ dayjs(row.updateTime).format("YYYY-MM-DD HH:mm:ss") }}
-            </div>
-          </template>
-        </el-table-column>
-        <el-table-column label="操作" width="150" fixed="right">
-          <template #default="{ row }">
-            <!-- <el-button link :icon="Edit" /> -->
-            <el-dropdown trigger="click">
-              <span class="el-dropdown-link navbar-bg-hover select-none">
-                <el-icon @click="setEdit(row)"><Edit /></el-icon>
-              </span>
-            </el-dropdown>
-            <el-dropdown class="ml-2" trigger="click">
-              <span class="el-dropdown-link navbar-bg-hover select-none">
-                <el-icon><More /></el-icon>
-              </span>
-              <template #dropdown>
-                <el-dropdown-menu class="setting">
-                  <el-dropdown-item @click="setDelete(row)">
-                    <el-text type="danger">删除</el-text>
-                  </el-dropdown-item>
-                  <el-dropdown-item @click="copyManage(row)">
-                    复制
-                  </el-dropdown-item>
-                </el-dropdown-menu>
-              </template>
-            </el-dropdown>
-          </template>
-        </el-table-column>
-      </el-table>
-    </div>
-    <div class="flex justify-between item-center">
-      <div class="float-left mt-5 ml-2 total">共{{ params.total }}条数据</div>
-      <div class="float-right mt-8 mr-8">
-        <el-pagination
-          v-model:current-page="params.params.pageNumber"
-          v-model:page-size="params.params.pageSize"
-          background
-          layout="prev, pager, next"
-          :total="params.total"
-          @size-change="handleSizeChange"
-          @current-change="handleCurrentChange"
-        />
+      <div class="flex justify-between item-center">
+        <div class="float-left mt-5 ml-2 total">共{{ params.total }}条数据</div>
+        <div class="float-right mt-8 mr-8">
+          <el-pagination
+            v-model:current-page="params.params.pageNumber"
+            v-model:page-size="params.params.pageSize"
+            background
+            layout="prev, pager, next"
+            :total="params.total"
+            @size-change="handleSizeChange"
+            @current-change="handleCurrentChange"
+          />
+        </div>
       </div>
     </div>
     <el-dialog

+ 253 - 82
src/views/evaluate/children/change/manage/addExam.vue

@@ -1,34 +1,41 @@
 <script setup lang="ts">
 import { ref, reactive, nextTick } from "vue";
 import { ElMessageBox, ElMessage } from "element-plus";
+import { Calendar } from "@element-plus/icons-vue";
+import dayjs from "dayjs";
+import { postAddAssessment } from "@/api/assessment";
+import { postListTreeWithUser } from "@/api/department";
+import { getTemplateInfoList } from "@/api/templateInfo";
 import ElPicker from "@/components/ELPicker/index.vue";
+const $emit = defineEmits(["addHandClick"]);
 const dialogVisibleAdd = ref(false);
-const title = ref<String>("发起考核");
+const titleHeader = ref<any>("发起考核");
 // 季度 半年
 const ElPickerRef = ref();
 const form = reactive({
   name: "",
-  cycle: "",
+  cycle: "月度",
   cycleValue: "",
   assessmentType: null,
-  params: {
-    id: "",
-    tpName: "",
-    remark: "",
-    isDelete: "",
-    createUser: "",
-    createTime: "",
-    updateUser: "",
-    updateTime: "",
-    flowId: ""
-  },
-  assessmentObjectList: {
-    left: [{ value: "1" }],
-    right: [{ value: "1" }]
-  },
-  tpName: "",
-  remark: "",
-  isDelete: ""
+  // params: {
+  //   id: "",
+  //   tpName: "",
+  //   remark: "",
+  //   isDelete: "",
+  //   createUser: "",
+  //   createTime: "",
+  //   updateUser: "",
+  //   updateTime: "",
+  //   flowId: ""
+  // },
+  assessmentObjectList: [
+    {
+      assessmentObjectId: "",
+      assessmentObjectName: "",
+      assessmentModelId: "",
+      assessmentModelName: ""
+    }
+  ]
 });
 const rules = reactive({
   name: [
@@ -44,42 +51,55 @@ const formRightRules = reactive({
   right: [{ required: true, message: "请选择考核模板", trigger: "blur" }]
 });
 const handleClose = () => {
-  ElMessageBox.confirm("确认关闭弹窗吗?")
-    .then(() => {
-      dialogVisibleAdd.value = !dialogVisibleAdd.value;
-      ElMessage({
-        message: "已关闭"
-      });
-    })
-    .catch(() => {
-      // catch error
-    });
-};
-// 添加部门保存
-const saveDepartment = () => {
-  dialogVisibleAdd.value = false;
+  dialogVisibleAdd.value = !dialogVisibleAdd.value;
   ElMessage({
-    message: "添加成功",
-    type: "success"
+    message: "已关闭"
   });
+  // ElMessageBox.confirm("确认关闭弹窗吗?")
+  //   .then(() => {})
+  //   .catch(() => {
+  //     // catch error
+  //   });
+};
+// 添加部门保存
+const saveDepartment = async () => {
+  const { code, msg } = await postAddAssessment(form);
+  if (code === 200) {
+    ElMessage({
+      message: "添加成功",
+      type: "success"
+    });
+    $emit("addHandClick");
+    dialogVisibleAdd.value = false;
+  } else {
+    ElMessage.error(msg);
+  }
 };
 const open = (item: any, index: string) => {
+  postListTreeWithUserApi();
   if (item) {
-    title.value = index;
+    titleHeader.value = index;
   }
   dialogVisibleAdd.value = true;
 };
 const addNew = () => {
-  form.assessmentObjectList.right.push({ value: "" });
-  form.assessmentObjectList.left.push({ value: "" });
+  form.assessmentObjectList.push({
+    assessmentObjectId: "",
+    assessmentObjectName: "",
+    assessmentModelId: "",
+    assessmentModelName: ""
+  });
+  // form.assessmentObjectList.left.push({ value: "" });
 };
 const deleteItem = (index: any) => {
-  form.assessmentObjectList.left.splice(index, 1);
-  form.assessmentObjectList.right.splice(index, 1);
+  form.assessmentObjectList.splice(index, 1);
+  // form.assessmentObjectList.right.splice(index, 1);
 };
 // 单选
 const timeType = ref<any>("月度");
+const quarterValue = ref(true);
 const format = ref<any>("YYYY-MM");
+const pickerType = ref<any>("month");
 const handleRegionChange = (value: any) => {
   console.log(value);
   // form.date1 = "";
@@ -87,20 +107,119 @@ const handleRegionChange = (value: any) => {
   switch (value) {
     case "年度":
       format.value = "YYYY";
+      pickerType.value = "year";
       break;
     case "月度":
       format.value = "YYYY-MM";
+      pickerType.value = "month";
+
       break;
     case "日期":
       format.value = "YYYY-MM-DD";
+      pickerType.value = "";
+
+      break;
+    case "季度":
+      quarterValue.value = true;
+
+      break;
+    case "半年":
+      quarterValue.value = false;
+
+      break;
   }
-  if (value === "季度" || value === "半年") {
-    nextTick(() => {
-      ElPickerRef.value.open(value);
-    });
-    // console.log(ElPickerRef.value.open(value));
+};
+const yearTime = ref<any>(dayjs(new Date()).format("YYYY"));
+const decreaseYear = () => {
+  yearTime.value = dayjs().year(yearTime.value).subtract(1, "year").year(); // 减一年
+};
+const increaseYear = () => {
+  yearTime.value = dayjs().year(yearTime.value).add(1, "year").year(); // 加一年
+};
+const monthOne = item => {
+  let start = "";
+  let end = "";
+
+  switch (item) {
+    case "一季度":
+      start = `${yearTime.value}-01-01`;
+      end = `${yearTime.value}-03-31`;
+      break;
+    case "二季度":
+      start = `${yearTime.value}-04-01`;
+      end = `${yearTime.value}-06-30`;
+      break;
+    case "三季度":
+      start = `${yearTime.value}-07-01`;
+      end = `${yearTime.value}-09-30`;
+      break;
+    case "四季度":
+      start = `${yearTime.value}-10-01`;
+      end = `${yearTime.value}-12-31`;
+      break;
+    case "上半年":
+      start = `${yearTime.value}-01-01`;
+      end = `${yearTime.value}-06-30`;
+      break;
+    case "下半年":
+      start = `${yearTime.value}-07-01`;
+      end = `${yearTime.value}-12-31`;
+      break;
   }
+  form.cycleValue = `${yearTime.value}年${item}`;
+  console.log(start, end);
+  // return `从 ${start} 到 ${end}`; // 设置时间区间
+};
+// 部门人员与考核模板数据
+const treeDept = ref([]);
+const templateparams = reactive({
+  page: 1,
+  pageSize: 100
+});
+const resTmp = ref([]);
+const postListTreeWithUserApi = async () => {
+  const res = await postListTreeWithUser();
+  const { data, code } = await getTemplateInfoList(templateparams);
+  resTmp.value = data.records;
+  console.log(data);
+  treeDept.value = [];
+  treeDept.value = transformData(res.data);
+};
+
+function transformData(arr) {
+  return arr.map(item => {
+    const {
+      deptName: userName,
+      deptCode: userCode,
+      childrenRes,
+      ...rest
+    } = item;
+
+    return {
+      userName,
+      userCode,
+      childrenRes: childrenRes ? transformData(childrenRes) : [],
+      ...rest
+    };
+  });
+}
+const handleRreeSelect = (item, index) => {
+  // form.assessmentObjectList.forEach((itemObj, indexObj) => {
+  //   console.log(itemObj, indexObj);
+  //   // if (indexObj === index) {
+  //   //   itemObj.assessmentObjectName = item.assessmentObjectName;
+  //   // }
+  // });
 };
+const handleSelect = (item, index) => {
+  // form.assessmentObjectList.forEach((itemObj, indexObj) => {
+  //   console.log(itemObj, indexObj);
+  //   if (indexObj === index) {
+  //     itemObj.assessmentModelName = item.assessmentModelName;
+  //   }
+  // });
+};
+
 const monthTime = ref("");
 defineExpose({
   open
@@ -109,12 +228,7 @@ defineExpose({
 
 <template>
   <div>
-    <el-dialog
-      v-model="dialogVisibleAdd"
-      :title="title"
-      width="500"
-      :before-close="handleClose"
-    >
+    <el-dialog v-model="dialogVisibleAdd" :title="titleHeader" width="500">
       <el-form
         :model="form"
         label-width="auto"
@@ -134,30 +248,76 @@ defineExpose({
             <el-radio value="日期" size="large">日期</el-radio>
           </el-radio-group>
           <el-date-picker
-            v-if="timeType === '日期'"
+            v-if="
+              timeType === '月度' || timeType === '日期' || timeType === '年度'
+            "
             v-model="form.cycleValue"
-            type="daterange"
-            range-separator="至"
-            start-placeholder="开始时间"
-            end-placeholder="结束时间"
-          />
-          <ElPicker
-            v-else-if="timeType === '季度' || timeType === '半年'"
-            ref="ElPickerRef"
-            v-model="monthTime"
-          />
-          <el-date-picker
-            v-else
-            v-model="form.cycleValue"
-            type="year"
-            placeholder="请选择日期"
+            :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"
+              />
+            </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"
+                  >
+                    <el-icon><DArrowLeft /></el-icon>
+                  </div>
+                  <div>{{ yearTime }}</div>
+                  <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"
+                >
+                  <el-dropdown-item @click="monthOne('一季度')">
+                    一季度
+                  </el-dropdown-item>
+                  <el-dropdown-item @click="monthOne('二季度')">
+                    二季度
+                  </el-dropdown-item>
+                  <el-dropdown-item @click="monthOne('三季度')">
+                    三季度
+                  </el-dropdown-item>
+                  <el-dropdown-item @click="monthOne('四季度')">
+                    四季度
+                  </el-dropdown-item>
+                </div>
+                <div v-else class="flex justify-around align-center mt-5 mb-5">
+                  <el-dropdown-item @click="monthOne('上半年')">
+                    上半年
+                  </el-dropdown-item>
+                  <el-dropdown-item @click="monthOne('下半年')">
+                    下半年
+                  </el-dropdown-item>
+                </div>
+              </el-dropdown-menu>
+            </template>
+          </el-dropdown>
         </el-form-item>
         <el-form-item label="被考核类型">
           <el-select
             v-model="form.assessmentType"
-            placeholder="please select your zone"
+            placeholder="请选择被考核类型"
           >
             <el-option label="员工" :value="0" />
             <el-option label="部门" :value="1" />
@@ -179,18 +339,23 @@ defineExpose({
               >
                 <el-form-item label="被考核对象" prop="left">
                   <div
-                    v-for="(item, index) in form.assessmentObjectList.left"
+                    v-for="(item, index) in form.assessmentObjectList"
                     :key="index"
                     class="w-full mt-1"
                   >
-                    <el-select
-                      v-model="item.value"
-                      placeholder="please select your zone"
+                    <el-tree-select
+                      v-model="item.assessmentObjectId"
+                      :data="treeDept"
+                      :render-after-expand="false"
+                      show-checkbox
+                      :props="{
+                        label: 'userName',
+                        value: 'userCode',
+                        children: 'childrenRes'
+                      }"
                       style="width: 180px"
-                    >
-                      <el-option label="Zone one" value="shanghai" />
-                      <el-option label="Zone two" value="beijing" />
-                    </el-select>
+                      @change="handleRreeSelect(item, index)"
+                    />
                   </div>
                 </el-form-item>
               </el-form>
@@ -203,17 +368,23 @@ defineExpose({
               >
                 <el-form-item label="考核模板" prop="right">
                   <div
-                    v-for="(item, index) in form.assessmentObjectList.right"
+                    v-for="(item, index) in form.assessmentObjectList"
                     :key="index"
                     class="w-full flex mt-1"
                   >
                     <el-select
-                      v-model="item.value"
-                      placeholder="please select your zone"
+                      v-model="item.assessmentModelId"
+                      placeholder="请选择"
+                      filterable
                       style="width: 180px"
+                      @change="handleSelect(item, index)"
                     >
-                      <el-option label="Zone one" value="shanghai" />
-                      <el-option label="Zone two" value="beijing" />
+                      <el-option
+                        v-for="itemTmp in resTmp"
+                        :key="itemTmp.id"
+                        :label="itemTmp.tpName"
+                        :value="itemTmp.id"
+                      />
                     </el-select>
                     <div
                       v-if="index !== 0"

+ 0 - 0
src/views/evaluate/children/change/manage/importIndex.vue


+ 229 - 37
src/views/evaluate/children/change/mould/manageObject.vue

@@ -2,10 +2,125 @@
 defineOptions({
   name: "evaluateChangeManageObject"
 });
-import { getState, getStateType } from "@/config/tag";
-import { ref, reactive } from "vue";
+import { getState, getStateType, assessmentStatus } from "@/config/tag";
+import { ref, reactive, onMounted } from "vue";
+import {
+  getAssessmentQuotaDetails,
+  delAssessmentObject
+} from "@/api/assessment";
+import { getTemplateInfoList } from "@/api/templateInfo";
 import { useRouter } from "vue-router";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { treeDept, postListTreeWithUserApi } from "@/api/department";
 import { Search } from "@element-plus/icons-vue";
+import messagePerson from "./message.vue";
+const $props = defineProps({
+  message: {
+    type: Object
+  }
+});
+const valSelection = ref(false);
+const messageData = ref({});
+const initParams = reactive({
+  params: {
+    pageNumber: 1,
+    pageSize: 10,
+    userName: "",
+    modelName: "",
+    quotaName: "",
+    assessmentId: "",
+    orderField: "",
+    orderType: ""
+  },
+  tmpParams: {
+    page: 1,
+    pageSize: 100
+  },
+  list: [],
+  tmpList: []
+});
+onMounted(() => {
+  Object.assign(messageData.value, $props.message);
+  initParams.params.assessmentId = messageData.value.id;
+  getAssessmentQuotaDetailsApi();
+  getTemplateInfoListApi();
+  postListTreeWithUserApi();
+  console.log("onMounted", $props.message);
+});
+// 分页查询
+const getAssessmentQuotaDetailsApi = async () => {
+  const res = await getAssessmentQuotaDetails(initParams.tmpParams);
+  if (res.code === 200) {
+    initParams.tmpList = res.data.records;
+  }
+};
+// 考核模板
+const getTemplateInfoListApi = async () => {
+  const { data, code } = await getTemplateInfoList(initParams.params);
+  if (code == 200) {
+    initParams.tmpList = data.records;
+  }
+};
+// 删除
+const delParams = reactive({
+  assessmentId: "",
+  objectAddVoList: [
+    {
+      assessmentObjectId: "",
+      assessmentObjectName: ""
+    }
+  ]
+});
+// 被考核对象
+const addPersonParams = reactive({
+  assessmentId: "",
+  objectAddVoList: [
+    {
+      assessmentObjectId: "",
+      assessmentObjectName: ""
+    }
+  ]
+});
+const aaa = ref();
+const delAssessmentObjectApi = async () => {
+  if (valSelection.value) {
+    ElMessageBox.confirm(
+      "该员工考核删除后不可恢复,请谨慎操作!",
+      "确定删除该员工考核吗?",
+      {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }
+    ).then(async () => {
+      const { code, msg } = await delAssessmentObject(delParams);
+      if (code === 200) {
+        getAssessmentQuotaDetailsApi();
+        ElMessage.success("删除成功");
+      } else {
+        ElMessage.error(msg);
+      }
+    });
+  } else {
+    ElMessage.warning("请选择要删除的考核对象");
+  }
+};
+// 批量选中
+const changeSelection = val => {
+  if (val) {
+    valSelection.value = true;
+    delParams.assessmentId = messageData.value.id;
+    addPersonParams.assessmentId = messageData.value.id;
+    val.forEach((item, index) => {
+      delParams.objectAddVoList.forEach((item1, index1) => {
+        if (index == index1) {
+          item1.assessmentObjectId = item.id;
+          item1.assessmentObjectName = item.name;
+        }
+      });
+    });
+  }
+};
 const router = useRouter();
 const activeName = ref("first");
 const tableData = [
@@ -34,12 +149,30 @@ const tableData = [
     show: false
   }
 ];
-const setEdit = (row: any) => {};
-const setDelete = (row: any) => {};
 // 批量导入
 const addsImport = () => {
   router.push("/import/index");
 };
+const publishShow = ref(true);
+const publish = () => {
+  publishShow.value = false;
+  ElMessage({
+    message: "成功",
+    type: "success"
+  });
+};
+// 添加被考核人
+const dialogVisibleAdd = ref(false);
+const handleRreeSelect = data => {
+  console.log("1111111", data);
+};
+const dialogVisibleAddShow = () => {
+  dialogVisibleAdd.value = true;
+};
+// 跳转对应科室
+const GoView = row => {
+  router.push("/evaluate/children/change/mould/view");
+};
 </script>
 
 <template>
@@ -53,41 +186,75 @@ const addsImport = () => {
         </div>
         <div>
           <div class="flex items-center justify-between">
-            <h5>恩泽医院外科片区评估</h5>
-            <el-tag class="ml-2" :type="getStateType(0)">
-              {{ getState(0) }}
+            <h5>{{ messageData.name }}</h5>
+            <el-tag :type="getStateType(messageData.assessmentStatus)">
+              {{ assessmentStatus(messageData.assessmentStatus) }}
             </el-tag>
           </div>
-          <el-text type="info" class="text-xs">2023/01/01-2016/05/01</el-text>
+          <el-text type="info" class="text-xs">
+            {{ messageData.cycleValue }}
+          </el-text>
         </div>
       </div>
       <div class="mr-10">
-        <el-button type="primary">公布考核结果</el-button>
+        <el-button v-if="publishShow" type="primary" @click="publish"
+          >公布考核结果</el-button
+        >
       </div>
     </div>
-    <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
+    <el-tabs v-model="activeName" class="demo-tabs">
       <el-tab-pane label="考核对象" name="first">
         <div class="w-full flex items-center justify-between">
           <div class="w-1/2 flex items-center justify-between">
             <el-text class="w-1/5">考核模板</el-text>
-            <el-input class="ml-1" />
-            <el-input class="ml-2" :prefix-icon="Search" />
+            <el-select
+              v-model="initParams.params.modelName"
+              placeholder="请选择"
+              filterable
+              clearable
+              style="width: 250px"
+              @change="getAssessmentQuotaDetailsApi"
+            >
+              <el-option
+                v-for="itemTmp in initParams.tmpList"
+                :key="itemTmp.id"
+                :label="itemTmp.tpName"
+                :value="itemTmp.tpName"
+              />
+            </el-select>
+            <el-input
+              v-model="initParams.params.userName"
+              class="ml-2"
+              clearable
+              placeholder="搜索人员"
+              :prefix-icon="Search"
+              @change="getAssessmentQuotaDetailsApi"
+            />
           </div>
           <div class="mr-10">
             <el-button type="primary" plain>批量调整执行人</el-button>
             <el-button type="primary" plain>批量重置流程</el-button>
-            <el-button type="primary" plain>批量删除</el-button>
-            <el-button type="primary" plain>添加被考核人</el-button>
+            <el-button type="primary" plain @click="delAssessmentObjectApi">
+              批量删除
+            </el-button>
+            <el-button type="primary" plain @click="dialogVisibleAddShow"
+              >添加被考核人</el-button
+            >
           </div>
         </div>
         <el-table
-          :data="tableData"
+          :data="initParams.list"
           style="width: 100%"
           max-height="250"
-          @row-click="handleRowClick"
+          @selection-change="changeSelection"
         >
           <el-table-column type="selection" width="55" />
-          <el-table-column prop="address" label="考核名称" width="300" fixed />
+          <el-table-column
+            prop="assessmentModelName"
+            label="考核名称"
+            width="300"
+            fixed
+          />
           <el-table-column prop="date" label="周期" width="250" />
           <el-table-column prop="name" label="执行期" width="250" />
           <el-table-column prop="name" label="考核模板" width="300" />
@@ -97,24 +264,7 @@ const addsImport = () => {
           <el-table-column label="操作" width="200" fixed="right">
             <template #default="{ row }">
               <!-- <el-button link :icon="Edit" /> -->
-              <el-dropdown trigger="click">
-                <span class="el-dropdown-link navbar-bg-hover select-none">
-                  <el-icon @click="setEdit(row)"><Edit /></el-icon>
-                </span>
-              </el-dropdown>
-              <el-dropdown class="ml-2" trigger="click">
-                <span class="el-dropdown-link navbar-bg-hover select-none">
-                  <el-icon><More /></el-icon>
-                </span>
-                <template #dropdown>
-                  <el-dropdown-menu class="setting">
-                    <el-dropdown-item @click="setDelete(row)">
-                      <el-text type="danger">删除</el-text>
-                    </el-dropdown-item>
-                    <el-dropdown-item> 复制 </el-dropdown-item>
-                  </el-dropdown-menu>
-                </template>
-              </el-dropdown>
+              <el-icon @click="GoView(row)"><View /></el-icon>
             </template>
           </el-table-column>
         </el-table>
@@ -133,9 +283,51 @@ const addsImport = () => {
           </div>
         </div>
       </el-tab-pane>
-      <el-tab-pane label="统计分析" name="third">Role</el-tab-pane>
-      <el-tab-pane label="基础信息" name="fourth">Task</el-tab-pane>
+      <el-tab-pane label="统计分析" name="third">
+        <!--  -->
+      </el-tab-pane>
+      <el-tab-pane label="基础信息" name="fourth">
+        <messagePerson />
+      </el-tab-pane>
     </el-tabs>
+    <!-- 添加被考核人 -->
+    <el-dialog v-model="dialogVisibleAdd" title="添加被考核人" width="744">
+      <div>
+        <el-form
+          ref="ruleFormRef"
+          label-position="top"
+          label-width="auto"
+          :model="addPersonParams"
+        >
+          <el-form-item label="维度权重" label-position="top">
+            <el-tree-select
+              v-model="aaa"
+              :data="treeDept"
+              multiple
+              :props="{
+                label: 'userName',
+                value: 'userCode',
+                children: 'childrenRes'
+              }"
+              :render-after-expand="false"
+              show-checkbox
+              check-strictly
+              check-on-click-node
+              style="width: 240px"
+              @node-click="handleRreeSelect"
+            />
+          </el-form-item>
+        </el-form>
+      </div>
+      <template #footer>
+        <div class="dialog-footer w-full flex justify-between mt-4">
+          <div>
+            <el-button>取消</el-button>
+            <el-button type="primary"> 确认 </el-button>
+          </div>
+        </div>
+      </template>
+    </el-dialog>
   </div>
 </template>
 

+ 358 - 0
src/views/evaluate/children/change/mould/message.vue

@@ -0,0 +1,358 @@
+<script setup lang="ts">
+import { ref, reactive, nextTick } from "vue";
+import { ElMessageBox, ElMessage } from "element-plus";
+import { Calendar } from "@element-plus/icons-vue";
+import dayjs from "dayjs";
+import { postAddAssessment } from "@/api/assessment";
+import { postListTreeWithUser } from "@/api/department";
+import { getTemplateInfoList } from "@/api/templateInfo";
+import ElPicker from "@/components/ELPicker/index.vue";
+const $emit = defineEmits(["addHandClick"]);
+const dialogVisibleAdd = ref(false);
+const btn = ref(true);
+const btnShow = () => {
+  btn.value = false;
+};
+// 季度 半年
+const ElPickerRef = ref();
+const form = reactive({
+  name: "",
+  cycle: "月度",
+  cycleValue: "",
+  assessmentType: null,
+  assessmentObjectList: [
+    {
+      assessmentObjectId: "",
+      assessmentObjectName: "",
+      assessmentModelId: "",
+      assessmentModelName: ""
+    }
+  ]
+});
+const rules = reactive({
+  name: [{ required: true, message: "请填写名称", trigger: "blur" }]
+});
+const formLeftRules = reactive({
+  left: [{ required: true, message: "请选择考核指标", trigger: "blur" }],
+  value: [{ required: true, message: "请选择被考核对象", trigger: "blur" }]
+});
+const formRightRules = reactive({
+  left: [{ required: true, message: "请选择考核指标", trigger: "blur" }],
+  right: [{ required: true, message: "请选择考核模板", trigger: "blur" }]
+});
+const handleClose = () => {
+  btn.value = true;
+};
+// 添加部门保存
+const saveDepartment = async () => {
+  btn.value = true;
+};
+const addNew = () => {
+  form.assessmentObjectList.push({
+    assessmentObjectId: "",
+    assessmentObjectName: "",
+    assessmentModelId: "",
+    assessmentModelName: ""
+  });
+  // form.assessmentObjectList.left.push({ value: "" });
+};
+const deleteItem = (index: any) => {
+  form.assessmentObjectList.splice(index, 1);
+  // form.assessmentObjectList.right.splice(index, 1);
+};
+// 单选
+const timeType = ref<any>("月度");
+const quarterValue = ref(true);
+const format = ref<any>("YYYY-MM");
+const pickerType = ref<any>("month");
+const handleRegionChange = (value: any) => {
+  console.log(value);
+  // form.date1 = "";
+  timeType.value = value;
+  switch (value) {
+    case "年度":
+      format.value = "YYYY";
+      pickerType.value = "year";
+      break;
+    case "月度":
+      format.value = "YYYY-MM";
+      pickerType.value = "month";
+
+      break;
+    case "日期":
+      format.value = "YYYY-MM-DD";
+      pickerType.value = "";
+
+      break;
+    case "季度":
+      quarterValue.value = true;
+
+      break;
+    case "半年":
+      quarterValue.value = false;
+
+      break;
+  }
+};
+const yearTime = ref<any>(dayjs(new Date()).format("YYYY"));
+const decreaseYear = () => {
+  yearTime.value = dayjs().year(yearTime.value).subtract(1, "year").year(); // 减一年
+};
+const increaseYear = () => {
+  yearTime.value = dayjs().year(yearTime.value).add(1, "year").year(); // 加一年
+};
+const monthOne = item => {
+  let start = "";
+  let end = "";
+
+  switch (item) {
+    case "一季度":
+      start = `${yearTime.value}-01-01`;
+      end = `${yearTime.value}-03-31`;
+      break;
+    case "二季度":
+      start = `${yearTime.value}-04-01`;
+      end = `${yearTime.value}-06-30`;
+      break;
+    case "三季度":
+      start = `${yearTime.value}-07-01`;
+      end = `${yearTime.value}-09-30`;
+      break;
+    case "四季度":
+      start = `${yearTime.value}-10-01`;
+      end = `${yearTime.value}-12-31`;
+      break;
+    case "上半年":
+      start = `${yearTime.value}-01-01`;
+      end = `${yearTime.value}-06-30`;
+      break;
+    case "下半年":
+      start = `${yearTime.value}-07-01`;
+      end = `${yearTime.value}-12-31`;
+      break;
+  }
+  form.cycleValue = `${yearTime.value}年${item}`;
+  console.log(start, end);
+  // return `从 ${start} 到 ${end}`; // 设置时间区间
+};
+// 部门人员与考核模板数据
+const treeDept = ref([]);
+const templateparams = reactive({
+  page: 1,
+  pageSize: 100
+});
+const resTmp = ref([]);
+const postListTreeWithUserApi = async () => {
+  const res = await postListTreeWithUser();
+  const { data, code } = await getTemplateInfoList(templateparams);
+  resTmp.value = data.records;
+  console.log(data);
+  treeDept.value = [];
+  treeDept.value = transformData(res.data);
+};
+
+function transformData(arr) {
+  return arr.map(item => {
+    const {
+      deptName: userName,
+      deptCode: userCode,
+      childrenRes,
+      ...rest
+    } = item;
+
+    return {
+      userName,
+      userCode,
+      childrenRes: childrenRes ? transformData(childrenRes) : [],
+      ...rest
+    };
+  });
+}
+</script>
+
+<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-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 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"
+        >
+          <span class="el-dropdown-link navbar-bg-hover select-none">
+            <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"
+                >
+                  <el-icon><DArrowLeft /></el-icon>
+                </div>
+                <div>{{ yearTime }}</div>
+                <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"
+              >
+                <el-dropdown-item @click="monthOne('一季度')">
+                  一季度
+                </el-dropdown-item>
+                <el-dropdown-item @click="monthOne('二季度')">
+                  二季度
+                </el-dropdown-item>
+                <el-dropdown-item @click="monthOne('三季度')">
+                  三季度
+                </el-dropdown-item>
+                <el-dropdown-item @click="monthOne('四季度')">
+                  四季度
+                </el-dropdown-item>
+              </div>
+              <div v-else class="flex justify-around align-center mt-5 mb-5">
+                <el-dropdown-item @click="monthOne('上半年')">
+                  上半年
+                </el-dropdown-item>
+                <el-dropdown-item @click="monthOne('下半年')">
+                  下半年
+                </el-dropdown-item>
+              </div>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+      </el-form-item>
+      <el-form-item label="被考核类型">
+        <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"
+      >
+        <div class="w-full flex">
+          <div class="w-1/3">
+            <el-form
+              label-position="top"
+              :model="form.assessmentObjectList"
+              :rules="formLeftRules"
+            >
+              <el-form-item label="被考核对象" prop="left">
+                <div
+                  v-for="(item, index) in form.assessmentObjectList"
+                  :key="index"
+                  class="w-full mt-1"
+                >
+                  <el-tree-select
+                    v-model="item.assessmentObjectId"
+                    :data="treeDept"
+                    :render-after-expand="false"
+                    show-checkbox
+                    disabled
+                    :props="{
+                      label: 'userName',
+                      value: 'userCode',
+                      children: 'childrenRes'
+                    }"
+                    style="width: 180px"
+                  />
+                </div>
+              </el-form-item>
+            </el-form>
+          </div>
+          <div class="w-1/2 ml-7">
+            <el-form
+              label-position="top"
+              :model="form.assessmentObjectList"
+              :rules="formRightRules"
+            >
+              <el-form-item label="考核模板" prop="right">
+                <div
+                  v-for="(item, index) in form.assessmentObjectList"
+                  :key="index"
+                  class="w-full flex mt-1"
+                >
+                  <el-select
+                    v-model="item.assessmentModelId"
+                    disabled
+                    placeholder="请选择"
+                    filterable
+                    style="width: 180px"
+                  >
+                    <el-option
+                      v-for="itemTmp in resTmp"
+                      :key="itemTmp.id"
+                      :label="itemTmp.tpName"
+                      :value="itemTmp.id"
+                    />
+                  </el-select>
+                </div>
+              </el-form-item>
+            </el-form>
+          </div>
+        </div>
+      </el-form-item>
+    </el-form>
+    <el-button
+      v-if="btn"
+      class="float-right mt-4"
+      type="warning"
+      @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>
+    </div>
+  </div>
+</template>

+ 4 - 0
src/views/login/index.vue

@@ -79,7 +79,11 @@ const onLogin = async (formEl: FormInstance | undefined) => {
             //   message("登录成功", { type: "success" });
             // });
             router.push("/");
+            console.log("登录成功", res);
             message("登录成功", { type: "success" });
+          } else {
+            // @ts-ignore
+            message(res.msg, { type: "error" });
           }
         });
     } else {