Ver Fonte

feat: 权限-考核

ystl_myq há 7 meses atrás
pai
commit
364e601a9a

+ 10 - 0
src/api/assessment.ts

@@ -20,6 +20,16 @@ export const postAddAssessmentObject = data => {
     data
   });
 };
+// 考核信息详情(考核对象)
+export const getAssessmentObjectDetails = params => {
+  return http.request<addDeptList>(
+    "get",
+    "/assessment/getAssessmentObjectDetails",
+    {
+      params
+    }
+  );
+};
 // 考核详情
 export const getAssessmentDetails = params => {
   return http.request<addDept>("get", "/assessment/getAssessmentDetails", {

+ 22 - 14
src/api/department.ts

@@ -38,20 +38,28 @@ export const postListTreeWithUserApi = async () => {
   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
+const transformData = data => {
+  return data.map(item => {
+    const transformedItem = {
+      userName: item.userName || item.deptName,
+      userCode: item.userCode || item.deptCode,
+      children: []
     };
+
+    if (item.childrenRes) {
+      transformedItem.children = transformData(item.childrenRes);
+    }
+
+    if (item.childrenUserRes) {
+      item.childrenUserRes.forEach(user => {
+        transformedItem.children.push({
+          userName: user.userName,
+          userCode: user.userCode,
+          children: []
+        });
+      });
+    }
+
+    return transformedItem;
   });
 };

+ 11 - 0
src/api/menu.ts

@@ -5,6 +5,11 @@ type ResultList = {
   msg: string;
   data: Array<any>;
 };
+type Result = {
+  code: number;
+  msg: string;
+  data: boolean;
+};
 // 查询所有菜单
 export const getMenuList = () => {
   return http.request<ResultList>("get", "/sysMenu/menuList");
@@ -30,3 +35,9 @@ export const delByCode = params => {
     params
   });
 };
+// 更新菜单
+export const updateMenu = params => {
+  return http.request<Result>("get", "/sysMenu/updateMenu", {
+    params
+  });
+};

+ 11 - 1
src/api/roles.ts

@@ -26,7 +26,7 @@ export const postDelRole = data => {
 export const postAddRole = data => {
   return http.request<pageRole>("post", "/sysRole/addRole", { data });
 };
-// 修改角色名称
+// 修改角色信息
 export const postUpdateRole = data => {
   return http.request<pageRole>("post", "/sysRole/updateRole", { data });
 };
@@ -36,3 +36,13 @@ export const postPageUserByRole = data => {
     data
   });
 };
+// 根据角色code查询菜单信息编码
+export const getUserPermissionsByRoleCode = params => {
+  return http.request<pageRoleList>(
+    "get",
+    "/sysRole/getUserPermissionsByRoleCode",
+    {
+      params
+    }
+  );
+};

+ 13 - 1
src/api/select.ts

@@ -2,6 +2,7 @@ import { http } from "@/utils/http";
 import { ref } from "vue";
 export const select = ref<any>([]);
 export const selectFrom = ref<any>([]);
+export const selectRank = ref<any>([]);
 // 字典
 type QuotaPageList = {
   code: number;
@@ -24,7 +25,18 @@ export const getFromSelectDictListtApi = async () => {
   const { code, data } = await selectDictList({ dictType: "2" });
   if (code == 200) {
     selectFrom.value = data;
-    console.log("11111", data);
+    return data;
+  }
+};
+// 职称
+export const getFromSelectDictRankApi = async () => {
+  const { code, data } = await selectDictList({ dictType: "4" });
+  if (code == 200) {
+    data.forEach(item => {
+      if (item.dictTypeName == "医师分类") {
+        selectRank.value.push(item);
+      }
+    });
     return data;
   }
 };

+ 1 - 0
src/components/UserPageTable/index.vue

@@ -70,6 +70,7 @@ defineExpose({
         style="max-width: 300px"
         clearable
         @change="postOrganizationUserPageApi"
+        @keyup.enter="postOrganizationUserPageApi"
       />
       <slot name="add-button" />
       <!-- <el-button type="primary" @click="AddPerson">添加成员</el-button> -->

+ 5 - 2
src/layout/components/sidebar/vertical.vue

@@ -96,8 +96,10 @@ onBeforeUnmount(() => {
       <Logo v-if="showLogo" :collapse="isCollapse" />
       <el-scrollbar
         wrap-class="scrollbar-wrapper"
-        :class="[device === 'mobile' ? 'mobile' : 'pc']"
-        class="bottomRR"
+        :class="[
+          device === 'mobile' ? 'mobile' : 'pc',
+          route.name === 'Welcome' ? '' : 'bottomRR'
+        ]"
         style="background-color: #d5e8fb"
       >
         <el-menu
@@ -151,6 +153,7 @@ onBeforeUnmount(() => {
   z-index: 9999;
   width: 500px !important;
   height: 500px;
+  margin-bottom: 20px;
 }
 
 :deep(.el-loading-mask) {

+ 5 - 3
src/router/utils.ts

@@ -29,7 +29,7 @@ import draw from "@/routerList/draw";
 import evaluate from "@/routerList/evaluate";
 import home from "@/routerList/home";
 import _import from "@/routerList/import";
-import index from "@/routerList/index";
+import indexDefine from "@/routerList/index";
 import other from "@/routerList/other";
 import password from "@/routerList/password";
 const muenList = [
@@ -38,7 +38,7 @@ const muenList = [
   evaluate,
   home,
   _import,
-  index,
+  indexDefine,
   other,
   password
 ];
@@ -46,7 +46,6 @@ const btnList = ref([]);
 getMenuListForUser().then(({ data }) => {
   console.log("dataqqqqAAA", data);
 });
-
 // ------------------------------------
 const IFrame = () => import("@/layout/frameView.vue");
 // https://cn.vitejs.dev/guide/features.html#glob-import
@@ -284,6 +283,8 @@ function initRouter() {
           addAuths(cleanEmptyChildren(menuDataList), btnList.value);
           handleAsyncRoutes(cloneDeep(cleanEmptyChildren(menuDataList)));
           storageLocal().setItem(key, cleanEmptyChildren(menuDataList));
+          console.log("指标没有了2222", cleanEmptyChildren(menuDataList));
+
           resolve(router);
         });
       });
@@ -294,6 +295,7 @@ function initRouter() {
         let menuDataList = matchAndMerge(data, muenList);
         addAuths(cleanEmptyChildren(menuDataList), btnList.value);
         handleAsyncRoutes(cloneDeep(cleanEmptyChildren(menuDataList)));
+        console.log("指标没有了1111", cleanEmptyChildren(menuDataList));
         resolve(router);
       });
     });

+ 20 - 20
src/routerList/evaluate.ts

@@ -1,6 +1,6 @@
 // evaluateIndex;
 import server3 from "@/assets/icon-png/menuList/server (3).svg";
-import server4 from "@/assets/icon-png/menuList/server (4).svg";
+// import server4 from "@/assets/icon-png/menuList/server (4).svg";
 import layer from "@/assets/svg/layers (2).svg";
 
 // 最简代码,也就是这些字段必须有
@@ -68,25 +68,25 @@ export default {
           }
         }
       ]
-    },
-    {
-      path: "/evaluate/children/exam",
-      name: "evaluateExam",
-      meta: {
-        title: "我的考核",
-        icon: server4
-      },
-      children: [
-        {
-          path: "/evaluate/children/exam/index",
-          name: "evaluateExamIndex",
-          component: () => import("@/views/evaluate/children/exam/index.vue"),
-          meta: {
-            title: "代办事项",
-            showParent: true
-          }
-        }
-      ]
     }
