From dc3af0cbb4a6d105bdff497b510cc0a87b3e8d0a Mon Sep 17 00:00:00 2001 From: spring <2396852758@qq.com> Date: 星期五, 28 二月 2025 17:53:44 +0800 Subject: [PATCH] Merge branch 'dev' of http://114.132.189.42:9002/r/lims-ruoyi-before into dev --- src/views/CNAS/personnel/personnelInfo/tabs/personnel-capacity.vue | 576 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 576 insertions(+), 0 deletions(-) diff --git a/src/views/CNAS/personnel/personnelInfo/tabs/personnel-capacity.vue b/src/views/CNAS/personnel/personnelInfo/tabs/personnel-capacity.vue new file mode 100644 index 0000000..ac989ea --- /dev/null +++ b/src/views/CNAS/personnel/personnelInfo/tabs/personnel-capacity.vue @@ -0,0 +1,576 @@ +<!-- 浜哄憳鑳藉姏 --> +<template> + <div> + <div style="display: flex;justify-content: space-between;"> + <el-form ref="page" size="small" :inline="true"> + <el-form-item label="濮撳悕"> + <el-input v-model="userName" placeholder="璇疯緭鍏ュ鍚�" size="small" clearable></el-input> + </el-form-item> + <el-form-item> + <el-button size="small" type="primary" @click="refreshTable">鏌� 璇�</el-button> + </el-form-item> + </el-form> + <div> + <el-button v-if="!isDepartment" size="small" type="primary" @click="addAppointPost('add')">鏂板</el-button> + </div> + </div> + <lims-table :tableData="tableData" :column="yearColumnData" + @pagination="pagination" :height="'calc(100vh - 20em)'" + :page="search" :tableLoading="yearLoading"> + <div slot="jobResponsibilities" slot-scope="scope"> + <div v-html="changeLine(scope.row.responsibilities)"></div> + </div> + <div slot="placeWorkSlot" slot-scope="scope"> + <div v-html="changeLine(scope.row.placeWork)"></div> + </div> + </lims-table> + <!--鏂板鑳藉姏璁ゅ畾寮规--> + <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :title="title" + :visible.sync="dialogVisible" + width="80%" @close="resetForm"> + <el-form v-if="dialogVisible" ref="infoForm" :model="form" :rules="rules"> + <el-col :span="12"> + <el-form-item label="浜哄憳锛�" label-width="110px" prop="userId"> + <el-select v-model="form.userId" disabled clearable + filterable size="small" style="width: 100%;"> + <el-option v-for="item in responsibleOptions" :key="item.id" :label="item.name" :value="item.id"> + </el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :span="24"> + <div style="display: flex;justify-content: space-evenly;font-weight: 600"> + <span>鏌ユ牳缁撴灉</span> + <span>绗﹀悎涓庡惁</span> + <span>澶囨敞</span> + </div> + </el-col> + <el-col :span="8"> + <el-form-item label="瀛﹀巻锛�" label-width="110px" prop="academicDegree"> + <el-input v-model="form.academicDegree" :disabled="operationType === 'view' || operationType === 'confirm'" size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item class="radio-group" prop="academicConformNot" style="text-align: center"> + <el-radio-group v-model="form.academicConformNot" :disabled="operationType === 'view' || operationType === 'confirm'" v-removeAriaHidden> + <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-col> + <el-col :span="8"> + <el-form-item prop="academicRemarks"> + <el-input v-model="form.academicRemarks" :disabled="operationType === 'view' || operationType === 'confirm'" size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="鐩稿叧骞撮檺锛�" label-width="110px" prop="relatedYears"> + <el-input v-model="form.relatedYears" :disabled="operationType === 'view' || operationType === 'confirm'" size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item class="radio-group" prop="relatedYearsConformNot" style="text-align: center"> + <el-radio-group v-model="form.relatedYearsConformNot" :disabled="operationType === 'view' || operationType === 'confirm'" v-removeAriaHidden> + <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-col> + <el-col :span="8"> + <el-form-item prop="relatedYearsRemarks "> + <el-input v-model="form.relatedYearsRemarks " :disabled="operationType === 'view' || operationType === 'confirm'" size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="鐩稿叧鍩硅锛�" label-width="110px" prop="relatedTraining"> + <el-input v-model="form.relatedTraining" :disabled="operationType === 'view' || operationType === 'confirm'" size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item class="radio-group" prop="relatedTrainingConformNot" style="text-align: center"> + <el-radio-group v-model="form.relatedTrainingConformNot" :disabled="operationType === 'view' || operationType === 'confirm'" v-removeAriaHidden> + <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-col> + <el-col :span="8"> + <el-form-item prop="relatedTrainingRemarks"> + <el-input v-model="form.relatedTrainingRemarks" :disabled="operationType === 'view' || operationType === 'confirm'" + size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="鐩稿叧缁忛獙锛�" label-width="110px" prop="relevantExperience"> + <el-input v-model="form.relevantExperience" :disabled="operationType === 'view' || operationType === 'confirm'" size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item class="radio-group" prop="relevantExperienceConformNot" style="text-align: center"> + <el-radio-group v-model="form.relevantExperienceConformNot" :disabled="operationType === 'view' || operationType === 'confirm'" v-removeAriaHidden> + <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-col> + <el-col :span="8"> + <el-form-item prop="relevantExperienceRemarks"> + <el-input v-model="form.relevantExperienceRemarks" :disabled="operationType === 'view' || operationType === 'confirm'" + size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="涓婂矖璇侊細" label-width="110px" prop="workLicense"> + <el-input v-model="form.workLicense" :disabled="operationType === 'view' || operationType === 'confirm'" size="small" + style="width: 100%"> + </el-input> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item class="radio-group" prop="workLicenseConformNot" style="text-align: center"> + <el-radio-group v-model="form.workLicenseConformNot" :disabled="operationType === 'view' || operationType === 'confirm'" v-removeAriaHidden> + <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-col> + <el-col :span="8"> + <el-form-item prop="workLicenseRemarks"> + <el-input v-model="form.workLicenseRemarks" :disabled="operationType === 'view' || operationType === 'confirm'" size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="宀椾綅鑱岃矗锛�" label-width="110px" prop="jobResponsibilitiesTem" style="height: 450px"> + <el-checkbox-group v-model="form.jobResponsibilitiesTem" :disabled="operationType === 'view' || operationType === 'confirm'" + @change="selectResponsibilities"> + <el-checkbox v-for="city in dict.type.responsibilities_list" :key="city.value" :label="city.label" + :value="city.value"></el-checkbox> + </el-checkbox-group> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item class="radio-group" prop="jobResponsibilitiesConformNot" + style="text-align: center;height: 420px"> + <el-radio-group v-model="form.jobResponsibilitiesConformNot" :disabled="operationType === 'view' || operationType === 'confirm'" v-removeAriaHidden> + <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-col> + <el-col :span="8"> + <el-form-item prop="jobResponsibilitiesRemarks" style="height: 420px"> + <el-input v-model="form.jobResponsibilitiesRemarks" :disabled="operationType === 'view' || operationType === 'confirm'" + size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <span style="padding-left: 110px;font-size: 14px">澶囨敞锛氬矖浣嶈亴璐h揪鍒�5椤瑰強5椤逛互涓婁负绗﹀悎</span> + </el-col> + <el-col :span="16"> + <el-form-item label="缁煎悎璇勪环锛�" label-width="110px" prop="comprehensiveAssessment"> + <el-radio-group v-model="form.comprehensiveAssessment" :disabled="operationType === 'view' || operationType === 'confirm'" v-removeAriaHidden> + <el-radio label="Qualified this position">鍙儨浠昏宀椾綅</el-radio> + <el-radio label="You can work while training">鍙竟鍩硅杈逛笂宀�</el-radio> + <el-radio label="Iconpetent for the position">涓嶈儨浠昏宀椾綅</el-radio> + </el-radio-group> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item prop="confirmOperatingPersonnelId" label="纭浜猴細"> + <el-select v-model="form.confirmOperatingPersonnelId" clearable :disabled="operationType === 'view' || operationType === 'confirm'" + filterable size="small" style="width: 50%;"> + <el-option v-for="item in responsibleOptions" :key="item.id" :label="item.name" :value="item.id"> + </el-option> + </el-select> + </el-form-item> + </el-col> + </el-form> + <span slot="footer" class="dialog-footer"> + <el-button v-if="operationType !== 'view'" @click="resetForm">鍙栨秷</el-button> + <el-button v-if="operationType !== 'view' && operationType !== 'confirm'" type="primary" @click="submitForm">淇濆瓨</el-button> + <el-button v-if="operationType !== 'view' && operationType !== 'confirm'" type="primary" @click="submitForm1">鎻愪氦骞堕�氱煡</el-button> + <el-button v-if="operationType === 'confirm'" type="primary" @click="verifyGet">纭</el-button> + </span> + </el-dialog> + </div> +</template> + +<script> + +import limsTable from "@/components/Table/lims-table.vue"; +import { + addOrUpdatePersonPersonnelCapacity, + confirmPersonnelCapability, + deletePersonPersonnelCapacity, + exportPersonnelCapacity, + personPersonnelCapacityPage, + submitConfirmPersonnelCapability +} from "@/api/cnas/personal/personPersonnelCapacity"; +import {selectUserCondition} from "@/api/cnas/resourceDemand/facilitiesEnvironment/facilitiesAndEnvironment"; +import {mapGetters} from "vuex"; + +export default { + props: { + departId: { + type: Number, + default: () => { + return null; + } + }, + isDepartment: { + type: Boolean, + default: false + } + }, + components: { + limsTable + }, + computed: { + ...mapGetters(["userId"]), + }, + dicts: ['responsibilities_list'], + data() { + return { + userName: '', + tableData: [], + search: { + size: 20, + current: 1, + total: 0 + }, + title: '鏂板鑳藉姏璁ゅ畾', + operationType: '', + yearColumnData: [ + { + label: '宀椾綅', + prop: 'postName', + minWidth: '100' + }, { + label: '濮撳悕', + prop: 'userName', + minWidth: '100' + }, { + label: '瀛﹀巻', + prop: 'academicDegree', + minWidth: '100' + }, { + label: '涓撲笟', + prop: 'major', + minWidth: '100' + }, { + label: '鑱岀О', + prop: 'professionalTitle', + minWidth: '100' + }, { + dataType: 'slot', + label: '宀椾綅鑱岃矗', + prop: 'jobResponsibilities', + minWidth: '200px', + slot: 'jobResponsibilities' + }, { + dataType: 'tag', + label: '缁煎悎璇勪环', + minWidth: '140px', + prop: 'comprehensiveAssessment', + formatData: (params) => { + if (params == 'Qualified this position') { + return '鍙儨浠昏宀椾綅'; + } else if (params == 'You can work while training') { + return '鍙竟鍩硅杈逛笂宀�'; + } else { + return '涓嶈儨浠昏宀椾綅'; + } + }, + formatType: (params) => { + if (params == 'Qualified this position') { + return 'success'; + } else if (params == 'You can work while training') { + return 'warning'; + } else { + return 'danger'; + } + } + }, { + label: '纭浜�', + prop: 'confirmOperatingPersonnelName', + minWidth: '100' + }, { + label: '纭鏃ユ湡', + prop: 'confirmDate', + minWidth: '160' + }, { + dataType: 'action', + minWidth: '220', + label: '鎿嶄綔', + fixed: 'right', + operation: [ + { + name: '缂栬緫', + type: 'text', + clickFun: (row) => { + this.handleViewClick('edit', row); + }, + disabled: (row) => { + if (row.confirmDate) { + return true + } else { + return false + } + }, + }, + { + name: '鏌ョ湅', + type: 'text', + clickFun: (row) => { + this.handleViewClick('view', row); + } + }, + { + name: '瀵煎嚭', + type: 'text', + clickFun: (row) => { + this.downLoadPost(row); + } + }, + { + name: '纭', + type: 'text', + clickFun: (row) => { + this.handleViewClick('confirm', row); + }, + disabled: (row) => { + if (row.confirmDate || this.userId != row.confirmOperatingPersonnelId) { + return true + } else { + return false + } + }, + }, + { + name: '鍒犻櫎', + type: 'text', + color: '#f56c6c', + clickFun: (row) => { + this.deletePost(row.id); + }, + disabled: (row) => { + if (row.confirmDate) { + return true + } else { + return false + } + } + } + ] + }], + yearLoading: false, + dialogVisible: false, + verifyGetId: '', + form: { + jobResponsibilitiesTem: [] + }, + responsibleOptions: [], + rules: { + confirmOperatingPersonnelId: [{ required: true, message: '璇烽�夋嫨纭浜�', trigger: 'change' }], + userId: [{ required: true, message: '璇烽�夋嫨浜哄憳', trigger: 'change' }], + academicDegree: [{ required: true, message: '璇疯緭鍏ュ鍘嗘煡鏍哥粨鏋�', trigger: 'blur' }], + academicConformNot: [{ required: true, message: '璇烽�夋嫨瀛﹀巻绗﹀悎涓庡惁', trigger: 'change' }], + relatedYears: [{ required: true, message: '璇疯緭鍏ョ浉鍏冲勾闄愭煡鏍哥粨鏋�', trigger: 'blur' }], + relatedYearsConformNot: [{ required: true, message: '璇烽�夋嫨鐩稿叧骞撮檺绗﹀悎涓庡惁', trigger: 'change' }], + relatedTraining: [{ required: true, message: '璇疯緭鍏ョ浉鍩硅闄愭煡鏍哥粨鏋�', trigger: 'blur' }], + relatedTrainingConformNot: [{ required: true, message: '璇烽�夋嫨鐩稿叧鍩硅绗﹀悎涓庡惁', trigger: 'change' }], + relevantExperience: [{ required: true, message: '璇疯緭鍏ョ浉鍏崇粡楠屾煡鏍哥粨鏋�', trigger: 'blur' }], + relevantExperienceConformNot: [{ required: true, message: '璇烽�夋嫨鐩稿叧缁忛獙绗﹀悎涓庡惁', trigger: 'change' }], + workLicense: [{ required: true, message: '璇疯緭鍏ヤ笂宀楄瘉鏌ユ牳缁撴灉', trigger: 'blur' }], + workLicenseConformNot: [{ required: true, message: '璇烽�夋嫨涓婂矖璇佺鍚堜笌鍚�', trigger: 'change' }], + jobResponsibilitiesTem: [{ required: true, message: '璇烽�夋嫨宀椾綅鑱岃矗鏌ユ牳缁撴灉', trigger: 'change' }], + jobResponsibilitiesConformNot: [{ required: true, message: '璇烽�夋嫨宀椾綅鑱岃矗绗﹀悎涓庡惁', trigger: 'change' }], + comprehensiveAssessment: [{ required: true, message: '璇烽�夋嫨缁煎悎璇勪环', trigger: 'change' }] + }, + responsibilities: [] + }; + }, + mounted() { + this.getList(this.departId); + }, + methods: { + // 涓嬭浇 + downLoadPost(row) { + exportPersonnelCapacity({id: row.id}).then(res => { + this.outLoading = false + const blob = new Blob([res],{ type: 'application/msword' }); + this.$download.saveAs(blob, '浜哄憳鑳藉姏瀵煎嚭.docx') + }) + }, + // 鏌ヨ + refreshTable() { + this.getList(this.departId); + }, + // 鑾峰彇浜哄憳鑳藉姏鍒楄〃淇℃伅 + getList(userId) { + this.search.userId = userId; + const params = this.isDepartment ? + { + departmentId: this.search.userId, + size: this.search.size, + current: this.search.current, + userName: this.userName, + }: { + userId: this.search.userId, + size: this.search.size, + current: this.search.current, + userName: this.userName, + } + this.yearLoading = true + personPersonnelCapacityPage(params).then(res => { + this.yearLoading = false + this.tableData = res.data.records; + this.search.total = res.data.total; + }).catch(err => { + console.log(err); + this.yearLoading = false + }) + }, + pagination (page) { + this.search.size = page.limit + this.refreshTable() + }, + selectResponsibilities(arr) { + let arrTem = []; + arr.map(val => { + const index = this.dict.type.responsibilities_list.findIndex(item => item.label === val); + if (index > -1) { + arrTem.push(this.dict.type.responsibilities_list[index].value); + } + }); + this.form.jobResponsibilities = arrTem.join(','); + }, + changeLine (val) { + if(val) { + return val.replace(/,/g, '<br>') + } else { + return + } + }, + // 鏂板 + addAppointPost(type) { + this.operationType = type; + this.title = '鏂板鑳藉姏璁ゅ畾' + this.dialogVisible = true; + this.form = { + jobResponsibilitiesTem: [] + } + this.form.userId = this.departId + this.getUserList(); + + }, + // 缂栬緫/鏌ョ湅 + handleViewClick(type, row) { + this.operationType = type; + this.verifyGetId = row.id + this.title = this.operationType === 'edit' ? '淇敼鑳藉姏璁ゅ畾' : '鏌ョ湅鑳藉姏璁ゅ畾' + this.dialogVisible = true; + this.form = {...row} + if(this.form.responsibilities) { + this.$set(this.form, 'jobResponsibilitiesTem', this.form.responsibilities.split(",")) + } else { + this.$set(this.form, 'jobResponsibilitiesTem', []) + } + this.getUserList(); + }, + // 淇濆瓨 + submitForm() { + this.$refs.infoForm.validate((valid) => { + if (valid) { + addOrUpdatePersonPersonnelCapacity(this.form).then(res => { + if (res.code == 200) { + this.$message.success('鎻愪氦鎴愬姛'); + this.getList(this.departId); + this.dialogVisible = false; + } + }); + } + }); + }, + // 鎻愪氦骞堕�氱煡 + submitForm1() { + this.$refs.infoForm.validate((valid) => { + if (valid) { + submitConfirmPersonnelCapability(this.form).then(res => { + if (res.code == 200) { + this.$message.success('鎻愪氦鎴愬姛'); + this.getList(this.departId); + this.dialogVisible = false; + } + }); + } + }); + }, + verifyGet () { + confirmPersonnelCapability({id: this.verifyGetId}).then(res => { + if (res.code == 200) { + this.$message.success('纭鎴愬姛'); + this.resetForm() + this.getList(this.departId); + } + }); + }, + // 鍒犻櫎宀椾綅鑱岃矗 + deletePost(id) { + this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎姝ゆ暟鎹�, 鏄惁缁х画?', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + deletePersonPersonnelCapacity({id: id}).then(res => { + if (res.code == 200) { + this.$message.success('鍒犻櫎鎴愬姛'); + this.getList(this.departId); + } + }); + }).catch(() => { + this.$message.error('鍒犻櫎澶辫触'); + }); + }, + resetForm() { + this.$refs.infoForm.resetFields(); + this.dialogVisible = false; + }, + getUserList(){ + selectUserCondition().then(res => { + if (res.code == 200) { + this.responsibleOptions = res.data + } + }) + }, + }, + watch: { + // 鐩戝惉鐐瑰嚮el-tree鐨勬暟鎹紝杩涜鏁版嵁鍒锋柊 + departId: { + handler(newId, oldId) { + this.getList(newId); + } + }, + } +}; +</script> +<style scoped> +>>> .el-dialog__body { + max-height: 74vh; + overflow-y: auto; +} + +.radio-group >>> .el-form-item__error { + padding-left: 38px; +} +>>>.el-checkbox__label { + width: 212px; + white-space: pre-wrap; +} +</style> -- Gitblit v1.9.3