From 7df5ffa1db94e3225bd16ef2d0d8ef0e02084951 Mon Sep 17 00:00:00 2001
From: 祖安之光 <11848914+light-of-zuan@user.noreply.gitee.com>
Date: 星期四, 26 六月 2025 13:30:08 +0800
Subject: [PATCH] 新增页面

---
 src/views/homePage.vue                                                                        |    4 
 src/store/modules/user.js                                                                     |    2 
 src/views/build/conpanyFunctionConsult/industryTemplate/index.vue                             |  192 +++
 src/views/build/conpanyFunctionConsult/industryTemplate/components/editDialog.vue             |  214 +++
 src/views/build/conpanyFunctionConsult/staffManage/staffRegister/index.vue                    |  265 ++++
 src/views/build/conpanyFunctionConsult/staffManage/staffPortfolio/components/editorDialog.vue |  132 ++
 src/views/build/conpanyFunctionConsult/staffManage/staffPortfolio/index.vue                   |  157 ++
 src/api/orgStructure/depart.js                                                                |   80 +
 src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/exportWord.js     |   55 +
 src/views/build/conpanyFunctionConsult/staffManage/staffRegister/components/staffDialog.vue   |   85 +
 src/views/build/conpanyFunctionConsult/infoPlatform/index.vue                                 |  162 ++
 /dev/null                                                                                     |  179 ---
 src/views/system/clauseManage/index.vue                                                       |  166 +++
 src/views/build/conpanyFunctionConsult/infoPlatform/components/editDialog.vue                 |  131 ++
 src/views/build/conpanyFunctionConsult/orgStructure/departManage/index.vue                    |  287 +++++
 public/dutyFile.docx                                                                          |    0 
 src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/dutyDialog.vue    |  378 ++++++
 src/views/build/conpanyFunctionConsult/orgStructure/dutyDistributeChart/index.vue             |  312 +++++
 src/views/system/clauseManage/components/editDialog.vue                                       |  125 ++
 src/api/staffManage/staff.js                                                                  |  113 ++
 src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/departDialog.vue  |  216 +++
 21 files changed, 3,065 insertions(+), 190 deletions(-)

diff --git a/public/dutyFile.docx b/public/dutyFile.docx
new file mode 100644
index 0000000..4851a82
--- /dev/null
+++ b/public/dutyFile.docx
Binary files differ
diff --git a/src/api/orgStructure/depart.js b/src/api/orgStructure/depart.js
new file mode 100644
index 0000000..063c549
--- /dev/null
+++ b/src/api/orgStructure/depart.js
@@ -0,0 +1,80 @@
+import request from '@/utils/request'
+
+
+export function getDepart(params) {
+    return request({
+        url: '/system/dept/list',
+        method: 'get',
+        params: params
+    })
+}
+
+export function saveDepart(data) {
+    return request({
+        url: '/system/dept/save',
+        method: 'post',
+        data: data
+    })
+}
+
+export function delDepart(deptId) {
+    return request({
+        url: `/system/dept/${deptId}`,
+        method: 'delete'
+    })
+}
+
+export function getCompany(params) {
+    return request({
+        url: '/system/company/list',
+        method: 'get',
+        params: params
+    })
+}
+
+export function getSysClause(params) {
+    return request({
+        url: '/system/clauseManagement/getSysClauseManagements',
+        method: 'get',
+        params: params
+    })
+}
+
+export function getDeptInfo(deptId) {
+    return request({
+        url: `/system/dept/${deptId}`,
+        method: 'get'
+    })
+}
+
+export function saveResponsibility(data) {
+    return request({
+        url: '/system/dept/saveResponsibility',
+        method: 'post',
+        data: data
+    })
+}
+
+export function initDistribution(params) {
+    return request({
+        url: '/system/dept/initFunctionalDistribution',
+        method: 'get',
+        params: params
+    })
+}
+
+export function getDistribution(params) {
+    return request({
+        url: '/system/dept/functionalDistributionList',
+        method: 'get',
+        params: params
+    })
+}
+
+export function saveDistribution(data) {
+    return request({
+        url: '/system/dept/saveFunctionalDistribution',
+        method: 'post',
+        data: data
+    })
+}
\ No newline at end of file
diff --git a/src/api/staffManage/staff.js b/src/api/staffManage/staff.js
new file mode 100644
index 0000000..e07231e
--- /dev/null
+++ b/src/api/staffManage/staff.js
@@ -0,0 +1,113 @@
+import request from '@/utils/request'
+
+export function getRosterList(params) {
+    return request({
+        url: '/company/roster/list',
+        method: 'get',
+        params: params
+    })
+}
+
+export function saveRoster(data) {
+    return request({
+        url: '/company/roster/insert',
+        method: 'post',
+        data: data
+    })
+}
+
+export function updateRoster(data) {
+    return request({
+        url: '/company/roster/update',
+        method: 'post',
+        data: data
+    })
+}
+
+export function delRoster(params) {
+    return request({
+        url: '/company/roster/deleted',
+        method: 'get',
+        params: params
+    })
+}
+
+export function getInfoPlatforms(params) {
+    return request({
+        url: '/system/informationPlatform/getInformationPlatforms',
+        method: 'get',
+        params: params
+    })
+}
+
+export function updateInfoPlatforms(data) {
+    return request({
+        url: '/system/informationPlatform/saveInformationPlatform',
+        method: 'post',
+        data: data
+    })
+}
+
+export function delInfoPlatforms(params) {
+    return request({
+        url: '/system/informationPlatform/delInformationPlatform',
+        method: 'get',
+        params: params
+    })
+}
+
+export function getSysClause(params) {
+    return request({
+        url: '/system/clauseManagement/getSysClauseManagements',
+        method: 'get',
+        params: params
+    })
+}
+
+export function updateSysClause(data) {
+    return request({
+        url: '/system/clauseManagement/saveSysClauseManagement',
+        method: 'post',
+        data: data
+    })
+}
+
+export function delSysClause(params) {
+    return request({
+        url: '/system/clauseManagement/delSysClauseManagement',
+        method: 'get',
+        params: params
+    })
+}
+
+export function getIndustryTemp(params) {
+    return request({
+        url: '/company/industryTemplate/list',
+        method: 'get',
+        params: params
+    })
+}
+
+export function addIndustryTemp(data) {
+    return request({
+        url: '/company/industryTemplate/insert',
+        method: 'post',
+        data: data
+    })
+}
+
+export function updateIndustryTemp(data) {
+    return request({
+        url: '/company/industryTemplate/update',
+        method: 'post',
+        data: data
+    })
+}
+
+export function delIndustryTemp(params) {
+    return request({
+        url: '/company/industryTemplate/deleted',
+        method: 'get',
+        params: params
+    })
+}
\ No newline at end of file
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
index 2f33a7d..20271e6 100644
--- a/src/store/modules/user.js
+++ b/src/store/modules/user.js
@@ -10,6 +10,7 @@
       token: getToken(),
       id: '',
       name: '',
+      companyId: null,
       avatar: '',
       roles: [],
       permissions: []
@@ -46,6 +47,7 @@
             }
             this.id = user.userId
             this.name = user.userName
+            this.companyId = user.companyId
             this.avatar = avatar
             Cookies.set('userInfo',JSON.stringify(user))
             resolve(res)