+    // {
+    //   path: "/evaluate/children/exam",
+    //   name: "evaluateExam",
+    //   meta: {
+    //     title: "我的考核",
+    //     icon: server4
+    //   },
+    //   children: [
+    //     {
+    //       path: "/evaluate/children/exam/index",
+    //       name: "evaluateExamIndex",
+    //       component: () => import("@/views/evaluate/children/exam/index.vue"),
+    //       meta: {
+    //         title: "代办事项",
+    //         showParent: true
+    //       }
+    //     }
+    //   ]
+    // }
   ]
 } satisfies RouteConfigsTable;

+ 4 - 16
src/routerList/index.ts

@@ -1,15 +1,14 @@
 // 最简代码,也就是这些字段必须有
 import server from "@/assets/icon-png/menuList/server (1).svg";
-// import menuIndex from "@/assets/svg/layers.svg?component";
+import menuIndex from "@/assets/svg/layers.svg?component";
 export default {
   path: "/IndexDefine",
   meta: {
     title: "指标库",
-    // icon: menuIndex,
-    icon: "menu-index",
+    icon: menuIndex,
+    // icon: "menu-index",
     rank: 1
   },
-  // component: () => import("@/views/indexDefine/children/define.vue"),
   children: [
     {
       path: "/IndexDefine/index",
@@ -21,7 +20,7 @@ export default {
       children: [
         {
           path: "/IndexDefine/children/define",
-          name: "IndexDefine",
+          name: "IndexChildrenDefine",
           component: () => import("@/views/indexDefine/children/define.vue"),
           meta: {
             auths: [],
@@ -29,17 +28,6 @@ export default {
             // 是否继承父菜单显示,默认false
             showParent: true
           }
-          // children: [
-          //   {
-          //     path: "/IndexDefine/children/import/index",
-          //     name: "IndexDefineImport",
-          //     component: () =>
-          //       import("@/views/indexDefine/children/import/index.vue"),
-          //     meta: {
-          //       title: "指标定义"
-          //     }
-          //   }
-          // ]
         }
       ]
     }

+ 39 - 18
src/views/background/framework/proson/components/addPerson.vue

@@ -2,6 +2,7 @@
 import { ref, reactive, nextTick } from "vue";
 import { ElMessageBox, ElMessage } from "element-plus";
 import { postDeptUserAdd, postListTree } from "@/api/department";
+import { getFromSelectDictRankApi, selectRank } from "@/api/select";
 const dialogVisibleAdd = ref(false);
 const treeSelectRef = ref(null);
 const postOrganizationUserPage = ref(null);
@@ -70,6 +71,7 @@ const open = (row, postOrganizationUserPageApi) => {
     dialogVisibleAdd.value = true;
     postOrganizationUserPage.value = postOrganizationUserPageApi;
     postListTreeApi();
+    getFromSelectDictRankApi();
   } else {
     ElMessage.warning("请选择部门");
   }
@@ -84,6 +86,29 @@ const openTreeFocus = async () => {
     }
   }
 };
+const rules = reactive({
+  realName: [
+    {
+      required: true,
+      message: "请填写姓名",
+      trigger: "blur"
+    }
+  ],
+  hospitalCode: [
+    {
+      required: true,
+      message: "请填写工号",
+      trigger: "blur"
+    }
+  ],
+  deptCode: [
+    {
+      required: true,
+      message: "请选择部门",
+      trigger: "blur"
+    }
+  ]
+});
 defineExpose({
   open
 });
@@ -96,25 +121,16 @@ defineExpose({
         ref="formRef"
         :model="form"
         label-width="auto"
+        :rules="rules"
         style="max-width: 600px"
       >
-        <el-form-item
-          prop="name"
-          label="姓名"
-          :rules="[
-            {
-              required: true,
-              message: '请填写部门名称',
-              trigger: 'blur'
-            }
-          ]"
-        >
+        <el-form-item prop="realName" label="姓名">
           <el-input v-model="form.realName" />
         </el-form-item>
-        <el-form-item label="工号">
+        <el-form-item prop="hospitalCode" label="工号">
           <el-input v-model="form.hospitalCode" />
         </el-form-item>
-        <el-form-item label="部门">
+        <el-form-item prop="deptCode" label="部门">
           <el-tree-select
             ref="treeSelectRef"
             v-model="form.deptCode"
@@ -127,7 +143,6 @@ defineExpose({
             filterable
             check-strictly
             :render-after-expand="false"
-            style="width: 240px"
             node-key="deptCode"
             @focus="openTreeFocus"
           />
@@ -138,13 +153,19 @@ defineExpose({
             <el-option label="女" value="女" />
           </el-select>
         </el-form-item>
-        <el-form-item label="年龄">
-          <el-input />
+        <el-form-item label="出生日期">
+          <!-- <el-input /> -->
+          <!-- v-model="form.gender" -->
+          <el-date-picker type="date" placeholder="请选择出生日期" />
         </el-form-item>
         <el-form-item label="职称">
           <el-select v-model="form.jobTitle" placeholder="请选择职称">
-            <el-option label="Zone one" value="shanghai" />
-            <el-option label="Zone two" value="beijing" />
+            <el-option
+              v-for="(item, index) in selectRank"
+              :key="index"
+              :label="item.dictValue"
+              :value="item.dictValue"
+            />
           </el-select>
         </el-form-item>
         <el-form-item label="手机号">

+ 16 - 11
src/views/background/framework/proson/components/newDepartment.vue

@@ -34,7 +34,6 @@ const postListTreeApi = async () => {
     optiones.parentOptions = data;
   }
 };
-postListTreeApi();
 // 负责人
 const userList = ref({
   username: "",
@@ -77,6 +76,7 @@ const saveDepartment = () => {
 };
 const open = node => {
   dialogVisibleAdd.value = true;
+  postListTreeApi();
   if (node) {
     // form.leader
     form.deptName = "";
@@ -118,20 +118,25 @@ defineExpose({
             }
           ]"
         >
-          <el-input v-model="form.deptName" />
+          <el-input v-model="form.deptName" placeholder="请填写部门名称" />
         </el-form-item>
         <el-form-item label="部门编号">
-          <el-input v-model="form.deptCode" />
+          <el-input v-model="form.deptCode" placeholder="请输入部门编号" />
         </el-form-item>
         <el-form-item label="上级部门">
-          <el-select v-model="form.parentCode" placeholder="请选择上级部门">
-            <el-option
-              v-for="item in optiones.parentOptions"
-              :key="item.value"
-              :label="item.deptName"
-              :value="item.deptCode"
-            />
-          </el-select>
+          <el-tree-select
+            v-model="form.parentCode"
+            :data="optiones.parentOptions"
+            check-strictly
+            filterable
+            clearable
+            :props="{
+              label: 'deptName',
+              value: 'deptCode',
+              children: 'childrenRes'
+            }"
+            placeholder="请选择部门"
+          />
         </el-form-item>
         <el-form-item label="部门负责人">
           <el-select v-model="form.leader" placeholder="请选择部门负责人">

+ 28 - 5
src/views/background/framework/proson/components/prosonEditDrawer.vue

@@ -2,7 +2,7 @@
 import { ref, reactive } from "vue";
 import { ElMessageBox, ElMessage } from "element-plus";
 import type { DrawerProps, FormItemProps, FormProps } from "element-plus";
-import { postUpdateDept } from "@/api/department";
+import { postUpdateDept, postListTree } from "@/api/department";
 // const itemLabelPosition = ref<FormItemProps["labelPosition"]>("");
 const drawer = ref(false);
 const disabledValue = ref(true);
@@ -12,6 +12,7 @@ const formLabelAlign = reactive({
   deptName: "",
   deptCode: "",
   type: "",
+  parentCode: "",
   leader: ""
 });
 const handleClose = (done: () => void) => {
@@ -57,9 +58,11 @@ const open = row => {
   // formLabelAlign = row.data;
   formLabelAlign.deptName = row.data.deptName;
   formLabelAlign.deptCode = row.data.deptCode;
+  formLabelAlign.parentCode = row.data.parentCode;
   formLabelAlign.leader = row.data.leader;
   // console.log("数据", row.data);
   console.log("数据", row);
+  postListTreeApi();
   drawer.value = true;
 };
 
@@ -69,6 +72,13 @@ const editClick = () => {
   editShow.value = false;
   disabledValue.value = false;
 };
+const parentOptions = ref([]);
+const postListTreeApi = async () => {
+  const { code, data } = await postListTree();
+  if (code === 200) {
+    parentOptions.value = data;
+  }
+};
 defineExpose({
   open
 });
@@ -83,7 +93,7 @@ const timer = ref("");
       :before-close="handleClose"
     >
       <template #header>
-        <h4>指标详情</h4>
+        <h4>部门详情</h4>
       </template>
       <template #default>
         <div>
@@ -116,8 +126,21 @@ const timer = ref("");
                 :disabled="disabledValue"
               />
             </el-form-item>
-            <el-form-item label="部门ID" label-position="top">
-              <el-input :disabled="disabledValue" />
+            <el-form-item label="上级部门" label-position="top">
+              <!-- <el-input v-model="formLabelAlign.parentCode" /> -->
+              <el-tree-select
+                v-model="formLabelAlign.parentCode"
+                :data="parentOptions"
+                check-strictly
+                filterable
+                :disabled="disabledValue"
+                :props="{
+                  label: 'deptName',
+                  value: 'deptCode',
+                  children: 'childrenRes'
+                }"
+                placeholder="请选择部门"
+              />
             </el-form-item>
             <el-form-item label="部门负责人" label-position="top">
               <el-input
@@ -129,7 +152,7 @@ const timer = ref("");
         </div>
       </template>
       <template #footer>
-        <el-button v-if="editShow" type="warning" @click="editClick"
+        <el-button v-if="editShow" type="primary" @click="editClick"
           >编辑</el-button
         >
         <div v-else>

+ 11 - 2
src/views/background/framework/proson/prosonDepartment.vue

@@ -3,7 +3,7 @@ defineOptions({
   // name 作为一种规范最好必须写上并且和路由的name保持一致
   name: "prosonDepartment"
 });
-import { ref, reactive } from "vue";
+import { ref, reactive, watch } from "vue";
 import { ElMessageBox, ElMessage } from "element-plus";
 import { Search } from "@element-plus/icons-vue";
 import prosonEditDrawer from "./components/prosonEditDrawer.vue";
@@ -160,6 +160,13 @@ const handleSizeChange = val => {
 const handleCurrentChange = val => {
   console.log(`current page: ${val}`);
 };
+const filterNode = (value: string, data: any) => {
+  if (!value) return true; // 如果没有过滤关键词,显示所有节点
+  return data.deptName && data.deptName.includes(value); // 使用 deptName 进行匹配
+};
+watch(realName, val => {
+  treeRef.value!.filter(val);
+});
 </script>
 
 <template>
@@ -190,6 +197,7 @@ const handleCurrentChange = val => {
         v-model="realName"
         placeholder="搜索"
         class="mb-2"
+        clearable
         :prefix-icon="Search"
       />
       <el-tree
@@ -202,12 +210,13 @@ const handleCurrentChange = val => {
         default-expand-all
         :expand-on-click-node="false"
         highlight-current
+        :filter-node-method="filterNode"
         @node-click="handleNodeClick"
       >
         <template #default="{ node }">
           <div class="flex-1 flex justify-between items-center">
             <span>{{ node.label }}</span>
-            <el-dropdown trigger="click">
+            <el-dropdown trigger="click" @click.stop>
               <span>
                 <el-icon><Operation /></el-icon>
               </span>

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

@@ -69,7 +69,7 @@ const filterNode = (value: string, data: any) => {
 const defaultProps = {
   label: "userName",
   value: "userCode",
-  children: "childrenRes"
+  children: "children"
 };
 </script>
 

+ 188 - 37
src/views/background/framework/roles/rolePower.vue

@@ -12,9 +12,16 @@ import { getDeleteUserApi } from "@/api/userSetting";
 import {
   getMenuList,
   getMenuListCodeForRole,
-  postAddMenuList
+  postAddMenuList,
+  updateMenu
 } from "@/api/menu";
-import { postPageRole, postDelRole, postPageUserByRole } from "@/api/roles";
+import {
+  postPageRole,
+  postDelRole,
+  postPageUserByRole,
+  postUpdateRole,
+  getUserPermissionsByRoleCode
+} from "@/api/roles";
 import pngcaret from "@/assets/icon-png/caret-right-small.svg";
 import UserPageTable from "@/components/UserPageTable/index.vue";
 const UserTable = ref();
@@ -85,14 +92,22 @@ postPageRoleApi();
 // 查看角色组
 const bgColor = ref(null);
 const lookRoles = 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);
+  getMenuListApi();
   postPageUserByRoleApi();
   getMenuListCodeForRoleApi(item);
+  getUserPermissionsByRoleCodeApi(item.roleCode);
+  Object.assign(roleParams, {
+    roleName: "",
+    roleSort: 0,
+    menuCodes: [],
+    roleCode: "",
+    remark: ""
+  });
 };
 // 添加角色
 const addRoles = () => {
@@ -189,25 +204,22 @@ const postPageUserByRoleApi = async () => {
 const handleClick = (tab, event) => {
   console.log(tab, event);
 };
-const getMenuListApi = async () => {
-  const { code, data } = await getMenuList();
-  console.log("菜单", data);
+
+const postAddMenuListApi = async () => {
+  const { code } = await updateMenu({
+    menuName: "指标库",
+    menuType: "menu",
+    parentCode: "",
+    orderNum: 1,
+    url: "",
+    moduleUrl: "/indexDefine",
+    icon: "",
+    // remark: "",
+    remark: "系统管理",
+    menuCode: "menu340900015906103296"
+  });
 };
-getMenuListApi();
-// const postAddMenuListApi = async () => {
-//   const { code } = await postAddMenuList({
-//     menuName: "指标库",
-//     menuType: "menu",
-//     parentCode: "",
-//     orderNum: 0,
-//     url: "",
-//     moduleUrl: "/IndexDefine",
-//     icon: "",
-//     remark: "",
-//     menuCode: ""
-//   });
-// };
-// postAddMenuListApi();
+postAddMenuListApi();
 // {
 //     menuName: "新建模板",
 //     menuType: "menu",
@@ -234,6 +246,123 @@ const handleCurrentChange = val => {
   paramsPageUser.pageNumber = val;
   postPageUserByRoleApi();
 };
+// 查看角色菜单权限表
+const menuListRole = ref<any>([]);
+const menuListRoleList = ref<any>([]);
+function addShowProperty(menuArray) {
+  menuArray.forEach(menu => {
+    menu.show = false; // 添加 show 属性
+    if (menu.childrenRes) {
+      addShowProperty(menu.childrenRes); // 递归处理子菜单
+    }
+  });
+  return menuArray; // 返回修改后的菜单数组
+}
+
+const getMenuListApi = async () => {
+  const { code, data } = await getMenuList();
+  if (code === 200) {
+    let menuData = data;
+    let modifiedMenuData = addShowProperty(menuData);
+    modifiedMenuData.forEach(item => {
+      item.allShow = false;
+    });
+    function checkMenuCodes(menuItems) {
+      menuListRole.value.forEach(item => {
+        const hasRole = menuListRole.value.includes(item.menuCode);
+        item.show = hasRole;
+
+        // Recursively check children
+        if (item.childrenRes && item.childrenRes.length > 0) {
+          checkMenuCodes(item.childrenRes);
+        }
+
+        // Check if all required roles are present
+        if (item.childrenRes) {
+          const allShow = item.childrenRes.every(child => child.show);
+          if (allShow && item.menuCode === item.parentCode) {
+            item.allShow = true; // Only set allShow for the top-level menus
+          }
+        }
+      });
+    }
+    checkMenuCodes(modifiedMenuData);
+    menuListRoleList.value = modifiedMenuData;
+    console.log("菜单列表", menuListRoleList.value);
+  }
+};
+// getMenuListApi();
+const getUserPermissionsByRoleCodeApi = async roleCode => {
+  const { code, msg, data } = await getUserPermissionsByRoleCode({
+    roleCode
+  });
+  if (code == 200) {
+    // getMenuListApi();
+    menuListRole.value = data;
+  }
+};
+const roleParams = reactive({
+  roleName: "",
+  roleSort: 0,
+  menuCodes: [],
+  roleCode: "",
+  remark: ""
+});
+const postUpdateRoleApi = async () => {
+  const { code, msg, data } = await postUpdateRole(roleParams);
+  if (code == 200) {
+    getUserPermissionsByRoleCodeApi(roleParams.roleCode);
+    ElMessage.success("修改成功");
+  } else {
+    ElMessage.error(msg);
+  }
+};
+// 添加菜单code
+function collectMenuCodes(menu) {
+  // 添加当前菜单的 menuCode 到 roleParams.menuCodes
+  roleParams.menuCodes.push(menu.menuCode);
+  menu.show = true;
+  // 如果有子菜单,递归处理
+  if (menu.childrenRes && menu.childrenRes.length > 0) {
+    menu.childrenRes.forEach(child => {
+      collectMenuCodes(child);
+    });
+  }
+}
+function collectMenuShow(menu) {
+  // 添加当前菜单的 menuCode 到 roleParams.menuCodes
+  menu.show = false;
+  // 如果有子菜单,递归处理
+  if (menu.childrenRes && menu.childrenRes.length > 0) {
+    menu.childrenRes.forEach(child => {
+      collectMenuCodes(child);
+    });
+  }
+}
+const roleShowClick = (item, type: any) => {
+  roleParams.roleName = rolesList.addPerson.roleName;
+  roleParams.roleCode = rolesList.addPerson.roleCode;
+  console.log("角色", item);
+  if (type) {
+    // 不是全选
+    if (item.show) {
+      roleParams.menuCodes.push(item.menuCode);
+      postUpdateRoleApi();
+    } else {
+      roleParams.menuCodes.filter(value => value !== item.menuCode);
+      postUpdateRoleApi();
+    }
+  } else {
+    if (!item.allShow) {
+      collectMenuCodes(item);
+      postUpdateRoleApi();
+    } else {
+      roleParams.menuCodes = [];
+      postUpdateRoleApi();
+      collectMenuShow(item);
+    }
+  }
+};
 </script>
 
 <template>
@@ -415,41 +544,63 @@ const handleCurrentChange = val => {
         </el-tab-pane>
         <Auth :value="['权限管理']">
           <el-tab-pane label="权限管理" name="second">
-            <el-table :data="tableData" border style="width: 100%">
+            <el-table :data="menuListRoleList" border style="width: 100%">
               <el-table-column prop="date" label="模块">
                 <template #default="{ row }">
                   <div>
-                    <input v-model="row.show" type="checkbox" />{{ row.date }}
-                    <br />
-                    <input v-model="row.show1" type="checkbox" />{{ row.name }}
-                    <br />
-                    <input v-model="row.show2" type="checkbox" />{{
-                      row.address
-                    }}
+                    <input
+                      v-model="row.show"
+                      type="checkbox"
+                      @click="roleShowClick(row, (type = 1))"
+                    />{{ row.menuName }}
                   </div>
                 </template>
               </el-table-column>
               <el-table-column prop="name" label="菜单">
                 <template #default="{ row }">
-                  <div>
-                    <input v-model="row.show" type="checkbox" />{{ row.date }}
-                  </div>
-                  <div>
-                    <input v-model="row.show" type="checkbox" />{{ row.date }}
+                  <div v-for="item in row.childrenRes" :key="item.childrenRes">
+                    <div
+                      v-for="item1 in item.childrenRes"
+                      :key="item1.menuCode"
+                    >
+                      <input
+                        v-model="item1.show"
+                        type="checkbox"
+                        @click="roleShowClick(row, (type = 1))"
+                      />{{ item1.menuName }}
+                    </div>
                   </div>
                 </template>
               </el-table-column>
               <el-table-column prop="address" label="全选">
                 <template #default="{ row }">
                   <div>
-                    <input v-model="row.show" type="checkbox" />{{ row.date }}
+                    <input
+                      v-model="row.allShow"
+                      type="checkbox"
+                      @click="roleShowClick(row, (type = 0))"
+                    />{{ row.date }}全选
                   </div>
                 </template>
               </el-table-column>
               <el-table-column prop="address" label="权限点">
                 <template #default="{ row }">
-                  <div>
-                    <input v-model="row.show" type="checkbox" />{{ row.date }}
+                  <div v-for="item in row.childrenRes" :key="item.childrenRes">
+                    <div
+                      v-for="item1 in item.childrenRes"
+                      :key="item1.menuCode"
+                    >
+                      <div
+                        v-for="item2 in item1.childrenRes"
+                        :key="item2.menuCode"
+                      >
+                        <input
+                          v-model="item2.show"
+                          type="checkbox"
+                          @click="roleShowClick(row, (type = 1))"
+                        />{{ item2.menuName }}
+                      </div>
+                    </div>
                   </div>
                 </template>
               </el-table-column>

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

@@ -44,7 +44,7 @@ const postAssignmentUserApi = async () => {
 const defaultProps = {
   label: "userName",
   value: "userCode",
-  children: "childrenRes"
+  children: "children"
 };
 const tree = ref(null);
 

+ 56 - 38
src/views/evaluate/children/change/manage/addExam.vue

@@ -63,6 +63,9 @@ const handleClose = () => {
 };
 // 添加部门保存
 const saveDepartment = async () => {
+  form.cycleValue = dayjs(form.cycleValue).format(format.value);
+  //
+  console.log("form", dayjs(form.cycleValue).format(format.value));
   const { code, msg } = await postAddAssessment(form);
   if (code === 200) {
     ElMessage({
@@ -102,28 +105,33 @@ const format = ref<any>("YYYY-MM");
 const pickerType = ref<any>("month");
 const handleRegionChange = (value: any) => {
   console.log(value);
-  // form.date1 = "";
   timeType.value = value;
+  console.log("111", form.cycleValue);
   switch (value) {
     case "年度":
+      form.cycleValue = "";
       format.value = "YYYY";
       pickerType.value = "year";
       break;
     case "月度":
+      form.cycleValue = "";
       format.value = "YYYY-MM";
       pickerType.value = "month";
 
       break;
     case "日期":
+      form.cycleValue = "";
       format.value = "YYYY-MM-DD";
       pickerType.value = "";
 
       break;
     case "季度":
+      form.cycleValue = "";
       quarterValue.value = true;
 
       break;
     case "半年":
+      form.cycleValue = "";
       quarterValue.value = false;
 
       break;
@@ -181,45 +189,54 @@ const postListTreeWithUserApi = async () => {
   const res = await postListTreeWithUser();
   const { data, code } = await getTemplateInfoList(templateparams);
   resTmp.value = data.records;
-  console.log(data);
+  console.log("人员", res.data);
+  console.log("人员", transformData(res.data));
   treeDept.value = [];
-  treeDept.value = transformData(res.data);
+  let aa = res.data;
+  treeDept.value = transformData(aa);
 };
 
-function transformData(arr) {
-  return arr.map(item => {
-    const {
-      deptName: userName,
-      deptCode: userCode,
-      childrenRes,
-      ...rest
-    } = item;
-
-    return {
-      userName,
-      userCode,
-      childrenRes: childrenRes ? transformData(childrenRes) : [],
-      ...rest
+const transformData = data => {
+  return data.map(item => {
+    const transformedItem = {
+      deptName: item.userName || item.deptName,
+      deptCode: item.userCode || item.deptCode,
+      children: []
     };
+
+    if (item.childrenRes) {
+      transformedItem.children = transformData(item.childrenRes);
+    }
+
+    if (item.childrenUserRes) {
+      item.childrenUserRes.forEach(user => {
+        transformedItem.children.push({
+          deptName: user.userName,
+          deptCode: user.userCode,
+          children: []
+        });
+      });
+    }
+
+    return transformedItem;
   });
-}
-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 handleRreeSelect = (node, index) => {
+  console.log(node.deptName, index);
+  form.assessmentObjectList.assessmentObjectName = node.deptName;
+};
+const handleSelect = (node, index) => {
+  console.log(node, index);
+  resTmp.value.map(item => {
+    console.log(item);
+    if (item.id == node) {
+      form.assessmentObjectList.assessmentModelName = item.tpName;
+    }
+  });
+};
+const aaaa = a => {
+  console.log(a);
 };
-
 const monthTime = ref("");
 defineExpose({
   open
@@ -255,6 +272,7 @@ defineExpose({
             :type="pickerType"
             :format="format"
             placeholder="请选择"
+            @change="aaaa"
           />
           <el-dropdown
             v-else-if="timeType === '季度' || timeType === '半年'"
@@ -349,12 +367,12 @@ defineExpose({
                       :render-after-expand="false"
                       show-checkbox
                       :props="{
-                        label: 'userName',
-                        value: 'userCode',
-                        children: 'childrenRes'
+                        label: 'deptName',
+                        value: 'deptCode',
+                        children: 'children'
                       }"
                       style="width: 180px"
-                      @change="handleRreeSelect(item, index)"
+                      @check-change="handleRreeSelect"
                     />
                   </div>
                 </el-form-item>
@@ -377,7 +395,7 @@ defineExpose({
                       placeholder="请选择"
                       filterable
                       style="width: 180px"
-                      @change="handleSelect(item, index)"
+                      @change="handleSelect"
                     >
                       <el-option
                         v-for="itemTmp in resTmp"

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

@@ -0,0 +1,9 @@
+<script setup lang="ts">
+// defineOptions({
+//   name: ''
+// })
+</script>
+
+<template>
+  <div>导入指标</div>
+</template>

+ 76 - 11
src/views/evaluate/children/change/mould/manageObject.vue

@@ -6,7 +6,8 @@ import { getState, getStateType, assessmentStatus } from "@/config/tag";
 import { ref, reactive, onMounted } from "vue";
 import {
   getAssessmentQuotaDetails,
-  delAssessmentObject
+  delAssessmentObject,
+  getAssessmentObjectDetails
 } from "@/api/assessment";
 import { getTemplateInfoList } from "@/api/templateInfo";
 import { useRouter } from "vue-router";
@@ -14,6 +15,7 @@ import { ElMessage, ElMessageBox } from "element-plus";
 import { treeDept, postListTreeWithUserApi } from "@/api/department";
 import { Search } from "@element-plus/icons-vue";
 import messagePerson from "./message.vue";
+import dayjs from "dayjs";
 const $props = defineProps({
   message: {
     type: Object
@@ -32,26 +34,53 @@ const initParams = reactive({
     orderField: "",
     orderType: ""
   },
+  objParams: {
+    pageNumber: 1,
+    pageSize: 10,
+    userName: "",
+    modelName: "",
+    quotaName: "",
+    assessmentId: "",
+    orderField: "",
+    orderType: ""
+  },
+  indexParams: {
+    pageNumber: 1,
+    pageSize: 10,
+    userName: "",
+    modelName: "",
+    quotaName: "",
+    assessmentId: "",
+    orderField: "",
+    orderType: ""
+  },
   tmpParams: {
     page: 1,
     pageSize: 100
   },
+  total: 0,
+  total1: 0,
   list: [],
+  Indexlist: [],
   tmpList: []
 });
 onMounted(() => {
   Object.assign(messageData.value, $props.message);
-  initParams.params.assessmentId = messageData.value.id;
+  initParams.params.assessmentId = $props.message.id;
+  initParams.objParams.assessmentId = $props.message.id;
+  initParams.indexParams.assessmentId = $props.message.id;
   getAssessmentQuotaDetailsApi();
   getTemplateInfoListApi();
   postListTreeWithUserApi();
+  getAssessmentObjectDetailsApi();
   console.log("onMounted", $props.message);
 });
-// 分页查询
+// 指标分页查询
 const getAssessmentQuotaDetailsApi = async () => {
-  const res = await getAssessmentQuotaDetails(initParams.tmpParams);
+  const res = await getAssessmentQuotaDetails(initParams.indexParams);
+  console.log("getAssessmentQuotaDetailsApi", res);
   if (res.code === 200) {
-    initParams.tmpList = res.data.records;
+    initParams.Indexlist = res.data.records;
   }
 };
 // 考核模板
@@ -173,6 +202,20 @@ const dialogVisibleAddShow = () => {
 const GoView = row => {
   router.push("/evaluate/children/change/mould/view");
 };
+// 考核对象
+const objList = ref([]);
+const getAssessmentObjectDetailsApi = async () => {
+  const { data, msg, code } = await getAssessmentObjectDetails(
+    initParams.objParams
+  );
+  if (code === 200) {
+    objList.value = data.records;
+    initParams.total = data.totalRow;
+  }
+  console.log("考核对象", data);
+};
+const handleSizeChange = val => {};
+const handleCurrentChange = val => {};
 </script>
 
 <template>
@@ -261,12 +304,18 @@ const GoView = row => {
             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" />
-          <el-table-column prop="name" label="状态" width="150" />
-          <el-table-column prop="name" label="创建人" width="150" />
-          <el-table-column prop="name" label="更新时间" width="150" />
+          <el-table-column prop="date" label="人员" width="250" />
+          <el-table-column prop="name" label="工号" width="250" />
+          <el-table-column
+            prop="assessmentModelName"
+            label="考核模板"
+            width="300"
+          />
+          <el-table-column prop="name" label="更新时间" width="150">
+            <template #default="{ row }">
+              {{ dayjs(row.updateTime).format("YYYY-MM-DD HH:mm:ss") }}
+            </template>
+          </el-table-column>
           <el-table-column label="操作" width="200" fixed="right">
             <template #default="{ row }">
               <!-- <el-button link :icon="Edit" /> -->
@@ -274,6 +323,22 @@ const GoView = row => {
             </template>
           </el-table-column>
         </el-table>
+        <div class="flex justify-between item-center">
+          <div class="float-left mt-5 ml-2 total">
+            共{{ initParams.total }}条数据
+          </div>
+          <div class="float-right mt-5 mr-8">
+            <el-pagination
+              v-model:current-page="initParams.objParams.pageNumber"
+              v-model:page-size="initParams.objParams.pageSize"
+              background
+              layout="prev, pager, next"
+              :total="initParams.total"
+              @size-change="handleSizeChange"
+              @current-change="handleCurrentChange"
+            />
+          </div>
+        </div>
       </el-tab-pane>
       <el-tab-pane label="考核指标" name="second"
         ><div class="w-full flex items-center justify-between">

+ 1 - 1
src/views/indexDefine/children/define.vue

@@ -1,6 +1,6 @@
 <script setup lang="ts">
 defineOptions({
-  name: "IndexDefine"
+  name: "IndexChildrenDefine"
 });
 import { ref, reactive, markRaw, onMounted } from "vue";
 import dialogVue from "./components/dialog.vue";