gaoluyang
2025-02-28 c87ec8dac5f2b8f16036b794850b8f4e552a71d7
人员-任职授权记录搬迁
已修改2个文件
已添加2个文件
645 ■■■■■ 文件已修改
src/api/cnas/personal/personPostAuthorizationRecord.js 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/components/mandateAdd.vue 200 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/index.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/tabs/mandate.vue 404 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/cnas/personal/personPostAuthorizationRecord.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
import request from "@/utils/request";
// ä»»èŒæŽˆæƒè®°å½•查询表格
export function PersonPostAuthorizationRecordPage(query) {
  return request({
    url: "/personPostAuthorizationRecord/PersonPostAuthorizationRecordPage",
    method: "get",
    params: query
  });
}
// ä»»èŒæŽˆæƒè®°å½•删除
export function deletePersonPostAuthorizationRecord(query) {
  return request({
    url: "/personPostAuthorizationRecord/deletePersonPostAuthorizationRecord",
    method: "delete",
    params: query
  });
}
// ä»»èŒæŽˆæƒå¯¼å‡º
export function exportPersonPostAuthorizationRecord(query) {
  return request({
    url: "/personPostAuthorizationRecord/exportPersonPostAuthorizationRecord",
    method: "get",
    params: query,
    responseType: "blob"
  });
}
// ä»»èŒæŽˆæƒå¯¼å‡º
export function addOrUpdatePersonPostAuthorizationRecord(query) {
  return request({
    url: "/personPostAuthorizationRecord/addOrUpdatePersonPostAuthorizationRecord",
    method: "post",
    data: query,
  });
}
src/views/CNAS/personnel/personnelInfo/components/mandateAdd.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,200 @@
<template>
  <div class="add">
    <el-dialog
      :title="isEdit ?'编辑附件资料':'新增附件资料'"
      :visible.sync="dialogVisible"
      width="50%"
    >
      <el-form
        ref="ruleForm"
        :rules="rules"
        :model="form"
        label-width="130px"
        size="medium"
      >
        <el-form-item label="证书编号" prop="certificateNumber">
          <el-input v-model="form.certificateNumber" placeholder="请输入" style="width: 100%">
          </el-input>
        </el-form-item >
        <el-form-item label="被任职人员" prop="userId">
          <el-select v-model="form.userId" placeholder="请选择">
            <el-option
              v-for="(item, index) in userList"
              :key="index"
              :label="item.name"
              :value="item.id"
            ></el-option>
          </el-select>
        </el-form-item >
        <el-form-item label="任职岗位" prop="post">
          <el-input v-model="form.post" placeholder="请输入"></el-input>
        </el-form-item >
        <el-form-item label="理论考试成绩" prop="num1">
          <el-input v-model="form.num1" placeholder="请输入"></el-input>
        </el-form-item >
        <el-form-item label="操作技能考试成绩" prop="num2">
          <el-input v-model="form.num2" placeholder="请输入"></el-input>
        </el-form-item >
        <el-form-item label="操作类型" prop="operationType">
          <el-input v-model="form.operationType" placeholder="请选择"></el-input>
        </el-form-item >
        <el-row>
          <el-col :span="20">
            <el-form-item label="上岗证书">
              <el-input v-model="form.systemFileName" size="small" disabled>
                <el-button slot="append" icon="el-icon-delete-solid"
                           @click="deleteFile(form.systemFileName)"></el-button>
              </el-input>
            </el-form-item>
          </el-col>
          <el-col :span="4">
            <el-upload ref="upload" style="float: left; margin: 0 12px 0 20px;" :action="action"
                       :headers="uploadHeader"
                       :show-file-list="false"
                       :on-success="onSuccess">
              <el-button class="uploadFile" slot="trigger" size="small" type="primary">上传</el-button>
            </el-upload>
          </el-col>
        </el-row>
        <el-form-item label="备注">
          <el-input v-model="form.remarks" placeholder="请选择"></el-input>
        </el-form-item >
      </el-form>
      <div slot="footer" class="foot">
        <el-button @click="dialogVisible = false">取 æ¶ˆ</el-button>
        <el-button type="primary" :loading="loading" @click="submitForm">ç¡® å®š</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import {deleteCNASFile} from "@/api/cnas/personal/personalList";
