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