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/job-responsibilities.vue | 395 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 395 insertions(+), 0 deletions(-) diff --git a/src/views/CNAS/personnel/personnelInfo/tabs/job-responsibilities.vue b/src/views/CNAS/personnel/personnelInfo/tabs/job-responsibilities.vue new file mode 100644 index 0000000..1ae74e8 --- /dev/null +++ b/src/views/CNAS/personnel/personnelInfo/tabs/job-responsibilities.vue @@ -0,0 +1,395 @@ +<!-- 宀椾綅鑱岃矗 --> +<template> + <div class="view"> + <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" clearable placeholder="璇疯緭鍏ュ憳宸�" size="small" style="width: 20vh;"></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 size="small" type="primary" @click="addPost">鏂板</el-button> + <!-- <el-button size="small" type="primary">瀵煎嚭excel</el-button>--> + </div> + </div> + <div class="table"> + <el-table :data="tableData" v-loading="tableLoading" height="66.5vh" style="width: 100%"> + <el-table-column label="搴忓彿" type="index" width="60"></el-table-column> + <el-table-column label="鍛樺伐缂栧彿" min-width="120" prop="account"></el-table-column> + <el-table-column label="宀椾綅鍚嶇О" min-width="180" prop="postName"></el-table-column> + <el-table-column label="鎵�灞為儴闂�" min-width="180" prop="departLimsName"></el-table-column> + <el-table-column label="宸ヤ綔鐩爣" min-width="180" prop="jobObjective"></el-table-column> + <el-table-column label="宀椾綅鑱岃矗" min-width="180" prop="jobResponsibilities"></el-table-column> + <el-table-column label="浠昏亴浜�" min-width="180" prop="incumbentName"></el-table-column> + <el-table-column label="浠昏亴浜哄鏍告棩鏈�" min-width="180" prop="incumbentDate"></el-table-column> + <el-table-column label="涓荤" min-width="180" prop="supervisorName"></el-table-column> + <el-table-column label="涓荤瀹℃牳鏃ユ湡" min-width="180" prop="supervisorDate"></el-table-column> + <el-table-column fixed="right" label="鎿嶄綔" width="140" align="center"> + <template v-slot="scope"> + <el-button v-if="!isDepartment || scope.row.currentState === '鍏抽棴'" size="small" type="text" + @click="handleViewClick(scope.row, 'view')">鏌ョ湅 + </el-button> + <el-button v-if="isDepartment && scope.row.currentState !== '鍏抽棴'" size="small" type="text" + @click="handleViewClick(scope.row, 'edit')">缂栬緫 + </el-button> + <el-button size="small" type="text" @click="downLoadPost(scope.row)">瀵煎嚭</el-button> + <el-button v-if="isDepartment" size="small" style="color: #f56c6c" type="text" @click="deletePost(scope.row)">鍒犻櫎</el-button> + </template> + </el-table-column> + </el-table> + <el-pagination :current-page="1" :page-size="search.size" :page-sizes="[10, 20, 30, 50, 100]" + :total="search.total" layout="->,total, sizes, prev, pager, next, jumper" + background + style="margin-top: 10px" + @size-change="handleSizeChange" + @current-change="handleCurrentChange"> + </el-pagination> + </div> + <!-- 鏂板宀椾綅鑱岃矗 --> + <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="dialogVisible" + title="鏂板宀椾綅鑱岃矗" + width="50%" @close="resetForm"> + <el-steps :active="currentStep" align-center finish-status="success"> + <el-step v-for="(v, i) in steps" :key="i" :title="v" style="cursor:pointer" + @click.native="choiceStep(i)"></el-step> + </el-steps> + <el-form ref="form" :model="form" :rules="rules" label-width="130px"> + <div> + <el-card style="margin-top: 1em; height: 40vh; overflow-y: scroll;"> + <!-- 鏂板璁惧浜嬭褰曞崱鐗� --> + <el-row> + <el-col :span="12"> + <el-form-item label="宀椾綅鍚嶇О锛�" prop="postName"> + <el-input v-model="form.postName" :disabled="currentStep !== 0 || operationType === 'view'" + size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="宸ヤ綔鐩爣锛�" prop="jobObjective"> + <el-input v-model="form.jobObjective" :disabled="currentStep !== 0 || operationType === 'view'" + size="small" + type="textarea"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="宀椾綅鑱岃矗锛�" prop="jobResponsibilities"> + <el-input v-model="form.jobResponsibilities" :disabled="currentStep !== 0 || operationType === 'view'" + size="small" + type="textarea"></el-input> + </el-form-item> + </el-col> + <el-col v-if="currentStep === 0 || operationType === 'view'" :span="12"> + <el-form-item + :rules="[{ required: currentStep === 0, message: '璇烽�夋嫨浠昏亴浜�', trigger: 'change' }]" + label="浠昏亴浜猴細" + prop="incumbentId"> + <el-select v-model="form.incumbentId" :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 v-if="currentStep === 1 || operationType === 'view'" :span="12"> + <el-form-item + :rules="[{ required: currentStep === 1, message: '璇烽�夋嫨涓荤', trigger: 'blur' }]" + label="涓荤锛�" + prop="supervisorId"> + <el-select v-model="form.supervisorId" :disabled="currentStep !== 1 || 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-row> + </el-card> + <el-row style="margin-top: 1em;"> + <el-col :span="4"> + 鎿嶄綔浜猴細{{ form.submitPerson }} + </el-col> + <el-col :span="6"> + 鏃ユ湡锛歿{ form.submitDate }} + </el-col> + </el-row> + </div> + </el-form> + <span slot="footer" class="dialog-footer"> + <el-button v-if="currentStep !== 0 && currentStep !== 3" @click="submitForm('3reject')">椹冲洖</el-button> + <el-button v-if="currentStep === 0" @click="submitForm('2save')">淇濆瓨</el-button> + <el-button v-if="currentStep !== 3" type="primary" + @click="submitForm('1submit')">{{ currentStep === 0 ? '鎻愪氦' : '閫氳繃' }}</el-button> + </span> + </el-dialog> + </div> +</template> + +<script> +import { dateFormat } from '@/utils/date' +import { + exportPersonJobResponsibilities, personJobResponsibilitiesDelete, + personJobResponsibilitiesSave, + personJobResponsibilitiesSelect +} from "@/api/cnas/personal/personJobResponsibilities"; +import {selectUserCondition} from "@/api/cnas/resourceDemand/facilitiesEnvironment/facilitiesAndEnvironment"; +import {mapGetters} from "vuex"; + +export default { + data() { + return { + userName: '', + tableData: [], + tableLoading: false, + responsibleOptions: [], + search: { + size: 20, + current: 1, + total: 0 + }, + dialogVisible: false, + currentStep: 0, // 姝ラ鏉℃樉绀虹鍑犳 + currentStepClick: 0, // 鐐瑰嚮姝ラ鏉″彉鍖� + operationType: '', + steps: ['鎻愪氦', '浠昏亴浜虹‘璁�', '涓荤纭'], + form: { + postName: '', // 宀椾綅鍚嶇О + jobObjective: '', // 宸ヤ綔鐩爣 + jobResponsibilities: '', // 宀椾綅鑱岃矗 + incumbentId: '', // 浠昏亴浜� + supervisorId: '' // 涓荤 + }, + rules: { + postName: [{ required: true, message: '璇疯緭鍏ュ矖浣嶅悕绉�', trigger: 'blur' }], + jobObjective: [{ required: true, message: '璇疯緭鍏ュ伐浣滅洰鏍�', trigger: 'blur' }], + jobResponsibilities: [{ required: true, message: '璇疯緭鍏ュ矖浣嶈亴璐�', trigger: 'blur' }], + incumbentId: [{ required: true, message: '璇烽�夋嫨浠昏亴浜�', trigger: 'change' }], + supervisorId: [{ required: true, message: '璇烽�夋嫨涓荤', trigger: 'change' }] + } + // departId: 0 + }; + }, + props: { + departId: { + type: Number, + default: () => { + return null; + } + }, + isDepartment: { + type: Boolean, + default: false + } + }, + mounted() { + this.getPostList(this.departId); + }, + methods: { + addPost() { + this.dialogVisible = true; + this.form = { + postName: '', // 宀椾綅鍚嶇О + jobObjective: '', // 宸ヤ綔鐩爣 + jobResponsibilities: '', // 宀椾綅鑱岃矗 + incumbentId: '', // 浠昏亴浜� + supervisorId: '', // 鎿嶄綔浜� + submitPerson: '', // 涓荤 + submitDate: '', // 鏃ユ湡 + currentStep: 0 // 鏃ユ湡 + }; + this.currentStep = 0; + this.getUserList(); + }, + // 鏌ヨ鍒楄〃淇℃伅 + getPostList(userId) { + this.search.userId = userId; + const params = this.isDepartment ? { + userName: this.userName, + 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, + } + this.tableLoading = true + personJobResponsibilitiesSelect(params).then(res => { + this.tableLoading = false + this.tableData = res.data.records; + this.search.total = res.data.total; + }).catch(err => { + this.tableLoading = false + }) + }, + //鎻愪氦琛ㄥ崟 + async submitForm(saveState) { + this.$refs.form.validate((valid) => { + if (valid === true || saveState !== '1submit') { + // 缁欏綋鍓嶇幆鑺傝缃垱寤轰汉涓庢椂闂� + let user = this.nickName; + const dateTime = dateFormat(new Date()); + // 鑾峰彇褰撳墠鐜妭鎿嶄綔浜轰笌鏃ユ湡 + switch (this.currentStep) { + case 0: + this.form.submittingOperator = user.name; + this.form.submittingDate = dateTime; + break; + case 1: + this.form.incumbentOperator = user.name; + this.form.incumbentDate = dateTime; + break; + case 2: + this.form.supervisorOperator = user.name; + this.form.supervisorDate = dateTime; + break; + default: + break; + } + // 鑾峰彇褰撳墠鐜妭璐熻矗浜� + switch (saveState === '3reject' ? this.currentStep - 1 : this.currentStep) { + case 1: + this.form.currentResponsible = this.form.submittingOperator; + break; + case 2: + this.form.currentResponsible = this.form.incumbentOperator; + break; + default: + break; + } + let currentStepAction; + // 璁剧疆璇ユ搷浣滃垽鏂槸鍚︿负鎻愪氦锛屼繚瀛橈紝椹冲洖锛岄�氳繃 + switch (saveState) { + // 鎻愪氦锛岄�氳繃 + case '1submit': + currentStepAction = this.currentStep + 1; + break; + // 淇濆瓨 + case '2save': + currentStepAction = this.currentStep; + break; + // 椹冲洖 + case '3reject': + currentStepAction = this.currentStep - 1; + break; + default: + break; + } + // 鑾峰彇褰撳墠鐘舵�� + this.form.currentState = currentStepAction === 3 ? '鍏抽棴' : this.steps[currentStepAction]; + personJobResponsibilitiesSave(this.form).then(res => { + if (res.code == 200) { + this.$message.success('鎻愪氦鎴愬姛'); + this.getPostList(this.departId); + this.dialogVisible = false; + } + }); + } else { + let step = this.steps[this.currentStep]; + this.$message.warning(step + ' 娴佺▼涓湁蹇呭~椤规湭濉紒'); + } + }); + }, + // 缂栬緫 + handleViewClick(row, type) { + this.operationType = type; + this.getUserList(); + row.incumbentId = Number(row.incumbentId); + this.form = { ...row }; + switch (row.currentState) { + case '鎻愪氦': + this.currentStep = 0; + break; + case '浠昏亴浜虹‘璁�': + this.currentStep = 1; + this.form.submitPerson = row.submittingOperator; + this.form.submitDate = row.submittingDate; + break; + case '涓荤纭': + this.currentStep = 2; + this.form.submitPerson = row.incumbentOperator; + this.form.submitDate = row.incumbentDate; + break; + case '鍏抽棴': + this.currentStep = 3; + this.form.submitPerson = row.supervisorOperator; + this.form.submitDate = row.supervisorDate; + break; + default: + break; + } + this.form.currentState = this.currentStep; + this.currentStepClick = this.currentStep === 3 ? 0 : this.currentStep + console.log('this.form---', this.form); + this.dialogVisible = true; + }, + // 涓嬭浇宀椾綅鑱岃矗 + downLoadPost(row) { + exportPersonJobResponsibilities({id:row.id}).then(res => { + const blob = new Blob([res],{ type: 'application/octet-stream' }); + this.$download.saveAs(blob, row.incumbentName+'-宀椾綅鑱岃矗'+'.docx'); + this.$message.success('瀵煎嚭鎴愬姛') + }) + }, + // 鍒犻櫎宀椾綅鑱岃矗 + deletePost(row) { + this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎姝ゆ暟鎹�, 鏄惁缁х画?', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + personJobResponsibilitiesDelete({id: row.id}).then(res => { + if (res.code == 200) { + this.$message.success('鍒犻櫎鎴愬姛'); + this.getPostList(this.departId); + } + }); + }).catch(() => { + this.$message.error('鍒犻櫎澶辫触'); + }); + }, + resetForm() { + this.$refs.form.resetFields(); + }, + refreshTable() { + this.getPostList(this.departId); + }, + // 鑾峰彇璐熻矗浜轰俊鎭帴鍙� + getUserList() { + selectUserCondition().then(res => { + if (res.code == 200) { + this.responsibleOptions = res.data + } + }) + }, + choiceStep(index) { + this.currentStepClick = index; + }, + handleSizeChange(val) { + this.search.size = val; + this.getPostList(this.departId); + }, + handleCurrentChange(val) { + this.search.current = val; + this.getPostList(this.departId); + } + }, + watch: { + departId: { + handler(newId, oldId) { + this.getPostList(newId); + } + } + }, + computed: { + ...mapGetters(['nickName']) + }, +}; +</script> +<style scoped> +</style> -- Gitblit v1.9.3