祖安之光
10 天以前 7df5ffa1db94e3225bd16ef2d0d8ef0e02084951
新增页面
已重命名1个文件
已修改2个文件
已添加17个文件
已删除1个文件
3255 ■■■■■ 文件已修改
public/dutyFile.docx 补丁 | 查看 | 原始文档 | blame | 历史
src/api/orgStructure/depart.js 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/staffManage/staff.js 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/user.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/build/conpanyFunctionConsult/industryTemplate/components/editDialog.vue 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/build/conpanyFunctionConsult/industryTemplate/index.vue 192 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/build/conpanyFunctionConsult/infoPlatform/components/editDialog.vue 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/build/conpanyFunctionConsult/infoPlatform/index.vue 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/departDialog.vue 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/dutyDialog.vue 378 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/build/conpanyFunctionConsult/orgStructure/departManage/components/exportWord.js 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/build/conpanyFunctionConsult/orgStructure/departManage/index.vue 287 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/build/conpanyFunctionConsult/orgStructure/dutyDistributeChart/index.vue 312 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/build/conpanyFunctionConsult/peopleManage/user/index.vue 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/build/conpanyFunctionConsult/staffManage/staffPortfolio/components/editorDialog.vue 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/build/conpanyFunctionConsult/staffManage/staffPortfolio/index.vue 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/build/conpanyFunctionConsult/staffManage/staffRegister/components/staffDialog.vue 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/build/conpanyFunctionConsult/staffManage/staffRegister/index.vue 265 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/homePage.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/clauseManage/components/editDialog.vue 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/clauseManage/index.vue 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/dutyFile.docx
Binary files differ
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
    })
}
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
    })
}
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)
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>
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>
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>
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>
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>
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>
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
            }
        });
}
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>
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>
src/views/build/conpanyFunctionConsult/peopleManage/user/index.vue
文件已删除
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>
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>
src/views/build/conpanyFunctionConsult/staffManage/staffRegister/components/staffDialog.vue
文件名从 src/views/build/conpanyFunctionConsult/peopleManage/user/components/userDialog.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)
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>
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);
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>
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>