import {selectUserCondition} from "@/api/business/inspectionTask";
import {addOrUpdatePersonPostAuthorizationRecord} from "@/api/cnas/personal/personPostAuthorizationRecord";
export default {
  data() {
    return {
      isEdit: false,
      dialogVisible: false,
      form: {
        id: undefined,
        certificateNumber: undefined,
        userId: undefined,
        post: undefined,
        operationType: undefined,
        fileList: [],
        fileName: undefined,
        systemFileName: undefined,
        remarks: undefined,
        num2:undefined,
        num1:undefined
      },
      rules: {
        certificateNumber: [{ required: true, message: '请输入证书编号', trigger: 'blur' }],
        userId: [{ required: true, message: '请选择被任职人员', trigger: 'change' }],
        post: [{ required: true, message: '任职岗位', trigger: 'blur' }],
        operationType: [{ required: true, message: '操作类型', trigger: 'blur' }],
      },
      loading: false,
      userList: []
    }
  },
  computed: {
    action() {
      return this.javaApi + '/personBasicInfo/saveCNASFile'
    }
  },
  methods: {
    onSuccess(response, file, fileList) {
      this.$set(this.form, "systemFileName", response.data)
    },
    deleteFile(fileName) {
      deleteCNASFile({fileName: fileName}).then(res => {
        this.$message.success('删除成功!')
        this.$set(this.form, "systemFileName", null)
      })
    },
    async openDialog(row, type) {
      await this.getUserList()
      this.dialogVisible = true
      if(type) {
        this.isEdit = true
        this.form.id = row.id
        this.form.certificateNumber = row.certificateNumber
        this.form.userId = Number(row.userId)
        this.form.post = row.post
        this.form.operationType = row.operationType
        this.form.systemFileName = row.systemFileName
        this.form.remarks = row.remarks
        this.form.num1 = row.num1
        this.form.num2 = row.num2
      } else {
        this.resetForm('ruleForm')
      }
    },
    closeDialog() {
      this.resetForm('ruleForm')
      this.dialogVisible = false
    },
    /**
     * @desc èŽ·å–ç”¨æˆ·ä¿¡æ¯
     */
    async getUserList() {
      selectUserCondition().then((res) => {
        this.userList = res.data;
      })
    },
    /**
     * @desc æäº¤è¡¨å•
     */
    submitForm() {
      this.$refs.ruleForm.validate((valid) => {
        if(valid) {
          const params = {
            id: this.form.id,
            certificateNumber: this.form.certificateNumber,
            userId: this.form.userId,
            post: this.form.post,
            operationType: this.form.operationType,
            systemFileName: this.form.systemFileName,
            remarks: this.form.remarks,
            num1: this.form.num1,
            num2: this.form.num2
          }
          this.loading = true
          addOrUpdatePersonPostAuthorizationRecord(params).then(res => {
            this.loading = false
            this.closeDialog()
            this.$emit('refresh')
          }).catch(err => {
            this.loading = false
          })
        }
      })
    },
    /**
     * @desc ä¸Šä¼ æ–‡ä»¶
     */
    beforeUpload(file) {
      if (file.size > 1024 * 1024 * 10) {
        this.$message.error('上传文件不超过10M');
        this.$refs.upload.clearFiles()
        return false;
      } else {
        this.form.fileList = [file]
        this.form.fileName = file.name
        return true;
      }
    },
  }
}
</script>
<style scoped>
.foot {
    width: 100%;
}
.add >>> .el-dialog__footer {
    padding-right: 20px;
}
</style>
src/views/CNAS/personnel/personnelInfo/index.vue
@@ -75,9 +75,9 @@
                           :departId="departId"
                           :isDepartment="isDepartment"></training-record>
        </el-tab-pane>