diff --git a/src/views/build/conpanyFunctionConsult/industryTemplate/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/industryTemplate/components/editDialog.vue
new file mode 100644
index 0000000..79b1e9c
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/industryTemplate/components/editDialog.vue
@@ -0,0 +1,214 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="state.title"
+        width="700px"
+        :before-close="handleClose"
+        :close-on-press-escape="false"
+        :close-on-click-modal="false"
+    >
+      <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" >
+        <el-form-item label="模板名称:" prop="templateName">
+          <el-input v-model.trim="state.form.templateName" :disabled="state.title =='查看'" placeholder="模板名称"></el-input>
+        </el-form-item>
+        <el-form-item label="行业:" prop="industryType">
+          <el-select v-model="state.form.industryType" placeholder="请选择" clearable>
+            <el-option key="1" label="化工" :value="1"></el-option>
+            <el-option key="2" label="安防" :value="2"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="模板文件:" prop="filePath">
+          <el-upload accept=".doc,.docx" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)" :on-exceed="showTip" :limit='state.fileLimit' v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles)" >
+            <el-button type="primary">点击上传</el-button>
+            <template #tip>
+              <div class="el-upload__tip">支持上传.doc、.docx格式文档,尺寸小于5M,最多可上传1张</div>
+            </template>
+          </el-upload>
+        </el-form-item>
+      </el-form>
+      <template #footer v-if="state.title !='查看'">
+        <span class="dialog-footer">
+            <el-button @click="handleClose" size="default">取 消</el-button>
+            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue'
+import {ElMessage} from "element-plus";
+import {addUser, editUser, getUserById, resetPwd} from "@/api/onlineEducation/user"
+import {Base64} from "js-base64"
+import {getCompany} from "@/api/onlineEducation/company";
+import {addIndustryTemp, updateIndustryTemp, updateInfoPlatforms} from "@/api/staffManage/staff";
+import {getToken} from "@/utils/auth";
+import {delPic} from "@/api/onlineEducation/banner";
+
+const emit = defineEmits(["getList"]);
+const dialogVisible = ref(false)
+const superRef = ref()
+const checkFiles = (rule, value, callback) => {
+  if (state.fileList.length == 0) {
+    callback(new Error('请上传模板文件'))
+  } else {
+    callback()
+  }
+}
+const state = reactive({
+  title: '',
+  form: {
+    id: null,
+    templateName: '',
+    industryType: '',
+    filePath: '',
+    format: '',
+    companyId: null
+  },
+  formRules:{
+    templateName: [{ required: true, message: '请输入模板名称', trigger: 'blur' }],
+    industryType: [{ required: true, message: '请选择行业类型', trigger: 'blur' }],
+    filePath: [{ required: true, validator: checkFiles, trigger: 'blur' }]
+  },
+  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
+  header: {
+    Authorization: getToken()
+  },
+  fileLimit: 1,
+  fileList: []
+})
+onMounted(() => {
+
+});
+
+const openDialog = async (type, value,companyId) => {
+  state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看'
+  state.form.companyId = companyId
+  if(state.title == '编辑'||state.title == '查看'){
+    Object.keys(state.form).forEach(key => {
+      if (key in value) {
+        state.form[key] = value[key]
+      }
+    })
+    if(value.filePath) {
+      const obj = {
+        url: value.filePath,
+        name: '模板文件'
+      }
+      state.fileList = [obj]
+    }
+  }
+  dialogVisible.value = true
+}
+
+
+const onSubmit = async () => {
+  const valid = await superRef.value.validate();
+  if(valid){
+    if(state.title == '新增'){
+      const {id,...data} = state.form
+      const res = await addIndustryTemp(data)
+      if(res.code == 200){
+        ElMessage.success(res.message)
+        emit('getList')
+        handleClose()
+        dialogVisible.value = false;
+      }else{
+        ElMessage.warning(res.message)
+      }
+    }else{
+      const res = await updateIndustryTemp(state.form)
+      if(res.code == 200){
+        ElMessage.success(res.message)
+        emit('getList')
+        handleClose()
+        dialogVisible.value = false;
+      }else{
+        ElMessage.warning(res.message)
+      }
+    }
+  }
+}
+
+const handleAvatarSuccess = (res, uploadFile) => {
+  if(res.code == 200){
+    state.form.filePath = res.data.path
+    state.form.format = '.' + res.data.filename.split('.')[1]
+  }else{
+    state.fileList = []
+    ElMessage({
+      type: 'warning',
+      message: '文件上传失败'
+    })
+  }
+}
+
+const showTip =()=>{
+  ElMessage({
+    type: 'warning',
+    message: '超出文件上传数量'
+  });
+}
+const picSize = async (rawFile) => {
+  if(rawFile.size / 1024 / 1024 > 5){
+    ElMessage({
+      type: 'warning',
+      message: '文件大小不能超过5M'
+    });
+    return false
+  }
+};
+const handleRemove = async (file, uploadFiles) => {
+  let path = state.form.filePath;
+  await delPic({path: path}).then(res => {
+    if(res.code == 200){
+      // ElMessage({
+      //   type: 'success',
+      //   message: '文件已删除'
+      // })
+      state.form.filePath = ''
+      state.form.format = ''
+    }else{
+      ElMessage({
+        type: 'warning',
+        message: res.message
+      })
+    }
+  }).catch(() => {
+    state.form.imgUrl = ''
+  });
+}
+
+const handleClose = () => {
+  state.form = {
+    id: null,
+    templateName: '',
+    industryType: '',
+    filePath: '',
+    format: '',
+    companyId: null
+  }
+  superRef.value.clearValidate();
+  superRef.value.resetFields()
+  dialogVisible.value = false;
+}
+
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+}
+</style>
diff --git a/src/views/build/conpanyFunctionConsult/industryTemplate/index.vue b/src/views/build/conpanyFunctionConsult/industryTemplate/index.vue
new file mode 100644
index 0000000..19c1ef3
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/industryTemplate/index.vue
@@ -0,0 +1,192 @@
+<template>
+  <div class="app-container">
+    <div style="display: flex;justify-content: space-between">
+      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item v-if="isAdmin" label="企业:" >
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
+            <el-option
+                v-for="item in companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="isAdmin" label="行业:" >
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
+            <el-option key="1" label="化工" :value="1"></el-option>
+            <el-option key="2" label="安防" :value="2"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item >
+          <el-button v-if="isAdmin" type="primary" @click="getList">查询</el-button>
+          <el-button v-if="isAdmin" type="primary" plain @click="reset">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true">
+      <el-table-column label="序号" type="index" align="center" width="80"/>
+      <el-table-column label="模板名称" prop="templateName" align="center"/>
+      <el-table-column label="行业" prop="industryType" align="center">
+        <template #default="scope">
+          {{getName(scope.row.industryType)}}
+        </template>
+      </el-table-column>
+      <el-table-column label="模板文件" prop="fileName" align="center">
+        <template #default="scope">
+          <el-button link type="primary" @click="downloadFile(scope.row.filePath)">{{getName(scope.row.industryType) + '模板'}}</el-button>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
+        <template #default="scope">
+          <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
+          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="total > 0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+
+    <edit-dialog ref="dialogRef" @getList=getList></edit-dialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
+import {ElMessage, ElMessageBox} from "element-plus";
+import {delCompany, getCompany} from "@/api/onlineEducation/company";
+import {delUser, getUser} from "@/api/onlineEducation/user";
+import Cookies from "js-cookie";
+import editDialog from './components/editDialog.vue'
+import {
+  delIndustryTemp,
+  getIndustryTemp,
+} from "@/api/staffManage/staff";
+import useUserStore from "@/store/modules/user";
+const userStore = useUserStore()
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const dialogRef = ref();
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    companyId: null
+  },
+  total: 0,
+  dataList: [],
+  companyList: [],
+  isAdmin: false,
+  typeList: [
+    {
+      value: 1,
+      name: '化工'
+    },
+    {
+      value: 2,
+      name: '安防'
+    }
+  ]
+});
+
+const { queryParams, total, dataList,companyList, isAdmin } = toRefs(data);
+const userInfo = ref()
+onMounted(async ()=>{
+  if(userStore.roles.includes('admin')){
+    data.isAdmin = true
+    await getCompanyList()
+  }else{
+    data.isAdmin = false
+    data.queryParams.companyId = userStore.companyId
+  }
+  await getList()
+})
+
+onUnmounted(()=>{
+
+})
+
+const getList = async () => {
+  loading.value = true
+  const res = await getIndustryTemp(data.queryParams)
+  if(res.code == 200){
+    data.dataList = res.data.list || []
+    data.total = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false
+}
+
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+    data.queryParams.companyId = data.companyList[0].id
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const downloadFile = (path)=>{
+  window.open(import.meta.env.VITE_APP_BASE_API + '/' + path)
+}
+
+const getName =(type)=>{
+  return data.typeList.find(i=> i.value == type)?.name
+}
+
+const openDialog = (type, value) => {
+  dialogRef.value.openDialog(type, value, data.queryParams.companyId);
+}
+
+/** 重置新增的表单以及其他数据  */
+const reset= async()=> {
+  data.queryParams = {
+    pageNum: 1,
+    pageSize: 10,
+    companyId: null
+  }
+  await getCompanyList()
+  await getList()
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delIndustryTemp({companyRosterId: val.id})
+        if(res.code == 200){
+          ElMessage.success('数据删除成功')
+          await getList()
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+</script>
diff --git a/src/views/build/conpanyFunctionConsult/infoPlatform/components/editDialog.vue b/src/views/build/conpanyFunctionConsult/infoPlatform/components/editDialog.vue
new file mode 100644
index 0000000..6c3bbc5
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/infoPlatform/components/editDialog.vue
@@ -0,0 +1,131 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="state.title"
+        width="700px"
+        :before-close="handleClose"
+        :close-on-press-escape="false"
+        :close-on-click-modal="false"
+    >
+      <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" >
+        <el-form-item label="信息平台名称:" prop="platformName">
+          <el-input v-model.trim="state.form.platformName" :disabled="state.title =='查看'" placeholder="信息平台名称"></el-input>
+        </el-form-item>
+        <el-form-item label="创建时间:" prop="buildDate">
+          <el-date-picker
+              :disabled="state.title =='查看'"
+              v-model="state.form.buildDate"
+              type="date"
+              value-format="YYYY-MM-DD"
+              placeholder="请选择创建时间"
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer v-if="state.title !='查看'">
+        <span class="dialog-footer">
+            <el-button @click="handleClose" size="default">取 消</el-button>
+            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue'
+import {ElMessage} from "element-plus";
+import {addUser, editUser, getUserById, resetPwd} from "@/api/onlineEducation/user"
+import {Base64} from "js-base64"
+import {getCompany} from "@/api/onlineEducation/company";
+import {updateInfoPlatforms} from "@/api/staffManage/staff";
+
+const emit = defineEmits(["getList"]);
+const dialogVisible = ref(false)
+const superRef = ref()
+const state = reactive({
+  title: '',
+  form: {
+    id: null,
+    platformName: '',
+    buildDate: '',
+    companyId: null
+  },
+  formRules:{
+    platformName: [{ required: true, message: '请输入信息平台名称', trigger: 'blur' }],
+    buildDate: [{ required: true, message: '请选择平台创建时间', trigger: 'blur' }]
+  }
+})
+onMounted(() => {
+
+});
+
+const openDialog = async (type, value,companyId) => {
+  state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看'
+  state.form.companyId = companyId
+  if(state.title == '编辑'||state.title == '查看'){
+    Object.keys(state.form).forEach(key => {
+      if (key in value) {
+        state.form[key] = value[key]
+      }
+    })
+  }
+  dialogVisible.value = true
+}
+
+
+const onSubmit = async () => {
+  const valid = await superRef.value.validate();
+  if(valid){
+    let data = {}
+    if(state.title == '新增'){
+      data = {
+        platformName: state.form.platformName,
+        buildDate: state.form.buildDate,
+        companyId: state.form.companyId
+      }
+    }else{
+      data = state.form
+    }
+      const res = await updateInfoPlatforms(data)
+      if(res.code == 200){
+        ElMessage.success(res.message)
+        emit('getList')
+        handleClose()
+        dialogVisible.value = false;
+      }else{
+        ElMessage.warning(res.message)
+      }
+
+  }
+}
+
+const handleClose = () => {
+  state.form = {
+    id: null,
+    platformName: '',
+    buildDate: '',
+    companyId: null
+  }
+  superRef.value.clearValidate();
+  superRef.value.resetFields()
+  dialogVisible.value = false;
+}
+
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+}
+</style>
diff --git a/src/views/build/conpanyFunctionConsult/infoPlatform/index.vue b/src/views/build/conpanyFunctionConsult/infoPlatform/index.vue
new file mode 100644
index 0000000..385baca
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/infoPlatform/index.vue
@@ -0,0 +1,162 @@
+<template>
+  <div class="app-container">
+    <div style="display: flex;justify-content: space-between">
+      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item v-if="isAdmin" label="企业:" >
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
+            <el-option
+                v-for="item in companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item >
+          <el-button v-if="isAdmin" type="primary" @click="getList">查询</el-button>
+          <el-button v-if="isAdmin" type="primary" plain @click="reset">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true">
+      <el-table-column label="序号" type="index" align="center" width="80"/>
+      <el-table-column label="信息平台名称" prop="platformName" align="center"/>
+      <el-table-column label="建设时间" prop="buildDate" align="center">
+        <template #default="scope">
+          {{scope.row.buildDate?.substring(0, 10)}}
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
+        <template #default="scope">
+          <el-button link type="primary" @click="openDialog('view',scope.row)">查看</el-button>
+          <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
+          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="total > 0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+
+    <edit-dialog ref="dialogRef" @getList=getList></edit-dialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
+import {ElMessage, ElMessageBox} from "element-plus";
+import {delCompany, getCompany} from "@/api/onlineEducation/company";
+import {delUser, getUser} from "@/api/onlineEducation/user";
+import Cookies from "js-cookie";
+import editDialog from './components/editDialog.vue'
+import {delInfoPlatforms, delRoster, getInfoPlatforms, getRosterList} from "@/api/staffManage/staff";
+import useUserStore from "@/store/modules/user";
+const userStore = useUserStore()
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const dialogRef = ref();
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    companyId: null
+  },
+  total: 0,
+  dataList: [],
+  companyList: [],
+  isAdmin: false
+});
+
+const { queryParams, total, dataList,companyList, isAdmin } = toRefs(data);
+const userInfo = ref()
+onMounted(async ()=>{
+  userInfo.value = JSON.parse(Cookies.get('userInfo'))
+  if(userStore.roles.includes('admin')){
+    data.isAdmin = true
+    await getCompanyList()
+  }else{
+    data.isAdmin = false
+    data.queryParams.companyId = userStore.companyId
+  }
+  await getList()
+})
+
+onUnmounted(()=>{
+
+})
+
+const getList = async () => {
+  loading.value = true
+  const res = await getInfoPlatforms(data.queryParams)
+  if(res.code == 200){
+    data.dataList = res.data || []
+    data.total = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false
+}
+
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+    data.queryParams.companyId = data.companyList[0].id
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const openDialog = (type, value) => {
+  dialogRef.value.openDialog(type, value, data.queryParams.companyId);
+}
+
+/** 重置新增的表单以及其他数据  */
+const reset= async()=> {
+  data.queryParams = {
+    pageNum: 1,
+    pageSize: 10,
+    companyId: null
+  }
+  await getCompanyList()
+  await getList()
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delInfoPlatforms({id: val.id})
+        if(res.code == 200){
+          ElMessage.success('数据删除成功')
+          await getList()
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+</script>
diff --git a/src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/departDialog.vue b/src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/departDialog.vue
new file mode 100644
index 0000000..aa2adec
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/departDialog.vue
@@ -0,0 +1,216 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="state.title"
+        width="700px"
+        :before-close="handleClose"
+        :close-on-press-escape="false"
+        :close-on-click-modal="false"
+    >
+      <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" >
+        <el-form-item label="部门名称:"  prop="deptName">
+          <el-input v-model.trim="state.form.deptName" :disabled="state.title =='查看'" placeholder="部门名称"></el-input>
+        </el-form-item>
+        <el-form-item label="负责人:" prop="leaderUserId">
+          <el-select clearable v-model="state.form.leaderUserId" :disabled="state.title =='查看'" filterable placeholder="负责人" style="width: 100%">
+            <el-option
+                v-for="item in state.userList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="主要负责部门:" prop="parentId">
+          <el-select
+              clearable
+              v-model="state.form.parentId"
+              :disabled="state.title =='查看'"
+              filterable
+              placeholder="主要负责部门"
+              style="width: 100%"
+          >
+            <el-option
+                v-for="item in state.departList"
+                :key="item.deptId"
+                :label="item.deptName"
+                :value="item.deptId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="部门涉及条款:" prop="caluseVO1List">
+          <el-select
+              clearable
+              v-model="state.form.caluseVO1List"
+              :disabled="state.title =='查看'"
+              filterable
+              placeholder="部门涉及条款"
+              style="width: 100%"
+              multiple
+              value-key="clauseId"
+          >
+            <el-option
+                v-for="item in state.sysClauseList"
+                :key="item.clauseId"
+                :label="item.content"
+                :value="item"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <template #footer v-if="state.title !='查看'">
+        <span class="dialog-footer">
+            <el-button @click="handleClose" size="default">取 消</el-button>
+            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue'
+import {ElMessage} from "element-plus";
+import {getDepart, getSysClause, saveDepart} from "@/api/orgStructure/depart";
+import {listUser} from "@/api/system/user";
+
+const emit = defineEmits(["getList"]);
+const dialogVisible = ref(false)
+const superRef = ref()
+
+const state = reactive({
+  title: '',
+  form: {
+    deptId: null,
+    deptName: '',
+    leaderUserId: null,
+    parentId: null,
+    caluseVO1List: [],
+    delCaluseIds: [],
+    companyId: null
+  },
+  userList: [],
+  departList: [],
+  sysClauseList: [],
+  oldClauseList: [],
+  formRules:{
+    deptName: [{ required: true, message: '请输入部门名称', trigger: 'blur' }],
+    leaderUserId: [{ required: true, message: '请选择负责人', trigger: 'blur' }],
+    parentId: [{ required: true, message: '请选择负责部门', trigger: 'blur' }],
+    caluseVO1List: [{ required: true, message: '请选择设计条款', trigger: 'blur' }],
+  }
+})
+
+onMounted(() => {
+
+});
+const disabled = ref(false);
+const userInfo = ref()
+const openDialog = async (type, value, companyId) => {
+  await getUserList()
+  await getDepartList(companyId)
+  await getSysClauseList()
+  state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看';
+  if(type === 'edit' || type === 'view') {
+    state.departList = state.departList.filter(i=>i.deptId !== value.deptId)
+    Object.keys(state.form).forEach(key => {
+      if (key in value) {
+        state.form[key] = value[key];
+      }
+    });
+    state.oldClauseList = value.caluseVO1List
+  }else{
+    state.form.companyId = companyId
+  }
+  dialogVisible.value = true
+}
+
+const getUserList = async ()=> {
+  const res = await listUser()
+  if(res.code == 200){
+    state.userList = res.data.list?res.data.list:[]
+  }else{
+    ElMessage.warning(res.message)
+  }
+};
+
+const getDepartList = async (companyId)=> {
+  const params = {
+    pageNum: 1,
+    pageSize: 999,
+    companyId: companyId
+  }
+  const res = await getDepart(params)
+  if(res.code == 200){
+    state.departList = res.data
+  }else{
+    ElMessage.warning(res.message)
+  }
+};
+
+const getSysClauseList = async ()=> {
+  const res = await getSysClause()
+  if(res.code == 200){
+    state.sysClauseList = res.data.map(i=>{
+      return {
+        clauseId: i.id,
+        clauseNum: i.clauseNum,
+        content: i.name,
+        id: null
+      }
+    })
+  }else{
+    ElMessage.warning(res.message)
+  }
+};
+
+const onSubmit = async () => {
+  const valid = await superRef.value.validate();
+  if(valid){
+    state.form.delCaluseIds = state.oldClauseList.filter(oldItem => !state.form.caluseVO1List.some(newItem => newItem.id === oldItem.id)).map(item => item.id)
+    const res = await saveDepart(state.form)
+    if(res.code == 200){
+      ElMessage.success(res.message)
+      emit('getList')
+      handleClose()
+      dialogVisible.value = false;
+    }else{
+      ElMessage.warning(res.message)
+    }
+  }
+}
+
+const handleClose = () => {
+  state.form = {
+    deptId: null,
+    deptName: '',
+    leaderUserId: null,
+    parentId: null,
+    caluseVO1List: [],
+    delCaluseIds: [],
+    companyId: null
+  }
+
+  superRef.value.clearValidate();
+  superRef.value.resetFields()
+  dialogVisible.value = false;
+}
+
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+}
+</style>
diff --git a/src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/dutyDialog.vue b/src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/dutyDialog.vue
new file mode 100644
index 0000000..c18d848
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/dutyDialog.vue
@@ -0,0 +1,378 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        title="编辑"
+        width="75%"
+        :before-close="handleClose"
+        :close-on-press-escape="false"
+        :close-on-click-modal="false"
+    >
+      <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" >
+        <el-row>
+          <el-col :sm="24" :md="12">
+            <el-form-item label="部门名称:" prop="deptName">
+              <el-input v-model.trim="state.form.deptName" readonly></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :sm="24" :md="12">
+            <el-form-item label="部门负责人:" prop="leaderName">
+              <el-input v-model.trim="state.form.leaderName" readonly></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :sm="24" :md="12">
+            <el-form-item label="部门人数:" prop="personNum">
+              <el-input type="number" v-model.trim.number="state.form.personNum" placeholder="请输入部门人数" ></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :sm="24" :md="12">
+            <el-form-item label="内审员:" prop="internalAuditors">
+              <el-select
+                  clearable
+                  v-model="state.form.internalAuditors"
+                  filterable
+                  placeholder="内审员"
+                  style="width: 100%"
+              >
+                <el-option
+                    v-for="item in state.userList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="部门职责:" prop="responsibilities">
+          <el-input
+              v-model="state.form.responsibilities"
+              style="width: 100%"
+              :autosize="{ minRows: 2, maxRows: 4 }"
+              type="textarea"
+              placeholder="部门职责"
+          />
+        </el-form-item>
+      </el-form>
+      <el-button
+          type="primary"
+          plain
+          icon="Plus"
+          @click="addLine"
+          style="margin-bottom: 10px"
+      >新增</el-button>
+      <el-table :data="state.form.sysDeptResponsibilityList" class="customedTable" :border="true">
+        <el-table-column label="条款号" prop="clauseNum" align="center" width="80">
+          <template #default="scope">
+            <el-input
+                v-model.trim="scope.row.clauseNum"
+                size="large"
+                v-if="scope.$index>4 && scope.$index<state.form.sysDeptResponsibilityList.length-2"
+                style="width: 100%;"
+            >
+            </el-input>
+            <span v-else>
+              {{scope.row.clauseNum}}
+            </span>
+          </template>
+        </el-table-column>
+        <el-table-column label="内容" prop="content" align="center">
+          <template #default="scope">
+            <el-input
+                v-model.trim="scope.row.content"
+                size="large"
+                v-if="scope.$index>4 && scope.$index<state.form.sysDeptResponsibilityList.length-2"
+                style="width: 100%;"
+            >
+            </el-input>
+            <span v-else>
+              {{scope.row.content}}
+            </span>
+          </template>
+        </el-table-column>
+        <el-table-column label="条款负责人" prop="leader" align="center">
+          <template #default="scope">
+<!--            <el-select-->
+<!--                v-model="scope.row.leader"-->
+<!--                filterable-->
+<!--                size="large"-->
+<!--                style="width: 100%"-->
+<!--            >-->
+<!--              <el-option-->
+<!--                  v-for="item in state.userList"-->
+<!--                  :key="item.id"-->
+<!--                  :label="item.name"-->
+<!--                  :value="item.id"-->
+<!--              />-->
+<!--            </el-select>-->
+            <el-input
+                v-model.trim="scope.row.leader"
+                size="large"
+                style="width: 100%;"
+            >
+            </el-input>
+          </template>
+        </el-table-column>
+        <el-table-column label="相关证据材料" prop="evidenceMaterials" align="center">
+          <template #default="scope">
+            <el-input
+                v-model.trim="scope.row.evidenceMaterials"
+                size="large"
+                style="width: 100%;"
+            >
+            </el-input>
+          </template>
+        </el-table-column>
+        <el-table-column label="现有管理类文件" prop="managementDocuments" align="center" width="150">
+          <template #default="scope">
+            <el-input
+                v-model.trim="scope.row.managementDocuments"
+                size="large"
+                style="width: 100%;"
+                clearable
+            >
+            </el-input>
+          </template>
+        </el-table-column>
+        <el-table-column label="技术类文件" prop="technicalDocuments" align="center" width="150">
+          <template #default="scope">
+            <el-input
+                v-model.trim="scope.row.technicalDocuments"
+                size="large"
+                style="width: 100%;"
+            >
+            </el-input>
+          </template>
+        </el-table-column>
+        <el-table-column label="现有记录" prop="existingRecords" align="center" width="150">
+          <template #default="scope">
+            <el-input
+                v-model.trim="scope.row.existingRecords"
+                size="large"
+                style="width: 100%;"
+            >
+            </el-input>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center" width="70">
+          <template #default="scope">
+<!--            <el-button link type="primary" @click="openEdit('edit',scope.row)">编辑</el-button>-->
+            <el-button link type="danger" v-if="scope.$index>4 && scope.$index<state.form.sysDeptResponsibilityList.length-2" @click="handleDelete(scope.$index)">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <template #footer>
+        <span class="dialog-footer">
+            <el-button @click="handleClose" size="default">取 消</el-button>
+            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {reactive, ref, toRefs, defineEmits, nextTick, onMounted, computed, watch} from 'vue'
+import {ElMessage} from "element-plus";
+import {getDeptInfo, saveResponsibility} from "@/api/orgStructure/depart";
+import {listUser} from "@/api/system/user";
+const emit = defineEmits(["getList"]);
+const dialogVisible = ref(false)
+const superRef = ref()
+
+const state = reactive({
+  form: {
+    deptName: '',
+    leaderName: '',
+    companyId: null,
+    delData: [],
+    deptId: null,
+    internalAuditors: null,
+    personNum: null,
+    responsibilities: '',
+    sysDeptResponsibilityList: []
+  },
+  oldResponsibilityList: [],
+  formRules:{
+    personNum: [{ required: true, message: '请输入部门人数', trigger: 'blur' }],
+    internalAuditors: [{ required: true, message: '请选择内审员', trigger: 'blur' }],
+    responsibilities: [{ required: true, message: '请输入部门职责', trigger: 'blur' }]
+  },
+  firstFive: [
+    {clauseNum: '5.3',content: '组织的岗位、职责和权限'},
+    {clauseNum: '4.1',content: '理解组织及其环境'},
+    {clauseNum: '4.2',content: '理解相关方的需求和期望'},
+    {clauseNum: '6.1',content: '应对风险和机遇的措施'},
+    {clauseNum: '6.2',content: '质量目标及其实现的策划'}
+  ],
+  lastTwo: [
+    {clauseNum: '9.1',content: '监视、测量、分析和评价'},
+    {clauseNum: '10',content: '改进'}
+  ],
+  userList: []
+})
+
+onMounted(() => {
+
+});
+
+const openDialog = async (value) => {
+  await getUserList()
+  await getDeptDetail(value.deptId)
+  dialogVisible.value = true
+}
+
+const getDeptDetail = async (deptId)=>{
+  const res = await getDeptInfo(deptId)
+  if (res.code == 200) {
+    if(res.data){
+      Object.keys(state.form).forEach(key => {
+        if (key in res.data) {
+          state.form[key] = res.data[key];
+        }
+      })
+      if(res.data.sysDeptResponsibilitys && Array.isArray(res.data.sysDeptResponsibilitys) && res.data.sysDeptResponsibilitys.find(i=>i.clauseNum == '5.3')){
+        state.form.sysDeptResponsibilityList = sortResponsibilities(res.data.sysDeptResponsibilitys)
+        state.oldResponsibilityList = sortResponsibilities(res.data.sysDeptResponsibilitys)
+      }else{
+        state.form.sysDeptResponsibilityList = [...state.firstFive,...res.data.sysDeptResponsibilitys,...state.lastTwo]
+        state.oldResponsibilityList = [...state.firstFive,...res.data.sysDeptResponsibilitys,...state.lastTwo]
+      }
+      state.form.personNum = state.form.personNum==0?null:state.form.personNum
+      state.form.internalAuditors = state.form.internalAuditors==0?null:state.form.internalAuditors
+    }else{
+      ElMessage.warning('暂无部门信息')
+    }
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const sortResponsibilities = (list) => {
+  // 提取firstFive和lastTwo的clauseNum作为排序依据
+  const firstFiveClauses = state.firstFive.map(item => item.clauseNum)
+  const lastTwoClauses = state.lastTwo.map(item => item.clauseNum)
+
+  // 分类处理
+  const matchedFirstFive = []
+  const matchedLastTwo = []
+  const otherItems = []
+
+  // 先匹配firstFive
+  firstFiveClauses.forEach(clauseNum => {
+    const foundItem = list.find(item => item.clauseNum === clauseNum)
+    if (foundItem) {
+      matchedFirstFive.push(foundItem)
+    }
+  });
+
+  // 然后匹配lastTwo
+  lastTwoClauses.forEach(clauseNum => {
+    const foundItem = list.find(item => item.clauseNum === clauseNum)
+    if (foundItem && !matchedFirstFive.includes(foundItem)) {
+      matchedLastTwo.push(foundItem)
+    }
+  });
+
+  // 剩下的其他项
+  list.forEach(item => {
+    if (!matchedFirstFive.includes(item) && !matchedLastTwo.includes(item)) {
+      otherItems.push(item)
+    }
+  });
+
+  // 合并结果数组
+  return [...matchedFirstFive, ...otherItems, ...matchedLastTwo]
+}
+
+const getUserList = async ()=> {
+  const res = await listUser()
+  if(res.code == 200){
+    state.userList = res.data.list?res.data.list:[]
+  }else{
+    ElMessage.warning(res.message)
+  }
+}
+
+const addLine = () => {
+  const obj = {
+    clauseNum: '',
+    content: '',
+    leader: '',
+    evidenceMaterials: '',
+    managementDocuments: '',
+    technicalDocuments: '',
+    existingRecords: ''
+  }
+  state.form.sysDeptResponsibilityList.splice(-2, 0, obj);
+}
+
+const handleDelete = (i) =>{
+  state.form.sysDeptResponsibilityList = state.form.sysDeptResponsibilityList.filter((item,index) => index != i)
+}
+
+const onSubmit = async () => {
+  const valid = await superRef.value.validate();
+  if(valid){
+    state.form.delData = state.oldResponsibilityList.filter(oldItem => !state.form.sysDeptResponsibilityList.some(newItem => newItem.id === oldItem.id)).map(item => item.id)
+    for(let i of state.form.sysDeptResponsibilityList){
+      if(i.clauseNum == '' || i.content=='' || i.leader == ''){
+        ElMessage.warning('条款编号、内容、负责人不可为空')
+        return
+      }
+    }
+    const res = await saveResponsibility(state.form)
+    if(res.code == 200){
+      ElMessage.success(res.message)
+      handleClose()
+      emit('getList')
+    }else{
+      ElMessage.warning(res.message)
+    }
+  }
+}
+
+const handleClose = () => {
+  state.form = {
+    deptName: '',
+    leaderName: '',
+    companyId: null,
+    delData: [],
+    deptId: null,
+    internalAuditors: null,
+    personNum: null,
+    responsibilities: '',
+    sysDeptResponsibilityList: []
+  }
+  dialogVisible.value = false
+}
+
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+}
+</style>
+<style lang="scss">
+  .customedTable{
+    .el-table__cell{
+      padding: 2px 0 !important;
+    }
+    .cell{
+      padding: 0 2px !important;
+    }
+  }
+</style>
\ No newline at end of file
diff --git a/src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/exportWord.js b/src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/exportWord.js
new file mode 100644
index 0000000..3ba3d7b
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/exportWord.js
@@ -0,0 +1,55 @@
+//引入工具
+import PizZip from 'pizzip';
+import Docxtemplater from 'docxtemplater';
+import JSZipUtils from 'jszip-utils';
+import { saveAs } from 'file-saver';
+
+// 加载 .docx 模板文件
+function loadFile(url, callback) {
+    JSZipUtils.getBinaryContent(url, callback);
+}
+
+// 下载生成的文档
+export function download(file, name) {
+
+}
+
+// 生成并下载 Word 文档(templatePath是word文档模版地址,data是对应的数据)
+export function generateWordDocument(templatePath, data, name) {
+        loadFile(templatePath, function (error, content) {
+            if (error) {
+                throw error
+                return;
+            }
+
+            try {
+                // 加载模板文件内容到 PizZip
+                const zip = new PizZip(content);
+                const doc = new Docxtemplater(zip, {
+                    paragraphLoop: true,
+                    linebreaks: true,
+                });
+
+                // 设置模板中的占位符数据
+                doc.setData(data);
+
+                // 渲染文档
+                doc.render();
+
+                // 生成最终的文档 Blob
+                const fileWord = doc.getZip().generate({
+                    type: 'blob',
+                    mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+                });
+
+                saveAs(fileWord, name);
+
+                // // 返回生成的文档 Blob
+                // resolve(fileWord);
+            } catch (error) {
+                console.error('Error rendering document:', error);
+                throw error
+            }
+        });
+
+}
diff --git a/src/views/build/conpanyFunctionConsult/orgStructure/departManage/index.vue b/src/views/build/conpanyFunctionConsult/orgStructure/departManage/index.vue
new file mode 100644
index 0000000..955110e
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/orgStructure/departManage/index.vue
@@ -0,0 +1,287 @@
+<template>
+  <div class="app-container">
+    <div style="display: flex;justify-content: space-between">
+      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
+        <el-form-item>
+          <el-button type="primary" plain icon="Plus" @click="openDialog('add',{})">新增</el-button>
+        </el-form-item>
+        <el-form-item v-if="isAdmin" label="企业:" >
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
+            <el-option
+                v-for="item in companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item >
+          <el-button v-if="isAdmin" type="primary" @click="getList">查询</el-button>
+          <el-button v-if="isAdmin" type="primary" plain @click="reset">重置</el-button>
+          <el-button type="primary" @click="initDistribute">生成智能分配表</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" border>
+      <el-table-column label="序号" type="index" align="center" width="80" />
+      <el-table-column label="部门名称" prop="deptName" align="center"  />
+      <el-table-column label="负责人" prop="leaderName" align="center" />
+      <el-table-column label="主要负责部门" prop="parentName" align="center"/>
+      <el-table-column label="部门涉及条款" prop="userTypeName" align="center" width="150">
+        <template #default="scope">
+          <div v-if="scope.row.caluseVO1List">
+            <div v-for="(item,index) in scope.row.caluseVO1List" :key="index">
+              {{ item.clauseNum + ' ' + item.content}}
+            </div>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="部门职责表" prop="userTypeName" align="center" width="150">
+        <template #default="scope">
+          <el-button link type="primary" @click="openDutyDialog(scope.row)">编辑</el-button>
+          <el-button link type="danger" @click="download(scope.row)">导出</el-button>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
+        <template #default="scope">
+          <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
+          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="total > 0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+    <depart-dialog ref="dialogRef" @getList=getList></depart-dialog>
+    <duty-dialog ref="dutyDialogRef" @getList=getList></duty-dialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getDepart, delDepart, getCompany, getDeptInfo, initDistribution} from "@/api/orgStructure/depart";
+import departDialog from './components/departDialog.vue'
+import dutyDialog from './components/dutyDialog.vue'
+import {generateWordDocument} from "./components/exportWord.js";
+import useUserStore from "@/store/modules/user";
+const userStore = useUserStore()
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const dialogRef = ref();
+const dutyDialogRef = ref()
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    companyId: null
+  },
+  total: 0,
+  dataList: [],
+  companyList: [],
+  isAdmin: false,
+  firstFive: [
+    {clauseNum: '5.3',content: '组织的岗位、职责和权限'},
+    {clauseNum: '4.1',content: '理解组织及其环境'},
+    {clauseNum: '4.2',content: '理解相关方的需求和期望'},
+    {clauseNum: '6.1',content: '应对风险和机遇的措施'},
+    {clauseNum: '6.2',content: '质量目标及其实现的策划'}
+  ],
+  lastTwo: [
+    {clauseNum: '9.1',content: '监视、测量、分析和评价'},
+    {clauseNum: '10',content: '改进'}
+  ]
+});
+const { queryParams, total, dataList, companyList, isAdmin } = toRefs(data);
+const userInfo = ref()
+onMounted(async ()=>{
+  if(userStore.roles.includes('admin')){
+    data.isAdmin = true
+    await getCompanyList()
+  }else{
+    data.isAdmin = false
+    data.queryParams.companyId = userStore.companyId
+  }
+  await getList()
+})
+
+onUnmounted(()=>{
+
+})
+
+const getList = async () => {
+  loading.value = true
+  const res = await getDepart(data.queryParams)
+  if(res.code == 200){
+    data.dataList = res.data || []
+    data.total = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false
+}
+
+const initDistribute = async ()=>{
+  ElMessageBox.confirm(
+      '重新生成将重置原有分配信息,是否继续?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await initDistribution({companyId: data.queryParams.companyId})
+        if (res.code == 200) {
+          ElMessage.success(res.message)
+        } else {
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+    data.queryParams.companyId = data.companyList[0].id
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const openDialog = (type, value) => {
+  dialogRef.value.openDialog(type, value, data.queryParams.companyId);
+}
+const openDutyDialog = (value) =>{
+  dutyDialogRef.value.openDialog(value);
+}
+
+/** 重置新增的表单以及其他数据  */
+const reset = async()=> {
+  data.queryParams = {
+    pageNum: 1,
+    pageSize: 10,
+    companyId: null
+  }
+  await getCompanyList()
+  await getList()
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delDepart(val.deptId)
+        if(res.code == 200){
+          ElMessage.success('数据删除成功')
+          await getList()
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+const download = async (val) => {
+  const templatePath = '/dutyFile.docx'
+  const data = await getDeptDetail(val.deptId)
+  console.log(data)
+  try {
+    generateWordDocument(templatePath, data, `${data.deptName}职责表.docx`);
+  } catch (error){
+    ElMessage({
+      type: 'warning',
+      message: '失败'
+    });
+  }
+}
+
+const getDeptDetail = async (deptId)=>{
+  let tableData = {}
+  const res = await getDeptInfo(deptId)
+  if (res.code == 200) {
+    if(res.data){
+      tableData = res.data
+      if(res.data.sysDeptResponsibilitys && Array.isArray(res.data.sysDeptResponsibilitys) && res.data.sysDeptResponsibilitys.find(i=>i.clauseNum == '5.3')){
+        tableData.tableData = sortResponsibilities(res.data.sysDeptResponsibilitys.map(i=>{
+          return {
+            ...i,
+            evidenceMaterials: i.evidenceMaterials || '',
+            managementDocuments: i.managementDocuments || '',
+            technicalDocuments: i.technicalDocuments || '',
+            existingRecords: i.existingRecords || '',
+          }
+        }))
+      }else{
+        tableData.tableData = [...data.firstFive,...res.data.sysDeptResponsibilitys.map(i=>{
+          return {
+            ...i,
+            evidenceMaterials: i.evidenceMaterials || '',
+            managementDocuments: i.managementDocuments || '',
+            technicalDocuments: i.technicalDocuments || '',
+            existingRecords: i.existingRecords || '',
+          }
+        }),...data.lastTwo]
+      }
+      return tableData
+    }else{
+      ElMessage.warning('暂无部门信息')
+    }
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const sortResponsibilities = (list) => {
+  // 提取firstFive和lastTwo的clauseNum作为排序依据
+  const firstFiveClauses = data.firstFive.map(item => item.clauseNum)
+  const lastTwoClauses = data.lastTwo.map(item => item.clauseNum)
+
+  // 分类处理
+  const matchedFirstFive = []
+  const matchedLastTwo = []
+  const otherItems = []
+
+  // 先匹配firstFive
+  firstFiveClauses.forEach(clauseNum => {
+    const foundItem = list.find(item => item.clauseNum === clauseNum)
+    if (foundItem) {
+      matchedFirstFive.push(foundItem)
+    }
+  });
+
+  // 然后匹配lastTwo
+  lastTwoClauses.forEach(clauseNum => {
+    const foundItem = list.find(item => item.clauseNum === clauseNum)
+    if (foundItem && !matchedFirstFive.includes(foundItem)) {
+      matchedLastTwo.push(foundItem)
+    }
+  });
+
+  // 剩下的其他项
+  list.forEach(item => {
+    if (!matchedFirstFive.includes(item) && !matchedLastTwo.includes(item)) {
+      otherItems.push(item)
+    }
+  });
+
+  // 合并结果数组
+  return [...matchedFirstFive, ...otherItems, ...matchedLastTwo]
+}
+
+</script>
diff --git a/src/views/build/conpanyFunctionConsult/orgStructure/dutyDistributeChart/index.vue b/src/views/build/conpanyFunctionConsult/orgStructure/dutyDistributeChart/index.vue
new file mode 100644
index 0000000..903fff4
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/orgStructure/dutyDistributeChart/index.vue
@@ -0,0 +1,312 @@
+<template>
+  <div class="app-container">
+    <div style="display: flex;justify-content: space-between">
+      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
+<!--        <el-form-item>-->
+<!--          <el-button-->
+<!--              type="primary"-->
+<!--              plain-->
+<!--              icon="Plus"-->
+<!--              @click="openDialog('add',{})"-->
+<!--          >新增</el-button>-->
+<!--        </el-form-item>-->
+        <el-form-item v-if="isAdmin" label="企业:" >
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
+            <el-option
+                v-for="item in companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item >
+          <el-button type="primary" v-if="isAdmin" @click="getList">查询</el-button>
+          <el-button type="primary" v-if="isAdmin" plain @click="reset">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div style="display: flex;justify-content: space-between;margin-bottom: 10px">
+      <div>质量管理体系过程与部门职能矩阵</div>
+      <div>
+        <el-button type="primary" @click="initDistribute">重新生成</el-button>
+        <el-button type="primary" v-if="!isEdit" @click="isEdit = true">编辑</el-button>
+        <el-button type="primary" v-if="isEdit" @click="confirmEdit">保存</el-button>
+      </div>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="caluseList" class="caluseTable" :border="true" :span-method="arraySpanMethod">
+      <el-table-column label="条款号" prop="clauseNum" align="center"/>
+      <el-table-column label="条款内容/要素" prop="content" align="left"/>
+      <el-table-column label="总经理" prop="manage" align="center">
+        <template #default="scope">
+          <el-checkbox v-model="scope.row.manage" disabled size="large" />
+        </template>
+      </el-table-column>
+      <el-table-column label="管理者代表" prop="represent" align="center">
+        <template #default="scope">
+          <el-checkbox v-model="scope.row.represent" disabled size="large" />
+        </template>
+      </el-table-column>
+      <el-table-column v-for="column in deptList" :key="column.deptId" :prop="column.deptId" :label="column.deptName" align="center">
+        <template #default="scope">
+          <el-checkbox v-model="scope.row[column.deptId]" :disabled="!isEdit" size="large" @change="changeStatus(scope.row)"/>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
+import {ElMessage, ElMessageBox} from "element-plus";
+import {delUser, getUser} from "@/api/onlineEducation/user";
+import useUserStore from "@/store/modules/user";
+import {getCompany, getDepart, getDistribution, initDistribution, saveDistribution} from "@/api/orgStructure/depart";
+const userStore = useUserStore()
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const dialogRef = ref();
+const data = reactive({
+  isAdmin: false,
+  companyList: [],
+  queryParams: {
+    companyId: null
+  },
+  isEdit: false,
+  dataList: [],
+  deptList: [],
+  caluseList: [
+    {clauseNum: '4', content: '组织环境'},
+    {clauseNum: '4.1', content: '理解组织及其环境',manage: true,represent: false},
+    {clauseNum: '4.2', content: '理解相关方的需求和期望',manage: true,represent: false},
+    {clauseNum: '4.3', content: '确定质量管理体系的范围',manage: false,represent: true},
+    {clauseNum: '4.4', content: '质量管理体系及其过程',manage: false,represent: true},
+    {clauseNum: '5', content: '领导作用'},
+    {clauseNum: '5.1', content: '领导作用和承诺',manage: true,represent: false},
+    {clauseNum: '5.2', content: '方针',manage: true,represent: false},
+    {clauseNum: '5.3', content: '组织内的角色、职责和权限',manage: true,represent: false},
+    {clauseNum: '6', content: ''},
+    {clauseNum: '6.1', content: '应对风险和机遇的措施',manage: true,represent: false},
+    {clauseNum: '6.2', content: '质量目标及其实现的策划',manage: false,represent: true},
+    {clauseNum: '6.3', content: '变更的策划',manage: false,represent: true},
+    {clauseNum: '7', content: '支持'},
+    {clauseNum: '7.1', content: '资源',manage: true,represent: false},
+    {clauseNum: '7.1.1', content: '总则',manage: true,represent: false},
+    {clauseNum: '7.1.2', content: '人员',manage: true,represent: false},
+    {clauseNum: '7.1.3', content: '基础设施',manage: false,represent: true},
+    {clauseNum: '7.1.4', content: '过程运行环境',manage: false,represent: true},
+    {clauseNum: '7.1.5', content: '监视和测量资源',manage: false,represent: true},
+    {clauseNum: '7.1.6', content: '组织的知识',manage: false,represent: true}
+  ],
+  form: {
+    companyId: null,
+    list: []
+  }
+});
+
+const { queryParams,isEdit, dataList,deptList, isAdmin, companyList, caluseList, form } = toRefs(data);
+
+onMounted(async ()=>{
+  if(userStore.roles.includes('admin')){
+    data.isAdmin = true
+    await getCompanyList()
+  }else{
+    data.isAdmin = false
+    data.queryParams.companyId = userStore.companyId
+    data.form.companyId = userStore.companyId
+  }
+  await getDeptList()
+  await getList()
+})
+
+onUnmounted(()=>{
+
+})
+
+const changeStatus = (val)=>{
+  const excludeFields = ['clauseNum', 'content', 'manage', 'represent']
+  // 转换当前对象为临时数组
+  const currentList = Object.keys(val).filter(key => !excludeFields.includes(key)).map(key => ({
+        clauseNum: val.clauseNum,
+        deptId: Number(key),
+        chooseLab: val[key] ? 1 : 0
+      }))
+  // 合并到 data.form.list,覆盖重复项
+  currentList.forEach(newItem => {
+    const existingIndex = data.form.list.findIndex(
+        item => item.clauseNum === newItem.clauseNum && item.deptId === newItem.deptId
+    );
+    if (existingIndex !== -1) {
+      // 覆盖已存在的项
+      data.form.list[existingIndex] = newItem;
+    } else {
+      // 新增不存在的项
+      data.form.list.push(newItem);
+    }
+  })
+}
+
+const confirmEdit = async ()=>{
+  loading.value = true
+  const res = await saveDistribution(data.form)
+  if(res.code == 200){
+    ElMessage.success(res.message)
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false
+  data.isEdit = !data.isEdit
+}
+
+const arraySpanMethod = ({
+     row,
+     column,
+     rowIndex,
+     columnIndex,
+   }) => {
+  if (rowIndex === 0 || rowIndex === 5 ||rowIndex === 9 ||rowIndex === 13) {
+    if (columnIndex === 0) {
+      return [1, 1]
+    } else if(columnIndex === 1){
+      return [1,8]
+    }
+  }
+}
+
+const getList = async () => {
+  loading.value = true
+  const res = await getDistribution(data.queryParams)
+  if(res.code == 200){
+    data.dataList = res.data
+    for(let item of data.caluseList){
+      const sameNum = data.dataList.filter(i=>i.clauseNum == item.clauseNum).map(j=> {
+          return {
+            deptId: j.deptId,
+            chooseLab: j.chooseLab
+          }
+        }
+      )
+      for(let i of sameNum){
+        item[i.deptId] = i.chooseLab == 0?false:true
+      }
+    }
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false
+}
+
+const getDeptList = async () => {
+  loading.value = true
+  const res = await getDepart({pageNum: 1, pageSize: 999, companyId: data.queryParams.companyId})
+  if(res.code == 200){
+    data.deptList = res.data
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false
+}
+
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+    data.queryParams.companyId = data.companyList[0].id
+    data.form.companyId = data.companyList[0].id
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const initDistribute = async ()=>{
+  ElMessageBox.confirm(
+      '重新生成将重置原有分配信息,是否继续?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await initDistribution({companyId: data.queryParams.companyId})
+        if (res.code == 200) {
+          ElMessage.success(res.message)
+          await getList()
+        } else {
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+const openDialog = (type, value) => {
+  dialogRef.value.openDialog(type, value);
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  data.queryParams = {
+    pageNum: 1,
+    pageSize: 10,
+    companyId: null
+  }
+  getList()
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delUser(val.id)
+        if(res.code == 200){
+          ElMessage.success('数据删除成功')
+          await getList()
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+</script>
+<style lang="scss">
+.caluseTable{
+  .el-table__cell{
+    padding: 4px 0 !important;
+    .is-disabled{
+      .el-checkbox__label{
+        color: #606266 !important
+      }
+      &.is-checked{
+        .el-checkbox__label{
+          color: #409eff !important
+        }
+        .el-checkbox__inner{
+          background-color: #333;
+          &::after{
+            display: none;
+          }
+        }
+      }
+      .el-checkbox__inner{
+        width: 16px;
+        height: 16px;
+        background-color: #fff;
+        border-color: #999;
+        border-radius: 50% !important;
+      }
+    }
+  }
+  .cell{
+    padding: 0 6px !important;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/src/views/build/conpanyFunctionConsult/peopleManage/user/index.vue b/src/views/build/conpanyFunctionConsult/peopleManage/user/index.vue
deleted file mode 100644
index 4bc7af5..0000000
--- a/src/views/build/conpanyFunctionConsult/peopleManage/user/index.vue
+++ /dev/null
@@ -1,179 +0,0 @@
-<template>
-  <div class="app-container">
-    <div style="display: flex;justify-content: space-between">
-      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
-        <el-form-item>
-          <el-button
-              type="primary"
-              plain
-              icon="Plus"
-              @click="openDialog('add',{})"
-          >新增</el-button>
-        </el-form-item>
-        <el-form-item label="用户名:" >
-          <el-input v-model="data.queryParams.username" placeholder="请输入用户名"></el-input>
-        </el-form-item>
-        <el-form-item label="用户类型:" >
-          <el-select v-model="data.queryParams.userType" placeholder="请选择" clearable>
-            <el-option
-                v-for="item in data.userTypeList"
-                :key="item.id"
-                :label="item.name"
-                :value="item.id">
-            </el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item >
-          <el-button
-              type="primary"
-              @click="getList"
-          >查询</el-button>
-          <el-button
-              type="primary"
-              plain
-              @click="reset"
-          >重置</el-button>
-        </el-form-item>
-      </el-form>
-    </div>
-    <!-- 表格数据 -->
-    <el-table v-loading="loading" :data="dataList" :border="true">
-      <el-table-column label="序号" type="index" align="center" width="80" />
-      <el-table-column label="用户名" prop="username" align="center"  />
-      <el-table-column label="名称" prop="name" align="center" />
-      <el-table-column label="手机号" prop="phone" align="center"/>
-      <el-table-column label="用户类型" prop="userTypeName" align="center" width="150" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
-        <template #default="scope">
-          <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
-          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
-          <el-button link type="primary" @click="openDialog('pwd',scope.row)">修改密码</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <pagination
-        v-show="total > 0"
-        :total="total"
-        v-model:page="queryParams.pageNum"
-        v-model:limit="queryParams.pageSize"
-        @pagination="getList"
-    />
-
-    <user-dialog ref="dialogRef" @getList=getList></user-dialog>
-  </div>
-</template>
-
-<script setup>
-import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
-import {ElMessage, ElMessageBox} from "element-plus";
-import {delCompany, getCompany} from "@/api/onlineEducation/company";
-import userDialog from './components/userDialog.vue'
-import {delUser, getUser} from "@/api/onlineEducation/user";
-import Cookies from "js-cookie";
-
-
-const { proxy } = getCurrentInstance();
-const loading = ref(false);
-const dialogRef = ref();
-const data = reactive({
-  queryParams: {
-    pageNum: 1,
-    pageSize: 10,
-    username: '',
-    userType: null
-  },
-  total: 0,
-  dataList: [],
-  userTypeList: [
-    {
-      id: 0,
-      name: '管理员'
-    },
-    {
-      id: 1,
-      name: '企业级'
-    },
-    {
-      id: 2,
-      name: '部门级'
-    },
-    {
-      id: 3,
-      name: '车间(岗位)级别'
-    },
-    {
-      id: 4,
-      name: '其他'
-    },
-  ]
-
-});
-
-const { queryParams, total, dataList } = toRefs(data);
-const userInfo = ref()
-onMounted(()=>{
-  userInfo.value = JSON.parse(Cookies.get('userInfo'))
-  getList()
-})
-
-onUnmounted(()=>{
-
-})
-
-const getList = async () => {
-  loading.value = true
-  const res = await getUser(data.queryParams)
-  if(res.code == 200){
-    data.dataList = res.data.list.map(item => {
-      return {
-        ...item,
-        userTypeName: item.userType === 0 ? '管理员' : item.userType === 1 ? '企业级' : item.userType === 2 ? '部门级' : item.userType === 3 ? '车间级' :'其他'
-      }
-    })
-    data.total = res.data.total
-  }else{
-    ElMessage.warning(res.message)
-  }
-  loading.value = false
-}
-
-const openDialog = (type, value) => {
-  if(userInfo.value.userType === 3){
-    ElMessage.warning('车间级用户不能新增')
-    return;
-  }
-  dialogRef.value.openDialog(type, value);
-}
-
-/** 重置新增的表单以及其他数据  */
-function reset() {
-  data.queryParams = {
-    pageNum: 1,
-    pageSize: 10,
-    username: '',
-    userType: null
-  }
-  getList()
-}
-const handleDelete = (val) => {
-  ElMessageBox.confirm(
-      '确定删除此条数据?',
-      '提示',
-      {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-      .then( async() => {
-        const res = await delUser(val.id)
-        if(res.code == 200){
-          ElMessage.success('数据删除成功')
-          await getList()
-        }else{
-          ElMessage.warning(res.message)
-        }
-      })
-}
-
-</script>
diff --git a/src/views/build/conpanyFunctionConsult/staffManage/staffPortfolio/components/editorDialog.vue b/src/views/build/conpanyFunctionConsult/staffManage/staffPortfolio/components/editorDialog.vue
new file mode 100644
index 0000000..050d4bc
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/staffManage/staffPortfolio/components/editorDialog.vue
@@ -0,0 +1,132 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="state.title"
+        width="700px"
+        :before-close="handleClose"
+        :close-on-press-escape="false"
+        :close-on-click-modal="false"
+    >
+      <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" >
+        <el-form-item label="员工情况介绍:"  prop="companyRoster">
+          <editor v-model="state.form.companyRoster" :min-height="300"/>
+        </el-form-item>
+      </el-form>
+      <template #footer v-if="state.title !='查看'">
+        <span class="dialog-footer">
+            <el-button @click="handleClose" size="default">取 消</el-button>
+            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue'
+import {ElMessage} from "element-plus";
+import {addUser, editUser, getUserById, resetPwd} from "@/api/onlineEducation/user"
+import {Base64} from "js-base64"
+import {getCompany} from "@/api/onlineEducation/company";
+import {saveRoster, updateRoster} from "@/api/staffManage/staff";
+
+const emit = defineEmits(["getList"]);
+const dialogVisible = ref(false)
+const superRef = ref()
+const state = reactive({
+  title: '',
+  form: {
+    id: null,
+    companyId: null,
+    companyRoster: '',
+  },
+  isView: false,
+  formRules:{
+    companyRoster: [{ required: true, message: '员工情况介绍', trigger: 'blur' }],
+  },
+  isAdmin: false,
+})
+const UisMounted = ref(false);
+onMounted(() => {
+
+});
+
+const disabled = ref(false);
+const userInfo = ref()
+const openDialog = async (type, value, companyId) => {
+  state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看'
+  state.form.companyId = companyId
+  if(type == 'view'){
+    state.isView = true
+  }else{
+    state.isView = false
+  }
+  if(state.title == '编辑'||state.title == '查看'){
+    Object.keys(state.form).forEach(key => {
+      if (key in value) {
+        state.form[key] = value[key];
+      }
+    })
+  }
+  dialogVisible.value = true
+}
+const loading = ref(false)
+
+const onSubmit = async () => {
+  const valid = await superRef.value.validate();
+  if(valid){
+
+    if(state.title == '新增'){
+      const {id,...data} = state.form
+      const res = await saveRoster(data)
+      if(res.code == 200){
+        ElMessage.success(res.message)
+        emit('getList')
+        handleClose()
+        dialogVisible.value = false;
+      }else{
+        ElMessage.warning(res.message)
+      }
+    }else{
+      const res = await updateRoster(state.form)
+      if(res.code == 200){
+        ElMessage.success(res.message)
+        emit('getList')
+        handleClose()
+      }else{
+        ElMessage.warning(res.message)
+      }
+    }
+  }
+}
+
+
+const handleClose = () => {
+  state.form = {
+    id: null,
+    companyId: null,
+    companyRoster: '',
+  }
+  superRef.value.clearValidate();
+  superRef.value.resetFields()
+  dialogVisible.value = false;
+}
+
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+}
+</style>
diff --git a/src/views/build/conpanyFunctionConsult/staffManage/staffPortfolio/index.vue b/src/views/build/conpanyFunctionConsult/staffManage/staffPortfolio/index.vue
new file mode 100644
index 0000000..3225da3
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/staffManage/staffPortfolio/index.vue
@@ -0,0 +1,157 @@
+<template>
+  <div class="app-container">
+    <div style="display: flex;justify-content: space-between">
+      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item v-if="isAdmin" label="企业:" >
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
+            <el-option
+                v-for="item in companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item >
+          <el-button v-if="isAdmin" type="primary" @click="getList">查询</el-button>
+          <el-button v-if="isAdmin" type="primary" plain @click="reset">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true">
+      <el-table-column label="序号" type="index" align="center" width="80" />
+      <el-table-column label="企业名称" prop="companyName" align="center"  />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
+        <template #default="scope">
+          <el-button link type="primary" @click="openDialog('view',scope.row)">查看</el-button>
+          <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
+          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="total > 0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+
+    <editor-dialog ref="dialogRef" @getList=getList></editor-dialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
+import {ElMessage, ElMessageBox} from "element-plus";
+import {delCompany, getCompany} from "@/api/onlineEducation/company";
+import {delUser, getUser} from "@/api/onlineEducation/user";
+import Cookies from "js-cookie";
+import editorDialog from './components/editorDialog.vue'
+import {delRoster, getRosterList} from "@/api/staffManage/staff";
+import useUserStore from "@/store/modules/user";
+const userStore = useUserStore()
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const dialogRef = ref();
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    companyId: null
+  },
+  total: 0,
+  dataList: [],
+  companyList: [],
+  isAdmin: false
+});
+
+const { queryParams, total, dataList,companyList, isAdmin } = toRefs(data);
+const userInfo = ref()
+onMounted(async()=>{
+  userInfo.value = JSON.parse(Cookies.get('userInfo'))
+  if(userStore.roles.includes('admin')){
+    data.isAdmin = true
+    await getCompanyList()
+  }else{
+    data.isAdmin = false
+    data.queryParams.companyId = userStore.companyId
+  }
+  await getList()
+})
+
+onUnmounted(()=>{
+
+})
+
+const getList = async () => {
+  loading.value = true
+  const res = await getRosterList(data.queryParams)
+  if(res.code == 200){
+    data.dataList = res.data.list
+    data.total = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false
+}
+
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+    data.queryParams.companyId = data.companyList[0].id
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const openDialog = (type, value) => {
+  dialogRef.value.openDialog(type, value,data.queryParams.companyId);
+}
+
+/** 重置新增的表单以及其他数据  */
+const reset = async()=> {
+  data.queryParams = {
+    pageNum: 1,
+    pageSize: 10,
+    companyId: null
+  }
+  await getCompanyList()
+  await getList()
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delRoster({companyRosterId: val.id})
+        if(res.code == 200){
+          ElMessage.success('数据删除成功')
+          await getList()
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+</script>
diff --git a/src/views/build/conpanyFunctionConsult/peopleManage/user/components/userDialog.vue b/src/views/build/conpanyFunctionConsult/staffManage/staffRegister/components/staffDialog.vue
similarity index 85%
rename from src/views/build/conpanyFunctionConsult/peopleManage/user/components/userDialog.vue
rename to src/views/build/conpanyFunctionConsult/staffManage/staffRegister/components/staffDialog.vue
index c759cf7..fdef075 100644
--- a/src/views/build/conpanyFunctionConsult/peopleManage/user/components/userDialog.vue
+++ b/src/views/build/conpanyFunctionConsult/staffManage/staffRegister/components/staffDialog.vue
@@ -21,6 +21,17 @@
             <el-radio :label="1">女</el-radio>
           </el-radio-group>
         </el-form-item>
+        <el-form-item label="身份证号:"  prop="idCard" v-if="state.title !== '修改密码'">
+          <el-input v-model.trim="state.form.idCard" :maxlength="18" :disabled="disabled" placeholder="请输入身份证号"></el-input>
+        </el-form-item>
+        <el-form-item label="入职时间:" prop="entryTime" v-if="state.title !== '修改密码'" >
+          <el-date-picker
+              v-model="state.form.entryTime"
+              type="date"
+              value-format="YYYY-MM-DD"
+              placeholder="请选择入职时间"
+          />
+        </el-form-item>
         <el-form-item label="密码:" prop="password" v-if="state.title == '新增' || state.title == '修改密码'">
           <el-input v-model.trim="state.form.password" type="password" show-password placeholder="请输入密码"></el-input>
         </el-form-item>
@@ -92,6 +103,29 @@
 
 
         </el-form-item>
+        <el-form-item label="部门:" prop="deptId" v-if="state.title !== '修改密码'">
+          <el-select
+              clearable
+              v-model="state.form.deptId"
+              filterable
+              :disabled="disabled"
+              placeholder="请选择部门"
+              style="width: 100%"
+          >
+            <el-option
+                v-for="item in state.deptList"
+                :key="item.deptId"
+                :label="item.deptName"
+                :value="item.deptId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="职务:" prop="duty" v-if="state.title !== '修改密码'" >
+          <el-input v-model.trim="state.form.duty" :disabled="disabled" placeholder="请输入职务"></el-input>
+        </el-form-item>
+        <el-form-item label="专业:" prop="post" v-if="state.title !== '修改密码'" >
+          <el-input v-model.trim="state.form.post" :disabled="disabled" placeholder="请输入专业"></el-input>
+        </el-form-item>
         <el-form-item label="所属上级账号:" prop="companyName" v-if="showChild">
           <scorllSelect
               :disabled="disabled || state.title =='编辑'"
@@ -133,7 +167,7 @@
 import {getUser} from "@/api/onlineEducation/user";
 import {debounce} from "@/utils";
 import Cookies from "js-cookie";
-
+import {getDepart} from "@/api/orgStructure/depart";
 const emit = defineEmits(["getList"]);
 const dialogVisible = ref(false)
 const superRef = ref(null)
@@ -216,23 +250,33 @@
     userType: null,
     sex: 0,
     companyId: null,
-    parentId: null
+    companyName: '',
+    parentId: null,
+    entryTime: '',
+    idCard: '',
+    deptId: null,
+    duty: '',
+    post: ''
   },
   formRules:{
     name: [{ required: true, message: '请输入公司、部门或者车间岗位名称', trigger: 'blur' }],
-    companyName: [{ required: true, message: '请选择上级企业', trigger: 'blur' }],
+    companyName: [{ required: true, message: '请选择所在企业', trigger: 'blur' }],
+    deptId: [{ required: true, message: '请选择部门', trigger: 'blur' }],
     username: [{ required: true, trigger: "blur", validator: validateUsername }],
     password: [{ required: true, validator: validatePwd, trigger: 'blur' }],
     confirmPassword: [{ required: true, validator: equalToPassword, trigger: 'blur' }],
     phone: [{ required: true, validator: validateUserPhone, trigger: 'blur' }],
     userType: [{ required: true, message: '请选择用户类型', trigger: 'blur' }],
+    idCard: [{ required: true, message: '请输入身份证号', trigger: 'blur' }],
+    entryTime: [{ required: true, message: '请选择入职时间', trigger: 'blur' }],
+    duty: [{ required: true, message: '请输入职务', trigger: 'blur' }],
+    post: [{ required: true, message: '请输入专业', trigger: 'blur' }],
   },
   companyList: [],
   userList: [
 
   ],
   keyword:'',
-
   pageNum: 1,
   pageSize: 10,
   cloading:false,
@@ -251,17 +295,18 @@
 const showChild = ref(false)
 const disabled = ref(false);
 const userInfo = ref()
-const openDialog = async (type, value) => {
+const openDialog = async (type, value, companyId) => {
   userInfo.value = JSON.parse(Cookies.get('userInfo'))
-  console.log("userInfo",userInfo.value)
   state.currentUserType = userInfo.value.userType
   if(state.currentUserType === 0){
     state.isAdmin = true;
+    state.form.companyId = companyId;
   }else {
     state.isAdmin = false;
     state.form.companyId = userInfo.value.companyId;
     state.form.companyName = userInfo.value.companyName;
   }
+  await getdeptList(userInfo.value.companyId)
 
   if(type !== 'view' && type !== 'pwd'){
     // if(state.isAdmin){
@@ -272,7 +317,9 @@
   if(type === 'edit' || type === 'view') {
     startUsername.value = value.username
     if( type === 'view'){
-      disabled.value = true;
+      disabled.value = true
+    }else{
+      disabled.value = false
     }
     const res = await getUserById(value.id);
     if(res.code === 200){
@@ -361,6 +408,21 @@
   //   console.log("state.companyList",state.companyList)
   // }
 }
+
+const getdeptList = async (companyId)=> {
+  const params = {
+    pageNum: 1,
+    pageSize: 999,
+    companyId: companyId
+  }
+  const res = await getDepart(params)
+  if(res.code == 200){
+    state.deptList = res.data
+  }else{
+    ElMessage.warning(res.message)
+  }
+}
+
 const onSubmit = async () => {
   const valid = await superRef.value.validate();
   if(valid){
@@ -389,11 +451,15 @@
         phone: data.phone,
         id:data.id,
         companyId: data.companyId,
+        deptId: data.deptId,
         userType:data.userType,
         username:data.username,
         password: data.password,
-        parentId: data.parentId
-
+        parentId: data.parentId,
+        idCard: data.idCard,
+        entryTime: data.entryTime,
+        duty: data.duty,
+        post: data.post
       }
 
       const res = await editUser(param)
@@ -532,6 +598,7 @@
       state.form.companyId = item.id
     }
   })
+  getdeptList(state.form.companyId)
 }
 const getSelectUser = (val) => {
   console.log("valllllllll",val)
diff --git a/src/views/build/conpanyFunctionConsult/staffManage/staffRegister/index.vue b/src/views/build/conpanyFunctionConsult/staffManage/staffRegister/index.vue
new file mode 100644
index 0000000..0404d39
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/staffManage/staffRegister/index.vue
@@ -0,0 +1,265 @@
+<template>
+  <div class="app-container">
+    <div style="display: flex;justify-content: space-between">
+      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="用户名:" >
+          <el-input v-model="data.queryParams.username" placeholder="请输入用户名"></el-input>
+        </el-form-item>
+<!--        <el-form-item label="用户类型:" >-->
+<!--          <el-select v-model="data.queryParams.userType" placeholder="请选择" clearable>-->
+<!--            <el-option-->
+<!--                v-for="item in data.userTypeList"-->
+<!--                :key="item.id"-->
+<!--                :label="item.name"-->
+<!--                :value="item.id">-->
+<!--            </el-option>-->
+<!--          </el-select>-->
+<!--        </el-form-item>-->
+        <el-form-item v-if="isAdmin" label="企业:" >
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
+            <el-option
+                v-for="item in companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+<!--        <el-form-item label="用户名:" >-->
+<!--          <el-input v-model="data.queryParams.username" placeholder="请输入用户名"></el-input>-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="用户类型:" >-->
+<!--          <el-select v-model="data.queryParams.userType" placeholder="请选择" clearable>-->
+<!--            <el-option-->
+<!--                v-for="item in data.userTypeList"-->
+<!--                :key="item.id"-->
+<!--                :label="item.name"-->
+<!--                :value="item.id">-->
+<!--            </el-option>-->
+<!--          </el-select>-->
+<!--        </el-form-item>-->
+        <el-form-item >
+          <el-button type="primary" @click="getList">查询</el-button>
+          <el-button type="primary" plain @click="reset" style="margin-right: 12px">重置</el-button>
+          <vue3-json-excel
+              :json-data="expertData"
+              :fields="fields"
+              name="用户花名册.xls"
+          >
+            <el-button type="primary">导出</el-button>
+          </vue3-json-excel>
+        </el-form-item>
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true">
+      <el-table-column label="序号" type="index" align="center" width="80" />
+      <el-table-column label="姓名" prop="username" align="center"  />
+      <el-table-column label="身份证号" prop="idCard" align="center" />
+      <el-table-column label="入职时间" prop="entryTime" align="center"/>
+      <el-table-column label="部门" prop="deptName" align="center"/>
+      <el-table-column label="职务" prop="duty" align="center"/>
+      <el-table-column label="联系方式" prop="phone" align="center"/>
+      <el-table-column label="专业" prop="post" align="center"/>
+      <el-table-column label="用户类型" prop="userTypeName" align="center"/>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
+        <template #default="scope">
+          <el-button link type="primary" @click="openDialog('view',scope.row)">查看</el-button>
+          <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
+          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="total > 0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+
+    <user-dialog ref="dialogRef" @getList=getList></user-dialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
+import {ElMessage, ElMessageBox} from "element-plus";
+import {delCompany, getCompany} from "@/api/onlineEducation/company";
+import userDialog from './components/staffDialog.vue'
+import {delUser, getUser} from "@/api/onlineEducation/user";
+import Cookies from "js-cookie";
+import useUserStore from "@/store/modules/user";
+const userStore = useUserStore()
+
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const dialogRef = ref();
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    username: '',
+    userType: null,
+    companyId: null
+  },
+  total: 0,
+  dataList: [],
+  isAdmin: false,
+  companyList: [],
+  expertData: [],
+  userTypeList: [
+    {
+      id: 0,
+      name: '管理员'
+    },
+    {
+      id: 1,
+      name: '企业级'
+    },
+    {
+      id: 2,
+      name: '部门级'
+    },
+    {
+      id: 3,
+      name: '车间(岗位)级别'
+    },
+    {
+      id: 4,
+      name: '其他'
+    },
+  ]
+
+});
+
+const { queryParams, total, dataList,isAdmin,companyList,expertData } = toRefs(data);
+const userInfo = ref()
+const fields = ref({
+  '序号':'index',
+  '姓名':'username',
+  '身份证号':'idCard',
+  '入职时间':'entryTime',
+  '部门':'deptName',
+  '职务':'duty',
+  '联系方式':'phone',
+  '专业':'post',
+  '用户类型':'userTypeName'
+});
+onMounted(async ()=>{
+  userInfo.value = JSON.parse(Cookies.get('userInfo'))
+  if(userStore.roles.includes('admin')){
+    data.isAdmin = true
+    await getCompanyList()
+  }else{
+    data.isAdmin = false
+    data.queryParams.companyId = userStore.companyId
+  }
+  await getList()
+})
+
+onUnmounted(()=>{
+
+})
+
+const getList = async () => {
+  loading.value = true
+  const res = await getUser(data.queryParams)
+  if(res.code == 200){
+    data.dataList = res.data.list.map(item => {
+      return {
+        ...item,
+        userTypeName: item.userType === 0 ? '管理员' : item.userType === 1 ? '企业级' : item.userType === 2 ? '部门级' : item.userType === 3 ? '车间级' :'其他',
+        entryTime: item.entryTime?.substring(0, 10)
+      }
+    })
+    data.total = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false
+  await getAllList()
+}
+
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+    data.queryParams.companyId = data.companyList[0].id
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const getAllList = async () => {
+  let params = data.queryParams
+  params.pageSize = 999
+  const res = await getUser(params)
+  if(res.code == 200){
+    data.expertData = res.data.list.map((item,index) => {
+      return {
+        ...item,
+        index: index + 1,
+        userTypeName: item.userType === 0 ? '管理员' : item.userType === 1 ? '企业级' : item.userType === 2 ? '部门级' : item.userType === 3 ? '车间级' :'其他',
+        entryTime: item.entryTime?.substring(0, 10)
+      }
+    })
+  }else{
+    ElMessage.warning(res.message)
+  }
+}
+
+const openDialog = (type, value) => {
+  if(userInfo.value.userType === 3){
+    ElMessage.warning('车间级用户不能新增')
+    return;
+  }
+  dialogRef.value.openDialog(type, value, data.queryParams.companyId);
+}
+
+/** 重置新增的表单以及其他数据  */
+const reset = async()=> {
+  data.queryParams = {
+    pageNum: 1,
+    pageSize: 10,
+    username: '',
+    userType: null,
+    companyId: null
+  }
+  await getCompanyList()
+  await getList()
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delUser(val.id)
+        if(res.code == 200){
+          ElMessage.success('数据删除成功')
+          await getList()
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+</script>
diff --git a/src/views/homePage.vue b/src/views/homePage.vue
index d7d488d..acf9425 100644
--- a/src/views/homePage.vue
+++ b/src/views/homePage.vue
@@ -138,7 +138,6 @@
       loading.value = true;
       Cookies.set("username", loginForm.value.username, { expires: 30 });
       Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 });
-
       const param = {
         username: loginForm.value.username,
         password: Base64.encode(loginForm.value.password),
@@ -211,7 +210,8 @@
   align-items: center;
   font-family: 'AliMa';
   color: #fff;
-  font-size: 3.2rem;
+  font-size: clamp(3rem, 1.286rem + 2.68vw, 4.5rem);
+  letter-spacing: 10px;
   text-align: center;
   line-height: 1.5;
   transform: translateY(-80px);
diff --git a/src/views/system/clauseManage/components/editDialog.vue b/src/views/system/clauseManage/components/editDialog.vue
new file mode 100644
index 0000000..81a01cb
--- /dev/null
+++ b/src/views/system/clauseManage/components/editDialog.vue
@@ -0,0 +1,125 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="state.title"
+        width="700px"
+        :before-close="handleClose"
+        :close-on-press-escape="false"
+        :close-on-click-modal="false"
+    >
+      <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" >
+        <el-form-item label="条款编码:" prop="clauseNum">
+          <el-input v-model.trim="state.form.clauseNum" :disabled="state.title =='查看'" placeholder="条款编码"></el-input>
+        </el-form-item>
+        <el-form-item label="条款内容:" prop="name">
+          <el-input v-model.trim="state.form.name" :disabled="state.title =='查看'" placeholder="条款内容"></el-input>
+        </el-form-item>
+      </el-form>
+      <template #footer v-if="state.title !='查看'">
+        <span class="dialog-footer">
+            <el-button @click="handleClose" size="default">取 消</el-button>
+            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue'
+import {ElMessage} from "element-plus";
+import {addUser, editUser, getUserById, resetPwd} from "@/api/onlineEducation/user"
+import {Base64} from "js-base64"
+import {getCompany} from "@/api/onlineEducation/company";
+import {updateInfoPlatforms, updateSysClause} from "@/api/staffManage/staff";
+
+const emit = defineEmits(["getList"]);
+const dialogVisible = ref(false)
+const superRef = ref()
+const state = reactive({
+  title: '',
+  form: {
+    id: null,
+    clauseNum: '',
+    name: '',
+    companyId: null
+  },
+  formRules:{
+    clauseNum: [{ required: true, message: '请输入条款编码', trigger: 'blur' }],
+    name: [{ required: true, message: '请输入条款内容', trigger: 'blur' }]
+  }
+})
+onMounted(() => {
+
+});
+
+const openDialog = async (type, value,companyId) => {
+  state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看'
+  state.form.companyId = companyId
+  if(state.title == '编辑'||state.title == '查看'){
+    Object.keys(state.form).forEach(key => {
+      if (key in value) {
+        state.form[key] = value[key]
+      }
+    })
+  }
+  dialogVisible.value = true
+}
+
+
+const onSubmit = async () => {
+  const valid = await superRef.value.validate();
+  if(valid){
+    let data = {}
+    if(state.title == '新增'){
+      data = {
+        clauseNum: state.form.clauseNum,
+        name: state.form.name,
+        companyId: state.form.companyId
+      }
+    }else{
+      data = state.form
+    }
+      const res = await updateSysClause(data)
+      if(res.code == 200){
+        ElMessage.success(res.message)
+        emit('getList')
+        handleClose()
+        dialogVisible.value = false;
+      }else{
+        ElMessage.warning(res.message)
+      }
+
+  }
+}
+
+const handleClose = () => {
+  state.form = {
+    id: null,
+    clauseNum: '',
+    name: '',
+    companyId: null
+  }
+  superRef.value.clearValidate();
+  superRef.value.resetFields()
+  dialogVisible.value = false;
+}
+
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+}
+</style>
diff --git a/src/views/system/clauseManage/index.vue b/src/views/system/clauseManage/index.vue
new file mode 100644
index 0000000..0e72843
--- /dev/null
+++ b/src/views/system/clauseManage/index.vue
@@ -0,0 +1,166 @@
+<template>
+  <div class="app-container">
+    <div style="display: flex;justify-content: space-between">
+      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item v-if="isAdmin" label="企业:" >
+          <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
+            <el-option
+                v-for="item in companyList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item >
+          <el-button v-if="isAdmin" type="primary" @click="getList">查询</el-button>
+          <el-button v-if="isAdmin" type="primary" plain @click="reset">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true">
+      <el-table-column label="序号" type="index" align="center" width="80"/>
+      <el-table-column label="条款编号" prop="clauseNum" align="center"/>
+      <el-table-column label="条款内容" prop="name" align="center"/>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
+        <template #default="scope">
+          <el-button link type="primary" @click="openDialog('view',scope.row)">查看</el-button>
+          <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
+          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="total > 0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+
+    <edit-dialog ref="dialogRef" @getList=getList></edit-dialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
+import {ElMessage, ElMessageBox} from "element-plus";
+import {delCompany, getCompany} from "@/api/onlineEducation/company";
+import {delUser, getUser} from "@/api/onlineEducation/user";
+import Cookies from "js-cookie";
+import editDialog from './components/editDialog.vue'
+import {
+  delInfoPlatforms,
+  delRoster,
+  delSysClause,
+  getInfoPlatforms,
+  getRosterList,
+  getSysClause
+} from "@/api/staffManage/staff";
+import useUserStore from "@/store/modules/user";
+const userStore = useUserStore()
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const dialogRef = ref();
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    companyId: null
+  },
+  total: 0,
+  dataList: [],
+  companyList: [],
+  isAdmin: false
+});
+
+const { queryParams, total, dataList,companyList, isAdmin } = toRefs(data);
+const userInfo = ref()
+onMounted(async ()=>{
+  userInfo.value = JSON.parse(Cookies.get('userInfo'))
+  if(userStore.roles.includes('admin')){
+    data.isAdmin = true
+    await getCompanyList()
+  }else{
+    data.isAdmin = false
+    data.queryParams.companyId = userStore.companyId
+  }
+  await getList()
+})
+
+onUnmounted(()=>{
+
+})
+
+const getList = async () => {
+  loading.value = true
+  const res = await getSysClause(data.queryParams)
+  if(res.code == 200){
+    data.dataList = res.data || []
+    data.total = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false
+}
+
+const getCompanyList = async ()=>{
+  const queryParams = {
+    pageNum: 1,
+    pageSize: 999
+  }
+  const res = await getCompany(queryParams)
+  if (res.code == 200) {
+    data.companyList = res.data.list?res.data.list:[]
+    data.queryParams.companyId = data.companyList[0].id
+  } else {
+    ElMessage.warning(res.message)
+  }
+}
+
+const openDialog = (type, value) => {
+  dialogRef.value.openDialog(type, value, data.queryParams.companyId);
+}
+
+/** 重置新增的表单以及其他数据  */
+const reset= async()=> {
+  data.queryParams = {
+    pageNum: 1,
+    pageSize: 10,
+    companyId: null
+  }
+  await getCompanyList()
+  await getList()
+}
+
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delSysClause({id: val.id})
+        if(res.code == 200){
+          ElMessage.success('数据删除成功')
+          await getList()
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+</script>

--
Gitblit v1.9.2