From 14d29f928b24d203e76f1dcefc1a51182657cd45 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期一, 10 三月 2025 16:29:09 +0800
Subject: [PATCH] Merge branch 'dev' of http://114.132.189.42:9002/r/center-lims-before-ruoyi into dev
---
src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelCapacity/index.vue | 567 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 567 insertions(+), 0 deletions(-)
diff --git a/src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelCapacity/index.vue b/src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelCapacity/index.vue
new file mode 100644
index 0000000..49dd10d
--- /dev/null
+++ b/src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelCapacity/index.vue
@@ -0,0 +1,567 @@
+<!-- 浜哄憳鑳藉姏 -->
+<template>
+ <div>
+ <div style="text-align: left; margin-bottom: 15px;padding: 0 16px">
+ <label>濮撳悕</label>
+ <el-input v-model="userName" placeholder="璇疯緭鍏ュ鍚�" size="small" style="width: 20vh;"></el-input>
+ <el-button size="small" type="primary" @click="refreshTable">鏌ヨ</el-button>
+ <div v-if="isDepartment" style="float: right;">
+ <el-button size="small" type="primary" @click="addAppointPost('add')">鏂板</el-button>
+ </div>
+ </div>
+ <div class="table">
+ <TableCard :showForm="false" :showTitle="false">
+ <template v-slot:table>
+ <limsTable :column="yearColumnData" :height="'calc(100vh - 20em)'" :table-data="tableData"
+ :table-loading="yearLoading" style="padding: 0 15px;margin-bottom: 16px" :page="search"
+ @pagination="pagination">
+ <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>
+ </limsTable>
+ </template>
+ </TableCard>
+ </div>
+ <!--鏂板鑳藉姏璁ゅ畾寮规-->
+ <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="operationType === 'view'" clearable filterable placeholder="璇烽�夋嫨"
+ 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="12">
+ <el-form-item label="鑱岀О锛�" label-width="110px" prop="technicalPost">
+ <el-input v-model="form.technicalPost" :disabled="operationType === 'view'" clearable size="small"
+ style="width: 100%;" />
+ </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'" 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'">
+ <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'" 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'" 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'">
+ <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'" 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'" 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'">
+ <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'"
+ 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'" 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'">
+ <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'"
+ 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'" 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'">
+ <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'" 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'"
+ @change="selectResponsibilities">
+ <el-checkbox v-for="city in responsibilities" :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'">
+ <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'"
+ 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'">
+ <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-form>
+ <span slot="footer" class="dialog-footer">
+ <el-button v-if="operationType !== 'view'" @click="resetForm">鍙栨秷</el-button>
+ <el-button v-if="operationType !== 'view'" type="primary" @click="submitForm">淇濆瓨</el-button>
+ </span>
+ </el-dialog>
+ </div>
+</template>
+
+<script>
+import limsTable from "@/components/Table/lims-table.vue";
+import TableCard from '@/components/TableCard/index.vue';
+import {
+ exportPersonnelCapacity,
+ personPersonnelCapacityPage,
+ addOrUpdatePersonPersonnelCapacity,
+ confirmPersonnelCapability,
+ deletePersonPersonnelCapacity,
+ selectUserList,
+} from '@/api/cnas/personnel/personnelInfo.js'
+export default {
+ dicts: ['responsibilities_list'],
+ props: {
+ departId: {
+ type: Number,
+ default: () => {
+ return null;
+ }
+ },
+ isDepartment: {
+ type: Boolean,
+ default: false
+ }
+ },
+ components: {
+ limsTable,
+ TableCard
+ },
+ 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: 'technicalPost',
+ minWidth: '100'
+ }, {
+ dataType: 'slot',
+ label: '宸ヤ綔缁忓巻',
+ prop: 'placeWork',
+ minWidth: '100',
+ slot: 'placeWorkSlot'
+ }, {
+ 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: 'confirmOperatingPersonnelId',
+ minWidth: '100'
+ }, {
+ label: '纭鏃ユ湡',
+ prop: 'confirmDate',
+ minWidth: '160'
+ }, {
+ dataType: 'action',
+ minWidth: '220',
+ label: '鎿嶄綔',
+ fixed: 'right',
+ operation: [
+ {
+ name: '缂栬緫',
+ type: 'text',
+ clickFun: (row) => {
+ this.handleViewClick('edit', row);
+ },
+ showHide: (row) => {
+ if (this.isDepartment) {
+ 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.verifyGet(row.id);
+ }
+ },
+ {
+ name: '鍒犻櫎',
+ type: 'text',
+ color: '#f56c6c',
+ clickFun: (row) => {
+ this.deletePost(row.id);
+ },
+ showHide: (row) => {
+ if (this.isDepartment) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+ ]
+ }],
+ yearLoading: false,
+ dialogVisible: false,
+ form: {
+ jobResponsibilitiesTem: []
+ },
+ responsibleOptions: [],
+ rules: {
+ 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 name = this.isDepartment ? 'departmentId' : 'userId';
+ this.yearLoading = true
+ personPersonnelCapacityPage({
+ userName: this.userName,
+ [name]: this.search.userId,
+ size: this.search.size,
+ current: this.search.current
+ }).then(res => {
+ this.yearLoading = false
+ if (res.code === 201) return;
+ this.tableData = res.data.records;
+ this.search.total = res.data.total;
+ }).catch(err => {
+ console.log(err);
+ this.yearLoading = false
+ })
+ },
+ selectResponsibilities(arr) {
+ let arrTem = [];
+ arr.map(val => {
+ const index = this.responsibilities.findIndex(item => item.label === val);
+ if (index > -1) {
+ arrTem.push(this.responsibilities[index].value);
+ }
+ });
+ this.form.jobResponsibilities = arrTem.join(',');
+ },
+ getResponsibilities() {
+ this.responsibilities = this.dict.type.responsibilities_list;
+ },
+ 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.getUserList();
+ this.getResponsibilities();
+
+ },
+ // 缂栬緫/鏌ョ湅
+ handleViewClick(type, row) {
+ this.operationType = type;
+ 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();
+ this.getResponsibilities();
+ },
+ 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.form.id = null;
+ this.dialogVisible = false;
+ }
+ });
+ }
+ });
+ },
+ verifyGet(id) {
+ this.$confirm('鏄惁纭鏈潯淇℃伅?', '鎻愮ず', {
+ confirmButtonText: '纭畾',
+ cancelButtonText: '鍙栨秷',
+ type: 'warning'
+ }).then(() => {
+ confirmPersonnelCapability({ id }).then(res => {
+ if (res.code == 200) {
+ this.$message.success('纭鎴愬姛');
+ this.getList(this.departId);
+ }
+ });
+ }).catch((err) => {
+ console.log('err---', err);
+ this.$message.info('宸插彇娑�')
+ });
+ },
+ // 鍒犻櫎宀椾綅鑱岃矗
+ deletePost(id) {
+ this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎姝ゆ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+ confirmButtonText: '纭畾',
+ cancelButtonText: '鍙栨秷',
+ type: 'warning'
+ }).then(() => {
+ deletePersonPersonnelCapacity({ 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() {
+ selectUserList().then(res => {
+ if (res.code == 200) {
+ this.responsibleOptions = res.data;
+ }
+ });
+ },
+ pagination({ page, limit }) {
+ this.search.current = page;
+ this.search.size = limit;
+ this.getList();
+ },
+ },
+ watch: {
+ // 鐩戝惉鐐瑰嚮el-tree鐨勬暟鎹紝杩涜鏁版嵁鍒锋柊
+ departId: {
+ handler(newId, oldId) {
+ this.getList(newId);
+ }
+ },
+ // 鐩戝惉鐐瑰嚮el-tree鐨勬暟鎹紝杩涜鏁版嵁鍒锋柊
+ isDepartment: {
+ handler(newId, oldId) {
+ this.getList(this.departId);
+ }
+ },
+ }
+};
+</script>
+<style scoped>
+>>>.el-dialog {
+ margin: 6vh auto 50px !important;
+}
+
+>>>.el-dialog__body {
+ max-height: 70vh;
+ 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