<!--        <el-tab-pane label="任职授权记录" name="任职授权记录">-->
<!--          <Mandate v-if="activeName === '任职授权记录'" ref="manDateRef" :departId="departId" :isDepartment="isDepartment"></Mandate>-->
<!--        </el-tab-pane>-->
        <el-tab-pane label="任职授权记录" name="任职授权记录">
          <Mandate v-if="activeName === '任职授权记录'" ref="manDateRef" :departId="departId" :isDepartment="isDepartment"></Mandate>
        </el-tab-pane>
<!--        <el-tab-pane label="人员能力" name="人员能力">-->
<!--          <personnel-capacity v-if="activeName === '人员能力'" ref="personnelCapacity"-->
<!--                              :departId="departId"-->
src/views/CNAS/personnel/personnelInfo/tabs/mandate.vue
@@ -1,47 +1,31 @@
<template>
    <div class="flex_column">
<!--        <TableCard :showForm="isDepartment" title="任职授权记录">-->
<!--            <template v-slot:form>-->
<!--                <div v-if="isDepartment" class="w100 items_center justify_between">-->
<!--                    <div></div>-->
<!--                    <div>-->
<!--                        <el-button size="small" type="primary" @click="openDialog">新增</el-button>-->
<!--                    </div>-->
<!--                </div>-->
<!--            </template>-->
<!--            <template v-slot:table>-->
<!--                <ZTTable-->
<!--                    :column="columnData"-->
<!--                    :height="'calc(100vh - 21em)'"-->
<!--                    :table-data="tableData"-->
<!--                    :table-loading="loading"-->
<!--                    style="margin-top: 18px; padding: 0 15px;"-->
<!--                ></ZTTable>-->
<!--                <el-divider></el-divider>-->
<!--                <div class="pagination">-->
<!--                    <div></div>-->
<!--                    <el-pagination-->
<!--                        :page-size="pagination.pageSize"-->
<!--                        :page-sizes="[10, 20, 30, 40]"-->
<!--                        :total="pagination.total"-->
<!--                        layout="total, sizes, prev, pager, next, jumper"-->
<!--                        @current-change="currentChange"-->
<!--                        @size-change="sizeChange"-->
<!--                    >-->
<!--                    </el-pagination>-->
<!--                </div>-->
<!--            </template>-->
<!--        </TableCard>-->
        <Add ref="mandateModal" @refresh="getTableData"></Add>
  <div class="flex_column">
    <div>
      <div v-if="isDepartment" style="display: flex;justify-content: space-between;margin-bottom: 10px">
        <el-button size="small" type="primary" @click="getTableData">刷新</el-button>
        <el-button size="small" type="primary" icon="el-icon-plus" @click="openDialog">新增</el-button>
      </div>
      <lims-table :tableData="tableData" :column="columnData"
                  @pagination="page" :height="'calc(100vh - 18em)'"
                  :page="pagination" :tableLoading="loading"></lims-table>
    </div>
    <Add ref="mandateModal" @refresh="getTableData"></Add>
  </div>
