| | |
| | | <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-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"> |
| | | <el-table v-loading="loading" :data="dataList" border row-key="deptId" :default-expand-all="true" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"> |
| | | <el-table-column label="部门名称" prop="deptName" align="center" width="220"/> |
| | | <el-table-column label="排序" prop="orderNum" align="center" width="60"/> |
| | | <el-table-column label="负责人" prop="leaderName" align="center" width="80"/> |
| | | <!-- <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"> |
| | | <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> |
| | | {{sortVersionNumbers(scope.row.caluseVO1List?.map(i=>i.clauseNum)).join('、')}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="部门职责表" prop="userTypeName" align="center" width="150"> |
| | | <el-table-column label="部门职责表" prop="userTypeName" align="center" width="140"> |
| | | <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" > |
| | | <el-table-column label="操作" align="center" width="160"> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button> |
| | | <el-button link type="primary" @click="openDialog('add',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" |
| | | /> |
| | | <!-- <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> |
| | |
| | | <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 { |
| | | getDepart, |
| | | delDepart, |
| | | getCompany, |
| | | getDeptInfo, |
| | | initDistribution, |
| | | getDepartByPage |
| | | } from "@/api/orgStructure/depart"; |
| | | import departDialog from './components/departDialog.vue' |
| | | import dutyDialog from './components/dutyDialog.vue' |
| | | import {generateWordDocument} from "./components/exportWord.js"; |
| | |
| | | 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: '改进'} |
| | | ] |
| | | isAdmin: false |
| | | }); |
| | | const { queryParams, total, dataList, companyList, isAdmin } = toRefs(data); |
| | | const userInfo = ref() |
| | |
| | | loading.value = true |
| | | const res = await getDepart(data.queryParams) |
| | | if(res.code == 200){ |
| | | data.dataList = res.data || [] |
| | | data.total = res.data.total |
| | | data.dataList = proxy.handleTree(res.data, "deptId") |
| | | console.log(data.dataList,'list') |
| | | // data.total = res.data.total |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | |
| | | } |
| | | |
| | | const initDistribute = async ()=>{ |
| | | if(!data.queryParams.companyId){ |
| | | ElMessage.warning('请先选择要生成的企业') |
| | | } |
| | | ElMessageBox.confirm( |
| | | '重新生成将重置原有分配信息,是否继续?', |
| | | '提示', |
| | |
| | | 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); |
| | | dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin, data.companyList ); |
| | | } |
| | | const openDutyDialog = (value) =>{ |
| | | dutyDialogRef.value.openDialog(value); |
| | |
| | | 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){ |
| | |
| | | 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] |
| | | } |
| | | tableData.tableData = res.data.sysDeptResponsibilitys.map(i=>{ |
| | | return { |
| | | ...i, |
| | | leader: i.leader || '', |
| | | evidenceMaterials: i.evidenceMaterials || '', |
| | | managementDocuments: i.managementDocuments || '', |
| | | technicalDocuments: i.technicalDocuments || '', |
| | | existingRecords: i.existingRecords || '', |
| | | } |
| | | }) |
| | | return tableData |
| | | }else{ |
| | | ElMessage.warning('暂无部门信息') |
| | |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | const sortVersionNumbers = (versions) => { |
| | | return versions.sort((a, b) => { |
| | | const partsA = a.split('.').map(Number); |
| | | const partsB = b.split('.').map(Number); |
| | | const maxLength = Math.max(partsA.length, partsB.length) |
| | | for (let i = 0; i < maxLength; i++) { |
| | | const numA = partsA[i] || 0 |
| | | const numB = partsB[i] || 0 |
| | | |
| | | if (numA !== numB) { |
| | | return numA - numB |
| | | } |
| | | } |
| | | return 0 |
| | | }); |
| | | } |
| | | const sortResponsibilities = (list) => { |
| | | // 提取firstFive和lastTwo的clauseNum作为排序依据 |
| | | const firstFiveClauses = data.firstFive.map(item => item.clauseNum) |