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