</template>
<script>
// import Add from "./Add.vue"
import Add from "../components/mandateAdd.vue"
import limsTable from "@/components/Table/lims-table.vue";
import {
  deletePersonPostAuthorizationRecord, exportPersonPostAuthorizationRecord,
  PersonPostAuthorizationRecordPage
} from "@/api/cnas/personal/personPostAuthorizationRecord";
import {delCustomById} from "@/api/system/customer";
export default {
    components: {
        // Add
    },
  components: {
    limsTable,
    Add
  },
  props: {
    departId: {
      type: Number,
@@ -54,223 +38,141 @@
      default: false
    }
  },
    data() {
        return {
            // departId: 0,
            columnData: [
                {
                    label: '序号',
                    prop: 'id'
                }, {
                    label: '证书编号',
                    prop: 'certificateNumber'
                }, {
                    label: '被任职人员',
                    prop: 'userName'
                }, {
                    label: '任职岗位',
                    prop: 'post'
                }, {
                    label: '理论考试成绩',
                    prop: 'num1'
                },{
                    label: '操作技能考试成绩',
                    prop: 'num2'
                },{
                    label: '操作时间',
                    prop: 'updateTime'
                }, {
                    label: '备注',
                    prop: 'remarks',
                    width: 300
                }, {
                    label: '操作',
                    dataType: 'action',
                    width: 160,
                fixed: 'right',
                    operation: [
                        {
                            name: '编辑',
                            type: 'text',
                            clickFun: (row) => {
                                this.openDialog(row, true)
                            }
                        }, {
                            name: '下载',
                            type: 'text',
                            clickFun: (row) => {
                                this.handleDown(row)
                            }
                        }, {
                            name: '删除',
                            type: 'text',
                            color: '#f56c6c',
                            clickFun: (row) => {
                                this.deleteNotify(row.id)
                            }
                        }
                    ]
                },
            ],
            tableData: [],
            pagination: {
                current: 1,
                pageSize: 20,
                total: 0
            },
            loading: false
        }
    },
    mounted() {
      this.getTableData()
        console.log(this.departId)
    },
    methods: {
        openDialog(row, type=false) {
            this.$refs.mandateModal.openDialog(row, type)
        },
        /**
         * @desc æŸ¥è¯¢è¡¨æ ¼æ•°æ®
         */
        async getTableData() {
            this.loading = true
          const params = this.isDepartment ? {
            departLimsId: this.departId,
            current: this.pagination.current,
            size: this.pagination.pageSize
          } : {
            userId: this.departId,
            current: this.pagination.current,
            size: this.pagination.pageSize
          }
            const { code, data } = await this.$axios({
                method: 'get',
                url: getPersonPostAuthorizationRecordPage,
                params: params
            })
            if(code == 200) {
                this.pagination.total = data.total
                this.tableData = data.records
                this.loading = false
            }
        },
        /**
         * @desc å½“前页改变
         */
        currentChange(current) {
            this.pagination.current = current
            this.getTableData()
        },
        /**
         * @desc æ¯é¡µä¸ªæ•°æ”¹å˜
         */
        sizeChange(pageSize) {
            this.pagination.pageSize = pageSize
            this.getTableData()
        },
        /**
         * @desc åˆ é™¤ä»»èŒè®°å½•
         */
        deleteNotify(id) {
            this.$confirm('此操作将永久删除该文件, æ˜¯å¦ç»§ç»­?', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(() => {
                this.delMandate(id)
            })
        },
        /**
         * @desc api删除
         */
        async delMandate(id) {
            const formData = new FormData()
            formData.append('id', id)
            const { code, data } = await this.$axios({
                method: 'delete',
                url: deletePersonPostAuthorizationRecord,
                data: formData,
                noQs: true
            })
            if(code == 200) {
                this.$message({ message: '删除成功', type: 'success' })
                this.getTableData()
            } else {
                this.$message({ message: '删除失败', type: 'error' })
            }
        },
        /**
         * @desc èŽ·å–è®¾å¤‡id
         */
        getDepart(id) {
            this.departId = id
            this.getTableData()
        },
        handleDown(row){
          this.$axios.post(this.$api.personPostAuthorizationRecord.exportPersonPostAuthorizationRecord,{id:row.id},{responseType: "blob"}).then(res => {
            if(res.code == 201){
              this.$message.error(res.message)
              return
            }
            const blob = new Blob([res],{ type: 'application/octet-stream' });
            //将Blob å¯¹è±¡è½¬æ¢æˆå­—符串
            let reader = new FileReader();
            reader.readAsText(blob, 'utf-8');
            reader.onload = () => {
              try {
                let result = JSON.parse(reader.result);
                if (result.message) {
                  this.$message.error(result.message);
                } else {
                  const url = URL.createObjectURL(blob);
                  const link = document.createElement('a');
                  link.href = url;
                  link.download = '任职授权-'+row.certificateNumber+'-'+row.post + '.docx';
                  link.click();
                  this.$message.success('导出成功')
                }
              } catch (err) {
                console.log(err);
                const url = URL.createObjectURL(blob);
                const link = document.createElement('a');
                link.href = url;
                link.download = '任职授权-'+row.certificateNumber+'-'+row.post + '.docx';
                link.click();
                this.$message.success('导出成功')
  data() {
    return {
      columnData: [
        {
          label: '序号',
          prop: 'id'
        }, {
          label: '证书编号',
          prop: 'certificateNumber'
        }, {
          label: '被任职人员',
          prop: 'userName'
        }, {
          label: '任职岗位',
          prop: 'post'
        }, {
          label: '理论考试成绩',
          prop: 'num1',
          width: 120
        },{
          label: '操作技能考试成绩',
          prop: 'num2',
          width: 150
        },{
          label: '操作时间',
          prop: 'updateTime'
        }, {
          label: '备注',
          prop: 'remarks',
          width: 300
        }, {
          label: '操作',
          dataType: 'action',
          width: 160,
          fixed: 'right',
          operation: [
            {
              name: '编辑',
              type: 'text',
              clickFun: (row) => {
                this.openDialog(row, true)
              }
            }, {
              name: '下载',
              type: 'text',
              clickFun: (row) => {
                this.handleDown(row)
              }
            }, {
              name: '删除',
              type: 'text',
              color: '#f56c6c',
              clickFun: (row) => {
                this.deleteNotify(row.id)
              }
            }
          })
        }
          ]
        },
      ],
      tableData: [],
      pagination: {
        current: 1,
        size: 20,
        total: 0
      },
      loading: false
    }
  },
  mounted() {
    this.getTableData()
  },
  methods: {
    openDialog(row, type=false) {
      this.$refs.mandateModal.openDialog(row, type)
    },
//   watch: {
//     departId: {
//       handler(newId, oldId) {
//         if (newId) {
//           this.getTableData();
//         }
//       }
//     }
//   }
    /**
     * @desc æŸ¥è¯¢è¡¨æ ¼æ•°æ®
     */
    async getTableData() {
      const params = this.isDepartment ? {
        departLimsId: this.departId,
        current: this.pagination.current,
        size: this.pagination.pageSize
      } : {
        userId: this.departId,
        current: this.pagination.current,
        size: this.pagination.pageSize
      }
      this.loading = true
      PersonPostAuthorizationRecordPage(params).then(res => {
        this.loading = false
        this.tableData = res.data.records
        this.pagination.total = res.data.total
      }).catch(err => {
        this.loading = false
      })
    },
    page (page) {
      this.pagination.size = page.limit
      this.getTableData()
    },
    /**
     * @desc åˆ é™¤ä»»èŒè®°å½•
     */
    deleteNotify(id) {
      this.$confirm('是否删除当前数据?', "警告", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      }).then(() => {
        deletePersonPostAuthorizationRecord({id: id}).then(res => {
          this.$message.success('删除成功')
          this.getTableData()
        }).catch(e => {
          this.$message.error('删除失败')
        })
      }).catch(() => {})
    },
    handleDown(row){
      exportPersonPostAuthorizationRecord({id:row.id}).then(res => {
        const blob = new Blob([res],{ type: 'application/octet-stream' });
        this.$download.saveAs(blob, '任职授权-'+row.certificateNumber+'-'+row.post + '.docx')
      })
    }
  },
  watch: {
    departId: {
      handler(newId, oldId) {
        if (newId) {
          this.getTableData();
        }
      }
    }
  }
}
</script>
<style scoped>
.flex_column {
    display: flex;
    flex-direction: column;
    justify-content: space-between;
}
.w100 {
    width: 100%;
}
.pagination {
    display: flex;
    justify-content: space-between
}
.items_center {
    display: flex;
    align-items: center;
}
.justify_between {
    justify-content: space-between
}
</style>