3 files modified
29 files added
| New file |
| | |
| | | import request from '@/utils/request' |
| | | |
| | | export function getAnnualVerificationPlanList(params) { |
| | | return request({ |
| | | url: '/system/annualVerificationPlan/selectAnnualVerificationPlanList', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function saveAnnualVerificationPlan(data) { |
| | | return request({ |
| | | url: '/system/annualVerificationPlan/saveAnnualVerificationPlan', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | export function delAnnualVerificationPlan(params) { |
| | | return request({ |
| | | url: '/system/annualVerificationPlan/deletedAnnualVerificationPlan', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function getAnnualVerificationPlanDetail(params) { |
| | | return request({ |
| | | url: '/system/annualVerificationPlan/getAnnualVerificationPlan', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function getCalibrationMonitoringEquipmentList(params) { |
| | | return request({ |
| | | url: '/system/calibrationMonitoringEquipment/selectCalibrationMonitoringEquipmentList', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function saveCalibrationMonitoringEquipment(data) { |
| | | return request({ |
| | | url: '/system/calibrationMonitoringEquipment/saveCalibrationMonitoringEquipment', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | export function delCalibrationMonitoringEquipment(params) { |
| | | return request({ |
| | | url: '/system/calibrationMonitoringEquipment/deletedCalibrationMonitoringEquipment', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function getSixInspectionList(params) { |
| | | return request({ |
| | | url: '/system/sixInspection/selectSixInspectionList', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function saveSixInspection(data) { |
| | | return request({ |
| | | url: '/system/sixInspection/saveSixInspection', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | export function delSixInspection(params) { |
| | | return request({ |
| | | url: '/system/sixInspection/deletedSixInspection', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function getSixInspectionDetail(params) { |
| | | return request({ |
| | | url: '/system/sixInspection/getSixInspection', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function getInternalKnowledgeList(params) { |
| | | return request({ |
| | | url: '/system/internal-knowledge/selectInternalKnowledgeList', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function saveInternalKnowledge(data) { |
| | | return request({ |
| | | url: '/system/internal-knowledge/saveInternalKnowledge', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | export function delInternalKnowledge(params) { |
| | | return request({ |
| | | url: '/system/internal-knowledge/deletedInternalKnowledge', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function getExternalKnowledgeList(params) { |
| | | return request({ |
| | | url: '/system/externalKnowledge/selectExternalKnowledgeList', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function saveExternalKnowledge(data) { |
| | | return request({ |
| | | url: '/system/externalKnowledge/saveExternalKnowledge', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | export function delExternalKnowledge(params) { |
| | | return request({ |
| | | url: '/system/externalKnowledge/deletedExternalKnowledge', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| New file |
| | |
| | | import request from '@/utils/request' |
| | | |
| | | export function getDocDistributeCollectList(params) { |
| | | return request({ |
| | | url: '/system/documentDistributionCollection/selectDocumentDistributionCollectionList', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function saveDocDistributeCollect(data) { |
| | | return request({ |
| | | url: '/system/documentDistributionCollection/saveDocumentDistributionCollection', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | export function delDocDistributeCollect(params) { |
| | | return request({ |
| | | url: '/system/documentDistributionCollection/deletedDocumentDistributionCollection', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function getDocDistributeCollectDetail(params) { |
| | | return request({ |
| | | url: '/system/documentDistributionCollection/getDocumentDistributionCollection', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function getDocChangesInvalidateList(params) { |
| | | return request({ |
| | | url: '/system/documentChangesInvalidated/selectDocumentChangesInvalidatedList', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function saveDocChangesInvalidate(data) { |
| | | return request({ |
| | | url: '/system/documentChangesInvalidated/saveDocumentChangesInvalidated', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | export function delDocChangesInvalidate(params) { |
| | | return request({ |
| | | url: '/system/documentChangesInvalidated/deletedDocumentChangesInvalidated', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function getDocChangesInvalidateDetail(params) { |
| | | return request({ |
| | | url: '/system/documentChangesInvalidated/getDocumentChangesInvalidated', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function getDocBorrowCopyList(params) { |
| | | return request({ |
| | | url: '/system/documentBorrowCopy/selectDocumentBorrowCopyList', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function saveDocBorrowCopy(data) { |
| | | return request({ |
| | | url: '/system/documentBorrowCopy/saveDocumentBorrowCopy', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | export function delDocBorrowCopy(params) { |
| | | return request({ |
| | | url: '/system/documentBorrowCopy/deletedDocumentBorrowCopy', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function getDocBorrowCopyDetail(params) { |
| | | return request({ |
| | | url: '/system/documentBorrowCopy/getDocumentBorrowCopy', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function getDocDestructionApplyList(params) { |
| | | return request({ |
| | | url: '/system/documentDestructionApply/selectDocumentDestructionApplyList', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function saveDocDestructionApply(data) { |
| | | return request({ |
| | | url: '/system/documentDestructionApply/saveDocumentDestructionApply', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | export function delDocDestructionApply(params) { |
| | | return request({ |
| | | url: '/system/documentDestructionApply/deletedDocumentDestructionApply', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | export function updateSpecialCertificate(data) { |
| | | return request({ |
| | | url: '/system/user/specialCertificate', |
| | | method: 'put', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | export function getDepEmpsDetail(params) { |
| | | return request({ |
| | | url: '/system/user/getUserData', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | |
| | | <template> |
| | | <div class="sidebar-logo-container" :class="{ 'collapse': collapse }" :style="{ backgroundColor: sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }"> |
| | | <transition name="sidebarLogoFade"> |
| | | <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/build/conpanyFunctionConsult/companyInfo/overview"> |
| | | <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/build/companyInfo/overview"> |
| | | <img v-if="logo" :src="logo" class="sidebar-logo" /> |
| | | <h1 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }}</h1> |
| | | </router-link> |
| | | <router-link v-else key="expand" class="sidebar-logo-link" to="/build/conpanyFunctionConsult/companyInfo/overview"> |
| | | <router-link v-else key="expand" class="sidebar-logo-link" to="/build/companyInfo/overview"> |
| | | <img v-if="logo" :src="logo" class="sidebar-logo" /> |
| | | <h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }}</h1> |
| | | </router-link> |
| | |
| | | <el-form-item label="年龄:" prop="age" v-if="state.title !== '修改密码'"> |
| | | <el-input v-model.number.trim="state.form.age" type="number" :disabled="disabled" placeholder="请输入年龄"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="学历:" prop="qualification" v-if="state.title !== '修改密码'"> |
| | | <el-select |
| | | v-model="state.form.qualification" |
| | | placeholder="请选择学历" |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="item in state.quaList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="职称:" prop="positional" v-if="state.title !== '修改密码'"> |
| | | <el-input v-model.trim="state.form.positional" :disabled="disabled" placeholder="请输入职称"></el-input> |
| | | <!-- <el-input v-model.trim="state.form.positional" :disabled="disabled" placeholder="请输入职称"></el-input>--> |
| | | <el-radio-group v-model="state.form.positional" :disabled="disabled"> |
| | | <el-radio label="1">初级</el-radio> |
| | | <el-radio label="2">中级</el-radio> |
| | | <el-radio label="3">高级</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="人员类别:" prop="personType" v-if="state.title !== '修改密码'"> |
| | | <el-radio-group v-model="state.form.personType" :disabled="disabled"> |
| | | <el-radio :label="1">技术</el-radio> |
| | | <el-radio :label="2">管理</el-radio> |
| | | <el-radio :label="3">行政</el-radio> |
| | | <el-radio :label="4">特殊作业</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="身份证号:" prop="idCard" v-if="state.title !== '修改密码'"> |
| | |
| | | entryTime: [{ required: true, message: '请选择入职时间', trigger: 'blur' }], |
| | | age: [{ required: true, message: '请输入年龄', trigger: 'blur' }], |
| | | personType: [{ required: true, message: '请选择人员类别', trigger: 'blur' }], |
| | | post: [{ required: true, message: '请输入专业', trigger: 'blur' }], |
| | | positional: [{ required: true, message: '请输入职称', trigger: 'blur' }], |
| | | roles: [{ required: true, message: '请选择角色', trigger: 'blur' }] |
| | | }, |
| | | companyList: [], |
| | | userList: [], |
| | | roleList: [], |
| | | quaList: [ |
| | | {id: 1, name: '高中及以下'}, |
| | | {id: 2, name: '专科'}, |
| | | {id: 3, name: '本科'}, |
| | | {id: 4, name: '硕士'}, |
| | | {id: 5, name: '博士及以上'} |
| | | ], |
| | | keyword:'', |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | |
| | | } |
| | | state.form.roles = value.roles.map(i=>i.roleId) |
| | | } |
| | | if(type == 'pwd'){ |
| | | state.form.id = value.id |
| | | } |
| | | dialogVisible.value = true |
| | | if(type === 'edit' && state.form && (state.form.userType === 2||state.form.userType === 3)){ |
| | | await nextTick(() => { |
| | | // doGetUser() |
| | | }) |
| | | } |
| | | } |
| | | |
| | | const finshed = ref(false) |
| New file |
| | |
| | | <template> |
| | | <div class="notice"> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="state.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-form-item v-if="state.isAdmin && state.title !== '上传'" label="企业:" prop="companyId"> |
| | | <el-select v-model="state.form.companyId" placeholder="请选择" :disabled="state.title =='查看'" clearable @change="getDeptList"> |
| | | <el-option |
| | | v-for="item in state.companyList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="计划名称:" prop="name" v-if="state.title !== '上传'"> |
| | | <el-input |
| | | v-model.trim="state.form.name" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title == '查看'" |
| | | > |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item label="年份:" prop="year" v-if="state.title !== '上传'"> |
| | | <el-date-picker |
| | | v-model="state.form.year" |
| | | type="year" |
| | | value-format="YYYY" |
| | | placeholder="请选择年份" |
| | | :disabled="state.title == '查看'" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="设备列表:" prop="annualVerificationDevices" v-if="state.title !== '上传'"> |
| | | <el-button |
| | | type="primary" |
| | | plain |
| | | icon="Plus" |
| | | @click="addLine" |
| | | style="margin-bottom: 10px" |
| | | v-if="state.title == '新增'||state.title == '编辑' " |
| | | >新增</el-button> |
| | | </el-form-item> |
| | | <el-table :data="state.form.annualVerificationDevices" class="customedTable" :border="true" v-if="state.title !== '上传'"> |
| | | <el-table-column label="序号" type="index" width="80" align="center"> |
| | | </el-table-column> |
| | | <el-table-column label="设备编号" prop="deviceNumber" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.deviceNumber" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="设备名称" prop="deviceName" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.deviceName" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="规格型号" prop="model" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.model" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="校准周期" prop="calibrationCycle" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.calibrationCycle" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="下次校准时间" prop="nextCalibrationTime" align="center"> |
| | | <template #default="scope"> |
| | | <el-date-picker |
| | | :disabled="state.title =='查看'" |
| | | v-model="scope.row.nextCalibrationTime" |
| | | type="date" |
| | | placeholder="请选择日期" |
| | | value-format="YYYY-MM-DD" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="实际检定时间" prop="actCalibrationTime" align="center"> |
| | | <template #default="scope"> |
| | | <el-date-picker |
| | | :disabled="state.title =='查看'" |
| | | v-model="scope.row.actCalibrationTime" |
| | | type="date" |
| | | placeholder="请选择日期" |
| | | value-format="YYYY-MM-DD" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="校准人" prop="calibrationUser" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.calibrationUser" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="目前状态" prop="status" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.status" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="使用人" prop="useUser" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.useUser" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" width="70" v-if="state.title == '新增'||state.title == '编辑' "> |
| | | <template #default="scope"> |
| | | <el-button link type="danger" @click="handleDelete(scope.$index)">删除</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <el-form-item label="证书名称:" prop="certificateName" v-if="state.title == '上传'"> |
| | | <el-input |
| | | v-model.trim="state.form.certificateName" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title == '查看'" |
| | | > |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item label="检定证书:" prop="certificate" v-if="state.title == '上传'"> |
| | | <el-upload accept=".pdf,image/*" :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">支持上传pdf、图片格式,尺寸小于5M,最多可上传1份</div> |
| | | </template> |
| | | </el-upload> |
| | | </el-form-item> |
| | | <el-row v-if="state.title !== '上传'"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="编制:" prop="establishmentId"> |
| | | <el-select clearable v-model="state.form.establishmentId" :disabled="state.title =='查看'" filterable placeholder="编制" style="width: 100%"> |
| | | <el-option |
| | | v-for="item in state.userList" |
| | | :key="item.userId" |
| | | :label="item.name" |
| | | :value="item.userId" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="日期:" prop="establishmentTime" > |
| | | <el-date-picker |
| | | :disabled="state.title =='查看'" |
| | | v-model="state.form.establishmentTime" |
| | | type="date" |
| | | placeholder="请选择日期" |
| | | value-format="YYYY-MM-DD" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row v-if="state.title !== '上传'"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="审核:" prop="processId"> |
| | | <el-select clearable v-model="state.form.processId" :disabled="state.title =='查看'" filterable placeholder="审核" style="width: 100%"> |
| | | <el-option |
| | | v-for="item in state.userList" |
| | | :key="item.userId" |
| | | :label="item.name" |
| | | :value="item.userId" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="日期:" prop="processTime" > |
| | | <el-date-picker |
| | | :disabled="state.title =='查看'" |
| | | v-model="state.form.processTime" |
| | | type="date" |
| | | placeholder="请选择日期" |
| | | value-format="YYYY-MM-DD" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-form-item label="检定证书:" v-if="state.title == '查看' && state.form.certificate && state.form.certificate !== ''"> |
| | | <el-button type="text" @click="openFile(state.form.certificate)">预览</el-button> |
| | | </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 {getToken} from "@/utils/auth"; |
| | | import { |
| | | updateMaintenanceEvaluate, |
| | | getMaintenanceEvaluateDetail |
| | | } from "@/api/infrastructureMng/ledger"; |
| | | |
| | | import {listUser} from "@/api/system/user"; |
| | | import {getAnnualVerificationPlanDetail, saveAnnualVerificationPlan} from "@/api/assetManage/assetMng"; |
| | | import {delPic} from "@/api/onlineEducation/banner"; |
| | | |
| | | const emit = defineEmits(["getList"]); |
| | | const dialogVisible = ref(false) |
| | | const superRef = ref() |
| | | const checkList = (rule, value, callback) => { |
| | | if (state.form.annualVerificationDevices.length == 0) { |
| | | callback(new Error('设备列表不可为空')) |
| | | } else { |
| | | callback() |
| | | } |
| | | } |
| | | const checkFileList = (rule, value, callback) => { |
| | | if (state.fileList.length == 0) { |
| | | callback(new Error('请上传证书文件')) |
| | | } else { |
| | | callback() |
| | | } |
| | | } |
| | | const state = reactive({ |
| | | title: '', |
| | | form: { |
| | | id: null, |
| | | companyId: null, |
| | | name: '', |
| | | year: '', |
| | | annualVerificationDevices: [], |
| | | delData: [], |
| | | establishmentId: null, |
| | | establishmentName: '', |
| | | establishmentTime: '', |
| | | processId: null, |
| | | processName: '', |
| | | processTime: '', |
| | | certificateName: '', |
| | | certificate: '', |
| | | }, |
| | | oldDeviceList: [], |
| | | formRules:{ |
| | | companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }], |
| | | name: [{ required: true, message: '请填写计划名称', trigger: 'blur' }], |
| | | year: [{ required: true, message: '请选择年份', trigger: 'blur' }], |
| | | annualVerificationDevices: [{ required: true, validator: checkList, trigger: 'blur' }], |
| | | establishmentId: [{ required: true, message: '请选择编制人', trigger: 'blur' }], |
| | | establishmentTime: [{ required: true, message: '请选择编制时间', trigger: 'blur' }], |
| | | processId: [{ required: true, message: '请选择审核人', trigger: 'blur' }], |
| | | processTime: [{ required: true, message: '请选择审核时间', trigger: 'blur' }], |
| | | approvalId: [{ required: true, message: '请选择批准人', trigger: 'blur' }], |
| | | certificateName: [{ required: true, message: '请填写证书名称', trigger: 'blur' }], |
| | | certificate: [{ required: true, validator: checkFileList, trigger: 'blur' }] |
| | | }, |
| | | isAdmin: false, |
| | | companyList: [], |
| | | userList: [], |
| | | uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', |
| | | header: { |
| | | Authorization: getToken() |
| | | }, |
| | | fileLimit: 1, |
| | | fileList: [] |
| | | }) |
| | | onMounted(() => { |
| | | |
| | | }); |
| | | const openFile = (value) =>{ |
| | | window.open(import.meta.env.VITE_APP_BASE_API + '/' + value) |
| | | } |
| | | const openDialog = async (type, value,companyId, isAdmin, companyList) => { |
| | | state.isAdmin = isAdmin |
| | | if(isAdmin){ |
| | | state.companyList = companyList |
| | | } |
| | | await getUserList(companyId) |
| | | state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : type ==='upload' ? '上传' : '查看' |
| | | state.form.companyId = companyId |
| | | if(state.title == '编辑'||state.title == '查看' ||state.title == '上传'){ |
| | | await getInfo(value.id) |
| | | } |
| | | dialogVisible.value = true |
| | | } |
| | | |
| | | const addLine = () => { |
| | | const obj = { |
| | | id: null, |
| | | annualVerificationId: null, |
| | | deviceNumber: '', |
| | | deviceName: '', |
| | | model: '', |
| | | calibrationCycle: '', |
| | | nextCalibrationTime: '', |
| | | actCalibrationTime: '', |
| | | calibrationUser: '', |
| | | status: '', |
| | | useUser: '' |
| | | } |
| | | state.form.annualVerificationDevices.push(obj); |
| | | } |
| | | |
| | | const handleDelete = (i) =>{ |
| | | state.form.annualVerificationDevices = state.form.annualVerificationDevices.filter((item,index) => index != i) |
| | | } |
| | | |
| | | const onSubmit = async () => { |
| | | const valid = await superRef.value.validate(); |
| | | if(valid){ |
| | | const data = JSON.parse(JSON.stringify(state.form)) |
| | | data.delData = state.oldDeviceList.filter(i =>!data.annualVerificationDevices.some(item=>item.id == i.id)).map(i=>i.id) |
| | | data.establishmentName = state.userList.find(i=>i.userId == data.establishmentId)?.name |
| | | data.processName = state.userList.find(i=>i.userId == data.processId)?.name |
| | | if(state.title == '新增'){ |
| | | delete data.id |
| | | const res = await saveAnnualVerificationPlan(data) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | handleClose() |
| | | dialogVisible.value = false; |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }else{ |
| | | const res = await saveAnnualVerificationPlan(data) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | handleClose() |
| | | dialogVisible.value = false; |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | const getInfo = async (id)=> { |
| | | const res = await getAnnualVerificationPlanDetail({id: id}) |
| | | if(res.code == 200){ |
| | | Object.keys(state.form).forEach(key => { |
| | | if (key in res.data) { |
| | | state.form[key] = res.data[key] |
| | | } |
| | | }) |
| | | state.form.annualVerificationDevices = res.data.annualVerificationDevices?.map(item=>{ |
| | | return { |
| | | id: item.id, |
| | | annualVerificationId: item.annualVerificationId, |
| | | deviceNumber: item.deviceNumber, |
| | | deviceName: item.deviceName, |
| | | model: item.model, |
| | | calibrationCycle: item.calibrationCycle, |
| | | nextCalibrationTime: item.nextCalibrationTime, |
| | | actCalibrationTime: item.actCalibrationTime, |
| | | calibrationUser: item.calibrationUser, |
| | | useUser: item.useUser, |
| | | status: item.status |
| | | } |
| | | }) |
| | | state.oldDeviceList = state.form.annualVerificationDevices |
| | | if(state.form.certificate) { |
| | | const obj = { |
| | | url: state.form.certificate, |
| | | name: state.form.certificateName |
| | | } |
| | | state.fileList = [obj] |
| | | } |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const getDeptList = async ()=>{ |
| | | state.form.establishmentId = null |
| | | state.form.processId = null |
| | | await getUserList(state.form.companyId) |
| | | } |
| | | |
| | | const getUserList = async (companyId)=> { |
| | | const res = await listUser({pageIndex: 1,pageSize: 999,companyId: companyId}) |
| | | if(res.code == 200){ |
| | | state.userList = res.data.list?res.data.list.map(item=>{ |
| | | const user = item.id |
| | | const {id, ...data} = item |
| | | return { |
| | | ...data, |
| | | userId: user |
| | | } |
| | | }):[] |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const handleAvatarSuccess = (res, uploadFile) => { |
| | | if(res.code == 200){ |
| | | state.form.certificate = res.data.path |
| | | }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.certificate = '' |
| | | }else{ |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: res.message |
| | | }) |
| | | } |
| | | }).catch(() => { |
| | | state.form.certificate = '' |
| | | }); |
| | | } |
| | | |
| | | const handleClose = () => { |
| | | state.form = { |
| | | id: null, |
| | | companyId: null, |
| | | name: '', |
| | | year: '', |
| | | annualVerificationDevices: [], |
| | | delData: [], |
| | | establishmentId: null, |
| | | establishmentName: '', |
| | | establishmentTime: '', |
| | | processId: null, |
| | | processName: '', |
| | | processTime: '', |
| | | certificateName: '', |
| | | certificate: '', |
| | | } |
| | | state.fileList = [] |
| | | 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> |
| | | <style lang="scss"> |
| | | .customedTable{ |
| | | width: calc(100% - 150px); |
| | | margin-left: 150px; |
| | | margin-bottom: 30px; |
| | | .el-table__cell{ |
| | | padding: 2px 0 !important; |
| | | font-size: 14px !important; |
| | | } |
| | | .cell{ |
| | | padding: 0 2px !important; |
| | | font-size: 14px !important; |
| | | } |
| | | } |
| | | </style> |
| New file |
| | |
| | | <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">导出</el-button>--> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | <!-- 表格数据 --> |
| | | <el-table v-loading="loading" :data="dataList" :border="true"> |
| | | <el-table-column type="index" label="序号"></el-table-column> |
| | | <el-table-column prop="name" align="center" label="计划名称"></el-table-column> |
| | | <el-table-column prop="certificateName" align="center" label="检定证书"> |
| | | <template #default="scope"> |
| | | {{scope.row.certificateName}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center"> |
| | | <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="primary" @click="openDialog('upload',scope.row)">上传证书</el-button> |
| | | <el-button link type="primary" @click="downloadFile(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 Cookies from "js-cookie"; |
| | | import editDialog from './components/editDialog.vue' |
| | | import useUserStore from "@/store/modules/user"; |
| | | import {generateWordDocument} from "@/utils/exportWord"; |
| | | import { |
| | | delMaintenanceEvaluate, |
| | | getMaintenanceEvaluateDetail, |
| | | getMaintenanceEvaluateList |
| | | } from "@/api/infrastructureMng/ledger"; |
| | | import { |
| | | delAnnualVerificationPlan, |
| | | getAnnualVerificationPlanDetail, |
| | | getAnnualVerificationPlanList |
| | | } from "@/api/assetManage/assetMng"; |
| | | |
| | | |
| | | 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 ()=>{ |
| | | 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 getAnnualVerificationPlanList(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:[] |
| | | } else { |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const downloadFile = async (val)=>{ |
| | | const res = await getAnnualVerificationPlanDetail({id: val.id}) |
| | | if(res.code == 200){ |
| | | if(res.data){ |
| | | let tableData = res.data |
| | | tableData.table = res.data.annualVerificationDevices.map((item,index)=>{ |
| | | return { |
| | | ...item, |
| | | index: index + 1, |
| | | nextCalibrationTime: item.nextCalibrationTime.substring(0,10), |
| | | actCalibrationTime: item.actCalibrationTime.substring(0,10) |
| | | } |
| | | }) |
| | | tableData.establishmentTime = tableData.establishmentTime.substring(0,10) |
| | | tableData.processTime = tableData.processTime.substring(0,10) |
| | | try { |
| | | generateWordDocument('/annualVerificationPlan.docx', tableData, tableData.name +'.docx'); |
| | | } catch (error){ |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: '导出失败' |
| | | }); |
| | | } |
| | | }else{ |
| | | ElMessage.warning('暂无数据') |
| | | } |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const openDialog = (type, value) => { |
| | | dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin, data.companyList); |
| | | } |
| | | |
| | | /** 重置新增的表单以及其他数据 */ |
| | | 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 delAnnualVerificationPlan({id: val.id}) |
| | | if(res.code == 200){ |
| | | ElMessage.success('数据删除成功') |
| | | await getList() |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | </script> |
| New file |
| | |
| | | <template> |
| | | <div class="notice"> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="state.title" |
| | | width="50%" |
| | | :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 v-if="state.isAdmin" label="企业:" prop="companyId"> |
| | | <el-select v-model="state.form.companyId" placeholder="请选择" :disabled="state.title =='查看'" clearable @change="getDeptList"> |
| | | <el-option |
| | | v-for="item in state.companyList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="设备名称:" prop="deviceName"> |
| | | <el-input v-model.trim="state.form.deviceName" :readonly="state.title =='查看'"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="设备编号:" prop="deviceNumber"> |
| | | <el-input v-model.trim="state.form.deviceNumber" :readonly="state.title =='查看'"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="校准日期:" prop="calibrationTime"> |
| | | <el-date-picker |
| | | v-model="state.form.calibrationTime" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="请选择校准日期" |
| | | :disabled="state.title =='查看'" |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="校准证书编号:" prop="calibrationNumber"> |
| | | <el-input v-model.trim="state.form.calibrationNumber" :readonly="state.title =='查看'"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-form-item label="校准单位:" prop="calibrationCompany"> |
| | | <el-input v-model.trim="state.form.calibrationCompany" :readonly="state.title =='查看'"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="校准结果确认:" prop="calibrationResult"> |
| | | <el-radio-group v-model="state.form.calibrationResult" :disabled="state.title =='查看'"> |
| | | <el-radio :label="1">满足使用要求</el-radio> |
| | | <el-radio :label="2">不满足使用要求</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="确认人:" prop="confirmUser"> |
| | | <!-- <el-select clearable v-model="state.form.establishmentId" :disabled="state.title =='查看'" filterable placeholder="编制" style="width: 100%">--> |
| | | <!-- <el-option--> |
| | | <!-- v-for="item in state.userList"--> |
| | | <!-- :key="item.userId"--> |
| | | <!-- :label="item.name"--> |
| | | <!-- :value="item.userId"--> |
| | | <!-- />--> |
| | | <!-- </el-select>--> |
| | | <el-input v-model.trim="state.form.confirmUser" :readonly="state.title =='查看'" style="width: 100%"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="日期:" prop="confirmTime"> |
| | | <el-date-picker |
| | | :disabled="state.title =='查看'" |
| | | v-model="state.form.confirmTime" |
| | | type="date" |
| | | placeholder="请选择日期" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="管理人员:" prop="executiveUser"> |
| | | <!-- <el-select clearable v-model="state.form.executiveUser" :disabled="state.title =='查看'" filterable placeholder="编制" style="width: 100%">--> |
| | | <!-- <el-option--> |
| | | <!-- v-for="item in state.userList"--> |
| | | <!-- :key="item.userId"--> |
| | | <!-- :label="item.name"--> |
| | | <!-- :value="item.userId"--> |
| | | <!-- />--> |
| | | <!-- </el-select>--> |
| | | <el-input v-model.trim="state.form.executiveUser" :readonly="state.title =='查看'" style="width: 100%"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="日期:" prop="executiveTime"> |
| | | <el-date-picker |
| | | :disabled="state.title =='查看'" |
| | | v-model="state.form.executiveTime" |
| | | type="date" |
| | | placeholder="请选择日期" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </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 {Base64} from "js-base64" |
| | | import {getToken} from "@/utils/auth"; |
| | | import { |
| | | addInternalAuditCheck, getInternalAuditCheckInfo, |
| | | updateInternalAuditCheck |
| | | } from "@/api/innerReview/meetingReview"; |
| | | import {getDepart} from "@/api/orgStructure/depart"; |
| | | import {listUser} from "@/api/system/user"; |
| | | import {getMaintenanceRecordDetail, updateMaintenanceRecord} from "@/api/infrastructureMng/ledger"; |
| | | import {saveCalibrationMonitoringEquipment} from "@/api/assetManage/assetMng"; |
| | | |
| | | const emit = defineEmits(["getList"]); |
| | | const dialogVisible = ref(false) |
| | | const superRef = ref() |
| | | |
| | | const state = reactive({ |
| | | title: '', |
| | | form: { |
| | | id: null, |
| | | companyId: null, |
| | | deviceName: '', |
| | | deviceNumber: '', |
| | | calibrationTime: '', |
| | | calibrationNumber: '', |
| | | calibrationCompany: '', |
| | | calibrationResult: null, |
| | | confirmUser: '', |
| | | confirmTime: '', |
| | | executiveUser: '', |
| | | executiveTime: '' |
| | | }, |
| | | formRules:{ |
| | | companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }], |
| | | deviceName: [{ required: true, message: '请填写设备名称', trigger: 'blur' }], |
| | | deviceNumber: [{ required: true, message: '请填写设备编号', trigger: 'blur' }], |
| | | calibrationTime: [{ required: true, message: '请选择校准日期', trigger: 'blur' }], |
| | | calibrationNumber: [{ required: true, message: '请填写校准证书编号', trigger: 'blur' }], |
| | | calibrationCompany: [{ required: true, message: '请填写校准单位', trigger: 'blur' }], |
| | | calibrationResult: [{ required: true, message: '请选择校准结果', trigger: 'blur' }], |
| | | confirmUser: [{ required: true, message: '请填写确认人', trigger: 'blur' }], |
| | | confirmTime: [{ required: true, message: '请选择日期', trigger: 'blur' }], |
| | | executiveUser: [{ required: true, message: '请填写管理人员', trigger: 'blur' }], |
| | | executiveTime: [{ required: true, message: '请选择日期', trigger: 'blur' }] |
| | | }, |
| | | isAdmin: false, |
| | | companyList: [], |
| | | userList: [] |
| | | }) |
| | | onMounted(() => { |
| | | |
| | | }); |
| | | |
| | | const openDialog = async (type, value,companyId, isAdmin, companyList) => { |
| | | state.isAdmin = isAdmin |
| | | if(isAdmin){ |
| | | state.companyList = companyList |
| | | } |
| | | await getUserList(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){ |
| | | const data = JSON.parse(JSON.stringify(state.form)) |
| | | if(state.title == '新增'){ |
| | | delete data.id |
| | | const res = await saveCalibrationMonitoringEquipment(data) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | handleClose() |
| | | dialogVisible.value = false; |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }else{ |
| | | const res = await saveCalibrationMonitoringEquipment(data) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | handleClose() |
| | | dialogVisible.value = false; |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | const getDeptList = async ()=>{ |
| | | await getUserList(state.form.companyId) |
| | | } |
| | | |
| | | const getUserList = async (companyId)=> { |
| | | const res = await listUser({pageIndex: 1,pageSize: 999, companyId: companyId}) |
| | | if(res.code == 200){ |
| | | state.userList = res.data.list?res.data.list.map(item=>{ |
| | | const user = item.id |
| | | const {id, ...data} = item |
| | | return { |
| | | ...data, |
| | | userId: user |
| | | } |
| | | }):[] |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const handleClose = () => { |
| | | state.form = { |
| | | id: null, |
| | | companyId: null, |
| | | deviceName: '', |
| | | deviceNumber: '', |
| | | calibrationTime: '', |
| | | calibrationNumber: '', |
| | | calibrationCompany: '', |
| | | calibrationResult: null, |
| | | confirmUser: '', |
| | | confirmTime: '', |
| | | executiveUser: '', |
| | | executiveTime: '' |
| | | } |
| | | 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> |
| New file |
| | |
| | | <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">导出</el-button>--> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | <!-- 表格数据 --> |
| | | <el-table v-loading="loading" :data="dataList" :border="true"> |
| | | <el-table-column type="index" label="序号"></el-table-column> |
| | | <el-table-column prop="deviceName" align="center" label="确认单"> |
| | | <template #default="scope"> |
| | | {{scope.row.deviceName + '确认单'}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center"> |
| | | <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="primary" @click="downloadFile(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 Cookies from "js-cookie"; |
| | | import editDialog from './components/editDialog.vue' |
| | | import useUserStore from "@/store/modules/user"; |
| | | import {generateWordDocument} from "@/utils/exportWord"; |
| | | import { |
| | | delMaintenanceRecord, |
| | | getMaintenanceRecordDetail, |
| | | getMaintenanceRecordList |
| | | } from "@/api/infrastructureMng/ledger"; |
| | | import {getInternalAuditCheckInfo} from "@/api/innerReview/meetingReview"; |
| | | import {delCalibrationMonitoringEquipment, getCalibrationMonitoringEquipmentList} from "@/api/assetManage/assetMng"; |
| | | |
| | | |
| | | 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: [], |
| | | expertData: [], |
| | | isAdmin: false |
| | | }); |
| | | const fields = ref({ |
| | | '序号':'index', |
| | | '名称型号':'username', |
| | | '部门':'idCard', |
| | | '责任人/使用人':'entryTime', |
| | | '编号':'deptName', |
| | | '使用地点':'duty', |
| | | '使用情况':'phone' |
| | | }); |
| | | const { queryParams, total, dataList,companyList, isAdmin, expertData } = 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 getCalibrationMonitoringEquipmentList(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, data.isAdmin, data.companyList); |
| | | } |
| | | |
| | | const downloadFile = async (val)=>{ |
| | | let tableData = val |
| | | tableData.calibrationTime = tableData.calibrationTime.substring(0,10) |
| | | tableData.confirmTime = tableData.confirmTime.substring(0,10) |
| | | tableData.executiveTime = tableData.executiveTime.substring(0,10) |
| | | tableData.typeList = [ |
| | | { |
| | | id: 1, |
| | | label: '满足使用要求', |
| | | checked: tableData.calibrationResult == 1 ? false : true |
| | | }, |
| | | { |
| | | id: 2, |
| | | label: '不满足使用要求', |
| | | checked: tableData.calibrationResult == 2 ? false : true |
| | | } |
| | | ] |
| | | try { |
| | | generateWordDocument('/equipCalibrateConfirm.docx', tableData, tableData.deviceName + '使用确认单.docx'); |
| | | } catch (error){ |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: '导出失败' |
| | | }); |
| | | } |
| | | } |
| | | |
| | | /** 重置新增的表单以及其他数据 */ |
| | | 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 delCalibrationMonitoringEquipment({id: val.id}) |
| | | if(res.code == 200){ |
| | | ElMessage.success('数据删除成功') |
| | | await getList() |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | </script> |
| New file |
| | |
| | | <template> |
| | | <div class="notice"> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="state.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-form-item v-if="state.isAdmin" label="企业:" prop="companyId"> |
| | | <el-select v-model="state.form.companyId" placeholder="请选择" :disabled="state.title =='查看'" clearable @change="getDeptList"> |
| | | <el-option |
| | | v-for="item in state.companyList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="检查表名称:" prop="inspectionName"> |
| | | <el-input v-model.trim="state.form.inspectionName" :readonly="state.title =='查看'"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="年份:" prop="year"> |
| | | <el-date-picker |
| | | v-model="state.form.year" |
| | | type="year" |
| | | value-format="YYYY" |
| | | placeholder="请选择年份" |
| | | :disabled="state.title =='查看'" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="受检查区域:" prop="inspectionContent"> |
| | | <el-input v-model.trim="state.form.inspectionContent" :readonly="state.title =='查看'"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="检查日期:" prop="inspectionDate"> |
| | | <el-date-picker |
| | | v-model="state.form.inspectionDate" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="请选择日期" |
| | | :disabled="state.title =='查看'" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-table :data="state.maintainList" :border="true" class="customedTable" style="margin-bottom: 30px"> |
| | | <el-table-column label="序号" type="index" align="center"/> |
| | | <el-table-column label="检查项目" prop="project" align="center"/> |
| | | <el-table-column label="是否符合" prop="contentResult" align="center"> |
| | | <template #default="scope"> |
| | | <el-radio-group v-model="scope.row.contentResult" :disabled="state.title =='查看'"> |
| | | <el-radio :label="1">符合</el-radio> |
| | | <el-radio :label="2">不符合</el-radio> |
| | | <el-radio :label="3">不涉及</el-radio> |
| | | </el-radio-group> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="具体问题" prop="concreteProblems" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.concreteProblems" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%" |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="责任部门" prop="responsibleDepartment" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.responsibleDepartment" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%" |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <el-form-item label="其他问题:" prop="sixInspectionProblemList"> |
| | | <el-button |
| | | type="primary" |
| | | plain |
| | | icon="Plus" |
| | | @click="addLine" |
| | | style="margin-bottom: 10px" |
| | | v-if="state.title !== '查看'" |
| | | >新增</el-button> |
| | | </el-form-item> |
| | | <el-table :data="state.form.sixInspectionProblemList" class="customedTable" :border="true"> |
| | | <el-table-column label="序号" type="index" width="80" align="center"> |
| | | </el-table-column> |
| | | <el-table-column label="问题" prop="problems" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.problems" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="备注" prop="remark" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.remark" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" width="70" v-if="state.title !== '查看'"> |
| | | <template #default="scope"> |
| | | <el-button link type="danger" @click="handleDelete(scope.$index)">删除</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="编制:" prop="establishmentId"> |
| | | <el-select clearable v-model="state.form.establishmentId" :disabled="state.title =='查看'" filterable placeholder="编制" style="width: 100%"> |
| | | <el-option |
| | | v-for="item in state.userList" |
| | | :key="item.userId" |
| | | :label="item.name" |
| | | :value="item.userId" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="审批:" prop="approvalId"> |
| | | <el-select clearable v-model="state.form.approvalId" :disabled="state.title =='查看'" filterable placeholder="审批" style="width: 100%"> |
| | | <el-option |
| | | v-for="item in state.userList" |
| | | :key="item.userId" |
| | | :label="item.name" |
| | | :value="item.userId" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </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 {Base64} from "js-base64" |
| | | import {getToken} from "@/utils/auth"; |
| | | import { |
| | | addInternalAuditCheck, getInternalAuditCheckInfo, |
| | | updateInternalAuditCheck |
| | | } from "@/api/innerReview/meetingReview"; |
| | | import {getDepart} from "@/api/orgStructure/depart"; |
| | | import {listUser} from "@/api/system/user"; |
| | | import {getMaintenanceServiceDetail, updateMaintenanceService} from "@/api/infrastructureMng/ledger"; |
| | | import {getSixInspectionDetail, saveSixInspection} from "@/api/assetManage/assetMng"; |
| | | |
| | | 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, |
| | | companyId: null, |
| | | inspectionName: '', |
| | | year: '', |
| | | inspectionContent: '', |
| | | inspectionDate: '', |
| | | sixInspectionContentList: [], |
| | | sixInspectionProblemList: [], |
| | | delProblemIds: [], |
| | | establishmentId: null, |
| | | establishmentName: '', |
| | | approvalId: null, |
| | | approvalName: '' |
| | | }, |
| | | oldServiceUsers: [], |
| | | maintainList: [ |
| | | { |
| | | id: null, |
| | | sort: 1, |
| | | project: '工作区域地面是否清扫干净,无散落杂物', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 2, |
| | | project: '工作空间通风和光照条件是否良好', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 3, |
| | | project: '工作台或桌面是否擦拭干净或有残留物品', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 4, |
| | | project: '工作台或桌面工具、文具、文件等是否干净、整齐有序', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 5, |
| | | project: '区域消防器具是否齐全、状态良好、有无定期检查', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 6, |
| | | project: '通道是否设置合理或顺畅', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 7, |
| | | project: '危化品放置和标识是否合规', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 8, |
| | | project: '仓库是否按货物分类进行区域管理', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 9, |
| | | project: '整顿时是否考虑方便FIFO原则', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 10, |
| | | project: '保留品、不良品、废料是否定期处理', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 11, |
| | | project: '不必要或剩余物料、工具、治具等是否全部清离现场', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 12, |
| | | project: '作业指导书、安全操作规程等是否设置合理', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 13, |
| | | project: '电气设备运行情况和环境条件是否良好', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 14, |
| | | project: '员工是否按设备操作规范作业', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 15, |
| | | project: '生产人员作业时是否佩戴防护用品', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | } |
| | | ], |
| | | formRules:{ |
| | | companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }], |
| | | inspectionName: [{ required: true, message: '请填写检查表名称', trigger: 'blur' }], |
| | | year: [{ required: true, message: '请选择年份', trigger: 'blur' }], |
| | | inspectionContent: [{ required: true, message: '请填写受检查区域', trigger: 'blur' }], |
| | | inspectionDate: [{ required: true, message: '请选择检查日期', trigger: 'blur' }], |
| | | establishmentId: [{ required: true, message: '请选择编制人', trigger: 'blur' }], |
| | | approvalId: [{ required: true, message: '请选择审批人', trigger: 'blur' }], |
| | | }, |
| | | isAdmin: false, |
| | | companyList: [], |
| | | userList: [] |
| | | }) |
| | | onMounted(() => { |
| | | |
| | | }); |
| | | |
| | | const openDialog = async (type, value,companyId, isAdmin, companyList) => { |
| | | state.isAdmin = isAdmin |
| | | if(isAdmin){ |
| | | state.companyList = companyList |
| | | } |
| | | await getUserList(companyId) |
| | | state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' |
| | | state.form.companyId = companyId |
| | | if(state.title == '编辑'||state.title == '查看'){ |
| | | await getInfo(value.id) |
| | | } |
| | | dialogVisible.value = true |
| | | } |
| | | |
| | | const onSubmit = async () => { |
| | | const valid = await superRef.value.validate(); |
| | | if(valid){ |
| | | if(state.maintainList.find(item=>item.contentResult == null || item.concreteProblems == '' || item.responsibleDepartment == '')){ |
| | | ElMessage.warning('请完善检查表格内容') |
| | | return |
| | | } |
| | | const data = JSON.parse(JSON.stringify(state.form)) |
| | | data.delProblemIds = state.oldServiceUsers.filter(i =>!data.sixInspectionProblemList.some(item=>item.id == i.id)).map(i=>i.id) |
| | | data.sixInspectionContentList = state.maintainList.map(item=>{ |
| | | return { |
| | | id: item.id, |
| | | sort: item.sort, |
| | | contentResult: item.contentResult, |
| | | concreteProblems: item.concreteProblems, |
| | | responsibleDepartment: item.responsibleDepartment |
| | | } |
| | | }) |
| | | data.establishmentName = state.userList.find(i=>i.userId == data.establishmentId)?.name |
| | | data.approvalName = state.userList.find(i=>i.userId == data.approvalId)?.name |
| | | if(state.title == '新增'){ |
| | | delete data.id |
| | | const res = await saveSixInspection(data) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | handleClose() |
| | | dialogVisible.value = false; |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }else{ |
| | | const res = await saveSixInspection(data) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | handleClose() |
| | | dialogVisible.value = false; |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | const addLine = () => { |
| | | const obj = { |
| | | id: null, |
| | | sixInspectionId: null, |
| | | problems: '', |
| | | remark: '' |
| | | } |
| | | state.form.sixInspectionProblemList.push(obj); |
| | | } |
| | | |
| | | const handleDelete = (i) =>{ |
| | | state.form.sixInspectionProblemList = state.form.sixInspectionProblemList.filter((item,index) => index != i) |
| | | } |
| | | |
| | | const getInfo = async (id)=> { |
| | | const res = await getSixInspectionDetail({id: id}) |
| | | if(res.code == 200){ |
| | | Object.keys(state.form).forEach(key => { |
| | | if (key in res.data) { |
| | | state.form[key] = res.data[key] |
| | | } |
| | | }) |
| | | state.oldServiceUsers = state.form.sixInspectionProblemList?.map(item=>{ |
| | | return { |
| | | id: item.id, |
| | | sixInspectionId: item.sixInspectionId, |
| | | problems: item.problems, |
| | | remark: item.remark |
| | | } |
| | | }) |
| | | state.maintainList = state.maintainList.map(item=>{ |
| | | return { |
| | | id: state.form.sixInspectionContentList.find(i=>i.sort == item.sort)?.id, |
| | | sort: item.sort, |
| | | project: item.project, |
| | | contentResult: state.form.sixInspectionContentList.find(i=>i.sort == item.sort)?.contentResult, |
| | | concreteProblems: state.form.sixInspectionContentList.find(i=>i.sort == item.sort)?.concreteProblems, |
| | | responsibleDepartment: state.form.sixInspectionContentList.find(i=>i.sort == item.sort)?.responsibleDepartment, |
| | | } |
| | | }) |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const getDeptList = async ()=>{ |
| | | state.form.establishmentId = null |
| | | state.form.establishmentName = '' |
| | | state.form.approvalId = null |
| | | state.form.approvalName = '' |
| | | await getUserList(state.form.companyId) |
| | | } |
| | | |
| | | |
| | | const getUserList = async (companyId)=> { |
| | | const res = await listUser({pageIndex: 1,pageSize: 999,companyId: companyId}) |
| | | if(res.code == 200){ |
| | | state.userList = res.data.list?res.data.list.map(item=>{ |
| | | const user = item.id |
| | | const {id, ...data} = item |
| | | return { |
| | | ...data, |
| | | userId: user |
| | | } |
| | | }):[] |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const handleClose = () => { |
| | | state.form = { |
| | | id: null, |
| | | companyId: null, |
| | | inspectionName: '', |
| | | year: '', |
| | | inspectionContent: '', |
| | | inspectionDate: '', |
| | | sixInspectionContentList: [], |
| | | sixInspectionProblemList: [], |
| | | delProblemIds: [], |
| | | establishmentId: null, |
| | | establishmentName: '', |
| | | approvalId: null, |
| | | approvalName: '' |
| | | } |
| | | state.maintainList = state.maintainList.map(i=>{ |
| | | return { |
| | | sort: i.sort, |
| | | project: i.project, |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | } |
| | | }) |
| | | 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> |
| | | <style lang="scss"> |
| | | .customedTable{ |
| | | width: calc(100% - 150px); |
| | | margin-left: 150px; |
| | | margin-bottom: 30px; |
| | | .el-table__cell{ |
| | | padding: 2px 0 !important; |
| | | font-size: 14px !important; |
| | | } |
| | | .cell{ |
| | | padding: 0 2px !important; |
| | | font-size: 14px !important; |
| | | } |
| | | } |
| | | </style> |
| New file |
| | |
| | | <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">导出</el-button>--> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | <!-- 表格数据 --> |
| | | <el-table v-loading="loading" :data="dataList" :border="true"> |
| | | <el-table-column type="index" label="序号"></el-table-column> |
| | | <el-table-column prop="inspectionName" align="center" label="检查表名称"></el-table-column> |
| | | <el-table-column prop="year" align="center" label="年份"></el-table-column> |
| | | <el-table-column label="操作" align="center"> |
| | | <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="primary" @click="downloadFile(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 Cookies from "js-cookie"; |
| | | import editDialog from './components/editDialog.vue' |
| | | import useUserStore from "@/store/modules/user"; |
| | | import {getStandardTemp,delStandardTemp} from "@/api/standardSys/standardSys"; |
| | | import { renderAsync } from "docx-preview"; |
| | | import { |
| | | delInternalAuditCheck, |
| | | delMeetingsList, |
| | | getInternalAuditCheck, getInternalAuditCheckInfo, |
| | | getMeetingsList |
| | | } from "@/api/innerReview/meetingReview"; |
| | | import {generateWordDocument} from "@/utils/exportWord"; |
| | | import { |
| | | delMaintenanceService, |
| | | getMaintenanceRecordDetail, getMaintenanceServiceDetail, |
| | | getMaintenanceServiceList |
| | | } from "@/api/infrastructureMng/ledger"; |
| | | import {delSixInspection, getSixInspectionDetail, getSixInspectionList} from "@/api/assetManage/assetMng"; |
| | | |
| | | |
| | | 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, |
| | | maintainList: [ |
| | | { |
| | | id: null, |
| | | sort: 1, |
| | | project: '工作区域地面是否清扫干净,无散落杂物', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 2, |
| | | project: '工作空间通风和光照条件是否良好', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 3, |
| | | project: '工作台或桌面是否擦拭干净或有残留物品', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 4, |
| | | project: '工作台或桌面工具、文具、文件等是否干净、整齐有序', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 5, |
| | | project: '区域消防器具是否齐全、状态良好、有无定期检查', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 6, |
| | | project: '通道是否设置合理或顺畅', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 7, |
| | | project: '危化品放置和标识是否合规', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 8, |
| | | project: '仓库是否按货物分类进行区域管理', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 9, |
| | | project: '整顿时是否考虑方便FIFO原则', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 10, |
| | | project: '保留品、不良品、废料是否定期处理', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 11, |
| | | project: '不必要或剩余物料、工具、治具等是否全部清离现场', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 12, |
| | | project: '作业指导书、安全操作规程等是否设置合理', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 13, |
| | | project: '电气设备运行情况和环境条件是否良好', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 14, |
| | | project: '员工是否按设备操作规范作业', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | },{ |
| | | id: null, |
| | | sort: 15, |
| | | project: '生产人员作业时是否佩戴防护用品', |
| | | contentResult: null, |
| | | concreteProblems: '', |
| | | responsibleDepartment: '' |
| | | } |
| | | ] |
| | | }); |
| | | |
| | | const { queryParams, total, dataList,companyList, isAdmin, maintainList } = 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 getSixInspectionList(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 = async (val)=>{ |
| | | const res = await getSixInspectionDetail({id: val.id}) |
| | | if(res.code == 200){ |
| | | if(res.data){ |
| | | let tableData = res.data |
| | | tableData.table = data.maintainList.map(item =>{ |
| | | return { |
| | | sort: item.sort, |
| | | project: item.project, |
| | | result1: tableData.sixInspectionContentList.find(i=>i.sort == item.sort)?.contentResult == 1 ? '√': '', |
| | | result2: tableData.sixInspectionContentList.find(i=>i.sort == item.sort)?.contentResult == 2 ? '√': '', |
| | | result3: tableData.sixInspectionContentList.find(i=>i.sort == item.sort)?.contentResult == 3 ? '√': '', |
| | | concreteProblems: tableData.sixInspectionContentList.find(i=>i.sort == item.sort)?.concreteProblems, |
| | | responsibleDepartment: tableData.sixInspectionContentList.find(i=>i.sort == item.sort)?.responsibleDepartment, |
| | | } |
| | | }) |
| | | if(Array.isArray(tableData.sixInspectionProblemList) && tableData.sixInspectionProblemList.length>0){ |
| | | tableData.problem = tableData.sixInspectionProblemList?.map((item,index)=>{ |
| | | return { |
| | | ...item, |
| | | index: index + 1 |
| | | } |
| | | }) |
| | | } |
| | | tableData.inspectionDate = tableData.inspectionDate.substring(0,10) |
| | | if(data.isAdmin){ |
| | | tableData.companyName = data.companyList.find(i=>i.id == val.companyId)?.name |
| | | }else{ |
| | | tableData.companyName = userStore.companyName |
| | | } |
| | | try { |
| | | generateWordDocument('/6sReviewSheet.docx', tableData, tableData.companyName + tableData.inspectionName + '.docx'); |
| | | } catch (error){ |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: '导出失败' |
| | | }); |
| | | } |
| | | }else{ |
| | | ElMessage.warning('暂无数据') |
| | | } |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const openDialog = (type, value) => { |
| | | dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin, data.companyList); |
| | | } |
| | | |
| | | /** 重置新增的表单以及其他数据 */ |
| | | 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 delSixInspection({id: val.id}) |
| | | if(res.code == 200){ |
| | | ElMessage.success('数据删除成功') |
| | | await getList() |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | </script> |
| New file |
| | |
| | | <template> |
| | | <div class="notice"> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="state.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-form-item v-if="state.isAdmin" label="企业:" prop="companyId"> |
| | | <el-select v-model="state.form.companyId" placeholder="请选择" :disabled="state.title =='查看'" clearable @change="getDeptList"> |
| | | <el-option |
| | | v-for="item in state.companyList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="记录名称:" prop="name"> |
| | | <el-input v-model.trim="state.form.name" :readonly="state.title =='查看'"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="文件借阅复制记录:" prop="documentBorrowCopyRecordList"> |
| | | <el-button |
| | | type="primary" |
| | | plain |
| | | icon="Plus" |
| | | @click="addLine" |
| | | style="margin-bottom: 10px" |
| | | v-if="state.title !='查看'" |
| | | >新增</el-button> |
| | | </el-form-item> |
| | | <el-table :data="state.form.documentBorrowCopyRecordList" class="customedTable" :border="true"> |
| | | <el-table-column label="序号" type="index" width="80" align="center"> |
| | | </el-table-column> |
| | | <el-table-column label="文件名称" prop="fileName" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.fileName" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="编号" prop="number" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.number" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="发放记录" align="center"> |
| | | <el-table-column label="部门" prop="distributionDeptName" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.distributionDeptName" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="签收" prop="distributionSign" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.distributionSign" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="日期" prop="distributionDate" align="center"> |
| | | <template #default="scope"> |
| | | <el-date-picker |
| | | v-model="scope.row.distributionDate" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="请选择日期" |
| | | :disabled="state.title =='查看'" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="份数" prop="distributionNum" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.distributionNum" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table-column> |
| | | <el-table-column label="回收记录" align="center"> |
| | | <el-table-column label="部门" prop="collectionDeptName" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.collectionDeptName" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="签回" prop="collectionSign" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.collectionSign" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="日期" prop="collectionDate" align="center"> |
| | | <template #default="scope"> |
| | | <el-date-picker |
| | | v-model="scope.row.collectionDate" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="请选择日期" |
| | | :disabled="state.title =='查看'" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="份数" prop="collectionNum" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.collectionNum" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table-column> |
| | | <el-table-column label="备注/版本" prop="remark" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.remark" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" width="70" v-if="state.title !='查看'"> |
| | | <template #default="scope"> |
| | | <el-button link type="danger" @click="handleDelete(scope.$index)">删除</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="制表:" prop="tabulationId"> |
| | | <el-select clearable v-model="state.form.tabulationId" :disabled="state.title =='查看'" filterable placeholder="编制" style="width: 100%"> |
| | | <el-option |
| | | v-for="item in state.userList" |
| | | :key="item.userId" |
| | | :label="item.name" |
| | | :value="item.userId" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="日期:" prop="tabulationDate"> |
| | | <el-date-picker |
| | | v-model="state.form.tabulationDate" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="请选择日期" |
| | | :disabled="state.title =='查看'" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </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 {getToken} from "@/utils/auth"; |
| | | import { |
| | | updateMaintenanceEvaluate, |
| | | getMaintenanceEvaluateDetail |
| | | } from "@/api/infrastructureMng/ledger"; |
| | | |
| | | import {listUser} from "@/api/system/user"; |
| | | import { |
| | | getDocBorrowCopyDetail, |
| | | getDocDistributeCollectDetail, |
| | | saveDocBorrowCopy, |
| | | saveDocDistributeCollect |
| | | } from "@/api/documentManage"; |
| | | |
| | | const emit = defineEmits(["getList"]); |
| | | const dialogVisible = ref(false) |
| | | const superRef = ref() |
| | | const checkList = (rule, value, callback) => { |
| | | if (state.form.documentBorrowCopyRecordList.length == 0) { |
| | | callback(new Error('文件发放回收记录不可为空')) |
| | | } else { |
| | | callback() |
| | | } |
| | | } |
| | | const state = reactive({ |
| | | title: '', |
| | | form: { |
| | | id: null, |
| | | companyId: null, |
| | | name: '', |
| | | documentBorrowCopyRecordList: [], |
| | | deleteIds: [], |
| | | tabulationId: null, |
| | | tabulationName: '', |
| | | tabulationDate: '' |
| | | }, |
| | | oldDeviceList: [], |
| | | formRules:{ |
| | | companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }], |
| | | name: [{ required: true, message: '请填写名称', trigger: 'blur' }], |
| | | tabulationId: [{ required: true, message: '请选择制表人', trigger: 'blur' }], |
| | | tabulationDate: [{ required: true, message: '请选择制表日期', trigger: 'blur' }], |
| | | }, |
| | | isAdmin: false, |
| | | companyList: [], |
| | | userList: [] |
| | | }) |
| | | onMounted(() => { |
| | | |
| | | }); |
| | | |
| | | const openDialog = async (type, value,companyId, isAdmin, companyList) => { |
| | | state.isAdmin = isAdmin |
| | | if(isAdmin){ |
| | | state.companyList = companyList |
| | | } |
| | | await getUserList(companyId) |
| | | state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' |
| | | state.form.companyId = companyId |
| | | if(state.title == '编辑'||state.title == '查看'){ |
| | | await getInfo(value.id) |
| | | } |
| | | dialogVisible.value = true |
| | | } |
| | | |
| | | const addLine = () => { |
| | | const obj = { |
| | | id: null, |
| | | documentId: null, |
| | | fileName: '', |
| | | number: '', |
| | | distributionDeptName: '', |
| | | distributionSign: '', |
| | | distributionDate: '', |
| | | distributionNum: null, |
| | | collectionDeptName: '', |
| | | collectionSign: '', |
| | | collectionDate: '', |
| | | collectionNum: null, |
| | | remark: '' |
| | | } |
| | | state.form.documentBorrowCopyRecordList.push(obj); |
| | | } |
| | | |
| | | const handleDelete = (i) =>{ |
| | | state.form.documentBorrowCopyRecordList = state.form.documentBorrowCopyRecordList.filter((item,index) => index != i) |
| | | } |
| | | |
| | | const onSubmit = async () => { |
| | | const valid = await superRef.value.validate(); |
| | | if(valid){ |
| | | const data = JSON.parse(JSON.stringify(state.form)) |
| | | data.deleteIds = state.oldDeviceList.filter(i =>!data.documentBorrowCopyRecordList.some(item=>item.id == i.id)).map(i=>i.id) |
| | | data.tabulationName = state.userList.find(i=>i.userId == data.tabulationId)?.name |
| | | if(state.title == '新增'){ |
| | | delete data.id |
| | | const res = await saveDocBorrowCopy(data) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | handleClose() |
| | | dialogVisible.value = false; |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }else{ |
| | | const res = await saveDocBorrowCopy(data) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | handleClose() |
| | | dialogVisible.value = false; |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | const getInfo = async (id)=> { |
| | | const res = await getDocBorrowCopyDetail({id: id}) |
| | | if(res.code == 200){ |
| | | Object.keys(state.form).forEach(key => { |
| | | if (key in res.data) { |
| | | state.form[key] = res.data[key] |
| | | } |
| | | }) |
| | | state.form.documentBorrowCopyRecordList = res.data.documentBorrowCopyRecordList?.map( |
| | | ({ id, documentId, fileName, number, distributionDeptName, distributionSign, distributionDate, distributionNum, collectionDeptName, collectionSign, collectionDate, collectionNum, remark}) => ({ |
| | | id, documentId, fileName, number, distributionDeptName, distributionSign, distributionDate, distributionNum, collectionDeptName, collectionSign, collectionDate, collectionNum, remark |
| | | }) |
| | | ) |
| | | state.oldDeviceList = state.form.documentBorrowCopyRecordList |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const getDeptList = async ()=>{ |
| | | state.form.tabulationId = null |
| | | state.form.tabulationName = '' |
| | | await getUserList(state.form.companyId) |
| | | } |
| | | |
| | | const getUserList = async (companyId)=> { |
| | | const res = await listUser({pageIndex: 1,pageSize: 999,companyId: companyId}) |
| | | if(res.code == 200){ |
| | | state.userList = res.data.list?res.data.list.map(item=>{ |
| | | const user = item.id |
| | | const {id, ...data} = item |
| | | return { |
| | | ...data, |
| | | userId: user |
| | | } |
| | | }):[] |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const handleClose = () => { |
| | | state.form = { |
| | | id: null, |
| | | companyId: null, |
| | | name: '', |
| | | documentBorrowCopyRecordList: [], |
| | | deleteIds: [], |
| | | tabulationId: null, |
| | | tabulationName: '', |
| | | tabulationDate: '' |
| | | } |
| | | 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> |
| | | <style lang="scss"> |
| | | .customedTable{ |
| | | width: calc(100% - 150px); |
| | | margin-left: 150px; |
| | | margin-bottom: 30px; |
| | | .el-table__cell{ |
| | | padding: 2px 0 !important; |
| | | font-size: 14px !important; |
| | | } |
| | | .cell{ |
| | | padding: 0 2px !important; |
| | | font-size: 14px !important; |
| | | } |
| | | } |
| | | </style> |
| New file |
| | |
| | | <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">导出</el-button>--> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | <!-- 表格数据 --> |
| | | <el-table v-loading="loading" :data="dataList" :border="true"> |
| | | <el-table-column type="index" label="序号"></el-table-column> |
| | | <el-table-column prop="enactmentDate" align="center" label="检查表名称"> |
| | | <template #default="scope"> |
| | | {{scope.row.name + '记录'}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center"> |
| | | <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="primary" @click="downloadFile(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 Cookies from "js-cookie"; |
| | | import editDialog from './components/editDialog.vue' |
| | | import useUserStore from "@/store/modules/user"; |
| | | import {generateWordDocument} from "@/utils/exportWord"; |
| | | import { |
| | | delMaintenanceEvaluate, |
| | | getMaintenanceEvaluateDetail, |
| | | getMaintenanceEvaluateList |
| | | } from "@/api/infrastructureMng/ledger"; |
| | | import { |
| | | delDocBorrowCopy, |
| | | delDocDistributeCollect, getDocBorrowCopyDetail, getDocBorrowCopyList, |
| | | getDocDistributeCollectDetail, |
| | | getDocDistributeCollectList |
| | | } from "@/api/documentManage"; |
| | | |
| | | |
| | | 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 ()=>{ |
| | | 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 getDocBorrowCopyList(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 = async (val)=>{ |
| | | const res = await getDocBorrowCopyDetail({id: val.id}) |
| | | if(res.code == 200){ |
| | | if(res.data){ |
| | | let tableData = res.data |
| | | tableData.table = res.data.documentBorrowCopyRecordList.map((item,index)=>{ |
| | | return { |
| | | ...item, |
| | | index: index + 1, |
| | | distributionDate: item.distributionDate.substring(0,10), |
| | | collectionDate: item.collectionDate.substring(0,10) |
| | | } |
| | | }) |
| | | tableData.tabulationDate = tableData.tabulationDate.substring(0,10) |
| | | try { |
| | | generateWordDocument('/docDistributeRetrieve.docx', tableData, tableData.name +'文件发放/回收记录.docx'); |
| | | } catch (error){ |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: '导出失败' |
| | | }); |
| | | } |
| | | }else{ |
| | | ElMessage.warning('暂无数据') |
| | | } |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const openDialog = (type, value) => { |
| | | dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin, data.companyList); |
| | | } |
| | | |
| | | /** 重置新增的表单以及其他数据 */ |
| | | 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 delDocBorrowCopy({id: val.id}) |
| | | if(res.code == 200){ |
| | | ElMessage.success('数据删除成功') |
| | | await getList() |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | </script> |
| New file |
| | |
| | | <template> |
| | | <div class="notice"> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="state.title" |
| | | width="50%" |
| | | :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 v-if="state.isAdmin" label="企业:" prop="companyId"> |
| | | <el-select v-model="state.form.companyId" placeholder="请选择" clearable @change="getDeptList" :disabled="state.title =='查看'"> |
| | | <el-option |
| | | v-for="item in state.companyList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="文件名称:" prop="fileName"> |
| | | <el-input v-model.trim="state.form.fileName" :readonly="state.title =='查看'"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="编号:" prop="number"> |
| | | <el-input v-model.trim="state.form.number" :readonly="state.title =='查看'"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="提出部门:" prop="deptId"> |
| | | <el-select |
| | | clearable |
| | | v-model="state.form.deptId" |
| | | :disabled="state.title =='查看'" |
| | | filterable |
| | | 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-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="更改人:" prop="modifierId"> |
| | | <el-select clearable v-model="state.form.modifierId" :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-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="8"> |
| | | <el-form-item label="页次:" prop="pageNumber"> |
| | | <el-input v-model.trim="state.form.pageNumber" :readonly="state.title =='查看'" style="width: 100%"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="原版/次:" prop="originalNumber"> |
| | | <el-input v-model.trim="state.form.originalNumber" :readonly="state.title =='查看'" style="width: 100%"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="现版/次:" prop="currentNumber"> |
| | | <el-input v-model.trim="state.form.currentNumber" :readonly="state.title =='查看'" style="width: 100%"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="更改原因:" prop="modifierReason"> |
| | | <el-input v-model.trim="state.form.modifierReason" type="textarea" :readonly="state.title =='查看'" :autosize="{ minRows: 2 }"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="更改方式:" prop="modifierType"> |
| | | <el-select v-model="state.form.modifierType" :disabled="state.title =='查看'" placeholder="请选择" clearable> |
| | | <el-option key="1" label="划改" :value="1"></el-option> |
| | | <el-option key="2" label="换页" :value="2"></el-option> |
| | | <el-option key="3" label="换版" :value="3"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="更改日期:" prop="modifierTime"> |
| | | <el-date-picker |
| | | :disabled="state.title === '查看'" |
| | | v-model="state.form.modifierTime" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="请选择日期" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="实施日期:" prop="implementTime"> |
| | | <el-date-picker |
| | | :disabled="state.title === '查看'" |
| | | v-model="state.form.implementTime" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="请选择日期" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="更改前:" prop="modifierFront"> |
| | | <el-input v-model.trim="state.form.modifierFront" type="textarea" :readonly="state.title =='查看'" :autosize="{ minRows: 2 }"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="更改后:" prop="modifierBack"> |
| | | <el-input v-model.trim="state.form.modifierBack" type="textarea" :readonly="state.title =='查看'" :autosize="{ minRows: 2 }"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-form-item label="评价对其他相关文件的影响:" prop="documentChangesInvalidatedEvaluateList"> |
| | | <el-button |
| | | type="primary" |
| | | plain |
| | | icon="Plus" |
| | | @click="addLine(1)" |
| | | style="margin-bottom: 10px" |
| | | v-if="state.title !='查看'" |
| | | >新增</el-button> |
| | | </el-form-item> |
| | | <el-table :data="state.form.documentChangesInvalidatedEvaluateList" class="customedTable" :border="true"> |
| | | <el-table-column label="序号" type="index" width="80" align="center"> |
| | | </el-table-column> |
| | | <el-table-column label="文件名称" prop="fileName" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.fileName" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="编号" prop="fileNumber" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.fileNumber" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" width="70" v-if="state.title !='查看'"> |
| | | <template #default="scope"> |
| | | <el-button link type="danger" @click="handleDelete(1,scope.$index)">删除</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="申请人:" prop="applyId"> |
| | | <el-select clearable v-model="state.form.applyId" :disabled="state.title =='查看'" filterable 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-col :span="12"> |
| | | <el-form-item label="日期:" prop="applyDate"> |
| | | <el-date-picker |
| | | :disabled="state.title === '查看'" |
| | | v-model="state.form.applyDate" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="请选择日期" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="审核:" prop="processId"> |
| | | <el-select clearable v-model="state.form.processId" :disabled="state.title =='查看'" filterable 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-col :span="12"> |
| | | <el-form-item label="日期:" prop="processDate"> |
| | | <el-date-picker |
| | | :disabled="state.title === '查看'" |
| | | v-model="state.form.processDate" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="请选择日期" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="批准:" prop="approvalId"> |
| | | <el-select clearable v-model="state.form.approvalId" :disabled="state.title =='查看'" filterable 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-col :span="12"> |
| | | <el-form-item label="日期:" prop="approvalDate"> |
| | | <el-date-picker |
| | | :disabled="state.title === '查看'" |
| | | v-model="state.form.approvalDate" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="请选择日期" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-form-item label="发放信息:" prop="documentChangesInvalidatedIssueList"> |
| | | <el-button |
| | | type="primary" |
| | | plain |
| | | icon="Plus" |
| | | @click="addLine(2)" |
| | | style="margin-bottom: 10px" |
| | | v-if="state.title !='查看'" |
| | | >新增</el-button> |
| | | </el-form-item> |
| | | <el-table :data="state.form.documentChangesInvalidatedIssueList" class="customedTable" :border="true"> |
| | | <el-table-column label="序号" type="index" width="80" align="center"> |
| | | </el-table-column> |
| | | <el-table-column label="发放部门" prop="distributionDeptName" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.distributionDeptName" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="签收人" prop="distributionSign" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.distributionSign" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="日期" prop="distributionDate" align="center"> |
| | | <template #default="scope"> |
| | | <el-date-picker |
| | | v-model="scope.row.distributionDate" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="请选择日期" |
| | | :disabled="state.title =='查看'" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" width="70" v-if="state.title !='查看'"> |
| | | <template #default="scope"> |
| | | <el-button link type="danger" @click="handleDelete(2,scope.$index)">删除</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <el-form-item label="备注:" prop="remark"> |
| | | <el-input v-model.trim="state.form.remark" type="textarea" :autosize="{ minRows: 2 }" :readonly="state.title =='查看'"></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 {Base64} from "js-base64" |
| | | import {getToken} from "@/utils/auth"; |
| | | import { |
| | | addInternalAuditCheck, getInternalAuditCheckInfo, |
| | | updateInternalAuditCheck |
| | | } from "@/api/innerReview/meetingReview"; |
| | | import {getDepart} from "@/api/orgStructure/depart"; |
| | | import {listUser} from "@/api/system/user"; |
| | | import {addStandingBook, updateStandingBook} from "@/api/infrastructureMng/ledger"; |
| | | import { |
| | | getDocChangesInvalidateDetail, |
| | | getDocDistributeCollectDetail, |
| | | saveDocChangesInvalidate |
| | | } from "@/api/documentManage"; |
| | | |
| | | const emit = defineEmits(["getList"]); |
| | | const dialogVisible = ref(false) |
| | | const superRef = ref() |
| | | |
| | | const state = reactive({ |
| | | title: '', |
| | | form: { |
| | | id: null, |
| | | companyId: null, |
| | | fileName: '', |
| | | number: '', |
| | | deptId: null, |
| | | modifierId: null, |
| | | modifierName: '', |
| | | pageNumber: '', |
| | | originalNumber: '', |
| | | currentNumber: '', |
| | | modifierReason: '', |
| | | modifierType: null, |
| | | modifierTime: '', |
| | | implementTime: '', |
| | | modifierFront: '', |
| | | modifierBack: '', |
| | | documentChangesInvalidatedEvaluateList: [], |
| | | delEvaluateIds: [], |
| | | applyId: null, |
| | | applyName: '', |
| | | applyDate: '', |
| | | processId: null, |
| | | processName: '', |
| | | processDate: '', |
| | | approvalId: null, |
| | | approvalName: '', |
| | | approvalDate: '', |
| | | documentChangesInvalidatedIssueList: [], |
| | | delInvalidatedIssueIds: [], |
| | | remark: '' |
| | | }, |
| | | formRules:{ |
| | | companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }], |
| | | fileName: [{ required: true, message: '请填写文件名称', trigger: 'blur' }], |
| | | number: [{ required: true, message: '请填写编号', trigger: 'blur' }], |
| | | deptId: [{ required: true, message: '请选择部门', trigger: 'blur' }], |
| | | modifierId: [{ required: true, message: '请选择更改人', trigger: 'blur' }], |
| | | pageNumber: [{ required: true, message: '请填写页次', trigger: 'blur' }], |
| | | originalNumber: [{ required: true, message: '请填写原版/次', trigger: 'blur' }], |
| | | currentNumber: [{ required: true, message: '请填写现版/次', trigger: 'blur' }], |
| | | modifierReason: [{ required: true, message: '请填写更改原因', trigger: 'blur' }], |
| | | modifierType: [{ required: true, message: '请选择更改方式', trigger: 'blur' }], |
| | | modifierTime: [{ required: true, message: '请选择更改日期', trigger: 'blur' }], |
| | | implementTime: [{ required: true, message: '请选择实施日期', trigger: 'blur' }], |
| | | modifierFront: [{ required: true, message: '请填写更改前', trigger: 'blur' }], |
| | | modifierBack: [{ required: true, message: '请填写更改后', trigger: 'blur' }], |
| | | applyId: [{ required: true, message: '请选择申请人', trigger: 'blur' }], |
| | | applyDate: [{ required: true, message: '请选择申请日期', trigger: 'blur' }], |
| | | processId: [{ required: true, message: '请选择审核人', trigger: 'blur' }], |
| | | processDate: [{ required: true, message: '请选择审核日期', trigger: 'blur' }], |
| | | approvalId: [{ required: true, message: '请选择批准人', trigger: 'blur' }], |
| | | approvalDate: [{ required: true, message: '请选择批准日期', trigger: 'blur' }] |
| | | }, |
| | | isAdmin: false, |
| | | companyList: [], |
| | | deptList: [], |
| | | userList: [], |
| | | oldList1: [], |
| | | oldList2: [] |
| | | }) |
| | | onMounted(() => { |
| | | |
| | | }); |
| | | |
| | | const openDialog = async (type, value,companyId, isAdmin, companyList) => { |
| | | state.isAdmin = isAdmin |
| | | if(isAdmin){ |
| | | state.companyList = companyList |
| | | } |
| | | await getUserList(companyId) |
| | | await getDepartList(companyId) |
| | | state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' |
| | | state.form.companyId = companyId |
| | | if(state.title == '编辑'||state.title == '查看'){ |
| | | await getInfo(value.id) |
| | | } |
| | | dialogVisible.value = true |
| | | } |
| | | |
| | | const addLine = (type) => { |
| | | if(type == 1){ |
| | | const obj = { |
| | | id: null, |
| | | documentChangesId: null, |
| | | fileName: '', |
| | | fileNumber: '' |
| | | } |
| | | state.form.documentChangesInvalidatedEvaluateList.push(obj); |
| | | }else{ |
| | | const obj = { |
| | | id: null, |
| | | documentChangesId: null, |
| | | distributionDeptName: '', |
| | | distributionSign: '', |
| | | distributionDate: '' |
| | | } |
| | | state.form.documentChangesInvalidatedIssueList.push(obj); |
| | | } |
| | | } |
| | | |
| | | const handleDelete = (type,i) =>{ |
| | | if(type == 1){ |
| | | state.form.documentChangesInvalidatedEvaluateList = state.form.documentChangesInvalidatedEvaluateList.filter((item,index) => index != i) |
| | | }else{ |
| | | state.form.documentChangesInvalidatedIssueList = state.form.documentChangesInvalidatedIssueList.filter((item,index) => index != i) |
| | | } |
| | | } |
| | | |
| | | const onSubmit = async () => { |
| | | const valid = await superRef.value.validate(); |
| | | if(valid){ |
| | | const data = JSON.parse(JSON.stringify(state.form)) |
| | | data.delEvaluateIds = state.oldList1.filter(i =>!data.documentChangesInvalidatedEvaluateList.some(item=>item.id == i.id)).map(i=>i.id) |
| | | data.delInvalidatedIssueIds = state.oldList2.filter(i =>!data.documentChangesInvalidatedIssueList.some(item=>item.id == i.id)).map(i=>i.id) |
| | | data.modifierName = state.userList.find(i=>i.id == data.modifierId)?.name |
| | | data.applyName = state.userList.find(i=>i.id == data.applyId)?.name |
| | | data.processName = state.userList.find(i=>i.id == data.processId)?.name |
| | | data.approvalName = state.userList.find(i=>i.id == data.approvalId)?.name |
| | | if(state.title == '新增'){ |
| | | delete data.id |
| | | const res = await saveDocChangesInvalidate(data) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | handleClose() |
| | | dialogVisible.value = false |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }else{ |
| | | const res = await saveDocChangesInvalidate(data) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | handleClose() |
| | | dialogVisible.value = false |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | const getDeptList = async ()=>{ |
| | | state.form.modifierId = null |
| | | state.form.applyId= null |
| | | state.form.processId= null |
| | | state.form.approvalId = null |
| | | await getDepartList(state.form.companyId) |
| | | await getUserList(state.form.companyId) |
| | | } |
| | | |
| | | const getDepartList = async (companyId)=> { |
| | | const params = { |
| | | companyId: companyId |
| | | } |
| | | const res = await getDepart(params) |
| | | if(res.code == 200){ |
| | | state.deptList = res.data |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const getUserList = async (companyId)=> { |
| | | const res = await listUser({pageIndex: 1,pageSize: 999, companyId: companyId}) |
| | | if(res.code == 200){ |
| | | state.userList = res.data.list?res.data.list:[] |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | |
| | | const getInfo = async (id)=> { |
| | | const res = await getDocChangesInvalidateDetail({id: id}) |
| | | if(res.code == 200){ |
| | | Object.keys(state.form).forEach(key => { |
| | | if (key in res.data) { |
| | | state.form[key] = res.data[key] |
| | | } |
| | | }) |
| | | state.form.documentChangesInvalidatedEvaluateList = res.data.documentChangesInvalidatedEvaluateList?.map( |
| | | ({ id, documentChangesId, fileName, fileNumber}) => ({ |
| | | id, documentChangesId, fileName, fileNumber |
| | | }) |
| | | ) |
| | | state.form.documentChangesInvalidatedIssueList = res.data.documentChangesInvalidatedIssueList?.map( |
| | | ({ id, documentChangesId, distributionDeptName, distributionSign, distributionDate}) => ({ |
| | | id, documentChangesId, distributionDeptName, distributionSign, distributionDate |
| | | }) |
| | | ) |
| | | state.oldList1 = state.form.documentChangesInvalidatedEvaluateList |
| | | state.oldList2 = state.form.documentChangesInvalidatedIssueList |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const handleClose = () => { |
| | | state.form = { |
| | | id: null, |
| | | companyId: null, |
| | | fileName: [], |
| | | number: '', |
| | | deptId: null, |
| | | modifierId: null, |
| | | modifierName: '', |
| | | pageNumber: '', |
| | | originalNumber: '', |
| | | currentNumber: '', |
| | | modifierReason: '', |
| | | modifierType: null, |
| | | modifierTime: '', |
| | | implementTime: '', |
| | | modifierFront: '', |
| | | modifierBack: '', |
| | | documentChangesInvalidatedEvaluateList: [], |
| | | delEvaluateIds: [], |
| | | applyId: null, |
| | | applyName: '', |
| | | applyDate: '', |
| | | processId: null, |
| | | processName: '', |
| | | processDate: '', |
| | | approvalId: null, |
| | | approvalName: '', |
| | | approvalDate: '', |
| | | documentChangesInvalidatedIssueList: [], |
| | | delInvalidatedIssueIds: [], |
| | | remark: '' |
| | | } |
| | | 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> |
| | | <style lang="scss"> |
| | | .customedTable{ |
| | | width: calc(100% - 150px); |
| | | margin-left: 150px; |
| | | margin-bottom: 30px; |
| | | .el-table__cell{ |
| | | padding: 2px 0 !important; |
| | | font-size: 14px !important; |
| | | } |
| | | .cell{ |
| | | padding: 0 2px !important; |
| | | font-size: 14px !important; |
| | | } |
| | | } |
| | | </style> |
| New file |
| | |
| | | <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 type="index" label="序号"></el-table-column> |
| | | <el-table-column prop="fileName" align="center" label="文件名称"></el-table-column> |
| | | <el-table-column label="操作" align="center"> |
| | | <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="primary" @click="downloadFile(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, tabsEmits} from "element-plus"; |
| | | import {delCompany, getCompany} from "@/api/onlineEducation/company"; |
| | | import Cookies from "js-cookie"; |
| | | import editDialog from './components/editDialog.vue' |
| | | import useUserStore from "@/store/modules/user"; |
| | | import {getStandardTemp,delStandardTemp} from "@/api/standardSys/standardSys"; |
| | | import { renderAsync } from "docx-preview"; |
| | | import { |
| | | delInternalAuditCheck, |
| | | delMeetingsList, |
| | | getInternalAuditCheck, getInternalAuditCheckInfo, |
| | | getMeetingsList |
| | | } from "@/api/innerReview/meetingReview"; |
| | | import {generateWordDocument} from "@/utils/exportWord"; |
| | | import {delStandingBook, getStandingBookList} from "@/api/infrastructureMng/ledger"; |
| | | import { |
| | | delDocChangesInvalidate, getDocChangesInvalidateDetail, |
| | | getDocChangesInvalidateList, |
| | | getDocDistributeCollectDetail |
| | | } from "@/api/documentManage"; |
| | | |
| | | |
| | | 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 ()=>{ |
| | | 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 getDocChangesInvalidateList(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, data.isAdmin, data.companyList); |
| | | } |
| | | |
| | | /** 重置新增的表单以及其他数据 */ |
| | | const reset= async()=> { |
| | | data.queryParams = { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | companyId: null |
| | | } |
| | | await getCompanyList() |
| | | await getList() |
| | | } |
| | | |
| | | const downloadFile = async (val)=>{ |
| | | const res = await getDocChangesInvalidateDetail({id: val.id}) |
| | | if(res.code == 200){ |
| | | if(res.data){ |
| | | let tableData = res.data |
| | | tableData.table1 = res.data.documentChangesInvalidatedEvaluateList.map((item,index)=>{ |
| | | return { |
| | | ...item, |
| | | index: index + 1 |
| | | } |
| | | }) |
| | | tableData.table2 = res.data.documentChangesInvalidatedIssueList.map((item,index)=>{ |
| | | return { |
| | | ...item, |
| | | index: index + 1, |
| | | distributionDate: item.distributionDate.substring(0,10) |
| | | } |
| | | }) |
| | | tableData.applyDate = tableData.applyDate.substring(0,10) |
| | | tableData.approvalDate = tableData.approvalDate.substring(0,10) |
| | | tableData.implementTime = tableData.implementTime.substring(0,10) |
| | | tableData.modifierTime = tableData.modifierTime.substring(0,10) |
| | | tableData.processDate = tableData.processDate.substring(0,10) |
| | | tableData.modifierType1 = tableData.modifierType == 1 ? '√' : '' |
| | | tableData.modifierType2 = tableData.modifierType == 2 ? '√' : '' |
| | | tableData.modifierType3 = tableData.modifierType == 3 ? '√' : '' |
| | | try { |
| | | generateWordDocument('/docChangeInvalidate.docx', tableData, tableData.fileName +'文件更改通知单.docx'); |
| | | } catch (error){ |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: '导出失败' |
| | | }); |
| | | } |
| | | }else{ |
| | | ElMessage.warning('暂无数据') |
| | | } |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const handleDelete = (val) => { |
| | | ElMessageBox.confirm( |
| | | '确定删除此条数据?', |
| | | '提示', |
| | | { |
| | | confirmButtonText: '确定', |
| | | cancelButtonText: '取消', |
| | | type: 'warning', |
| | | }) |
| | | .then( async() => { |
| | | const res = await delDocChangesInvalidate({id: val.id}) |
| | | if(res.code == 200){ |
| | | ElMessage.success('数据删除成功') |
| | | await getList() |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | </script> |
| New file |
| | |
| | | <template> |
| | | <div class="notice"> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="state.title" |
| | | width="50%" |
| | | :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 v-if="state.isAdmin" label="企业:" prop="companyId"> |
| | | <el-select v-model="state.form.companyId" placeholder="请选择" :disabled="state.title =='查看'" clearable @change="getDeptList"> |
| | | <el-option |
| | | v-for="item in state.companyList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="文件名称:" prop="fileName"> |
| | | <el-input v-model.trim="state.form.fileName" :disabled="state.title =='查看'"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="序号:" prop="sort"> |
| | | <el-input v-model.number.trim="state.form.sort" :disabled="state.title =='查看'"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="8"> |
| | | <el-form-item label="编号:" prop="number"> |
| | | <el-input v-model.trim="state.form.number" :disabled="state.title =='查看'"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="版本:" prop="edition"> |
| | | <el-input v-model.trim="state.form.edition" :disabled="state.title =='查看'"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="份数:" prop="copies"> |
| | | <el-input v-model.number.trim="state.form.copies" type="number" :disabled="state.title =='查看'"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="销毁原因:" prop="destruction"> |
| | | <el-input v-model.trim="state.form.destruction" type="textarea" :autosize="{ minRows: 4}" :readonly="state.title =='查看'"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="申请人:" prop="destructionApplyId"> |
| | | <el-select clearable v-model="state.form.destructionApplyId" :disabled="state.title =='查看'" filterable placeholder="申请人" style="width: 100%"> |
| | | <el-option |
| | | v-for="item in state.userList" |
| | | :key="item.userId" |
| | | :label="item.name" |
| | | :value="item.userId" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="日期:" prop="destructionApplyDate"> |
| | | <el-date-picker |
| | | v-model="state.form.destructionApplyDate" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="请选择日期" |
| | | :disabled="state.title =='查看'" |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="所在部意见:" prop="deptOpinions"> |
| | | <el-input v-model.trim="state.form.deptOpinions" type="textarea" :autosize="{ minRows: 4}" :readonly="state.title =='查看'"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="人员:" prop="deptUserId"> |
| | | <el-select clearable v-model="state.form.deptUserId" :disabled="state.title =='查看'" filterable placeholder="人员" style="width: 100%"> |
| | | <el-option |
| | | v-for="item in state.userList" |
| | | :key="item.userId" |
| | | :label="item.name" |
| | | :value="item.userId" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="日期:" prop="deptDate"> |
| | | <el-date-picker |
| | | v-model="state.form.deptDate" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="请选择日期" |
| | | :disabled="state.title =='查看'" |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="文件保管部门意见:" prop="safekeepingOpinions"> |
| | | <el-input v-model.trim="state.form.safekeepingOpinions" type="textarea" :autosize="{ minRows: 4}" :readonly="state.title =='查看'"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="人员:" prop="safekeepingId"> |
| | | <el-select clearable v-model="state.form.safekeepingId" :disabled="state.title =='查看'" filterable placeholder="人员" style="width: 100%"> |
| | | <el-option |
| | | v-for="item in state.userList" |
| | | :key="item.userId" |
| | | :label="item.name" |
| | | :value="item.userId" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="日期:" prop="safekeepingDate"> |
| | | <el-date-picker |
| | | v-model="state.form.safekeepingDate" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="请选择日期" |
| | | :disabled="state.title =='查看'" |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="管理者代表意见:" prop="managementOpinions"> |
| | | <el-input v-model.trim="state.form.managementOpinions" type="textarea" :autosize="{ minRows: 4}" :readonly="state.title =='查看'"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="人员:" prop="managementId"> |
| | | <el-select clearable v-model="state.form.managementId" :disabled="state.title =='查看'" filterable placeholder="人员" style="width: 100%"> |
| | | <el-option |
| | | v-for="item in state.userList" |
| | | :key="item.userId" |
| | | :label="item.name" |
| | | :value="item.userId" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="日期:" prop="managementDate"> |
| | | <el-date-picker |
| | | v-model="state.form.managementDate" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="请选择日期" |
| | | :disabled="state.title =='查看'" |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </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 {Base64} from "js-base64" |
| | | import {getToken} from "@/utils/auth"; |
| | | import { |
| | | addInternalAuditCheck, getInternalAuditCheckInfo, |
| | | updateInternalAuditCheck |
| | | } from "@/api/innerReview/meetingReview"; |
| | | import {getDepart} from "@/api/orgStructure/depart"; |
| | | import {listUser} from "@/api/system/user"; |
| | | import {getMaintenanceRecordDetail, updateMaintenanceRecord} from "@/api/infrastructureMng/ledger"; |
| | | import {saveDocDestructionApply} from "@/api/documentManage"; |
| | | |
| | | const emit = defineEmits(["getList"]); |
| | | const dialogVisible = ref(false) |
| | | const superRef = ref() |
| | | |
| | | const state = reactive({ |
| | | title: '', |
| | | form: { |
| | | id: null, |
| | | companyId: null, |
| | | fileName: '', |
| | | sort: null, |
| | | number: '', |
| | | edition: '', |
| | | copies: null, |
| | | destruction: '', |
| | | destructionApplyId: null, |
| | | destructionApplyName: '', |
| | | destructionApplyDate: '', |
| | | deptOpinions: '', |
| | | deptUserId: null, |
| | | deptUserName: '', |
| | | deptDate: '', |
| | | safekeepingOpinions: '', |
| | | safekeepingId: null, |
| | | safekeepingName: '', |
| | | safekeepingDate: '', |
| | | managementOpinions: '', |
| | | managementId: null, |
| | | managementName: '', |
| | | managementDate: '' |
| | | }, |
| | | formRules:{ |
| | | companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }], |
| | | fileName: [{ required: true, message: '请填写文件名称', trigger: 'blur' }], |
| | | destruction: [{ required: true, message: '请填写销毁原因', trigger: 'blur' }], |
| | | destructionApplyId: [{ required: true, message: '请选择申请人', trigger: 'blur' }], |
| | | destructionApplyDate: [{ required: true, message: '请选择日期', trigger: 'blur' }], |
| | | deptOpinions: [{ required: true, message: '请填写所在部门意见', trigger: 'blur' }], |
| | | deptUserId: [{ required: true, message: '请选择人员', trigger: 'blur' }], |
| | | deptDate: [{ required: true, message: '请选择日期', trigger: 'blur' }], |
| | | safekeepingOpinions: [{ required: true, message: '请填写文件保管部门意见', trigger: 'blur' }], |
| | | safekeepingId: [{ required: true, message: '请选择人员', trigger: 'blur' }], |
| | | safekeepingDate: [{ required: true, message: '请选择日期', trigger: 'blur' }], |
| | | managementOpinions: [{ required: true, message: '请填写管理者代表意见', trigger: 'blur' }], |
| | | managementId: [{ required: true, message: '请选择人员', trigger: 'blur' }], |
| | | managementDate: [{ required: true, message: '请选择日期', trigger: 'blur' }] |
| | | }, |
| | | isAdmin: false, |
| | | companyList: [], |
| | | userList: [] |
| | | }) |
| | | onMounted(() => { |
| | | |
| | | }); |
| | | |
| | | const openDialog = async (type, value,companyId, isAdmin, companyList) => { |
| | | state.isAdmin = isAdmin |
| | | if(isAdmin){ |
| | | state.companyList = companyList |
| | | } |
| | | await getUserList(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){ |
| | | const data = JSON.parse(JSON.stringify(state.form)) |
| | | data.destructionApplyName = state.userList.find(i=>i.userId == data.destructionApplyId)?.name |
| | | data.deptUserName = state.userList.find(i=>i.userId == data.deptUserId)?.name |
| | | data.safekeepingName = state.userList.find(i=>i.userId == data.safekeepingId)?.name |
| | | data.managementName = state.userList.find(i=>i.userId == data.managementId)?.name |
| | | if(state.title == '新增'){ |
| | | delete data.id |
| | | const res = await saveDocDestructionApply(data) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | handleClose() |
| | | dialogVisible.value = false; |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }else{ |
| | | const res = await saveDocDestructionApply(data) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | handleClose() |
| | | dialogVisible.value = false; |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | const getDeptList = async ()=>{ |
| | | state.form.destructionApplyId = null |
| | | state.form.deptUserId = null |
| | | state.form.safekeepingId = null |
| | | state.form.managementId = null |
| | | await getUserList(state.form.companyId) |
| | | } |
| | | |
| | | const getUserList = async (companyId)=> { |
| | | const res = await listUser({pageIndex: 1,pageSize: 999, companyId: companyId}) |
| | | if(res.code == 200){ |
| | | state.userList = res.data.list?res.data.list.map(item=>{ |
| | | const user = item.id |
| | | const {id, ...data} = item |
| | | return { |
| | | ...data, |
| | | userId: user |
| | | } |
| | | }):[] |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const handleClose = () => { |
| | | state.form = { |
| | | id: null, |
| | | companyId: null, |
| | | fileName: '', |
| | | sort: null, |
| | | number: '', |
| | | edition: '', |
| | | copies: null, |
| | | destruction: '', |
| | | destructionApplyId: null, |
| | | destructionApplyName: '', |
| | | destructionApplyDate: '', |
| | | deptOpinions: '', |
| | | deptUserId: null, |
| | | deptUserName: '', |
| | | deptDate: '', |
| | | safekeepingOpinions: '', |
| | | safekeepingId: null, |
| | | safekeepingName: '', |
| | | safekeepingDate: '', |
| | | managementOpinions: '', |
| | | managementId: null, |
| | | managementName: '', |
| | | managementDate: '' |
| | | } |
| | | 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> |
| New file |
| | |
| | | <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">导出</el-button>--> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | <!-- 表格数据 --> |
| | | <el-table v-loading="loading" :data="dataList" :border="true"> |
| | | <el-table-column type="index" label="序号"></el-table-column> |
| | | <el-table-column prop="fileName" align="center" label="文件名称"></el-table-column> |
| | | <el-table-column label="操作" align="center"> |
| | | <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="primary" @click="downloadFile(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 Cookies from "js-cookie"; |
| | | import editDialog from './components/editDialog.vue' |
| | | import useUserStore from "@/store/modules/user"; |
| | | import {generateWordDocument} from "@/utils/exportWord"; |
| | | import { |
| | | delMaintenanceRecord, |
| | | getMaintenanceRecordDetail, |
| | | getMaintenanceRecordList |
| | | } from "@/api/infrastructureMng/ledger"; |
| | | import {getInternalAuditCheckInfo} from "@/api/innerReview/meetingReview"; |
| | | import {delDocDestructionApply, getDocDestructionApplyList} from "@/api/documentManage"; |
| | | |
| | | |
| | | 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 ()=>{ |
| | | 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 getDocDestructionApplyList(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, data.isAdmin, data.companyList); |
| | | } |
| | | |
| | | const downloadFile = async (val)=>{ |
| | | let tableData = val |
| | | tableData.destructionApplyDate = tableData.destructionApplyDate.substring(0,10) |
| | | tableData.deptDate = tableData.deptDate.substring(0,10) |
| | | tableData.safekeepingDate = tableData.safekeepingDate.substring(0,10) |
| | | tableData.managementDate = tableData.managementDate.substring(0,10) |
| | | try { |
| | | generateWordDocument('/docDestruction.docx', tableData, tableData.fileName + '文件销毁申请表.docx'); |
| | | } catch (error){ |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: '导出失败' |
| | | }); |
| | | } |
| | | } |
| | | |
| | | /** 重置新增的表单以及其他数据 */ |
| | | 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 delDocDestructionApply({id: val.id}) |
| | | if(res.code == 200){ |
| | | ElMessage.success('数据删除成功') |
| | | await getList() |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | </script> |
| New file |
| | |
| | | <template> |
| | | <div class="notice"> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="state.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-form-item v-if="state.isAdmin" label="企业:" prop="companyId"> |
| | | <el-select v-model="state.form.companyId" placeholder="请选择" :disabled="state.title =='查看'" clearable @change="getDeptList"> |
| | | <el-option |
| | | v-for="item in state.companyList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="记录名称:" prop="name"> |
| | | <el-input v-model.trim="state.form.name" :readonly="state.title =='查看'"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="文件发放回收记录:" prop="documentDistributionCollectionRecordList"> |
| | | <el-button |
| | | type="primary" |
| | | plain |
| | | icon="Plus" |
| | | @click="addLine" |
| | | style="margin-bottom: 10px" |
| | | v-if="state.title !='查看'" |
| | | >新增</el-button> |
| | | </el-form-item> |
| | | <el-table :data="state.form.documentDistributionCollectionRecordList" class="customedTable" :border="true"> |
| | | <el-table-column label="序号" type="index" width="80" align="center"> |
| | | </el-table-column> |
| | | <el-table-column label="文件名称" prop="fileName" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.fileName" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="编号" prop="number" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.number" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="发放记录" align="center"> |
| | | <el-table-column label="部门" prop="distributionDeptName" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.distributionDeptName" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="签收" prop="distributionSign" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.distributionSign" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="日期" prop="distributionDate" align="center"> |
| | | <template #default="scope"> |
| | | <el-date-picker |
| | | v-model="scope.row.distributionDate" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="请选择日期" |
| | | :disabled="state.title =='查看'" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="份数" prop="distributionNum" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.distributionNum" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table-column> |
| | | <el-table-column label="回收记录" align="center"> |
| | | <el-table-column label="部门" prop="collectionDeptName" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.collectionDeptName" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="签回" prop="collectionSign" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.collectionSign" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="日期" prop="collectionDate" align="center"> |
| | | <template #default="scope"> |
| | | <el-date-picker |
| | | v-model="scope.row.collectionDate" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="请选择日期" |
| | | :disabled="state.title =='查看'" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="份数" prop="collectionNum" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.collectionNum" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table-column> |
| | | <el-table-column label="备注/版本" prop="remark" align="center"> |
| | | <template #default="scope"> |
| | | <el-input |
| | | v-model.trim="scope.row.remark" |
| | | size="large" |
| | | type="textarea" |
| | | style="width: 100%;" |
| | | clearable |
| | | :readonly="state.title =='查看'" |
| | | > |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" width="70" v-if="state.title !='查看'"> |
| | | <template #default="scope"> |
| | | <el-button link type="danger" @click="handleDelete(scope.$index)">删除</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="制表:" prop="tabulationId"> |
| | | <el-select clearable v-model="state.form.tabulationId" :disabled="state.title =='查看'" filterable placeholder="编制" style="width: 100%"> |
| | | <el-option |
| | | v-for="item in state.userList" |
| | | :key="item.userId" |
| | | :label="item.name" |
| | | :value="item.userId" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="日期:" prop="tabulationDate"> |
| | | <el-date-picker |
| | | v-model="state.form.tabulationDate" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="请选择日期" |
| | | :disabled="state.title =='查看'" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </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 {getToken} from "@/utils/auth"; |
| | | import { |
| | | updateMaintenanceEvaluate, |
| | | getMaintenanceEvaluateDetail |
| | | } from "@/api/infrastructureMng/ledger"; |
| | | |
| | | import {listUser} from "@/api/system/user"; |
| | | import {getDocDistributeCollectDetail, saveDocDistributeCollect} from "@/api/documentManage"; |
| | | |
| | | const emit = defineEmits(["getList"]); |
| | | const dialogVisible = ref(false) |
| | | const superRef = ref() |
| | | const checkList = (rule, value, callback) => { |
| | | if (state.form.documentDistributionCollectionRecordList.length == 0) { |
| | | callback(new Error('文件发放回收记录不可为空')) |
| | | } else { |
| | | callback() |
| | | } |
| | | } |
| | | const state = reactive({ |
| | | title: '', |
| | | form: { |
| | | id: null, |
| | | companyId: null, |
| | | name: '', |
| | | documentDistributionCollectionRecordList: [], |
| | | deleteIds: [], |
| | | tabulationId: null, |
| | | tabulationName: '', |
| | | tabulationDate: '' |
| | | }, |
| | | oldDeviceList: [], |
| | | formRules:{ |
| | | companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }], |
| | | name: [{ required: true, message: '请填写名称', trigger: 'blur' }], |
| | | tabulationId: [{ required: true, message: '请选择制表人', trigger: 'blur' }], |
| | | tabulationDate: [{ required: true, message: '请选择制表日期', trigger: 'blur' }], |
| | | }, |
| | | isAdmin: false, |
| | | companyList: [], |
| | | userList: [] |
| | | }) |
| | | onMounted(() => { |
| | | |
| | | }); |
| | | |
| | | const openDialog = async (type, value,companyId, isAdmin, companyList) => { |
| | | state.isAdmin = isAdmin |
| | | if(isAdmin){ |
| | | state.companyList = companyList |
| | | } |
| | | await getUserList(companyId) |
| | | state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' |
| | | state.form.companyId = companyId |
| | | if(state.title == '编辑'||state.title == '查看'){ |
| | | await getInfo(value.id) |
| | | } |
| | | dialogVisible.value = true |
| | | } |
| | | |
| | | const addLine = () => { |
| | | const obj = { |
| | | id: null, |
| | | documentId: null, |
| | | fileName: '', |
| | | number: '', |
| | | distributionDeptName: '', |
| | | distributionSign: '', |
| | | distributionDate: '', |
| | | distributionNum: null, |
| | | collectionDeptName: '', |
| | | collectionSign: '', |
| | | collectionDate: '', |
| | | collectionNum: null, |
| | | remark: '' |
| | | } |
| | | state.form.documentDistributionCollectionRecordList.push(obj); |
| | | } |
| | | |
| | | const handleDelete = (i) =>{ |
| | | state.form.documentDistributionCollectionRecordList = state.form.documentDistributionCollectionRecordList.filter((item,index) => index != i) |
| | | } |
| | | |
| | | const onSubmit = async () => { |
| | | const valid = await superRef.value.validate(); |
| | | if(valid){ |
| | | const data = JSON.parse(JSON.stringify(state.form)) |
| | | data.deleteIds = state.oldDeviceList.filter(i =>!data.documentDistributionCollectionRecordList.some(item=>item.id == i.id)).map(i=>i.id) |
| | | data.tabulationName = state.userList.find(i=>i.userId == data.tabulationId)?.name |
| | | if(state.title == '新增'){ |
| | | delete data.id |
| | | const res = await saveDocDistributeCollect(data) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | handleClose() |
| | | dialogVisible.value = false; |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }else{ |
| | | const res = await saveDocDistributeCollect(data) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | handleClose() |
| | | dialogVisible.value = false; |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | const getInfo = async (id)=> { |
| | | const res = await getDocDistributeCollectDetail({id: id}) |
| | | if(res.code == 200){ |
| | | Object.keys(state.form).forEach(key => { |
| | | if (key in res.data) { |
| | | state.form[key] = res.data[key] |
| | | } |
| | | }) |
| | | state.form.documentDistributionCollectionRecordList = res.data.documentDistributionCollectionRecordList?.map( |
| | | ({ id, documentId, fileName, number, distributionDeptName, distributionSign, distributionDate, distributionNum, collectionDeptName, collectionSign, collectionDate, collectionNum, remark}) => ({ |
| | | id, documentId, fileName, number, distributionDeptName, distributionSign, distributionDate, distributionNum, collectionDeptName, collectionSign, collectionDate, collectionNum, remark |
| | | }) |
| | | ) |
| | | state.oldDeviceList = state.form.documentDistributionCollectionRecordList |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const getDeptList = async ()=>{ |
| | | state.form.tabulationId = null |
| | | state.form.tabulationName = '' |
| | | await getUserList(state.form.companyId) |
| | | } |
| | | |
| | | const getUserList = async (companyId)=> { |
| | | const res = await listUser({pageIndex: 1,pageSize: 999,companyId: companyId}) |
| | | if(res.code == 200){ |
| | | state.userList = res.data.list?res.data.list.map(item=>{ |
| | | const user = item.id |
| | | const {id, ...data} = item |
| | | return { |
| | | ...data, |
| | | userId: user |
| | | } |
| | | }):[] |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const handleClose = () => { |
| | | state.form = { |
| | | id: null, |
| | | companyId: null, |
| | | name: '', |
| | | documentDistributionCollectionRecordList: [], |
| | | deleteIds: [], |
| | | tabulationId: null, |
| | | tabulationName: '', |
| | | tabulationDate: '' |
| | | } |
| | | 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> |
| | | <style lang="scss"> |
| | | .customedTable{ |
| | | width: calc(100% - 150px); |
| | | margin-left: 150px; |
| | | margin-bottom: 30px; |
| | | .el-table__cell{ |
| | | padding: 2px 0 !important; |
| | | font-size: 14px !important; |
| | | } |
| | | .cell{ |
| | | padding: 0 2px !important; |
| | | font-size: 14px !important; |
| | | } |
| | | } |
| | | </style> |
| New file |
| | |
| | | <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">导出</el-button>--> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | <!-- 表格数据 --> |
| | | <el-table v-loading="loading" :data="dataList" :border="true"> |
| | | <el-table-column type="index" label="序号"></el-table-column> |
| | | <el-table-column prop="enactmentDate" align="center" label="检查表名称"> |
| | | <template #default="scope"> |
| | | {{scope.row.name + '记录'}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center"> |
| | | <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="primary" @click="downloadFile(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 Cookies from "js-cookie"; |
| | | import editDialog from './components/editDialog.vue' |
| | | import useUserStore from "@/store/modules/user"; |
| | | import {generateWordDocument} from "@/utils/exportWord"; |
| | | import { |
| | | delMaintenanceEvaluate, |
| | | getMaintenanceEvaluateDetail, |
| | | getMaintenanceEvaluateList |
| | | } from "@/api/infrastructureMng/ledger"; |
| | | import { |
| | | delDocDistributeCollect, |
| | | getDocDistributeCollectDetail, |
| | | getDocDistributeCollectList |
| | | } from "@/api/documentManage"; |
| | | |
| | | |
| | | 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 ()=>{ |
| | | 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 getDocDistributeCollectList(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 = async (val)=>{ |
| | | const res = await getDocDistributeCollectDetail({id: val.id}) |
| | | if(res.code == 200){ |
| | | if(res.data){ |
| | | let tableData = res.data |
| | | tableData.table = res.data.documentDistributionCollectionRecordList.map((item,index)=>{ |
| | | return { |
| | | ...item, |
| | | index: index + 1, |
| | | distributionDate: item.distributionDate.substring(0,10), |
| | | collectionDate: item.collectionDate.substring(0,10) |
| | | } |
| | | }) |
| | | tableData.tabulationDate = tableData.tabulationDate.substring(0,10) |
| | | try { |
| | | generateWordDocument('/docDistributeRetrieve.docx', tableData, tableData.name +'文件发放/回收记录.docx'); |
| | | } catch (error){ |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: '导出失败' |
| | | }); |
| | | } |
| | | }else{ |
| | | ElMessage.warning('暂无数据') |
| | | } |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const openDialog = (type, value) => { |
| | | dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin, data.companyList); |
| | | } |
| | | |
| | | /** 重置新增的表单以及其他数据 */ |
| | | 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 delDocDistributeCollect({id: val.id}) |
| | | if(res.code == 200){ |
| | | ElMessage.success('数据删除成功') |
| | | await getList() |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | </script> |
| New file |
| | |
| | | <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> |
| | | <!-- 表格数据 --> |
| | | <div> |
| | | 公司目前拥有职工总人数{{ dataList.totalUser }}人,包括{{ dataList.post }}等专业, |
| | | <span v-if="(dataList.qualification5 && dataList.qualification5>0) || (dataList.qualification4 && dataList.qualification4>0)"> |
| | | <span v-if="dataList.qualification5>0">博士</span> |
| | | <span v-if="dataList.qualification4>0">硕士</span> |
| | | 高端人才多人, |
| | | </span> |
| | | <span v-if="(dataList.positional3 && dataList.positional3>0) || (dataList.positional2 && dataList.positional2>0) || (dataList.positional1 && dataList.positional1>0)"> |
| | | 其中 |
| | | <span v-if="dataList.positional3>0">高级人称{{dataList.positional3}}人,</span> |
| | | <span v-if="dataList.positional2>0">中级人称{{dataList.positional2}}人,</span> |
| | | <span v-if="dataList.positional1>0">初级人称{{dataList.positional1}}人,</span>。 |
| | | </span> |
| | | <br> |
| | | 本科及以上学历{{dataList.qualification3 + dataList.qualification4 + dataList.qualification5}}人,占总人数的{{dataList.qualificationBKRatio}}%, |
| | | 专业技术人员{{dataList.personTypeJS}}人,占总人数的{{dataList.jsRatio}}%以上,具备稳定的技术研发队伍。 |
| | | <br> |
| | | 公司员工年龄结构较为年轻化,平均年龄为{{dataList.avgAge}}岁,其中18周岁到40周岁的有{{dataList.age1840}}人,占总人数的{{dataList.age1840Ratio}}%,40周岁以上有{{dataList.age40}}人,占总人数的{{dataList.age40Ratio}}%。 |
| | | </div> |
| | | <div style="margin-top: 40px"> |
| | | <el-radio-group v-model="tabValue" style="margin-bottom: 20px"> |
| | | <el-radio-button :label="1">饼图展示</el-radio-button> |
| | | <el-radio-button :label="2">柱状图展示</el-radio-button> |
| | | </el-radio-group> |
| | | <div v-show="tabValue == 1" style="width: 100%;display: flex"> |
| | | <div id="pie1" style="width: 33.33%;height: 500px"></div> |
| | | <div id="pie2" style="width: 33.33%;height: 500px"></div> |
| | | <div id="pie3" style="width: 33.33%;height: 500px"></div> |
| | | </div> |
| | | <div v-show="tabValue == 2" style="width: 100%;display: flex"> |
| | | <div id="stick1" style="width: calc((100vw - 280px)/3);height: 500px"></div> |
| | | <div id="stick2" style="width: calc((100vw - 280px)/3);height: 500px"></div> |
| | | <div id="stick3" style="width: calc((100vw - 280px)/3);height: 500px"></div> |
| | | </div> |
| | | </div> |
| | | </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 Cookies from "js-cookie"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import {getDepEmpsDetail} from "@/api/staffManage/staff"; |
| | | import * as echarts from 'echarts'; |
| | | const userStore = useUserStore() |
| | | const { proxy } = getCurrentInstance(); |
| | | const loading = ref(false); |
| | | const dialogRef = ref(); |
| | | const data = reactive({ |
| | | queryParams: { |
| | | companyId: null |
| | | }, |
| | | total: 0, |
| | | dataList: {}, |
| | | companyList: [], |
| | | isAdmin: false, |
| | | tabValue: 1 |
| | | }); |
| | | |
| | | const { queryParams, total, dataList,companyList, isAdmin, tabValue } = 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 getDepEmpsDetail(data.queryParams) |
| | | if(res.code == 200){ |
| | | data.dataList = res.data |
| | | await initPie1(data.dataList) |
| | | await initPie2(data.dataList) |
| | | await initPie3(data.dataList) |
| | | await initStick1(data.dataList) |
| | | await initStick2(data.dataList) |
| | | await initStick3(data.dataList) |
| | | }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 initPie1 = (data)=>{ |
| | | var chartDom = document.getElementById('pie1'); |
| | | var myChart = echarts.init(chartDom); |
| | | var option; |
| | | option = { |
| | | title: { |
| | | text: '职称分布', |
| | | left: 'center' |
| | | }, |
| | | tooltip: { |
| | | trigger: 'item' |
| | | }, |
| | | legend: { |
| | | orient: 'horizontal', |
| | | left: 'center', |
| | | top: 40 |
| | | }, |
| | | series: [ |
| | | { |
| | | type: 'pie', |
| | | radius: '50%', |
| | | data: [ |
| | | { value: data.positional3, name: '高级' }, |
| | | { value: data.positional2, name: '中级' }, |
| | | { value: data.positional1, name: '初级' }, |
| | | ], |
| | | emphasis: { |
| | | itemStyle: { |
| | | shadowBlur: 10, |
| | | shadowOffsetX: 0, |
| | | shadowColor: 'rgba(0, 0, 0, 0.5)' |
| | | } |
| | | } |
| | | } |
| | | ] |
| | | }; |
| | | option && myChart.setOption(option); |
| | | } |
| | | |
| | | const initPie2 = (data)=>{ |
| | | var chartDom = document.getElementById('pie2'); |
| | | var myChart = echarts.init(chartDom); |
| | | var option; |
| | | option = { |
| | | title: { |
| | | text: '学历分布', |
| | | left: 'center' |
| | | }, |
| | | tooltip: { |
| | | trigger: 'item' |
| | | }, |
| | | legend: { |
| | | orient: 'horizontal', |
| | | left: 'center', |
| | | top: 40 |
| | | }, |
| | | series: [ |
| | | { |
| | | type: 'pie', |
| | | radius: '50%', |
| | | data: [ |
| | | { value: data.qualification1, name: '高中及以下' }, |
| | | { value: data.qualification2, name: '专科' }, |
| | | { value: data.qualification3, name: '本科' }, |
| | | { value: data.qualification4, name: '硕士' }, |
| | | { value: data.qualification5, name: '博士及以上' } |
| | | ], |
| | | emphasis: { |
| | | itemStyle: { |
| | | shadowBlur: 10, |
| | | shadowOffsetX: 0, |
| | | shadowColor: 'rgba(0, 0, 0, 0.5)' |
| | | } |
| | | } |
| | | } |
| | | ] |
| | | }; |
| | | option && myChart.setOption(option); |
| | | } |
| | | |
| | | const initPie3 = (data)=>{ |
| | | var chartDom = document.getElementById('pie3'); |
| | | var myChart = echarts.init(chartDom); |
| | | var option; |
| | | option = { |
| | | title: { |
| | | text: '年龄分布', |
| | | left: 'center' |
| | | }, |
| | | tooltip: { |
| | | trigger: 'item' |
| | | }, |
| | | legend: { |
| | | orient: 'horizontal', |
| | | left: 'center', |
| | | top: 40 |
| | | }, |
| | | series: [ |
| | | { |
| | | type: 'pie', |
| | | radius: '50%', |
| | | data: [ |
| | | { value: data.age1840, name: '18岁-40岁' }, |
| | | { value: data.age40, name: '40岁以上' } |
| | | ], |
| | | emphasis: { |
| | | itemStyle: { |
| | | shadowBlur: 10, |
| | | shadowOffsetX: 0, |
| | | shadowColor: 'rgba(0, 0, 0, 0.5)' |
| | | } |
| | | } |
| | | } |
| | | ] |
| | | } |
| | | option && myChart.setOption(option); |
| | | } |
| | | |
| | | const initStick1= (data) =>{ |
| | | var chartDom = document.getElementById('stick1'); |
| | | var myChart = echarts.init(chartDom); |
| | | var option; |
| | | |
| | | option = { |
| | | title: { |
| | | text: '职称分布', |
| | | left: 'center' |
| | | }, |
| | | tooltip: { |
| | | trigger: 'item' |
| | | }, |
| | | legend: { |
| | | orient: 'horizontal', |
| | | left: 'center', |
| | | top: 40 |
| | | }, |
| | | xAxis: { |
| | | type: 'category', |
| | | data: ['高级', '中级', '初级'] |
| | | }, |
| | | yAxis: { |
| | | type: 'value' |
| | | }, |
| | | series: [ |
| | | { |
| | | data: [data.positional3, data.positional2, data.positional1], |
| | | type: 'bar' |
| | | } |
| | | ] |
| | | }; |
| | | option && myChart.setOption(option); |
| | | } |
| | | |
| | | const initStick2= (data) =>{ |
| | | var chartDom = document.getElementById('stick2'); |
| | | var myChart = echarts.init(chartDom); |
| | | var option; |
| | | option = { |
| | | title: { |
| | | text: '学历分布', |
| | | left: 'center' |
| | | }, |
| | | tooltip: { |
| | | trigger: 'item' |
| | | }, |
| | | legend: { |
| | | orient: 'horizontal', |
| | | left: 'center', |
| | | top: 40 |
| | | }, |
| | | xAxis: { |
| | | type: 'category', |
| | | data: ['高中及以下','专科', '本科', '硕士', '博士及以上'] |
| | | }, |
| | | yAxis: { |
| | | type: 'value' |
| | | }, |
| | | series: [ |
| | | { |
| | | data: [data.qualification1, data.qualification2, data.qualification3, data.qualification4, data.qualification5], |
| | | type: 'bar' |
| | | } |
| | | ] |
| | | }; |
| | | option && myChart.setOption(option); |
| | | } |
| | | |
| | | const initStick3= (data) =>{ |
| | | var chartDom = document.getElementById('stick3'); |
| | | var myChart = echarts.init(chartDom); |
| | | var option; |
| | | option = { |
| | | title: { |
| | | text: '年龄分布', |
| | | left: 'center' |
| | | }, |
| | | tooltip: { |
| | | trigger: 'item' |
| | | }, |
| | | legend: { |
| | | orient: 'horizontal', |
| | | left: 'center', |
| | | top: 40 |
| | | }, |
| | | xAxis: { |
| | | type: 'category', |
| | | data: ['18岁-40岁', '40岁以上'] |
| | | }, |
| | | yAxis: { |
| | | type: 'value' |
| | | }, |
| | | series: [ |
| | | { |
| | | data: [data.age1840, data.age40], |
| | | type: 'bar' |
| | | } |
| | | ] |
| | | }; |
| | | option && myChart.setOption(option); |
| | | } |
| | | |
| | | /** 重置新增的表单以及其他数据 */ |
| | | const reset= async()=> { |
| | | data.queryParams = { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | companyId: null |
| | | } |
| | | await getCompanyList() |
| | | await getList() |
| | | } |
| | | |
| | | </script> |
| New file |
| | |
| | | <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="username" v-if="state.title == '查看'"> |
| | | <el-input v-model.trim="state.form.username" :disabled="state.title =='上传证书' || state.title =='查看'" placeholder="请输入用户名" ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="姓名:" prop="name" v-if="state.title == '查看'"> |
| | | <el-input v-model.trim="state.form.name" :disabled="disabled" placeholder="请输入姓名"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="性别:" prop="sex" v-if="state.title == '查看'"> |
| | | <el-radio-group v-model="state.form.sex" :disabled="disabled"> |
| | | <el-radio :label="0">男</el-radio> |
| | | <el-radio :label="1">女</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="年龄:" prop="age" v-if="state.title == '查看'"> |
| | | <el-input v-model.number.trim="state.form.age" type="number" :disabled="disabled" placeholder="请输入年龄"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="学历:" prop="qualification" v-if="state.title == '查看'"> |
| | | <el-select |
| | | v-model="state.form.qualification" |
| | | placeholder="请选择学历" |
| | | style="width: 100%" |
| | | :disabled="disabled" |
| | | > |
| | | <el-option |
| | | v-for="item in state.quaList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="职称:" prop="positional" v-if="state.title == '查看'"> |
| | | <!-- <el-input v-model.trim="state.form.positional" :disabled="disabled" placeholder="请输入职称"></el-input>--> |
| | | <el-radio-group v-model="state.form.positional" :disabled="disabled"> |
| | | <el-radio label="1">初级</el-radio> |
| | | <el-radio label="2">中级</el-radio> |
| | | <el-radio label="3">高级</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="人员类别:" prop="personType" v-if="state.title == '查看'"> |
| | | <el-radio-group v-model="state.form.personType" :disabled="disabled"> |
| | | <el-radio :label="1">技术</el-radio> |
| | | <el-radio :label="2">管理</el-radio> |
| | | <el-radio :label="3">行政</el-radio> |
| | | <el-radio :label="4">特殊作业</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="请选择入职时间" |
| | | :disabled="disabled" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="离职时间:" prop="resignTime" v-if="state.title == '查看'"> |
| | | <el-date-picker |
| | | v-model="state.form.resignTime" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="请选择离职时间" |
| | | :disabled="disabled" |
| | | /> |
| | | </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> |
| | | <el-form-item label="重复密码:" prop="confirmPassword" v-if="state.title == '新增' || state.title == '修改密码'"> |
| | | <el-input v-model.trim="state.form.confirmPassword" type="password" show-password placeholder="请输入确认密码"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="手机号:" prop="phone" v-if="state.title == '查看'"> |
| | | <el-input v-model.trim="state.form.phone" :maxlength="11" :disabled="disabled" placeholder="请输入手机号"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="用户类型:" v-if="state.title == '查看'" prop="userType"> |
| | | <el-radio-group v-model="state.form.userType" :disabled="disabled" @change="changeType" v-if="state.title == '新增' || state.title == '上传证书'"> |
| | | <el-radio :label="0" v-if="state.currentUserType == 0">系统管理员</el-radio> |
| | | <el-radio :label="6" v-if="state.currentUserType == 0 || state.currentUserType == 6 ">企业管理员</el-radio> |
| | | <el-radio :label="1" v-if="state.currentUserType == 0 || state.currentUserType == 6 || state.currentUserType ==1">企业用户</el-radio> |
| | | <!-- <el-radio :label="2" v-if="state.currentUserType !== 3">部门级</el-radio>--> |
| | | <!-- <el-radio :label="3">车间(岗位)级</el-radio>--> |
| | | <!-- <el-radio :label="4" v-if="state.currentUserType == 0">其他</el-radio>--> |
| | | </el-radio-group> |
| | | <span v-else>{{state.currentUserType === 0 ? '系统管理员' : state.currentUserType === 1 ? '企业用户' : state.currentUserType === 6 ? '企业管理员' : state.currentUserType === 2 ? '部门级' : state.currentUserType === 3 ? '车间级' :'其他'}}</span> |
| | | <!-- <span v-else-if="state.title == '上传证书'">{{state.form.userType === 0 ? '系统管理员' : state.form.userType === 1 ? '企业用户' : state.form.userType === 2 ? '部门级' : state.form.userType === 3 ? '车间级' :'其他'}}</span>--> |
| | | <!-- <el-radio-group v-model="state.form.userType" :disabled="disabled" @change="changeType" v-else-if="state.title == '上传证书'">--> |
| | | <!-- <el-radio :label="0" v-if="state.currentUserType == 0">管理员</el-radio>--> |
| | | <!-- <el-radio :label="1" >企业级</el-radio>--> |
| | | <!-- <el-radio :label="2" >部门级</el-radio>--> |
| | | <!-- <el-radio :label="3" >车间(岗位)级</el-radio>--> |
| | | <!-- <el-radio :label="4" >其他</el-radio>--> |
| | | <!-- </el-radio-group>--> |
| | | </el-form-item> |
| | | <el-form-item label="所属企业:" prop="companyName" v-if="state.title == '查看' && state.form.userType !== 0"> |
| | | <el-select |
| | | clearable |
| | | v-if="state.isAdmin" |
| | | v-model="state.form.companyName" |
| | | filterable |
| | | :disabled="disabled || (state.title =='上传证书' && state.currentUserType !== 0)" |
| | | remote |
| | | @change="selectValue" |
| | | reserve-keyword |
| | | placeholder="请输入企业名称" |
| | | remote-show-suffix |
| | | :remote-method="getCompanyList" |
| | | :loading="loading" |
| | | style="width: 240px" |
| | | > |
| | | <el-option |
| | | v-for="item in state.companyList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.name" |
| | | /> |
| | | </el-select> |
| | | <el-input v-else disabled style="width: 45%" v-model="state.form.companyName"></el-input> |
| | | <!-- <el-select--> |
| | | <!-- v-if="state.isAdmin"--> |
| | | <!-- v-model="state.form.companyName"--> |
| | | <!-- @change="selectValue"--> |
| | | <!-- style="width: 45%"--> |
| | | <!-- v-loadMore="loadMore"--> |
| | | <!-- class="m-2"--> |
| | | <!-- placeholder="请选择所属企业"--> |
| | | <!-- popper-class="more_select_dropdown"--> |
| | | <!-- >--> |
| | | <!-- <el-option--> |
| | | <!-- v-for="item in state.companyList"--> |
| | | <!-- :key="item.id"--> |
| | | <!-- :label="item.name"--> |
| | | <!-- :value="item.name"--> |
| | | <!-- />--> |
| | | <!-- </el-select>--> |
| | | |
| | | |
| | | </el-form-item> |
| | | <!-- <el-form-item label="所属上级账号:" prop="companyName" v-if="state.form.userType == 3">--> |
| | | <!-- <scorllSelect--> |
| | | <!-- :disabled="disabled"--> |
| | | <!-- ref="scrollRef"--> |
| | | <!-- v-model="state.form.parentName"--> |
| | | <!-- @getval = "getSelectUser"--> |
| | | <!-- placeholder="请选择"--> |
| | | <!-- clearable--> |
| | | <!-- style="width: 45%;"--> |
| | | <!-- filterable--> |
| | | <!-- remote--> |
| | | <!-- searchKey="username"--> |
| | | <!-- :methods="getUser">--> |
| | | <!-- </scorllSelect>--> |
| | | <!-- </el-form-item>--> |
| | | <el-form-item label="部门:" prop="deptId" v-if="state.title == '查看' && state.form.userType !== 0"> |
| | | <el-select |
| | | clearable |
| | | v-model="state.form.deptId" |
| | | filterable |
| | | :disabled="disabled" |
| | | placeholder="请选择部门" |
| | | style="width: 100%" |
| | | @change="getParentId" |
| | | > |
| | | <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 == '查看' && state.form.userType !== 0"> |
| | | <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 == '查看' && state.form.userType !== 0"> |
| | | <el-input v-model.trim="state.form.post" :disabled="disabled" placeholder="请输入专业"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="角色:" prop="roles" v-if="state.title == '查看'"> |
| | | <el-select |
| | | clearable |
| | | v-model="state.form.roles" |
| | | filterable |
| | | :disabled="disabled" |
| | | placeholder="请选择角色" |
| | | multiple |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="item in state.roleList" |
| | | :key="item.roleId" |
| | | :label="item.roleName" |
| | | :value="item.roleId" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="人员证书:" prop="operationCertificate" v-if="state.title == '上传证书'"> |
| | | <el-upload accept=".doc,.docx,.pdf,image/*" :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、pdf格式文档,尺寸小于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 { View } from "@element-plus/icons-vue"; |
| | | import scorllSelect from '@/components/scrollSelect/index.vue' |
| | | import {ElMessage} from "element-plus"; |
| | | import {verifyPhone, verifyPwd, verifyUsername,verifyIdCard} from "@/utils/validate"; |
| | | import { checkUserName, checkPhone } from "@/api/login" |
| | | import {addUser, editUser, getUserById, resetPwd} from "@/api/onlineEducation/user" |
| | | import {Base64} from "js-base64" |
| | | import {resetUserPwd} from "@/api/sysUsers"; |
| | | import {getInstitutionDetail} from "@/api/backManage/insitution"; |
| | | import {getCompany} from "@/api/onlineEducation/company"; |
| | | import {get} from "@vueuse/core"; |
| | | import {getUser} from "@/api/onlineEducation/user"; |
| | | import {debounce} from "@/utils"; |
| | | import Cookies from "js-cookie"; |
| | | import {getDepart} from "@/api/orgStructure/depart"; |
| | | import {getToken} from "@/utils/auth"; |
| | | import {delPic} from "@/api/onlineEducation/banner"; |
| | | import {updateSpecialCertificate} from "@/api/staffManage/staff"; |
| | | const emit = defineEmits(["getList"]); |
| | | const dialogVisible = ref(false) |
| | | const superRef = ref() |
| | | const scrollRef = ref(null) |
| | | |
| | | |
| | | const equalToPassword = (rule, value, callback) => { |
| | | if (state.form.password !== value) { |
| | | callback(new Error("两次输入的密码不一致")); |
| | | } else { |
| | | callback(); |
| | | } |
| | | }; |
| | | |
| | | const validateUserPhone = (rule, value, callback)=>{ |
| | | if(value === ''){ |
| | | callback(new Error('请输入手机号')) |
| | | }else{ |
| | | if(!verifyPhone(value)){ |
| | | callback(new Error('手机号格式有误')) |
| | | }else{ |
| | | callback() |
| | | } |
| | | } |
| | | } |
| | | |
| | | const checkFiles = (rule, value, callback) => { |
| | | if (state.fileList.length == 0) { |
| | | callback(new Error('请上传证书文件')) |
| | | } else { |
| | | callback() |
| | | } |
| | | } |
| | | |
| | | const verifyId = (rule, value, callback)=>{ |
| | | if(value === ''){ |
| | | callback() |
| | | }else{ |
| | | if(!verifyIdCard(value)){ |
| | | callback(new Error('身份证号格式有误')) |
| | | }else{ |
| | | callback() |
| | | } |
| | | } |
| | | } |
| | | |
| | | let validatePwd = (rule, value, callback)=>{ |
| | | if(value === ''){ |
| | | callback(new Error('请输入密码')) |
| | | }else{ |
| | | if(!verifyPwd(value)){ |
| | | callback(new Error('密码须包含字母、数字、特殊字符,长度在6-16之间')) |
| | | }else{ |
| | | callback() |
| | | } |
| | | } |
| | | } |
| | | const startUsername = ref(''); |
| | | const validateUsername = (rule, value, callback)=>{ |
| | | if(value === ''){ |
| | | callback(new Error('请输入用户名')) |
| | | }else if(state.title == '上传证书' && value == startUsername.value){ |
| | | callback() |
| | | }else{ |
| | | if(!verifyUsername(value)){ |
| | | callback(new Error('用户名须使用字母或数字,长度在5-16之间')) |
| | | }else{ |
| | | let param = {} |
| | | if(state.title=='新增/注册') { |
| | | param = { |
| | | username:value |
| | | } |
| | | }else if(state.title=='上传证书'){ |
| | | param = { |
| | | username:value, |
| | | id: state.registerForm.id |
| | | } |
| | | } |
| | | callback() |
| | | // checkUserName(param).then((res)=>{ |
| | | // if(res.data == false){ |
| | | // callback(new Error('用户名已被占用,请更换其他用户名')) |
| | | // }else{ |
| | | // callback() |
| | | // } |
| | | // }) |
| | | } |
| | | } |
| | | } |
| | | |
| | | const state = reactive({ |
| | | title: '', |
| | | form: { |
| | | id: null, |
| | | name: '', |
| | | phone: '', |
| | | password: '', |
| | | confirmPassword: '', |
| | | username: '', |
| | | userType: null, |
| | | sex: 0, |
| | | companyId: null, |
| | | companyName: '', |
| | | parentId: null, |
| | | entryTime: '', |
| | | resignTime: '', |
| | | idCard: '', |
| | | deptId: null, |
| | | duty: '', |
| | | post: '', |
| | | age: null, |
| | | personType: null, |
| | | positional: '', |
| | | roles: [], |
| | | operationCertificate: '' |
| | | }, |
| | | formRules:{ |
| | | name: [{ required: true, message: '请输入姓名', trigger: 'blur' }], |
| | | companyName: [{ required: true, message: '请选择所在企业', trigger: 'blur' }], |
| | | // deptId: [{ required: true, message: '请选择部门', trigger: 'blur' }], |
| | | username: [{ required: true, message: '请选择用户名', trigger: 'blur' }], |
| | | password: [{ required: true, validator: validatePwd, trigger: 'blur' }], |
| | | confirmPassword: [{ required: true, validator: equalToPassword, trigger: 'blur' }], |
| | | phone: [{ validator: validateUserPhone,required: true, trigger: 'blur' }], |
| | | userType: [{ required: true, message: '请选择用户类型', trigger: 'blur' }], |
| | | // idCard: [{ validator: verifyId, trigger: 'blur' }], |
| | | entryTime: [{ required: true, message: '请选择入职时间', trigger: 'blur' }], |
| | | age: [{ required: true, message: '请输入年龄', trigger: 'blur' }], |
| | | personType: [{ required: true, message: '请选择人员类别', trigger: 'blur' }], |
| | | post: [{ required: true, message: '请输入专业', trigger: 'blur' }], |
| | | positional: [{ required: true, message: '请输入职称', trigger: 'blur' }], |
| | | roles: [{ required: true, message: '请选择角色', trigger: 'blur' }], |
| | | operationCertificate: [{ validator: checkFiles,required: true, trigger: 'blur' }] |
| | | }, |
| | | companyList: [], |
| | | userList: [], |
| | | roleList: [], |
| | | quaList: [ |
| | | {id: 1, name: '高中及以下'}, |
| | | {id: 2, name: '专科'}, |
| | | {id: 3, name: '本科'}, |
| | | {id: 4, name: '硕士'}, |
| | | {id: 5, name: '博士及以上'} |
| | | ], |
| | | keyword:'', |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | cloading:false, |
| | | totlePage: 0, |
| | | userParam: {}, |
| | | isAdmin: false, |
| | | currentUserType: null, |
| | | uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', |
| | | header: { |
| | | Authorization: getToken() |
| | | }, |
| | | fileLimit: 1, |
| | | fileList: [] |
| | | }) |
| | | const UisMounted = ref(false); |
| | | onMounted(() => { |
| | | UisMounted.value = true; |
| | | |
| | | }); |
| | | const disabled = ref(false); |
| | | const userInfo = ref() |
| | | const openDialog = async (type, value, companyId, roleList) => { |
| | | userInfo.value = JSON.parse(Cookies.get('userInfo')) |
| | | await getCompanyList() |
| | | state.currentUserType = userInfo.value.userType |
| | | state.roleList = roleList |
| | | if(state.currentUserType === 0){ |
| | | state.isAdmin = true; |
| | | state.form.companyId = null; |
| | | }else { |
| | | state.isAdmin = false; |
| | | state.form.companyId = userInfo.value.companyId; |
| | | state.form.companyName = userInfo.value.companyName; |
| | | } |
| | | await getdeptList(userInfo.value.companyId) |
| | | |
| | | state.title = type === 'add' ? '新增' : type ==='edit' ? '上传证书' : type ==='pwd' ? '修改密码' : '查看' ; |
| | | if(type === 'edit' || type === 'view') { |
| | | startUsername.value = value.username |
| | | if( type === 'view'){ |
| | | disabled.value = true |
| | | }else{ |
| | | disabled.value = false |
| | | } |
| | | const res = await getUserById(value.id); |
| | | if(res.code === 200){ |
| | | state.form = res.data |
| | | } |
| | | state.form.roles = value.roles.map(i=>i.roleId) |
| | | if(value.operationCertificate) { |
| | | const obj = { |
| | | url: value.operationCertificate, |
| | | name: '证书' |
| | | } |
| | | state.fileList = [obj] |
| | | } |
| | | } |
| | | if(type == 'pwd'){ |
| | | state.form.id = value.id |
| | | } |
| | | dialogVisible.value = true |
| | | if(type === 'edit' && state.form && (state.form.userType === 2||state.form.userType === 3)){ |
| | | await nextTick(() => { |
| | | // doGetUser() |
| | | }) |
| | | } |
| | | } |
| | | |
| | | const finshed = ref(false) |
| | | const loading = ref(false) |
| | | |
| | | const getCompanyList = async ()=>{ |
| | | const queryParams = { |
| | | pageNum: 1, |
| | | pageSize: 999 |
| | | } |
| | | const res = await getCompany(queryParams) |
| | | if (res.code == 200) { |
| | | state.companyList = res.data.list?res.data.list:[] |
| | | // data.queryParams.companyId = data.companyList[0].id |
| | | } else { |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | 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 handleAvatarSuccess = (res, uploadFile) => { |
| | | if(res.code == 200){ |
| | | state.form.operationCertificate = res.data.path |
| | | }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.operationCertificate; |
| | | await delPic({path: path}).then(res => { |
| | | if(res.code == 200){ |
| | | // ElMessage({ |
| | | // type: 'success', |
| | | // message: '文件已删除' |
| | | // }) |
| | | state.form.operationCertificate = '' |
| | | }else{ |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: res.message |
| | | }) |
| | | } |
| | | }).catch(() => { |
| | | state.form.imgUrl = '' |
| | | }); |
| | | } |
| | | const onSubmit = async () => { |
| | | const valid = await superRef.value.validate(); |
| | | if(valid){ |
| | | if((state.form.userType ===2 ||state.form.userType ===3) && (state.form.parentId ===null ||state.form.companyId===null)){ |
| | | ElMessage.warning('请选择所属父级账号') |
| | | return; |
| | | } |
| | | const {confirmPassword,...data} = JSON.parse(JSON.stringify(state.form)) |
| | | data.password = Base64.encode(data.password) |
| | | data.roles = data.roles.map((item)=>{ |
| | | return { |
| | | roleId: item, |
| | | roleName: state.roleList.find(i=>i.roleId == item)?.roleName |
| | | } |
| | | }) |
| | | const param = { |
| | | // name: data.name, |
| | | // sex:data.sex, |
| | | // phone: data.phone, |
| | | id:data.id, |
| | | // companyId: data.companyId, |
| | | // deptId: data.deptId, |
| | | // userType:data.userType, |
| | | // username:data.username, |
| | | // password: data.password, |
| | | // parentId: data.parentId, |
| | | // idCard: data.idCard, |
| | | // entryTime: data.entryTime, |
| | | // resignTime: data.resignTime, |
| | | // duty: data.duty, |
| | | // post: data.post, |
| | | // companyName: data.companyName, |
| | | // age: data.age, |
| | | // personType: data.personType, |
| | | // positional: data.positional, |
| | | // roles: data.roles, |
| | | operationCertificate: data.operationCertificate |
| | | } |
| | | |
| | | const res = await updateSpecialCertificate(param) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | handleClose() |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | |
| | | } |
| | | } |
| | | const doGetUser = () => { |
| | | const param = { |
| | | userType: state.form.userType-1, |
| | | companyId: state.form.companyId, |
| | | } |
| | | scrollRef.value.getList(param,'change'); |
| | | } |
| | | const changeType = async (val) => { |
| | | // state.companyList = []; |
| | | // if(state.isAdmin){ |
| | | // await getCompanyList("") |
| | | // } |
| | | // state.form.parentId = null; |
| | | // state.form.parentName = ''; |
| | | // state.form.companyId = null; |
| | | // state.form.companyName = ''; |
| | | //当前是管理员级用户 |
| | | |
| | | if(state.form.userType === 0){ |
| | | state.form.deptId = null; |
| | | state.form.parentId = null; |
| | | state.form.companyId = null; |
| | | state.form.companyName = ''; |
| | | state.form.duty = '' |
| | | state.form.post = '' |
| | | } |
| | | |
| | | //当前是企业级/其他用户选择部门 |
| | | // if((state.currentUserType === 1 && state.form.userType === 2) || (state.currentUserType === 4 && state.form.userType === 2) || (state.currentUserType === 6 && state.form.userType === 2)){ |
| | | // state.form.parentId = userInfo.value.id; |
| | | // state.form.companyName = userInfo.value.companyName |
| | | // state.form.companyId = userInfo.value.companyId; |
| | | // showChild.value = false; |
| | | // // showCompany.value = true; |
| | | // |
| | | // } else if((state.currentUserType === 1 && state.form.userType === 3) || (state.currentUserType === 4 && state.form.userType === 3)|| (state.currentUserType === 6 && state.form.userType === 3)){ |
| | | // state.form.companyName = userInfo.value.companyName |
| | | // state.form.companyId = userInfo.value.companyId; |
| | | // // showCompany.value = true; |
| | | // showChild.value = true; |
| | | // const param = { |
| | | // userType: 2, |
| | | // companyId: state.form.companyId, |
| | | // } |
| | | // nextTick(() => { |
| | | // scrollRef.value.getList(param,'change'); |
| | | // }) |
| | | // } |
| | | // //当前是部门级选择车间 |
| | | // if((state.currentUserType === 2 && state.form.userType === 3)){ |
| | | // state.form.parentId = userInfo.value.id; |
| | | // state.form.companyName = userInfo.value.companyName |
| | | // state.form.companyId = userInfo.value.companyId; |
| | | // // showCompany.value = true; |
| | | // showChild.value = false; |
| | | // } |
| | | } |
| | | |
| | | const handleClose = () => { |
| | | state.form = { |
| | | id: null, |
| | | name: '', |
| | | phone: '', |
| | | password: '', |
| | | confirmPassword: '', |
| | | username: '', |
| | | userType: null, |
| | | sex: 0, |
| | | companyId: null, |
| | | companyName: '', |
| | | parentId: null, |
| | | entryTime: '', |
| | | resignTime: '', |
| | | idCard: '', |
| | | deptId: null, |
| | | duty: '', |
| | | post: '', |
| | | age: null, |
| | | personType: null, |
| | | positional: '', |
| | | roles: [], |
| | | operationCertificate: '' |
| | | } |
| | | state.userList = []; |
| | | state.companyList = []; |
| | | state.fileList = [] |
| | | state.pageNum = 1; |
| | | state.pageSize = 10; |
| | | superRef.value.clearValidate(); |
| | | superRef.value.resetFields() |
| | | dialogVisible.value = false; |
| | | } |
| | | // //触底函数 |
| | | // const loadMore = () => { |
| | | // console.log(' 触底了'); |
| | | // // 防抖处理 |
| | | // setTimeout(() => { |
| | | // if (finshed.value) return //值为true,则代表没有数据了 |
| | | // state.pageNum += 1 |
| | | // getCompanyList('') |
| | | // }, 500) |
| | | // } |
| | | |
| | | const selectValue = (val) => { |
| | | state.form.parentId = null; |
| | | state.companyList.forEach(item => { |
| | | if(item.name === val){ |
| | | state.form.companyId = item.id |
| | | } |
| | | }) |
| | | getdeptList(state.form.companyId) |
| | | } |
| | | |
| | | const getParentId = (val)=>{ |
| | | state.form.parentId = null; |
| | | state.deptList.forEach(item => { |
| | | if(item.deptId === val){ |
| | | state.form.deptId = item.deptId |
| | | state.form.parentId = item.parentId |
| | | } |
| | | }) |
| | | } |
| | | const getSelectUser = (val) => { |
| | | state.form.parentId = val; |
| | | } |
| | | |
| | | 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> |
| New file |
| | |
| | | <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> |
| | | </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="age" align="center"/> |
| | | <el-table-column label="职称" prop="positional" align="center"> |
| | | <template #default="scope"> |
| | | {{ scope.row.positional == '1'?'初级':scope.row.personType == '2'?'中级':'高级' }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="人员类别" prop="personType" align="center"> |
| | | <template #default="scope"> |
| | | {{ scope.row.personType == 1?'技术':scope.row.personType == 2?'管理':'行政' }} |
| | | </template> |
| | | </el-table-column> |
| | | <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="角色" prop="userTypeName" align="center"> |
| | | <template #default="scope"> |
| | | {{ scope.row.roles?.map(i=>i.roleName).join('、') }} |
| | | </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" |
| | | /> |
| | | |
| | | <emp-dialog ref="dialogRef" @getList=getList></emp-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 empDialog from './components/empDialog.vue' |
| | | import {delUser, getUser} from "@/api/onlineEducation/user"; |
| | | import Cookies from "js-cookie"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import {listRole} from "@/api/system/role"; |
| | | import EmpDialog from "@/views/work/empResource/specialEmp/components/empDialog"; |
| | | 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, |
| | | personType: 4 |
| | | }, |
| | | total: 0, |
| | | dataList: [], |
| | | isAdmin: false, |
| | | companyList: [], |
| | | roleList: [], |
| | | userTypeList: [ |
| | | { |
| | | id: 0, |
| | | name: '管理员' |
| | | }, |
| | | { |
| | | id: 1, |
| | | name: '企业级' |
| | | }, |
| | | { |
| | | id: 2, |
| | | name: '部门级' |
| | | }, |
| | | { |
| | | id: 3, |
| | | name: '车间(岗位)级别' |
| | | }, |
| | | { |
| | | id: 4, |
| | | name: '其他' |
| | | }, |
| | | ] |
| | | |
| | | }); |
| | | |
| | | const { queryParams, total, dataList,isAdmin,companyList } = 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() |
| | | await getRoleList() |
| | | }) |
| | | |
| | | 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) ? '企业用户': item.userType === 6 ? '企业管理员':'其他', |
| | | entryTime: item.entryTime?.substring(0, 10) |
| | | } |
| | | }) |
| | | data.total = res.data.total |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | loading.value = false |
| | | } |
| | | |
| | | const getRoleList = () => { |
| | | listRole(proxy.addDateRange({ |
| | | pageNum: 1, |
| | | pageSize: 999, |
| | | roleName: undefined, |
| | | roleKey: undefined, |
| | | status: undefined |
| | | }, [])).then(response => { |
| | | data.roleList = response.data.list |
| | | }); |
| | | } |
| | | |
| | | 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) => { |
| | | if(userInfo.value.userType !== 0 && userInfo.value.userType !== 6){ |
| | | ElMessage.warning('非管理员身份不可操作') |
| | | return; |
| | | } |
| | | dialogRef.value.openDialog(type, value, data.queryParams.companyId,data.roleList); |
| | | } |
| | | |
| | | /** 重置新增的表单以及其他数据 */ |
| | | 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> |
| New file |
| | |
| | | <template> |
| | | <div class="notice"> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="state.title" |
| | | width="600px" |
| | | :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 v-if="state.isAdmin" label="企业:" prop="companyId"> |
| | | <el-select v-model="state.form.companyId" placeholder="请选择" clearable style="width: 100%"> |
| | | <el-option |
| | | v-for="item in state.companyList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="名称:" prop="name"> |
| | | <el-input v-model.trim="state.form.name" :readonly="state.title =='查看'" placeholder="名称"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="文件类型:" prop="knowledgeType"> |
| | | <el-select v-model="state.form.knowledgeType" placeholder="请选择" clearable style="width: 100%"> |
| | | <el-option |
| | | v-for="item in state.typeList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="文件:" prop="filePath"> |
| | | <el-upload accept=".doc,.docx,.xls,.xlsx,.pdf" :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、.xls、.xlsx、.pdf格式文档,尺寸小于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"; |
| | | import {getIndustry} from "@/api/system/industry"; |
| | | import {saveExternalKnowledge, saveInternalKnowledge} from "@/api/assetManage/assetMng"; |
| | | |
| | | 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, |
| | | companyId: null, |
| | | name: '', |
| | | knowledgeType: null, |
| | | filePath: '', |
| | | fileName: '', |
| | | format: '' |
| | | }, |
| | | formRules:{ |
| | | companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }], |
| | | name: [{ required: true, message: '请输入名称', trigger: 'blur' }], |
| | | knowledgeType: [{ required: true, message: '请选择文件类型', trigger: 'blur' }], |
| | | filePath: [{ required: true, validator: checkFiles, trigger: 'blur' }] |
| | | }, |
| | | isAdmin: false, |
| | | companyList: [], |
| | | typeList: [ |
| | | { |
| | | id: 1, |
| | | name: '标准' |
| | | }, |
| | | { |
| | | id: 2, |
| | | name: '规范' |
| | | }, |
| | | { |
| | | id: 3, |
| | | name: '法律法规' |
| | | }, |
| | | { |
| | | id: 4, |
| | | name: '其他' |
| | | } |
| | | ], |
| | | uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', |
| | | header: { |
| | | Authorization: getToken() |
| | | }, |
| | | fileLimit: 1, |
| | | fileList: [] |
| | | }) |
| | | onMounted(() => { |
| | | |
| | | }); |
| | | |
| | | const openDialog = async (type, value,companyId, isAdmin, companyList) => { |
| | | state.isAdmin = isAdmin |
| | | if(isAdmin){ |
| | | state.companyList = companyList |
| | | } |
| | | 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: value.fileName |
| | | } |
| | | 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 saveExternalKnowledge(data) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | handleClose() |
| | | dialogVisible.value = false; |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }else{ |
| | | const res = await saveExternalKnowledge(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.fileName = res.data.originName |
| | | 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 = '' |
| | | state.form.fileName = '' |
| | | }else{ |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: res.message |
| | | }) |
| | | } |
| | | }).catch(() => { |
| | | state.form.imgUrl = '' |
| | | }); |
| | | } |
| | | |
| | | const handleClose = () => { |
| | | state.form = { |
| | | id: null, |
| | | companyId: null, |
| | | name: '', |
| | | knowledgeType: null, |
| | | filePath: '', |
| | | fileName: '', |
| | | format: '' |
| | | } |
| | | state.fileList = [] |
| | | 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> |
| New file |
| | |
| | | <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" @click="getList">查询</el-button> |
| | | <el-button type="primary" plain @click="reset">重置</el-button> |
| | | <vue3-json-excel |
| | | :json-data="expertData" |
| | | :fields="fields" |
| | | name="文件清单.xlsx" |
| | | style="margin-left: 12px" |
| | | > |
| | | <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="name" align="center"/> |
| | | <el-table-column label="文件类型" prop="knowledgeType" align="center"> |
| | | <template #default="scope"> |
| | | {{scope.row.knowledgeType == 1 ? '标准' : scope.row.knowledgeType == 2 ? '规范' : scope.row.knowledgeType == 3 ? '法律法规' : '其他'}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="文件" prop="filePath" align="center"> |
| | | <template #default="scope"> |
| | | <el-link style="" type="primary" @click="openFile(scope.row.filePath)">{{scope.row.name}}</el-link> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="上传日期" prop="updateTime" align="center" /> |
| | | <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > |
| | | <template #default="scope"> |
| | | <el-button link type="primary" @click="downloadFile(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 { Plus, Upload, Download} from '@element-plus/icons-vue'; |
| | | import {delUser, getUser} from "@/api/onlineEducation/user"; |
| | | import Cookies from "js-cookie"; |
| | | import editDialog from './components/editDialog.vue' |
| | | import { |
| | | delIndustryTemp, |
| | | getIndustryTemp, uploadTemplate, |
| | | } from "@/api/staffManage/staff"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import axios from "axios"; |
| | | import {getToken} from "@/utils/auth"; |
| | | import {getIndustry} from "@/api/system/industry"; |
| | | import {renderAsync} from "docx-preview"; |
| | | import { |
| | | delExternalKnowledge, |
| | | delInternalKnowledge, |
| | | getExternalKnowledgeList, |
| | | getInternalKnowledgeList |
| | | } from "@/api/assetManage/assetMng"; |
| | | import {getStandingBookList} from "@/api/infrastructureMng/ledger"; |
| | | 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, |
| | | expertData: [] |
| | | }); |
| | | |
| | | const { queryParams, total, dataList,companyList,isAdmin, expertData } = toRefs(data); |
| | | const userInfo = ref() |
| | | onMounted(async ()=>{ |
| | | if(userStore.roles.includes('admin')){ |
| | | data.isAdmin = true |
| | | data.queryParams.companyId = null |
| | | await getCompanyList() |
| | | }else{ |
| | | data.isAdmin = false |
| | | data.queryParams.companyId = userStore.companyId |
| | | } |
| | | await getList() |
| | | }) |
| | | |
| | | onUnmounted(()=>{ |
| | | |
| | | }) |
| | | |
| | | const fields = ref({ |
| | | '序号':'index', |
| | | '文件类型':'knowledgeTypeName', |
| | | '文件名称':'name' |
| | | }) |
| | | |
| | | const getAllList = async () => { |
| | | let query = { |
| | | pageNum: 1, |
| | | pageSize: 9999, |
| | | companyId: data.queryParams.companyId |
| | | } |
| | | const res = await getExternalKnowledgeList(query) |
| | | if(res.code == 200){ |
| | | data.expertData = res.data.list?.map((item,index) => { |
| | | return { |
| | | ...item, |
| | | index: index + 1, |
| | | knowledgeTypeName: item.knowledgeType == 1 ? '标准' : item.knowledgeType == 2 ? '规范' : item.knowledgeType == 3 ? '法律法规' : '其他' |
| | | } |
| | | }) |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const openFile = async(path)=>{ |
| | | const ext = path.split('.').pop().toLowerCase(); |
| | | if (ext === 'doc' || ext === 'xls' || ext === 'xlsx') { |
| | | ElMessageBox.confirm('暂不支持线上预览文件,是否下载查看?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning' }).then(() => { |
| | | window.open(`${import.meta.env.VITE_APP_BASE_API}/${path}`, '_blank'); |
| | | }).catch(() => { |
| | | console.log('取消预览') |
| | | }); |
| | | return |
| | | } |
| | | if(ext === 'pdf'){ |
| | | window.open(`${import.meta.env.VITE_APP_BASE_API}/${path}`, '_blank') |
| | | return |
| | | } |
| | | try { |
| | | // 1. 获取文件 |
| | | const response = await fetch(import.meta.env.VITE_APP_BASE_API + '/' + path); |
| | | const arrayBuffer = await response.arrayBuffer(); |
| | | // 2. 创建新窗口 |
| | | const win = window.open('', '_blank') |
| | | win.document.write(` |
| | | <!DOCTYPE html> |
| | | <html> |
| | | <head> |
| | | <title>预览</title> |
| | | <style> |
| | | body { margin: 20px; font-family: Arial; } |
| | | .docx-container { width: 100%; height: 100%; } |
| | | </style> |
| | | </head> |
| | | <body> |
| | | <div id="container" class="docx-container"></div> |
| | | </body> |
| | | </html> |
| | | `); |
| | | // 3. 渲染 DOCX |
| | | await renderAsync(arrayBuffer, win.document.getElementById('container')); |
| | | } catch (error) { |
| | | console.error('预览失败:', error); |
| | | alert(`预览失败: ${error.message}`); |
| | | } |
| | | } |
| | | const getList = async () => { |
| | | loading.value = true |
| | | const res = await getExternalKnowledgeList(data.queryParams) |
| | | if(res.code == 200){ |
| | | data.dataList = res.data.list |
| | | 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:[] |
| | | } else { |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const downloadFile = (e)=>{ |
| | | axios.get(import.meta.env.VITE_APP_BASE_API + '/' +e.filePath,{headers:{'Content-Type': 'application/json','Authorization': `${getToken()}`},responseType: 'blob'}).then(res=>{ |
| | | if (res) { |
| | | const link = document.createElement('a') |
| | | let blob = new Blob([res.data],{type: res.data.type}) |
| | | link.style.display = "none"; |
| | | link.href = URL.createObjectURL(blob); // 创建URL |
| | | link.setAttribute("download", e.fileName); |
| | | document.body.appendChild(link); |
| | | link.click(); |
| | | document.body.removeChild(link); |
| | | } else { |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: '文件读取失败' |
| | | }); |
| | | } |
| | | }) |
| | | } |
| | | |
| | | const openDialog = (type, value) => { |
| | | dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin, data.companyList); |
| | | } |
| | | |
| | | |
| | | /** 重置新增的表单以及其他数据 */ |
| | | 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 delExternalKnowledge({id: val.id}) |
| | | if(res.code == 200){ |
| | | ElMessage.success('数据删除成功') |
| | | await getList() |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | |
| | | </script> |
| New file |
| | |
| | | <template> |
| | | <div class="notice"> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="state.title" |
| | | width="600px" |
| | | :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 v-if="state.isAdmin" label="企业:" prop="companyId"> |
| | | <el-select v-model="state.form.companyId" placeholder="请选择" clearable style="width: 100%"> |
| | | <el-option |
| | | v-for="item in state.companyList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="名称:" prop="name"> |
| | | <el-input v-model.trim="state.form.name" :readonly="state.title =='查看'" placeholder="名称"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="文件类型:" prop="knowledgeType"> |
| | | <el-select v-model="state.form.knowledgeType" placeholder="请选择" clearable style="width: 100%"> |
| | | <el-option |
| | | v-for="item in state.typeList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="文件:" prop="filePath"> |
| | | <el-upload accept=".doc,.docx,.xls,.xlsx,.pdf" :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、.xls、.xlsx、.pdf格式文档,尺寸小于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"; |
| | | import {getIndustry} from "@/api/system/industry"; |
| | | import {saveInternalKnowledge} from "@/api/assetManage/assetMng"; |
| | | |
| | | 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, |
| | | companyId: null, |
| | | name: '', |
| | | knowledgeType: null, |
| | | filePath: '', |
| | | fileName: '', |
| | | format: '' |
| | | }, |
| | | formRules:{ |
| | | companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }], |
| | | name: [{ required: true, message: '请输入名称', trigger: 'blur' }], |
| | | knowledgeType: [{ required: true, message: '请选择文件类型', trigger: 'blur' }], |
| | | filePath: [{ required: true, validator: checkFiles, trigger: 'blur' }] |
| | | }, |
| | | isAdmin: false, |
| | | companyList: [], |
| | | typeList: [ |
| | | { |
| | | id: 1, |
| | | name: '体系文件' |
| | | }, |
| | | { |
| | | id: 2, |
| | | name: '项目文件' |
| | | }, |
| | | { |
| | | id: 3, |
| | | name: '其他' |
| | | } |
| | | ], |
| | | uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', |
| | | header: { |
| | | Authorization: getToken() |
| | | }, |
| | | fileLimit: 1, |
| | | fileList: [] |
| | | }) |
| | | onMounted(() => { |
| | | |
| | | }); |
| | | |
| | | const openDialog = async (type, value,companyId, isAdmin, companyList) => { |
| | | state.isAdmin = isAdmin |
| | | if(isAdmin){ |
| | | state.companyList = companyList |
| | | } |
| | | 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: value.fileName |
| | | } |
| | | 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 saveInternalKnowledge(data) |
| | | if(res.code == 200){ |
| | | ElMessage.success(res.message) |
| | | emit('getList') |
| | | handleClose() |
| | | dialogVisible.value = false; |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }else{ |
| | | const res = await saveInternalKnowledge(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.fileName = res.data.originName |
| | | 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 = '' |
| | | state.form.fileName = '' |
| | | }else{ |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: res.message |
| | | }) |
| | | } |
| | | }).catch(() => { |
| | | state.form.imgUrl = '' |
| | | }); |
| | | } |
| | | |
| | | const handleClose = () => { |
| | | state.form = { |
| | | id: null, |
| | | companyId: null, |
| | | name: '', |
| | | knowledgeType: null, |
| | | filePath: '', |
| | | fileName: '', |
| | | format: '' |
| | | } |
| | | state.fileList = [] |
| | | 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> |
| New file |
| | |
| | | <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" @click="getList">查询</el-button> |
| | | <el-button type="primary" plain @click="reset">重置</el-button> |
| | | <vue3-json-excel |
| | | :json-data="expertData" |
| | | :fields="fields" |
| | | name="文件清单.xlsx" |
| | | style="margin-left: 12px" |
| | | > |
| | | <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="name" align="center"/> |
| | | <el-table-column label="文件类型" prop="knowledgeType" align="center"> |
| | | <template #default="scope"> |
| | | {{scope.row.knowledgeType == 1 ? '体系' : scope.row.knowledgeType == 2 ? '项目' : '其他'}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="文件" prop="filePath" align="center"> |
| | | <template #default="scope"> |
| | | <el-link style="" type="primary" @click="openFile(scope.row.filePath)">{{scope.row.name}}</el-link> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="上传日期" prop="updateTime" align="center" /> |
| | | <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > |
| | | <template #default="scope"> |
| | | <el-button link type="primary" @click="downloadFile(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 { Plus, Upload, Download} from '@element-plus/icons-vue'; |
| | | import {delUser, getUser} from "@/api/onlineEducation/user"; |
| | | import Cookies from "js-cookie"; |
| | | import editDialog from './components/editDialog.vue' |
| | | import { |
| | | delIndustryTemp, |
| | | getIndustryTemp, uploadTemplate, |
| | | } from "@/api/staffManage/staff"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import axios from "axios"; |
| | | import {getToken} from "@/utils/auth"; |
| | | import {getIndustry} from "@/api/system/industry"; |
| | | import {renderAsync} from "docx-preview"; |
| | | import {delInternalKnowledge, getInternalKnowledgeList} from "@/api/assetManage/assetMng"; |
| | | import {getStandingBookList} from "@/api/infrastructureMng/ledger"; |
| | | 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, |
| | | expertData: [] |
| | | }); |
| | | |
| | | const { queryParams, total, dataList,companyList,isAdmin, expertData } = toRefs(data); |
| | | const userInfo = ref() |
| | | onMounted(async ()=>{ |
| | | if(userStore.roles.includes('admin')){ |
| | | data.isAdmin = true |
| | | data.queryParams.companyId = null |
| | | await getCompanyList() |
| | | }else{ |
| | | data.isAdmin = false |
| | | data.queryParams.companyId = userStore.companyId |
| | | } |
| | | await getList() |
| | | }) |
| | | |
| | | onUnmounted(()=>{ |
| | | |
| | | }) |
| | | |
| | | const fields = ref({ |
| | | '序号':'index', |
| | | '文件类型':'knowledgeTypeName', |
| | | '文件名称':'name' |
| | | }) |
| | | |
| | | const getAllList = async () => { |
| | | let query = { |
| | | pageNum: 1, |
| | | pageSize: 9999, |
| | | companyId: data.queryParams.companyId |
| | | } |
| | | const res = await getInternalKnowledgeList(query) |
| | | if(res.code == 200){ |
| | | data.expertData = res.data.list?.map((item,index) => { |
| | | return { |
| | | ...item, |
| | | index: index + 1, |
| | | knowledgeTypeName: item.knowledgeType == 1 ? '体系' : item.knowledgeType == 2 ? '项目' : '其他' |
| | | } |
| | | }) |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const openFile = async(path)=>{ |
| | | const ext = path.split('.').pop().toLowerCase(); |
| | | if (ext === 'doc' || ext === 'xls' || ext === 'xlsx') { |
| | | ElMessageBox.confirm('暂不支持线上预览文件,是否下载查看?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning' }).then(() => { |
| | | window.open(`${import.meta.env.VITE_APP_BASE_API}/${path}`, '_blank'); |
| | | }).catch(() => { |
| | | console.log('取消预览') |
| | | }); |
| | | return |
| | | } |
| | | if(ext === 'pdf'){ |
| | | window.open(`${import.meta.env.VITE_APP_BASE_API}/${path}`, '_blank') |
| | | return |
| | | } |
| | | try { |
| | | // 1. 获取文件 |
| | | const response = await fetch(import.meta.env.VITE_APP_BASE_API + '/' + path); |
| | | const arrayBuffer = await response.arrayBuffer(); |
| | | // 2. 创建新窗口 |
| | | const win = window.open('', '_blank') |
| | | win.document.write(` |
| | | <!DOCTYPE html> |
| | | <html> |
| | | <head> |
| | | <title>预览</title> |
| | | <style> |
| | | body { margin: 20px; font-family: Arial; } |
| | | .docx-container { width: 100%; height: 100%; } |
| | | </style> |
| | | </head> |
| | | <body> |
| | | <div id="container" class="docx-container"></div> |
| | | </body> |
| | | </html> |
| | | `); |
| | | // 3. 渲染 DOCX |
| | | await renderAsync(arrayBuffer, win.document.getElementById('container')); |
| | | } catch (error) { |
| | | console.error('预览失败:', error); |
| | | alert(`预览失败: ${error.message}`); |
| | | } |
| | | } |
| | | const getList = async () => { |
| | | loading.value = true |
| | | const res = await getInternalKnowledgeList(data.queryParams) |
| | | if(res.code == 200){ |
| | | data.dataList = res.data.list |
| | | 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:[] |
| | | } else { |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | |
| | | const downloadFile = (e)=>{ |
| | | axios.get(import.meta.env.VITE_APP_BASE_API + '/' +e.filePath,{headers:{'Content-Type': 'application/json','Authorization': `${getToken()}`},responseType: 'blob'}).then(res=>{ |
| | | if (res) { |
| | | const link = document.createElement('a') |
| | | let blob = new Blob([res.data],{type: res.data.type}) |
| | | link.style.display = "none"; |
| | | link.href = URL.createObjectURL(blob); // 创建URL |
| | | link.setAttribute("download", e.fileName); |
| | | document.body.appendChild(link); |
| | | link.click(); |
| | | document.body.removeChild(link); |
| | | } else { |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: '文件读取失败' |
| | | }); |
| | | } |
| | | }) |
| | | } |
| | | |
| | | const openDialog = (type, value) => { |
| | | dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin, data.companyList); |
| | | } |
| | | |
| | | |
| | | /** 重置新增的表单以及其他数据 */ |
| | | 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 delInternalKnowledge({id: val.id}) |
| | | if(res.code == 200){ |
| | | ElMessage.success('数据删除成功') |
| | | await getList() |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | |
| | | </script> |