From 952a20f1c005d80e9bf881287c40e6f4e4266a0b Mon Sep 17 00:00:00 2001
From: lxp <1928192722@qq.com>
Date: 星期三, 12 三月 2025 15:34:52 +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/PersonnelTraining/Edit.vue |  662 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 662 insertions(+), 0 deletions(-)

diff --git a/src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelTraining/Edit.vue b/src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelTraining/Edit.vue
new file mode 100644
index 0000000..b880fd0
--- /dev/null
+++ b/src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelTraining/Edit.vue
@@ -0,0 +1,662 @@
+<template>
+  <div>
+    <div class="page-header">
+      <h4><span class="line"></span><span>鍩硅涓庤�冩牳璁板綍</span></h4>
+      <div class="btns">
+        <el-button size="small" type="primary" @click="submitForm" :disabled="![1, 4].includes(currentRow.state)">{{
+          currentRow.assessmentUserId ? '淇濆瓨' : '鎻愪氦' }}</el-button>
+        <el-button size="small" @click="$emit('goBack')">杩斿洖</el-button>
+      </div>
+    </div>
+    <div class="form_title">
+      <el-row>
+        <el-col :span="5">
+          <span class="form_label">璇剧▼缂栧彿锛�</span>
+          <span> {{ trainingForm.courseCode }} </span>
+        </el-col>
+        <el-col :span="6">
+          <span class="form_label">鍩硅鍐呭锛�</span>
+          <span> {{ trainingForm.trainingContent }} </span>
+        </el-col>
+        <el-col :span="4">
+          <span class="form_label">鐘舵�侊細</span>
+          <el-tag v-if="trainingForm.state === 1" type="success">宸插畬鎴�</el-tag>
+          <el-tag v-if="trainingForm.state === 2" type="warning">杩涜涓�</el-tag>
+          <el-tag v-if="trainingForm.state === 3" type="primary">鏈紑濮�</el-tag>
+          <el-tag v-if="trainingForm.state === 4" type="info">宸茬粨鏉�</el-tag>
+        </el-col>
+        <el-col :span="4">
+          <span class="form_label">鍩硅璁插笀锛�</span>
+          <span> {{ trainingForm.trainingLecturerId }} </span>
+        </el-col>
+        <el-col :span="4">
+          <span class="form_label">鍩硅鏃ユ湡锛�</span>
+          <span> {{ trainingForm.trainingDate }} </span>
+        </el-col>
+      </el-row>
+      <el-row style="margin: 15px 0">
+        <el-form>
+          <el-col :span="12">
+            <el-form-item label="鑰冩牳鏂瑰紡">
+              <el-input v-model="trainingForm.assessmentMethod"
+                :disabled="currentRow.state == 1 || currentRow.assessmentUserId" :rows="2" placeholder="璇疯緭鍏�"
+                size="small" style="width: 79%" type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鏈鍩硅缁煎悎璇勪环">
+              <el-input v-model="trainingForm.comprehensiveAssessment"
+                :disabled="currentRow.state == 1 || ((currentRow.assessmentUserId !== user.userId) && ![35, 16, 36].includes(user.userId)) || !currentRow.assessmentUserId"
+                :rows="2" placeholder="璇疯緭鍏�" size="small" style="width: 68%" type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="璇勪环浜�">
+              <el-select v-model="trainingForm.assessmentUserId"
+                :disabled="currentRow.state == 1 || currentRow.assessmentUserId" placeholder="璇烽�夋嫨" size="small"
+                style="width: 68%">
+                <el-option v-for="item in userList" :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="璇勪环鏃堕棿">
+              <el-date-picker v-model="trainingForm.assessmentDate"
+                :disabled="currentRow.state == 1 || ((currentRow.assessmentUserId !== user.userId) && ![35, 16, 36].includes(user.userId)) || !currentRow.assessmentUserId"
+                style="width:40%" type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd" size="small"
+                placeholder="閫夋嫨鏃ユ湡">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍩硅鎽樿">
+              <el-input v-model="trainingForm.trainingAbstract"
+                :disabled="currentRow.state == 1 || currentRow.assessmentUserId" :rows="2" placeholder="璇疯緭鍏�"
+                size="small" style="width: 79%" type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item>
+              <!-- <el-upload
+                ref="upload"
+                :action="action"
+                :before-upload="beforeUpload"
+                :on-error="onError"
+                :data="uploadData"
+                :headers="uploadHeader"
+                :on-success="attachmentUpload"
+                >
+                <el-button size="small" type="primary">鐐瑰嚮涓婁紶</el-button>
+              </el-upload> -->
+              <el-button type="primary" size="small" @click="attachmentFrame = true">闄勪欢</el-button>
+            </el-form-item>
+          </el-col>
+          <!-- <el-col :span="12" :offset="12">
+            <el-image
+              v-if="currentRow.url"
+              style="width: 70%; height: 100px"
+              :src="javaApi + '/img/' + currentRow.url">
+              </el-image>
+          </el-col> -->
+        </el-form>
+      </el-row>
+    </div>
+    <!-- 鏂囦欢棰勮 -->
+    <el-dialog :visible.sync="lookDialogVisible" fullscreen title="鏌ョ湅闄勪欢" width="800px">
+      <filePreview v-if="lookDialogVisible" :currentFile="{}" :fileUrl="previewFile"
+        style="height: 90vh;overflow-y: auto;top: 0" />
+    </el-dialog>
+    <!-- 闄勪欢寮规 -->
+    <el-dialog title="闄勪欢" :visible.sync="attachmentFrame" width="70%" border :before-close="handleClose">
+      <el-upload ref="upload" :action="action" :before-upload="beforeUpload" :on-error="onError" :data="uploadData"
+        :headers="uploadHeader" :on-success="attachmentUpload" style="margin-bottom: 10px">
+        <el-button size="small" type="primary" :disabled="currentRow.state == 1">涓婁紶闄勪欢</el-button>
+      </el-upload>
+      <el-table ref="fileData" :data="fileData" height="400px">
+        <el-table-column label="搴忓彿" type="index" width="100" header-align="center" align="center">
+        </el-table-column>
+        <el-table-column label="鏂囦欢鍚嶇О" prop="fileName" header-align="center" align="center">
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" fixed="right" width="200px" header-align="center" align="center">
+          <template slot-scope="scope">
+            <el-button type="text" size="small" @click="preview(scope.row)">棰勮</el-button>
+            <el-button type="text" size="small" @click="download(scope.row)">涓嬭浇</el-button>
+            <el-button type="text" style="color: red;" size="small" @click="deleteFile(scope.row)">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="attachmentFrame = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="attachmentFrame = false">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+
+
+    <el-divider>浜哄憳璇︽儏</el-divider>
+    <div>
+      <div class="items_center">
+        <span>濮撳悕</span>
+        <el-input v-model="userName" class="search" placeholder="璇疯緭鍏�" size="small"></el-input>
+        <el-button size="small" type="primary" @click="getInfo">鏌ヨ</el-button>
+      </div>
+      <div class="items_btn">
+        <el-button :disabled="currentRow.state === 1" size="small" type="primary" @click="addPerson">鏂板浜哄憳</el-button>
+        <el-button :disabled="currentRow.state === 1" size="small" @click="batchDelete">鎵归噺鍒犻櫎</el-button>
+      </div>
+      <el-table :data="trainingTableData" height="calc(100vh - 30em)" stripe style="width: 100%"
+        @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column label="搴忓彿" type="index" width="60"></el-table-column>
+        <el-table-column label="濮撳悕" prop="userName"></el-table-column>
+        <el-table-column label="宸ュ彿" prop="account"></el-table-column>
+        <el-table-column label="瑙掕壊" prop="roleName"></el-table-column>
+        <el-table-column label="鐢佃瘽鍙风爜" prop="phone"></el-table-column>
+        <el-table-column label="鑰冩牳缁撴灉" prop="examinationResults">
+          <template v-slot="scope">
+            <el-select v-model="scope.row.examinationResults" :disabled="currentRow.state === 1" size="small"
+              style="width: 100%" @change="updatePersonResult(scope.row)">
+              <el-option label="鍚堟牸" value="鍚堟牸"></el-option>
+              <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�"></el-option>
+            </el-select>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <el-dialog :visible.sync="selectUserDia" title="閫夋嫨鐢ㄦ埛" width="70%">
+      <div class="search" style="margin-bottom: 9px;">
+        <div class="search_thing">
+          <div class="search_label">鐢ㄦ埛鍚嶏細</div>
+          <div class="search_input">
+            <el-input v-model="queryParams.name" clearable placeholder="璇疯緭鍏�" size="small"
+              @keyup.enter.native="$refs.ValueTable.selectList()"></el-input>
+          </div>
+        </div>
+      </div>
+      <div v-if="selectUserDia" class="body" style="height: 60vh;">
+        <lims-table :tableData="tableData" :column="column" :tableLoading="tableLoading" :height="'calc(100vh - 290px)'"
+          :page="page" @pagination="pagination" :isSelection="true"
+          :handleSelectionChange="handleSelectionChange"></lims-table>
+        <!-- <ValueTable ref="ValueTable" :componentData="addUserTableInfo" :isSelectedList="isSelectedList"
+          :url="$api.user.selectUserList" /> -->
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="selectUserDia = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="selectUser">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import TableCard from '@/components/TableCard/index.vue';
+import limsTable from "@/components/Table/lims-table.vue";
+// import ValueTable from '@/components/Table/value-table.vue';
+import filePreview from "@/components/Preview/filePreview.vue";
+import {
+  fileDownLoad,
+  deleteFile,
+  getFileData,
+  trainingAndAssessmentRecordsPage,
+  outOfFocusPreservation,
+  newPersonnelAddedToTrainingRecords,
+  deleteTrainingAndAssessmentRecords,
+  trainingAndAssessmentRecordsAdded,
+  selectUserList,
+} from '@/api/cnas/personnel/personnelInfo.js'
+import { selectUserCondition } from "@/api/system/user";
+import { mapGetters } from "vuex";
+export default {
+  name: 'Edit',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { limsTable, TableCard, filePreview },
+  props: {
+    currentRow: {
+      type: Object,
+      default: () => {
+        return {}
+      }
+    },
+  },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      previewFile: '',
+      lookDialogVisible: false,
+      user: {},
+      fileData: [],
+      attachmentFrame: false,
+      isSelectedList: [], // 绂佺敤鐨勫閫�
+      userName: undefined,
+      trainingForm: {
+        code: '111111',
+        date: '2024-10-10',
+      },
+      uploadData: {},
+      trainingColumn: [
+        {
+          label: '濮撳悕',
+          prop: 'userName'
+        },
+        {
+          label: '宸ュ彿',
+          prop: 'account'
+        },
+        {
+          label: '瑙掕壊',
+          prop: 'roleName'
+        },
+        {
+          label: '鐢佃瘽鍙风爜',
+          prop: 'phone'
+        },
+        {
+          label: '鑰冩牳缁撴灉',
+          prop: 'result'
+        }
+      ],
+      trainingTableData: [],
+      trainingLoading: false,
+      selectUserDia: false, // 娣诲姞浜哄憳寮规
+      addUserTableInfo: {
+        name: null,
+        entity: {
+          departLimsId: '1',
+          orderBy: {
+            field: 'id',
+            order: 'asc'
+          }
+        },
+        isIndex: true,
+        showSelect: true,
+        select: true,
+        do: [],
+        tagField: {
+          state: {
+            select: [
+              {
+                value: 1,
+                type: 'success',
+                label: '鍚敤'
+              },
+              {
+                value: 0,
+                type: 'danger',
+                label: '鍋滅敤'
+              }
+            ]
+          }
+        },
+        selectField: {},
+        upUserDepardLimsIdPower: true
+      },
+      multipleSelection: [],
+      multipleSelections: [],
+      userList: [],
+      stateList: [
+        {
+          value: 1,
+          type: 'success',
+          label: '鍚敤'
+        },
+        {
+          value: 0,
+          type: 'danger',
+          label: '鍋滅敤'
+        }
+      ],
+      queryParams: {},
+      tableData: [],
+      column: [
+        { label: "濮撳悕", prop: "name" },
+        { label: "璐﹀彿", prop: "account" },
+        {
+          label: "瑙掕壊",
+          prop: "roleName",
+        },
+        {
+          label: "鐘舵��", prop: "state", dataType: "tag",
+          formatData: (params) => {
+            let index = this.stateList.findIndex(
+              (item) => item.value == params
+            );
+            if (index > -1) {
+              return this.stateList[index].label;
+            } else {
+              return null;
+            }
+          },
+          formatType: (params) => {
+            let index = this.stateList.findIndex(
+              (item) => item.value == params
+            );
+            if (index > -1) {
+              return this.stateList[index].type;
+            } else {
+              return null;
+            }
+          },
+        },
+        { label: "鐢佃瘽鍙风爜", prop: "phone" },
+      ],
+      page: {
+        total: 0,
+        size: 10,
+        current: 0,
+      },
+      tableLoading: false,
+    };
+  },
+  computed: {
+    action() {
+      return this.javaApi + '/personTraining/fileUpload';
+    },
+    ...mapGetters(["userId"]),
+  },
+  mounted() {
+    this.trainingForm = JSON.parse(JSON.stringify(this.currentRow))
+    this.getInfo()
+    this.getUserList()
+    this.getFileData(this.trainingForm.id)
+    // 鑾峰彇褰撳墠鐧诲綍浜轰俊鎭�
+    this.loginPerson();
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 闄勪欢棰勮
+    preview(row) {
+      let folder = '';
+      if (row.fileUrl.includes('xls')) {
+        folder = 'excel'
+      } else if (row.fileUrl.includes('docx')) {
+        folder = 'word'
+      } else {
+        folder = 'img'
+      }
+      this.previewFile = this.javaApi + folder + row.fileUrl
+      this.$nextTick(() => {
+        this.lookDialogVisible = true
+      })
+    },
+    // 涓嬭浇
+    download(row) {
+      fileDownLoad({ id: row.id }).then(res => {
+        console.log('2123');
+        const blob = new Blob([res], { type: row.mime });
+        this.$download.saveAs(blob, row.fileName)
+      })
+    },
+
+    // 鍒犻櫎
+    deleteFile(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ枃浠�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        deleteFile({ id: row.id }).then(res => {
+          this.$message({
+            type: 'success',
+            message: '鍒犻櫎鎴愬姛!'
+          });
+          this.getFileData(this.trainingForm.id);
+        })
+      })
+
+    },
+    // 鏌ヨ
+    getFileData(id) {
+      getFileData({ detailedId: id }).then(res => {
+        this.fileData = res.data
+      })
+    },
+    // 闄勪欢涓婁紶 鎴愬姛鐨勯挬瀛�
+    attachmentUpload(res, file, fileList) {
+      // 缁欏浘鐗囪矾寰勮祴鍊�
+      this.$message.success('涓婁紶鎴愬姛')
+      this.currentRow.url = res.data.url
+      this.$refs.upload.clearFiles();
+      this.getFileData(this.trainingForm.id);
+    },
+    // 澶辫触鐨勯挬瀛�
+    onError(err, file, fileList) {
+      this.$message.error('涓婁紶澶辫触')
+    },
+    // 涓婁紶鍓嶇殑閽╁瓙
+    beforeUpload(file) {
+      // 缁欎紶閫掔殑鍙傛暟璧嬪��
+      this.$set(this.uploadData, "id", this.currentRow.id)
+    },
+    // 褰撳墠鐧诲綍浜轰俊鎭� 
+    loginPerson() {
+      this.user = {
+        userId: this.userId
+      }
+    },
+    // 鑾峰彇褰撳墠鏁版嵁
+    async getInfo() {
+      this.trainingLoading = true
+      trainingAndAssessmentRecordsPage({
+        trainingDetailedId: this.currentRow.id,
+        userName: this.userName
+      }).then(res => {
+        if (res.code === 200) {
+          this.trainingTableData = res.data
+        }
+        this.trainingLoading = false
+      })
+    },
+    async updatePersonResult(row) {
+      const { code } = await outOfFocusPreservation(row)
+      if (code === 200) {
+        this.$message.success("鎿嶄綔鎴愬姛锛�")
+      }
+    },
+    getList() {
+      this.tableLoading = true;
+      let param = { ...this.queryParams, ...this.page };
+      delete param.total;
+      selectUserList({ ...param })
+        .then((res) => {
+          this.tableLoading = false;
+          if (res.code === 200) {
+            this.tableData = res.data.records;
+            this.page.total = res.data.total;
+          }
+        })
+        .catch((err) => {
+          this.tableLoading = false;
+        });
+    },
+    pagination({ page, limit }) {
+      this.page.current = page;
+      this.page.size = limit;
+      this.getList();
+    },
+    handleSelectionChange(val) {
+      this.multipleSelections = val
+    },
+    addPerson() {
+      this.isSelectedList = this.trainingTableData.map(item => item.userId)
+      this.getList()
+      this.selectUserDia = true;
+    },
+    selectUser() {
+      let selects = this.multipleSelections;
+      if (selects.length == 0) {
+        this.$message.error('鏈�夋嫨鏁版嵁');
+        return;
+      }
+      let list = []
+      selects.forEach(a => {
+        const obj = {
+          courseId: this.currentRow.id,
+          examinationResults: "",
+          userId: a.id
+        }
+        list.push(obj)
+        // this.trainingTableData.push(obj);
+      });
+      newPersonnelAddedToTrainingRecords(list).then(res => {
+        this.isSelectedList = []
+        this.selectUserDia = false;
+        this.getInfo()
+      })
+    },
+    // 鎵归噺鍒犻櫎
+    handleSelectionChange(list) {
+      this.multipleSelection = list
+    },
+    batchDelete() {
+      console.log('鎵归噺鍒犻櫎', this.multipleSelection)
+      if (this.multipleSelection.length > 0) {
+        let ids = this.multipleSelection.map(item => item.trainingRecordId)
+        this.$confirm('鏄惁纭鍒犻櫎鎵�閫夋嫨鐨勬暟鎹�?', '鎻愮ず', {
+          confirmButtonText: '纭畾',
+          cancelButtonText: '鍙栨秷',
+          type: 'warning'
+        }).then(() => {
+          let formData = new FormData()
+          formData.append('ids', ids)
+          deleteTrainingAndAssessmentRecords(formData)
+            .then(res => {
+              if (res.code == 200) {
+                this.$message.success('鍒犻櫎鎴愬姛');
+                this.getInfo()
+              }
+            });
+        }).catch(() => {
+          this.$message.warning('鍙栨秷鍒犻櫎');
+        });
+      } else {
+        this.$message.warning('璇烽�夋嫨闇�瑕佸垹闄ょ殑鏁版嵁')
+      }
+    },
+    handleSizeChange(val) {
+      this.search.size = val;
+      this.getInfo();
+    },
+    handleCurrentChange(val) {
+      this.search.current = val;
+      this.getInfo();
+    },
+    /**
+     * @desc 鎻愪氦琛ㄥ崟
+     */
+    async submitForm() {
+      console.log('this.currentRow.state', this.currentRow.state);
+      if (this.currentRow.state !== 4 && this.currentRow.state !== 1) {
+        this.$message.warning("褰撳墠鐘舵�佹棤娉曟彁浜�/鎾ら攢锛�")
+        return
+      }
+      // 濡傛灉绛変簬4 琛ㄧず璇ョ姸鎬佷负宸茬粨鏉燂紝1 琛ㄧず宸插畬鎴�
+      let state = 4
+      if (this.currentRow.assessmentUserId == this.user.userId) {
+        state = 1
+      }
+      let data = {
+        assessmentMethod: this.trainingForm.assessmentMethod,
+        comprehensiveAssessment: this.trainingForm.comprehensiveAssessment,
+        trainingDetailedId: this.trainingForm.id,
+        assessmentUserId: this.currentRow.assessmentUserId ? this.currentRow.assessmentUserId : this.trainingForm.assessmentUserId,
+        assessmentDate: this.trainingForm.assessmentDate,
+        state: state,
+        trainingAbstract: this.trainingForm.trainingAbstract
+      }
+      const { code } = await trainingAndAssessmentRecordsAdded(data)
+      if (code === 200) {
+        this.currentRow.state = state
+        this.$message.success("鎿嶄綔鎴愬姛")
+        // this.$emit('refresh',this.currentRow.id)
+      }
+    },
+    getUserList() {
+      selectUserCondition().then(res => {
+        if (res.code === 201) {
+          return
+        }
+        this.userList = res.data
+      })
+    },
+    handleClose() {
+      this.attachmentFrame = false;
+    },
+  }
+};
+</script>
+
+<style scoped>
+.page-header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 0 20px;
+  margin-bottom: 10px;
+}
+
+h4 {
+  display: flex;
+  align-items: center;
+}
+
+h4 .line {
+  display: inline-block;
+  width: 3px;
+  height: 16px;
+  background: #3A7BFA;
+  margin-right: 4px;
+}
+
+.form_title {
+  font-size: 14px;
+  padding: 0 20px;
+  margin-bottom: 10px;
+}
+
+.el-divider {
+  margin: 0 1em 1em 0;
+}
+
+.form__input_label {
+  width: 90px;
+  margin-right: 6px;
+  color: #606266;
+}
+
+.form__input_label2 {
+  width: 210px;
+  margin-right: 6px;
+  color: #606266;
+}
+
+.search_thing {
+  display: flex;
+  align-items: center
+}
+
+.search_label {
+  width: 120px;
+}
+
+.pagination {
+  display: flex;
+  justify-content: space-between
+}
+
+.items_center {
+  float: left;
+  width: 50%;
+  text-align: left;
+}
+
+.items_btn {
+  text-align: right;
+  width: 50%;
+  float: right;
+  margin-bottom: 1em;
+}
+
+.search {
+  width: 180px;
+  padding: 0 16px;
+}
+</style>

--
Gitblit v1.9.3