<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">
|
<template #default="scope">
|
<span>
|
{{scope.row.sysDeptManageVoList?.map(i=>i.subDeptName).join('、')}}
|
</span>
|
</template>
|
</el-table-column>
|
<el-table-column label="部门涉及条款" prop="userTypeName" align="center" width="150">
|
<template #default="scope">
|
<span>
|
{{scope.row.caluseVO1List?.map(i=>i.clauseNum).join('、')}}
|
</span>
|
</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:[]
|
} else {
|
ElMessage.warning(res.message)
|
}
|
}
|
|
const openDialog = (type, value) => {
|
dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin, data.companyList );
|
}
|
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)
|
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,
|
leader: i.leader || '',
|
evidenceMaterials: i.evidenceMaterials || '',
|
managementDocuments: i.managementDocuments || '',
|
technicalDocuments: i.technicalDocuments || '',
|
existingRecords: i.existingRecords || '',
|
}
|
}))
|
}else{
|
tableData.tableData = [...data.firstFive,...res.data.sysDeptResponsibilitys,...data.lastTwo].map(i=>{
|
return {
|
...i,
|
leader: i.leader || '',
|
evidenceMaterials: i.evidenceMaterials || '',
|
managementDocuments: i.managementDocuments || '',
|
technicalDocuments: i.technicalDocuments || '',
|
existingRecords: i.existingRecords || '',
|
}
|
})
|
}
|
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>
|