spring
2025-02-24 d351fa25471f4e9b5d276895c39ec0fac5eb51b9
内审管理搬迁
已修改3个文件
已添加15个文件
4000 ■■■■■ 文件已修改
src/api/cnas/systemManagement/internalAuditManagement.js 398 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Table/lims-table.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/correctiveAction/index.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/customerSatisfaction/index.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/internalAuditManagement/components/ViewTestRecord.vue 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/internalAuditManagement/components/auditInspection.vue 254 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/internalAuditManagement/components/auditInspectionDia.vue 231 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/internalAuditManagement/components/auditMeetingSign.vue 202 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/internalAuditManagement/components/auditMeetingSignDia.vue 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/internalAuditManagement/components/auditReport.vue 312 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/internalAuditManagement/components/auditReportDia.vue 333 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/internalAuditManagement/components/correctiveAction.vue 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/internalAuditManagement/components/correctiveActionDIa.vue 409 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/internalAuditManagement/components/implementPlanDia.vue 307 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/internalAuditManagement/components/implementationPlan.vue 292 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/internalAuditManagement/components/yearPlan.vue 314 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/internalAuditManagement/components/yearPlanDia.vue 342 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/internalAuditManagement/index.vue 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/cnas/systemManagement/internalAuditManagement.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,398 @@
// å†…审管理相关接口
import request from "@/utils/request";
//年度计划-分页
export function pageInternalPlan(query) {
  return request({
    url: "/internalPlan/pageInternalPlan",
    method: "get",
    params: query,
  });
}
//年度计划-删除
export function delInternalPlan(query) {
  return request({
    url: "/internalPlan/delInternalPlan",
    method: "delete",
    params: query,
  });
}
//年度计划-导出
export function exportInternalPlan(query) {
  return request({
    url: "/internalPlan/exportInternalPlan",
    method: "get",
    headers: {
      responseType: "blob",
    },
    params: query,
  });
}
//年度计划详情
export function getInternalPlanOne(query) {
  return request({
    url: "/internalPlan/getInternalPlanOne",
    method: "get",
    params: query,
  });
}
// å¹´åº¦è®¡åˆ’-新增
export function addInternalPlan(data) {
  return request({
    url: "/internalPlan/addInternalPlan",
    method: "post",
    data: data,
  });
}
// å¹´åº¦è®¡åˆ’-修改
export function updateInternalPlan(data) {
  return request({
    url: "/internalPlan/updateInternalPlan",
    method: "post",
    data: data,
  });
}
// å¹´åº¦è®¡åˆ’-审核
export function examineInternalPlan(data) {
  return request({
    url: "/internalPlan/examineInternalPlan",
    method: "post",
    data: data,
  });
}
// å¹´åº¦è®¡åˆ’-批准
export function ratifyInternalPlan(data) {
  return request({
    url: "/internalPlan/ratifyInternalPlan",
    method: "post",
    data: data,
  });
}
//内审实施计划分页查询
export function pageInternalImplement(query) {
  return request({
    url: "/internalImplement/pageInternalImplement",
    method: "get",
    params: query,
  });
}
//内审实施计划删除
export function delInternalImplement(query) {
  return request({
    url: "/internalImplement/delInternalImplement",
    method: "delete",
    params: query,
  });
}
//导出内审实施计划
export function exportInternalImplement(query) {
  return request({
    url: "/internalImplement/exportInternalImplement",
    method: "get",
    headers: {
      responseType: "blob",
    },
    params: query,
  });
}
//内审实施计划详情
export function getInternalImplementOne(query) {
  return request({
    url: "/internalImplement/getInternalImplementOne",
    method: "get",
    params: query,
  });
}
// å†…审实施计划新增
export function addInternalImplement(data) {
  return request({
    url: "/internalImplement/addInternalImplement",
    method: "post",
    data: data,
  });
}
// å†…审实施计划修改
export function updateInternalImplement(data) {
  return request({
    url: "/internalImplement/updateInternalImplement",
    method: "post",
    data: data,
  });
}
// å†…审实施计划修改
export function ratifyInternalImplement(data) {
  return request({
    url: "/internalImplement/ratifyInternalImplement",
    method: "post",
    data: data,
  });
}
//会议签到查询
export function pageInternalMeeting(query) {
  return request({
    url: "/internalMeeting/pageInternalMeeting",
    method: "get",
    params: query,
  });
}
// ä¼šè®®ç­¾åˆ°åˆ é™¤
export function delInternalMeeting(query) {
  return request({
    url: "/internalMeeting/delInternalMeeting",
    method: "delete",
    params: query,
  });
}
//导出内审会议
export function exportInternalMeeting(query) {
  return request({
    url: "/internalMeeting/exportInternalMeeting",
    method: "get",
    headers: {
      responseType: "blob",
    },
    params: query,
  });
}
//会议签到查询详情
export function getInternalMeetingOne(query) {
  return request({
    url: "/internalMeeting/getInternalMeetingOne",
    method: "get",
    params: query,
  });
}
// æ–°å¢žä¼šè®®ç­¾åˆ°
export function addInternalMeeting(data) {
  return request({
    url: "/internalMeeting/addInternalMeeting",
    method: "post",
    data: data,
  });
}
// ä¼šè®®ç­¾åˆ°ä¿®æ”¹
export function updateInternalMeeting(data) {
  return request({
    url: "/internalMeeting/updateInternalMeeting",
    method: "post",
    data: data,
  });
}
//内审检查分页查询
export function pageInternalCheck(query) {
  return request({
    url: "/internalCheck/pageInternalCheck",
    method: "get",
    params: query,
  });
}
//内审检查删除
export function delInternalCheck(query) {
  return request({
    url: "/internalCheck/delInternalCheck",
    method: "delete",
    params: query,
  });
}
//导出内审检查
export function exportInternalCheck(query) {
  return request({
    url: "/internalCheck/exportInternalCheck",
    method: "get",
    headers: {
      responseType: "blob",
    },
    params: query,
  });
}
//内审检查详情
export function getInternalCheckOne(query) {
  return request({
    url: "/internalCheck/getInternalCheckOne",
    method: "get",
    params: query,
  });
}
// å†…审检查新增
export function addInternalCheck(data) {
  return request({
    url: "/internalCheck/addInternalCheck",
    method: "post",
    data: data,
  });
}
// å†…审检查修改
export function updateInternalCheck(data) {
  return request({
    url: "/internalCheck/updateInternalCheck",
    method: "post",
    data: data,
  });
}
// å†…审检查批准
export function ratifyInternalCheck(data) {
  return request({
    url: "/internalCheck/ratifyInternalCheck",
    method: "post",
    data: data,
  });
}
//查询内审管理纠正措施列表
export function pageInternalCorrect(query) {
  return request({
    url: "/internalCorrect/pageInternalCorrect",
    method: "get",
    params: query,
  });
}
//导出内审管理纠正措施附件
export function exportInternalCorrect(query) {
  return request({
    url: "/internalCorrect/exportInternalCorrect",
    method: "get",
    headers: {
      responseType: "blob",
    },
    params: query,
  });
}
//查询内审管理纠正处理详情
export function getInternalCorrect(query) {
  return request({
    url: "/internalCorrect/getInternalCorrect",
    method: "get",
    params: query,
  });
}
// æäº¤å†…审管理纠正措施列表
export function addInternalCorrect(data) {
  return request({
    url: "/internalCorrect/addInternalCorrect",
    method: "post",
    data: data,
  });
}
//内审报告删除
export function delInternalReport(query) {
  return request({
    url: "/internalReport/delInternalReport",
    method: "delete",
    params: query,
  });
}
//内审报告分页查询
export function pageInternalReport(query) {
  return request({
    url: "/internalReport/pageInternalReport",
    method: "get",
    params: query,
  });
}
//导出内审报告
export function exportInternalReport(query) {
  return request({
    url: "/internalReport/exportInternalReport",
    method: "get",
    headers: {
      responseType: "blob",
    },
    params: query,
  });
}
//内审报告详情
export function getInternalReportOne(query) {
  return request({
    url: "/internalReport/getInternalReportOne",
    method: "get",
    params: query,
  });
}
// å†…审报告新增
export function addInternalReport(data) {
  return request({
    url: "/internalReport/addInternalReport",
    method: "post",
    data: data,
  });
}
// å†…审报告修改
export function updateInternalReport(data) {
  return request({
    url: "/internalReport/updateInternalReport",
    method: "post",
    data: data,
  });
}
// å†…审报告审核
export function examineInternalReport(data) {
  return request({
    url: "/internalReport/examineInternalReport",
    method: "post",
    data: data,
  });
}
// å†…审报告负责人填写
export function qualityInternalReport(data) {
  return request({
    url: "/internalReport/qualityInternalReport",
    method: "post",
    data: data,
  });
}
//查询内审管理纠正措施附件
export function getInternalCorrectFileList(query) {
  return request({
    url: "/internalCorrect/getInternalCorrectFileList",
    method: "get",
    params: query,
  });
}
//删除内审管理纠正措施附件
export function delInternalCorrectFile(query) {
  return request({
    url: "/internalCorrect/delInternalCorrectFile",
    method: "delete",
    params: query,
  });
}
src/components/Table/lims-table.vue
@@ -268,7 +268,7 @@
      row.forEach((a) => {
        count += a.name.length;
      });
      return count * 15 + 60 + "px";
      return count * 15 + 70 + "px";
    },
    iconFn(row) {
      if (row.name === "编辑" || row.name === "修改") {
src/views/CNAS/systemManagement/correctiveAction/index.vue
@@ -15,7 +15,8 @@
        <TableCard :showForm="false" :showTitle="false">
          <template v-slot:table>
            <limsTable :column="tableColumn" :height="'calc(100vh - 17em)'" :table-data="tableData"
              :table-loading="tableLoading" style="padding: 0 15px;margin-bottom: 16px" @pagination="pagination">
              :table-loading="tableLoading" style="padding: 0 15px;margin-bottom: 16px" @pagination="pagination"
              :page="page">
            </limsTable>
          </template>
        </TableCard>
src/views/CNAS/systemManagement/customerSatisfaction/index.vue
@@ -34,7 +34,8 @@
          <TableCard :showForm="false" :showTitle="false">
            <template v-slot:table>
              <limsTable :column="tableColumn" :height="'calc(100vh - 22em)'" :table-data="tableData"
                :table-loading="tableLoading" style="padding: 0 15px;margin-bottom: 16px" @pagination="pagination">
                :table-loading="tableLoading" style="padding: 0 15px;margin-bottom: 16px" @pagination="pagination"
                :page="page">
              </limsTable>
            </template>
          </TableCard>
src/views/CNAS/systemManagement/internalAuditManagement/components/ViewTestRecord.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,176 @@
<template>
  <div>
    <el-dialog :visible.sync="filesDialogVisible" title="附件" width="80%" @closed="closeFilesLook">
      <div style="display: flex;justify-content: space-between;">
        <el-upload ref='upload' :action="fileAction" :auto-upload="true" :before-upload="fileBeforeUpload"
          :data="{ correctId: info.correctId }" :headers="uploadHeader" :on-error="onError"
          :on-success="handleSuccessUp" :show-file-list="false"
          accept='.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip,.rar' style="width: 80px !important;">
          <el-button size="small" style="height: 38px" type="primary">附件上传</el-button>
        </el-upload>
      </div>
      <div>
        <limsTable ref="yearTable" :column="columnData" :height="'calc(100vh - 30em)'" :highlightCurrentRow="true"
          :table-data="tableData" :table-loading="tableLoading" style="margin-top: 0.5em;" :page="page">
        </limsTable>
      </div>
    </el-dialog>
    <el-dialog :visible.sync="lookDialogVisible" fullscreen title="查看附件" top="5vh" width="800px">
      <filePreview v-if="lookDialogVisible" :currentFile="{}" :fileUrl="javaApi + '/word/' + currentInfo.fileUrl"
        style="height: 90vh;overflow-y: auto;" />
    </el-dialog>
  </div>
</template>
<script>
import limsTable from "@/components/Table/lims-table.vue";
import filePreview from '@/components/Preview/filePreview.vue'
import {
  getInternalCorrectFileList,
  delInternalCorrectFile,
} from '@/api/cnas/systemManagement/internalAuditManagement.js'
export default {
  name: 'ViewTestRecord',
  // import å¼•入的组件需要注入到对象中才能使用
  components: { filePreview, limsTable },
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      filesDialogVisible: false,
      tableLoading: false,
      filesLookInfo: {},
      columnData: [
        {
          label: '文件名称',
          prop: 'fileName',
          minWidth: '150px'
        },
        {
          dataType: 'action',
          minWidth: '100',
          label: '操作',
          fixed: 'right',
          operation: [
            {
              name: '预览',
              type: 'text',
              clickFun: (row) => {
                this.handleLook(row)
              }
            },
            {
              name: '下载',
              type: 'text',
              clickFun: (row) => {
                this.upload(row)
              }
            },
            {
              name: '删除',
              type: 'text',
              color: '#f56c6c',
              clickFun: (row) => {
                this.delete(row)
              }
            }
          ]
        }
      ],
      tableData: [],
      info: {},
      currentInfo: {},
      lookDialogVisible: false,
      page: {
        total: 0,
        size: -1,
        current: -1,
      },
    };
  },
  // æ–¹æ³•集合
  methods: {
    openDia(row) {
      this.filesDialogVisible = true
      this.info = row
      this.searchTableList()
    },
    // æŸ¥è¯¢é™„件列表
    searchTableList() {
      this.tableLoading = true
      getInternalCorrectFileList({ correctId: this.info.correctId }).then(res => {
        this.tableLoading = false
        if (res.code === 201) return
        this.tableData = res.data
      }).catch(err => {
        this.tableLoading = false
        console.log('err---', err);
      })
    },
    closeFilesLook() {
      this.filesDialogVisible = false
    },
    // æŸ¥çœ‹æ–‡ä»¶
    handleLook(row) {
      this.currentInfo = row
      this.lookDialogVisible = true
    },
    // ä¸‹è½½
    upload(row) {
      let url = '';
      if (row.type == 1) {
        url = this.javaApi + '/img/' + row.fileUrl
        this.$download.saveAs(url, row.fileName)
      } else {
        url = this.javaApi + '/word/' + row.fileUrl
        this.$download.saveAs(url, row.fileName)
      }
    },
    // åˆ é™¤
    delete(row) {
      this.tableLoading = true
      delInternalCorrectFile({ correctFileId: row.correctFileId }).then(res => {
        this.tableLoading = false
        if (res.code === 201) return
        this.$message.success('删除成功')
        this.searchTableList()
      }).catch(err => {
        this.tableLoading = false
        console.log('err---', err);
      })
    },
    // ä¸Šä¼ éªŒè¯
    fileBeforeUpload(file) {
      let flag = true
      if (file.size > 1024 * 1024 * 10) {
        this.$message.error('上传文件不超过10M');
        this.$refs.upload.clearFiles()
        flag = false
      }
      if (!flag) {
        return Promise.reject(flag); //正确的终止
      }
    },
    onError(err, file, fileList, type) {
      this.$message.error('上传失败')
      this.$refs.upload.clearFiles()
    },
    handleSuccessUp(response,) {
      this.upLoading = false;
      if (response.code == 200) {
        this.$message.success('上传成功');
        this.searchTableList()
      } else {
        this.$message.error(response.message);
      }
    },
  },
  computed: {
    fileAction() {
      return this.javaApi + '/internalCorrect/uploadInternalCorrectFile'
    }
  },
};
</script>
<style scoped></style>
src/views/CNAS/systemManagement/internalAuditManagement/components/auditInspection.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,254 @@
<template>
  <div>
    <div class="search-background">
      <span class="search-group">
        <span style="width: 160px">受审部门:</span>
        <el-input v-model="searchForm.department" clearable size="small"></el-input>
        <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">重 ç½®</el-button>
        <el-button size="medium" type="primary" @click="searchList">查 è¯¢</el-button>
      </span>
      <span class="search-group">
        <el-button size="medium" type="primary" @click="openFormDia('add')">新 å¢ž</el-button>
      </span>
    </div>
    <div class="table">
      <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData"
        :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" :page="page" @pagination="pagination">
      </limsTable>
    </div>
    <audit-inspection-dia v-if="auditInspectionDia" ref="auditInspectionDia"
      @closeImplementDia="closeImplementDia"></audit-inspection-dia>
  </div>
</template>
<script>
import limsTable from "@/components/Table/lims-table.vue";
import AuditInspectionDia from './auditInspectionDia.vue';
import {
  pageInternalCheck,
  delInternalCheck,
  exportInternalCheck
} from '@/api/cnas/systemManagement/internalAuditManagement.js'
export default {
  name: 'auditInspection',
  // import å¼•入的组件需要注入到对象中才能使用
  components: { AuditInspectionDia, limsTable },
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      searchForm: {
        department: '',
      },
      tableColumn: [
        {
          label: '受审部门',
          prop: 'department',
        },
        {
          label: '部门负责人',
          prop: 'departmentHead',
        },
        {
          label: '审核员',
          prop: 'auditor',
        },
        {
          label: '审核日期',
          prop: 'reviewDate',
        }, {
          dataType: 'tag',
          label: '批准状态',
          prop: 'ratifyStatus',
          minWidth: '100',
          formatData: (params) => {
            if (params === 0) {
              return '不批准';
            } else if (params === 1) {
              return '批准';
            } else {
              return null;
            }
          },
          formatType: (params) => {
            if (params === 0) {
              return 'danger';
            } else if (params === 1) {
              return 'success';
            } else {
              return null;
            }
          }
        }, {
          label: '批准内容',
          prop: 'ratifyRemark',
          minWidth: '140'
        },
        {
          dataType: 'action',
          minWidth: '220',
          label: '操作',
          operation: [
            {
              name: '导出',
              type: 'text',
              clickFun: (row) => {
                this.handleDown(row)
              },
              disabled: (row) => {
                if (row.ratifyStatus === 1) {
                  return false
                } else {
                  return true
                }
              },
            },
            {
              name: '编辑',
              type: 'text',
              clickFun: (row) => {
                this.openFormDia('edit', row);
              },
              disabled: (row) => {
                if (row.ratifyStatus === 1) {
                  return true
                } else {
                  return false
                }
              },
            },
            {
              name: '批准',
              type: 'text',
              clickFun: (row) => {
                this.openFormDia('ratify', row);
              },
              disabled: (row) => {
                if (row.ratifyStatus === 1) {
                  return true
                } else {
                  return false
                }
              },
            },
            {
              name: '删除',
              type: 'text',
              color: '#f56c6c',
              clickFun: (row) => {
                this.delPlan(row)
              },
              disabled: (row) => {
                if (row.ratifyStatus === 1) {
                  return true
                } else {
                  return false
                }
              },
            }
          ]
        }
      ],
      tableData: [],
      tableLoading: false,
      page: {
        size: 20,
        current: 1,
        total: 0,
      },
      auditInspectionDia: false
    };
  },
  mounted() {
    this.searchList()
  },
  // æ–¹æ³•集合
  methods: {
    // æŸ¥è¯¢åˆ—表
    searchList() {
      const entity = this.searchForm
      const page = this.page
      this.tableLoading = true
      pageInternalCheck({ ...entity, ...page }).then(res => {
        this.tableLoading = false
        if (res.code === 201) return
        this.tableData = res.data.records
        this.page.total = res.data.total
      }).catch(err => {
        console.log('err---', err);
        this.tableLoading = false
      })
    },
    // æ–°å¢žï¼Œç¼–辑,批准弹框
    openFormDia(type, row) {
      this.auditInspectionDia = true
      this.$nextTick(() => {
        this.$refs.auditInspectionDia.openDia(type, row)
      })
    },
    closeImplementDia() {
      this.auditInspectionDia = false
      this.searchList()
    },
    // é‡ç½®æŸ¥è¯¢æ¡ä»¶
    resetSearchForm() {
      this.searchForm.department = '';
      this.searchList()
    },
    // åˆ é™¤
    delPlan(row) {
      this.$confirm('此操作将永久删除该数据, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.tableLoading = true
        delInternalCheck({ checkId: row.checkId }).then(res => {
          this.tableLoading = false
          if (res.code === 201) return
          this.$message.success('删除成功')
          this.searchList()
        }).catch(err => {
          this.tableLoading = false
          console.log('err---', err);
        })
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        });
      });
    },
    // å¯¼å‡º
    handleDown(row) {
      exportInternalCheck({ checkId: row.checkId }).then(res => {
        this.outLoading = false
        this.$message.success('导出成功')
        const blob = new Blob([res], { type: 'application/msword' });
        this.$download.saveAs(blob, '内审检查' + '.docx');
      })
    },
    pagination({ page, limit }) {
      this.page.current = page;
      this.page.size = limit;
      this.searchList();
    },
  }
};
</script>
<style scoped>
.search-background {
  width: 100%;
  height: 60px;
  line-height: 60px;
  display: flex;
  justify-content: space-between;
}
.search-group {
  display: flex;
  align-items: center;
  margin: 0 20px;
}
</style>
src/views/CNAS/systemManagement/internalAuditManagement/components/auditInspectionDia.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,231 @@
<template>
  <div>
    <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false"
      :visible.sync="formDia" title="内部审核实施计划" width="80%" @close="closeImplementDia">
      <el-form ref="form" :model="form" :rules="rules" label-width="auto">
        <el-col :span="12">
          <el-form-item label="受审部门" prop="department">
            <el-input v-model="form.department" :disabled="operationType === 'ratify'" clearable
              size="small"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="部门负责人" prop="departmentHead">
            <el-input v-model="form.departmentHead" :disabled="operationType === 'ratify'" clearable
              size="small"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="审核员" prop="auditor">
            <el-input v-model="form.auditor" :disabled="operationType === 'ratify'" clearable size="small"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="审核日期" prop="reviewDate">
            <el-date-picker v-model="form.reviewDate" :disabled="operationType === 'ratify'" clearable
              format="yyyy-MM-dd" placeholder="选择日期" size="small" style="width: 100%" type="date"
              value-format="yyyy-MM-dd">
            </el-date-picker>
          </el-form-item>
        </el-col>
      </el-form>
      <div v-if="operationType !== 'ratify'" style="text-align: right;margin-bottom: 10px">
        <el-button size="small" type="primary" @click="addRow">添加</el-button>
        <el-button size="small" type="danger" @click="clearTable">清空</el-button>
      </div>
      <el-table :data="checkDetailList" border height="300" style="width: 100%">
        <el-table-column align="center" label="序号" type="index" width="60" />
        <el-table-column header-align="center" label="涉及要素和质量体系文件条款" prop="element">
          <template slot-scope="{row}">
            <el-input v-model="row.element" :disabled="operationType === 'ratify'" size="small" />
          </template>
        </el-table-column>
        <el-table-column header-align="center" label="审核内容" prop="content">
          <template slot-scope="{row}">
            <el-input v-model="row.content" :disabled="operationType === 'ratify'" size="small" />
          </template>
        </el-table-column>
        <el-table-column header-align="center" label="审核方式" prop="method">
          <template slot-scope="{row}">
            <el-input v-model="row.method" :disabled="operationType === 'ratify'" size="small" />
          </template>
        </el-table-column>
        <el-table-column header-align="center" label="审核结果记录" prop="resultRecords" width="180">
          <template slot-scope="{row}">
            <el-input v-model="row.resultRecords" :disabled="operationType === 'ratify'" size="small" />
          </template>
        </el-table-column>
        <el-table-column header-align="center" label="不符合性质" prop="nonNature" width="180">
          <template slot-scope="{row}">
            <el-input v-model="row.nonNature" :disabled="operationType === 'ratify'" size="small" />
          </template>
        </el-table-column>
      </el-table>
      <span slot="footer" class="dialog-footer">
        <el-button v-if="operationType === 'ratify'" :loading="loading" @click="ratify(0)">不批准</el-button>
        <el-button v-if="operationType === 'ratify'" :loading="loading" type="primary" @click="ratify(1)">批
          å‡†</el-button>
        <el-button v-if="operationType !== 'ratify'" @click="closeImplementDia">取 æ¶ˆ</el-button>
        <el-button v-if="operationType !== 'ratify'" :loading="loading" type="primary" @click="handleEdit">提
          äº¤</el-button>
      </span>
    </el-dialog>
    <el-dialog :visible.sync="approvalDialog" title="批准" width="30%" @close="approvalDialog = false">
      <span>
        æ‰¹å‡†å¤‡æ³¨ï¼š
        <el-input v-model="ratifyRemark" type="textarea"></el-input>
      </span>
      <span slot="footer" class="dialog-footer">
        <el-button :loading="approvalLoading" @click="approvalDialog = false">取 æ¶ˆ</el-button>
        <el-button :loading="approvalLoading" type="primary" @click="handleApproval(0)">ç¡® å®š</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import {
  getInternalCheckOne,
  addInternalCheck,
  updateInternalCheck,
  ratifyInternalCheck,
} from '@/api/cnas/systemManagement/internalAuditManagement.js'
export default {
  name: 'auditInspectionDia',
  // import å¼•入的组件需要注入到对象中才能使用
  components: {},
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      formDia: false,
      diaLoading: false,
      loading: false,
      form: {
        department: '',
        departmentHead: '',
        auditor: '',
        reviewDate: '',
      },
      rules: {
        department: [{ required: true, message: '请填写受审部门', trigger: 'blur' }],
        departmentHead: [{ required: true, message: '请填写部门负责人', trigger: 'blur' }],
        auditor: [{ required: true, message: '请填写审核员', trigger: 'blur' }],
        reviewDate: [{ required: true, message: '请填写审核日期', trigger: 'blur' }],
      },
      checkDetailList: [],
      operationType: '',
      approvalDialog: false,
      approvalLoading: false,
      ratifyRemark: '',
    };
  },
  // æ–¹æ³•集合
  methods: {
    // æ‰“开弹框
    openDia(type, row) {
      this.formDia = true
      this.operationType = type
      if (type !== 'add') {
        this.searchInfo(row)
      }
    },
    // æŸ¥è¯¢è¯¦æƒ…
    searchInfo(row) {
      this.diaLoading = true
      getInternalCheckOne({ checkId: row.checkId }).then(res => {
        this.diaLoading = false
        if (res.code === 201) return
        this.form = res.data
        this.checkDetailList = this.form.checkDetailList
      }).catch(err => {
        console.log(err)
        this.diaLoading = false
      })
    },
    // æäº¤å¼¹æ¡†æ•°æ®
    handleEdit() {
      this.$refs['form'].validate((valid) => {
        if (valid) {
          if (this.checkDetailList.length === 0) {
            this.$message.warning('请添加表格数据')
            return
          }
          this.loading = true
          const internalCheckDto = this.HaveJson(this.form)
          internalCheckDto.checkDetailList = this.HaveJson(this.checkDetailList)
          if (this.operationType === 'add') {
            addInternalCheck(internalCheckDto).then(res => {
              this.loading = false
              if (res.code === 201) return
              this.$message.success('操作成功')
              this.closeImplementDia()
            }).catch(err => {
              console.log('err---', err);
              this.loading = false
            })
          } else if (this.operationType === 'edit') {
            updateInternalCheck(internalCheckDto).then(res => {
              this.loading = false
              if (res.code === 201) return
              this.$message.success('操作成功')
              this.closeImplementDia()
            }).catch(err => {
              console.log('err---', err);
              this.loading = false
            })
          }
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    },
    ratify(ratifyStatus) {
      // ä¸æ‰¹å‡†éœ€è¦å¡«å†™æ‰¹å‡†å†…容
      if (ratifyStatus === 0) {
        this.approvalDialog = true
      } else {
        this.handleApproval(ratifyStatus)
      }
    },
    // æäº¤æ‰¹å‡†ä¿¡æ¯
    handleApproval(ratifyStatus) {
      this.approvalLoading = true
      const internalCheckDto = this.HaveJson(this.form)
      internalCheckDto.ratifyStatus = ratifyStatus
      internalCheckDto.ratifyRemark = ratifyStatus === 0 ? this.ratifyRemark : ''
      ratifyInternalCheck(internalCheckDto).then(res => {
        if (res.code === 200) {
          this.$message.success('提交成功!');
          this.approvalDialog = false
          this.closeImplementDia(this.departId);
        }
        this.approvalLoading = false
      }).catch(() => {
        this.approvalLoading = false
      })
    },
    // å¢žåŠ è¡¨æ ¼è¡Œæ•°æ®
    addRow() {
      this.checkDetailList.push({
        element: '',
        content: '',
        method: '',
        resultRecords: '',
        nonNature: '',
      })
    },
    // æ¸…空表格数据
    clearTable() {
      this.checkDetailList = []
    },
    closeImplementDia() {
      this.$refs.form.resetFields();
      this.formDia = false
      this.$emit('closeImplementDia')
    },
  }
};
</script>
<style scoped></style>
src/views/CNAS/systemManagement/internalAuditManagement/components/auditMeetingSign.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,202 @@
<template>
  <div>
    <div class="search-background">
      <span class="search-group">
        <span style="width: 160px">时间:</span>
        <el-input v-model="searchForm.meetingDate" clearable size="small"></el-input>
        <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">重 ç½®</el-button>
        <el-button size="medium" type="primary" @click="searchList">查 è¯¢</el-button>
      </span>
      <span class="search-group">
        <el-button size="medium" type="primary" @click="openFormDia('add')">新 å¢ž</el-button>
      </span>
    </div>
    <div class="table">
      <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData"
        :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" :page="page" @pagination="pagination">
      </limsTable>
    </div>
    <audit-meeting-sign-dia v-if="auditMeetingSignDia" ref="auditMeetingSignDia"
      @closeYearDia="closeYearDia"></audit-meeting-sign-dia>
  </div>
</template>
<script>
import limsTable from "@/components/Table/lims-table.vue";
import AuditMeetingSignDia from './auditMeetingSignDia.vue';
import {
  pageInternalMeeting,
  delInternalMeeting,
  exportInternalMeeting,
} from '@/api/cnas/systemManagement/internalAuditManagement.js'
export default {
  name: 'auditMeetingSign',
  // import å¼•入的组件需要注入到对象中才能使用
  components: { AuditMeetingSignDia, limsTable },
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      searchForm: {
        meetingDate: '',
      },
      tableColumn: [
        {
          label: '时间',
          prop: 'meetingDate',
          minWidth: '100'
        },
        {
          label: '主持人',
          prop: 'compere',
          minWidth: '100'
        },
        {
          label: '地点',
          prop: 'place',
          minWidth: '100'
        },
        {
          label: '会议主题',
          prop: 'subject',
          minWidth: '100'
        },
        {
          label: '参会人员',
          prop: 'participantName',
          minWidth: '120'
        },
        {
          dataType: 'action',
          fixed: 'right',
          minWidth: '220',
          label: '操作',
          operation: [
            {
              name: '导出',
              type: 'text',
              clickFun: (row) => {
                this.handleDown(row)
              }
            },
            {
              name: '编辑',
              type: 'text',
              clickFun: (row) => {
                this.openFormDia('edit', row);
              },
            },
            {
              name: '删除',
              type: 'text',
              color: '#f56c6c',
              clickFun: (row) => {
                this.delPlan(row)
              }
            }
          ]
        }
      ],
      tableData: [],
      tableLoading: false,
      page: {
        size: 20,
        current: 1,
        total: 0,
      },
      auditMeetingSignDia: false,
    };
  },
  mounted() {
    this.searchList()
  },
  // æ–¹æ³•集合
  methods: {
    // æŸ¥è¯¢åˆ—表
    searchList() {
      const entity = this.searchForm
      const page = this.page
      this.tableLoading = true
      pageInternalMeeting({ ...entity, ...page }).then(res => {
        this.tableLoading = false
        if (res.code === 201) return
        this.tableData = res.data.records
        this.page.total = res.data.total
      }).catch(err => {
        console.log('err---', err);
        this.tableLoading = false
      })
    },
    // æ–°å¢žï¼Œç¼–辑弹框
    openFormDia(type, row) {
      this.auditMeetingSignDia = true
      this.$nextTick(() => {
        this.$refs.auditMeetingSignDia.openDia(type, row)
      })
    },
    closeYearDia() {
      this.auditMeetingSignDia = false
      this.searchList()
    },
    // é‡ç½®æŸ¥è¯¢æ¡ä»¶
    resetSearchForm() {
      this.searchForm.meetingDate = '';
      this.searchList()
    },
    // åˆ é™¤
    delPlan(row) {
      this.$confirm('此操作将永久删除该数据, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.tableLoading = true
        delInternalMeeting({ meetingId: row.meetingId }).then(res => {
          this.tableLoading = false
          if (res.code === 201) return
          this.$message.success('删除成功')
          this.searchList()
        }).catch(err => {
          this.tableLoading = false
          console.log('err---', err);
        })
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        });
      });
    },
    // å¯¼å‡º
    handleDown(row) {
      exportInternalMeeting({ meetingId: row.meetingId }).then(res => {
        this.outLoading = false
        this.$message.success('导出成功')
        const blob = new Blob([res], { type: 'application/msword' });
        this.$download.saveAs(blob, '内审会议签到' + '.docx');
      })
    },
    pagination({ page, limit }) {
      this.page.current = page;
      this.page.size = limit;
      this.searchList();
    },
  }
};
</script>
<style scoped>
.search-background {
  width: 100%;
  height: 60px;
  line-height: 60px;
  display: flex;
  justify-content: space-between;
}
.search-group {
  display: flex;
  align-items: center;
  margin: 0 20px;
}
</style>
src/views/CNAS/systemManagement/internalAuditManagement/components/auditMeetingSignDia.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,183 @@
<template>
  <div>
    <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false"
      :visible.sync="formDia" title="内审会议签到表" width="1000px" @close="closeYearDia">
      <el-form ref="form" :model="form" :rules="rules" label-position="top" label-width="auto">
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="时间" prop="meetingDate">
              <el-date-picker v-model="form.meetingDate" clearable format="yyyy-MM-dd HH:mm:ss" placeholder="请选择"
                size="small" style="width: 100%" type="datetime" value-format="yyyy-MM-dd HH:mm:ss">
              </el-date-picker>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="主持人" prop="compere">
              <el-input v-model="form.compere" clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="地点" prop="place">
              <el-input v-model="form.place" clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="会议主题" prop="subject">
              <el-input v-model="form.subject" clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="参会人员" prop="participant">
              <el-select v-model="form.participant" clearable filterable multiple placeholder="请选择" size="small"
                style="width: 100%;">
                <el-option v-for="(item, i) in personList" :key="i" :label="item.label" :value="item.value">
                </el-option>
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="closeYearDia">取 æ¶ˆ</el-button>
        <el-button :loading="loading" type="primary" @click="handleEdit">提 äº¤</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import {
  selectUserCondition,
} from "@/api/business/inspectionTask.js";
import {
  getInternalMeetingOne,
  addInternalMeeting,
  updateInternalMeeting,
} from '@/api/cnas/systemManagement/internalAuditManagement.js'
export default {
  name: 'auditMeetingSignDia',
  // import å¼•入的组件需要注入到对象中才能使用
  components: {},
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      formDia: false,
      diaLoading: false,
      loading: false,
      form: {
        meetingDate: '',
        compere: '',
        place: '',
        subject: '',
        participant: [],
      },
      rules: {
        meetingDate: [{ required: true, message: '请填写会议时间', trigger: 'blur' }],
        compere: [{ required: true, message: '请填写主持人', trigger: 'blur' }],
        place: [{ required: true, message: '请填写地点', trigger: 'blur' }],
        subject: [{ required: true, message: '请填写会议主题', trigger: 'blur' }],
        participant: [{ required: true, message: '请选择参加人员', trigger: 'change' }],
      },
      operationType: '',
      personList: []
    };
  },
  mounted() {
  },
  // æ–¹æ³•集合
  methods: {
    // æ‰“开弹框
    openDia(type, row) {
      this.formDia = true
      this.operationType = type
      this.getAuthorizedPerson()
      if (type !== 'add') {
        this.searchInfo(row)
      }
    },
    // æŸ¥è¯¢è¯¦æƒ…
    searchInfo(row) {
      this.diaLoading = true
      getInternalMeetingOne({ meetingId: row.meetingId }).then(res => {
        this.diaLoading = false
        if (res.code === 201) return
        this.form = res.data
        this.form.participant = this.form.participant.split(',').map(Number)
      }).catch(err => {
        console.log(err)
        this.diaLoading = false
      })
    },
    // æäº¤å¼¹æ¡†æ•°æ®
    handleEdit() {
      this.$refs['form'].validate((valid) => {
        if (valid) {
          this.loading = true
          const internalMeeting = this.HaveJson(this.form)
          internalMeeting.participant = internalMeeting.participant.join(',')
          if (this.operationType === 'add') {
            addInternalMeeting(internalMeeting).then(res => {
              this.loading = false
              if (res.code === 201) return
              this.$message.success('操作成功')
              this.closeYearDia()
            }).catch(err => {
              console.log('err---', err);
              this.loading = false
            })
          } else if (this.operationType === 'edit') {
            updateInternalMeeting(internalMeeting).then(res => {
              this.loading = false
              if (res.code === 201) return
              this.$message.success('操作成功')
              this.closeYearDia()
            }).catch(err => {
              console.log('err---', err);
              this.loading = false
            })
          }
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    },
    closeYearDia() {
      this.$refs.form.resetFields();
      this.formDia = false
      this.$emit('closeYearDia')
    },
    getAuthorizedPerson() {
      selectUserCondition().then(res => {
        let data = []
        res.data.forEach(a => {
          data.push({
            label: a.name,
            value: a.id
          })
        })
        this.personList = data
      })
    },
  }
};
</script>
<style scoped>
.table {
  table-layout: fixed;
  width: 100%;
  margin-top: 10px;
}
.table td {
  height: 34px;
  width: 100px;
  text-align: center;
  font-size: 14px;
  word-wrap: break-word;
  white-space: normal;
  padding: 4px;
}
</style>
src/views/CNAS/systemManagement/internalAuditManagement/components/auditReport.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,312 @@
<template>
  <div>
    <div class="search-background">
      <span class="search-group">
        <span style="width: 160px">审核目的:</span>
        <el-input v-model="searchForm.purposes" clearable size="small"></el-input>
        <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">重 ç½®</el-button>
        <el-button size="medium" type="primary" @click="searchList">查 è¯¢</el-button>
      </span>
      <span class="search-group">
        <el-button size="medium" type="primary" @click="openFormDia('add')">新 å¢ž</el-button>
      </span>
    </div>
    <div class="table">
      <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData"
        :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" :page="page" @pagination="pagination">
      </limsTable>
    </div>
    <audit-report-dia v-if="auditReportDia" ref="auditReportDia"
      @closeImplementDia="closeImplementDia"></audit-report-dia>
  </div>
</template>
<script>
import limsTable from "@/components/Table/lims-table.vue";
import AuditReportDia from './auditReportDia.vue';
import {
  delInternalReport,
  pageInternalReport,
  exportInternalReport,
} from '@/api/cnas/systemManagement/internalAuditManagement.js'
export default {
  name: 'auditReport',
  // import å¼•入的组件需要注入到对象中才能使用
  components: { AuditReportDia, limsTable },
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      searchForm: {
        purposes: '',
      },
      tableColumn: [
        {
          label: '审核目的',
          prop: 'purposes',
        },
        {
          label: '审核依据',
          prop: 'basis',
        },
        {
          label: '审核日期',
          prop: 'reviewDate',
        },
        {
          label: '审核方法',
          prop: 'method',
        },
        {
          label: '审核范围',
          prop: 'scope',
        },
        {
          label: '审核责任者',
          prop: 'responsible',
        },
        {
          label: '审核组长',
          prop: 'leader',
        },
        {
          label: '审核员',
          prop: 'auditor',
        },
        {
          label: '审核组分工情况',
          prop: 'division',
        },
        {
          dataType: 'tag',
          label: '审核状态',
          prop: 'examineStatus',
          minWidth: '100',
          formatData: (params) => {
            if (params === 0) {
              return '不通过';
            } else if (params === 1) {
              return '通过';
            } else {
              return null;
            }
          },
          formatType: (params) => {
            if (params === 0) {
              return 'danger';
            } else if (params === 1) {
              return 'success';
            } else {
              return null;
            }
          }
        },
        {
          label: '审核内容',
          prop: 'examineRemark',
          minWidth: '140'
        },
        {
          dataType: 'tag',
          label: '质量负责人状态',
          prop: 'qualityStatus',
          minWidth: '100',
          formatData: (params) => {
            if (params === 0) {
              return '不通过';
            } else if (params === 1) {
              return '通过';
            } else {
              return null;
            }
          },
          formatType: (params) => {
            if (params === 0) {
              return 'danger';
            } else if (params === 1) {
              return 'success';
            } else {
              return null;
            }
          }
        },
        {
          label: '质量负责人意见',
          prop: 'qualityRemark',
          minWidth: '140'
        },
        {
          dataType: 'action',
          minWidth: '220',
          fixed: 'right',
          label: '操作',
          operation: [
            {
              name: '导出',
              type: 'text',
              clickFun: (row) => {
                this.handleDown(row)
              }
            },
            {
              name: '编辑',
              type: 'text',
              clickFun: (row) => {
                this.openFormDia('edit', row);
              },
              disabled: (row) => {
                if (row.examineStatus === 1 || row.examineStatus === 1) {
                  return true
                } else {
                  return false
                }
              },
            },
            {
              name: '审核',
              type: 'text',
              clickFun: (row) => {
                this.openFormDia('examine', row);
              },
              disabled: (row) => {
                if (row.examineStatus === 1) {
                  return true
                } else {
                  return false
                }
              },
            },
            {
              name: '意见',
              type: 'text',
              clickFun: (row) => {
                this.openFormDia('ratify', row);
              },
              disabled: (row) => {
                if (row.qualityStatus === 1 || row.examineStatus === 0 || row.examineStatus === null) {
                  return true
                } else {
                  return false
                }
              },
            },
            {
              name: '删除',
              type: 'text',
              color: '#f56c6c',
              clickFun: (row) => {
                this.delPlan(row)
              },
              disabled: (row) => {
                if (row.qualityStatus === 1) {
                  return true
                } else {
                  return false
                }
              },
            }
          ]
        }
      ],
      tableData: [],
      tableLoading: false,
      page: {
        size: 20,
        current: 1,
        total: 0,
      },
      auditReportDia: false
    };
  },
  mounted() {
    this.searchList()
  },
  // æ–¹æ³•集合
  methods: {
    // æŸ¥è¯¢åˆ—表
    searchList() {
      const entity = this.searchForm
      const page = this.page
      this.tableLoading = true
      pageInternalReport({ ...entity, ...page }).then(res => {
        this.tableLoading = false
        if (res.code === 201) return
        this.tableData = res.data.records
        this.page.total = res.data.total
      }).catch(err => {
        console.log('err---', err);
        this.tableLoading = false
      })
    },
    // æ–°å¢žï¼Œç¼–辑,批准弹框
    openFormDia(type, row) {
      this.auditReportDia = true
      this.$nextTick(() => {
        this.$refs.auditReportDia.openDia(type, row)
      })
    },
    closeImplementDia() {
      this.auditReportDia = false
      this.searchList()
    },
    // é‡ç½®æŸ¥è¯¢æ¡ä»¶
    resetSearchForm() {
      this.searchForm.purposes = '';
      this.searchList()
    },
    // åˆ é™¤
    delPlan(row) {
      this.$confirm('此操作将永久删除该数据, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.tableLoading = true
        delInternalReport({ reportId: row.reportId }).then(res => {
          this.tableLoading = false
          if (res.code === 201) return
          this.$message.success('删除成功')
          this.searchList()
        }).catch(err => {
          this.tableLoading = false
          console.log('err---', err);
        })
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        });
      });
    },
    // å¯¼å‡º
    handleDown(row) {
      exportInternalReport({ reportId: row.reportId }).then(res => {
        this.outLoading = false
        this.$message.success('导出成功')
        const blob = new Blob([res], { type: 'application/msword' });
        this.$download.saveAs(blob, '内审报告' + '.docx');
      })
    },
    pagination({ page, limit }) {
      this.page.current = page;
      this.page.size = limit;
      this.searchList();
    },
  }
};
</script>
<style scoped>
.search-background {
  width: 100%;
  height: 60px;
  line-height: 60px;
  display: flex;
  justify-content: space-between;
}
.search-group {
  display: flex;
  align-items: center;
  margin: 0 20px;
}
</style>
src/views/CNAS/systemManagement/internalAuditManagement/components/auditReportDia.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,333 @@
<template>
  <div>
    <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false"
      :visible.sync="formDia" title="内部审核报告" width="80%" @close="closeImplementDia">
      <el-form ref="form" :model="form" :rules="rules" label-position="top" label-width="auto">
        <el-row :gutter="20">
          <el-col :span="24">
            <el-form-item label="审核目的" prop="purposes">
              <el-input v-model="form.purposes" :disabled="operationType === 'examine' || operationType === 'ratify'"
                clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="审核依据" prop="basis">
              <el-input v-model="form.basis" :disabled="operationType === 'examine' || operationType === 'ratify'"
                clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="审核日期" prop="reviewDate">
              <el-date-picker v-model="form.reviewDate"
                :disabled="operationType === 'examine' || operationType === 'ratify'" clearable format="yyyy-MM-dd"
                placeholder="选择日期" size="small" style="width: 100%" type="date" value-format="yyyy-MM-dd">
              </el-date-picker>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="审核方法" prop="method">
              <el-input v-model="form.method" :disabled="operationType === 'examine' || operationType === 'ratify'"
                clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="审核范围" prop="scope">
              <el-input v-model="form.scope" :disabled="operationType === 'examine' || operationType === 'ratify'"
                clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="审核责任者" prop="responsible">
              <el-input v-model="form.responsible" :disabled="operationType === 'examine' || operationType === 'ratify'"
                clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="审核组长" prop="leader">
              <el-input v-model="form.leader" :disabled="operationType === 'examine' || operationType === 'ratify'"
                clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="审核员" prop="auditor">
              <el-input v-model="form.auditor" :disabled="operationType === 'examine' || operationType === 'ratify'"
                clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="审核组分工情况" prop="division">
              <el-input v-model="form.division" :disabled="operationType === 'examine' || operationType === 'ratify'"
                clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="审核概况" prop="overview">
              <el-input v-model="form.overview" :disabled="operationType === 'examine' || operationType === 'ratify'"
                :rows="3" clearable size="small" type="textarea"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="内审组对中心管理体系的结论性评价" prop="conclusion">
              <el-input v-model="form.conclusion" :disabled="operationType === 'examine' || operationType === 'ratify'"
                :rows="3" clearable size="small" type="textarea"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="改进意见" prop="suggest">
              <el-input v-model="form.suggest" :disabled="operationType === 'examine' || operationType === 'ratify'"
                :rows="3" clearable size="small" type="textarea"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="预计受审核部门完成纠正措施所需时间" prop="actionDate">
              <el-input v-model="form.actionDate" :disabled="operationType === 'examine' || operationType === 'ratify'"
                :rows="3" clearable size="small" type="textarea"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="不符合情况整改总体跟进确认人" prop="followUser">
              <el-input v-model="form.followUser" :disabled="operationType === 'examine' || operationType === 'ratify'"
                :rows="3" clearable size="small" type="textarea"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="不符合情况整改总体跟进确认记录" prop="followRecord">
              <el-input v-model="form.followRecord"
                :disabled="operationType === 'examine' || operationType === 'ratify'" :rows="3" clearable size="small"
                type="textarea"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="本报告发放范围" prop="reportScope">
              <el-input v-model="form.reportScope" :disabled="operationType === 'examine' || operationType === 'ratify'"
                :rows="3" clearable size="small" type="textarea"></el-input>
            </el-form-item>
          </el-col>
          <el-col v-if="operationType === 'ratify'" :span="24">
            <el-form-item label="质量负责人意见" prop="qualityRemark">
              <el-input v-model="form.qualityRemark" :rows="3" clearable size="small" type="textarea"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button v-if="operationType === 'examine'" :loading="loading" @click="examine(0)">不通过</el-button>
        <el-button v-if="operationType === 'examine'" :loading="loading" type="primary" @click="examine(1)">通
          è¿‡</el-button>
        <el-button v-if="operationType === 'ratify'" :loading="loading" @click="handleApproval(0)">不批准</el-button>
        <el-button v-if="operationType === 'ratify'" :loading="loading" type="primary" @click="handleApproval(1)">批
          å‡†</el-button>
        <el-button v-if="operationType !== 'ratify' && operationType !== 'examine'" @click="closeImplementDia">取
          æ¶ˆ</el-button>
        <el-button v-if="operationType !== 'ratify' && operationType !== 'examine'" :loading="loading" type="primary"
          @click="handleEdit">提 äº¤</el-button>
      </span>
    </el-dialog>
    <el-dialog :visible.sync="examineDialog" title="审核" width="30%" @close="examineDialog = false">
      <span>
        å®¡æ ¸å¤‡æ³¨ï¼š
        <el-input v-model="examineRemark" type="textarea"></el-input>
      </span>
      <span slot="footer" class="dialog-footer">
        <el-button :loading="examineLoading" @click="examineDialog = false">取 æ¶ˆ</el-button>
        <el-button :loading="examineLoading" type="primary" @click="handleExamine(0)">ç¡® å®š</el-button>
      </span>
    </el-dialog>
    <el-dialog :visible.sync="approvalDialog" title="批准" width="30%" @close="approvalDialog = false">
      <span>
        æ‰¹å‡†å¤‡æ³¨ï¼š
        <el-input v-model="qualityRemark" type="textarea"></el-input>
      </span>
      <span slot="footer" class="dialog-footer">
        <el-button :loading="approvalLoading" @click="approvalDialog = false">取 æ¶ˆ</el-button>
        <el-button :loading="approvalLoading" type="primary" @click="handleApproval(0)">ç¡® å®š</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import {
  getInternalReportOne,
  addInternalReport,
  updateInternalReport,
  examineInternalReport,
  qualityInternalReport,
} from '@/api/cnas/systemManagement/internalAuditManagement.js'
export default {
  name: 'auditReportDia',
  // import å¼•入的组件需要注入到对象中才能使用
  components: {},
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      formDia: false,
      diaLoading: false,
      loading: false,
      form: {
        purposes: '',
        basis: '',
        reviewDate: '',
        method: '',
        scope: '',
        responsible: '',
        leader: '',
        auditor: '',
        division: '',
        overview: '',
        conclusion: '',
        suggest: '',
        actionDate: '',
        followUser: '',
        followRecord: '',
        reportScope: '',
        qualityRemark: '',
      },
      rules: {
        purposes: [{ required: true, message: '请填写审核目的', trigger: 'blur' }],
        basis: [{ required: true, message: '请填写审核依据', trigger: 'blur' }],
        reviewDate: [{ required: true, message: '请填写审核日期', trigger: 'change' }],
        method: [{ required: true, message: '请填写审核方法', trigger: 'blur' }],
        scope: [{ required: true, message: '请填写审核范围', trigger: 'blur' }],
        responsible: [{ required: true, message: '请填写审核责任者', trigger: 'blur' }],
        leader: [{ required: true, message: '请填写审核组长', trigger: 'blur' }],
        auditor: [{ required: true, message: '请填写审核员', trigger: 'blur' }],
        division: [{ required: true, message: '请填写审核组分工情况', trigger: 'blur' }],
        overview: [{ required: true, message: '请填写审核概况', trigger: 'blur' }],
        conclusion: [{ required: true, message: '请填写', trigger: 'blur' }],
        suggest: [{ required: true, message: '请填写', trigger: 'blur' }],
        actionDate: [{ required: true, message: '请填写', trigger: 'blur' }],
        followUser: [{ required: true, message: '请填写', trigger: 'blur' }],
        followRecord: [{ required: true, message: '请填写', trigger: 'blur' }],
        reportScope: [{ required: true, message: '请填写', trigger: 'blur' }],
        qualityRemark: [{ required: true, message: '请填写', trigger: 'blur' }],
      },
      operationType: '',
      approvalDialog: false,
      approvalLoading: false,
      examineDialog: false,
      examineLoading: false,
      qualityRemark: '',
      examineRemark: '',
    };
  },
  mounted() {
  },
  // æ–¹æ³•集合
  methods: {
    // æ‰“开弹框
    openDia(type, row) {
      this.formDia = true
      this.operationType = type
      if (type !== 'add') {
        this.searchInfo(row)
      }
    },
    // æŸ¥è¯¢è¯¦æƒ…
    searchInfo(row) {
      this.diaLoading = true
      getInternalReportOne({ reportId: row.reportId }).then(res => {
        this.diaLoading = false
        if (res.code === 201) return
        this.form = res.data
      }).catch(err => {
        console.log(err)
        this.diaLoading = false
      })
    },
    // æäº¤å¼¹æ¡†æ•°æ®
    handleEdit() {
      this.$refs['form'].validate((valid) => {
        if (valid) {
          this.loading = true
          const internalReport = this.HaveJson(this.form)
          if (this.operationType === 'add') {
            addInternalReport(internalReport).then(res => {
              this.loading = false
              if (res.code === 201) return
              this.$message.success('操作成功')
              this.closeImplementDia()
            }).catch(err => {
              console.log('err---', err);
              this.loading = false
            })
          } else if (this.operationType === 'edit') {
            updateInternalReport(internalReport).then(res => {
              this.loading = false
              if (res.code === 201) return
              this.$message.success('操作成功')
              this.closeImplementDia()
            }).catch(err => {
              console.log('err---', err);
              this.loading = false
            })
          }
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    },
    // å®¡æ ¸æµç¨‹
    examine(examineStatus) {
      if (examineStatus === 0) {
        this.examineDialog = true
      } else {
        this.handleExamine(examineStatus)
      }
    },
    handleExamine(examineStatus) {
      this.examineLoading = true
      const internalReport = this.HaveJson(this.form)
      internalReport.examineStatus = examineStatus
      examineInternalReport(internalReport).then(res => {
        if (res.code === 200) {
          this.$message.success('提交成功!');
          this.approvalDialog = false
          this.closeImplementDia(this.departId);
        }
        this.examineLoading = false
      }).catch(() => {
        this.examineLoading = false
      })
    },
    // æäº¤å®¡æ ¸ä¿¡æ¯
    handleApproval(qualityStatus) {
      this.approvalLoading = true
      const internalReport = this.HaveJson(this.form)
      internalReport.qualityStatus = qualityStatus
      qualityInternalReport(internalReport).then(res => {
        if (res.code === 200) {
          this.$message.success('提交成功!');
          this.approvalDialog = false
          this.closeImplementDia(this.departId);
        }
        this.approvalLoading = false
      }).catch(() => {
        this.approvalLoading = false
      })
    },
    closeImplementDia() {
      this.$refs.form.resetFields();
      this.formDia = false
      this.$emit('closeImplementDia')
    },
  }
};
</script>
<style scoped>
>>>.el-dialog {
  margin: 6vh auto 50px !important;
}
>>>.el-dialog__body {
  max-height: 42em;
  overflow-y: auto;
}
>>>.is-required {
  margin-bottom: 6px;
}
</style>
src/views/CNAS/systemManagement/internalAuditManagement/components/correctiveAction.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,182 @@
<template>
  <div>
    <div class="search-background">
      <span class="search-group">
        <span style="width: 200px">不合格描述:</span>
        <el-input v-model="searchForm.raiseResult" clearable size="small"></el-input>
        <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">重 ç½®</el-button>
        <el-button size="medium" type="primary" @click="searchList">查 è¯¢</el-button>
      </span>
      <span class="search-group">
        <el-button size="medium" type="primary" @click="openFormDia('add')">新 å¢ž</el-button>
      </span>
    </div>
    <div class="table">
      <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData"
        :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" :page="page" @pagination="pagination">
      </limsTable>
    </div>
    <corrective-action-d-ia v-if="correctiveActionDIa" ref="correctiveActionDIa"
      @closeRectifyDia="closeRectifyDia"></corrective-action-d-ia>
    <view-test-record v-if="viewTestRecordDialog" ref="viewTestRecordDialog"></view-test-record>
  </div>
</template>
<script>
import TableCard from '@/components/TableCard/index.vue';
import limsTable from "@/components/Table/lims-table.vue";
import CorrectiveActionDIa from './correctiveActionDIa.vue';
import ViewTestRecord from './ViewTestRecord.vue';
import {
  pageInternalCorrect,
  exportInternalCorrect,
} from '@/api/cnas/systemManagement/internalAuditManagement.js'
export default {
  name: 'correctiveAction',
  // import å¼•入的组件需要注入到对象中才能使用
  components: { CorrectiveActionDIa, limsTable, TableCard, ViewTestRecord },
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      searchForm: {
        raiseResult: '',
      },
      tableColumn: [
        {
          label: '不合格或偏离事实的描述',
          prop: 'raiseResult',
          minWidth: '100'
        },
        {
          label: '原因分析',
          prop: 'causeResult',
          minWidth: '100'
        },
        {
          label: '纠正措施',
          prop: 'correctResult',
          minWidth: '100'
        },
        {
          label: '实施验证结果',
          prop: 'validationResult',
          minWidth: '100'
        },
        {
          dataType: 'action',
          minWidth: '220',
          label: '操作',
          operation: [
            {
              name: '导出',
              type: 'text',
              clickFun: (row) => {
                this.handleDown(row)
              }
            },
            {
              name: '纠正',
              type: 'text',
              clickFun: (row) => {
                this.openFormDia('rectify', row);
              },
            },
            {
              name: '查看附件',
              type: 'text',
              clickFun: (row) => {
                this.viewFiles(row);
              },
            },
          ]
        }
      ],
      tableData: [],
      tableLoading: false,
      page: {
        size: 20,
        current: 1,
        total: 0,
      },
      correctiveActionDIa: false,
      viewTestRecordDialog: false,
    };
  },
  mounted() {
    this.searchList()
  },
  // æ–¹æ³•集合
  methods: {
    // æŸ¥è¯¢åˆ—表
    searchList() {
      const entity = {
        raiseResult: this.searchForm.raiseResult,
      }
      const page = this.page
      this.tableLoading = true
      pageInternalCorrect({ ...entity, ...page }).then(res => {
        this.tableLoading = false
        if (res.code === 201) return
        this.tableData = res.data.records
        this.page.total = res.data.total
      }).catch(err => {
        console.log('err---', err);
        this.tableLoading = false
      })
    },
    // é‡ç½®æŸ¥è¯¢æ¡ä»¶
    resetSearchForm() {
      this.searchForm.raiseResult = '';
      this.searchList()
    },
    // æŸ¥çœ‹é™„ä»¶
    viewFiles(row) {
      this.viewTestRecordDialog = true
      this.$nextTick(() => {
        this.$refs.viewTestRecordDialog.openDia(row)
      })
    },
    openFormDia(type, row) {
      this.correctiveActionDIa = true
      this.$nextTick(() => {
        this.$refs.correctiveActionDIa.openDia(type, row)
      })
    },
    // å¯¼å‡º
    handleDown(row) {
      exportInternalCorrect({ correctId: row.correctId }).then(res => {
        this.outLoading = false
        this.$message.success('导出成功')
        const blob = new Blob([res], { type: 'application/msword' });
        this.$download.saveAs(blob, '内审纠正措施' + '.docx');
      })
    },
    closeRectifyDia() {
      this.correctiveActionDIa = false
      this.searchList()
    },
    pagination({ page, limit }) {
      this.page.current = page;
      this.page.size = limit;
      this.searchList();
    },
  }
};
</script>
<style scoped>
.search-background {
  width: 100%;
  height: 60px;
  line-height: 60px;
  display: flex;
  justify-content: space-between;
}
.search-group {
  display: flex;
  align-items: center;
  margin: 0 20px;
}
</style>
src/views/CNAS/systemManagement/internalAuditManagement/components/correctiveActionDIa.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,409 @@
<template>
  <div>
    <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="formDia" title="纠正措施处理单"
      width="60%" @close="closeRectifyDia">
      <el-steps :active="currentStep" align-center finish-status="success">
        <el-step title="不合格或偏离事实的描述" @click.native="setStep(0)"></el-step>
        <el-step title="原因分析" @click.native="setStep(1)"></el-step>
        <el-step title="纠正措施" @click.native="setStep(2)"></el-step>
        <el-step title="实施验证结果" @click.native="setStep(3)"></el-step>
      </el-steps>
      <div>
        <table border="1" cellspacing="10" class="tables">
          <tr v-if="showStep === 0">
            <td class="td-title">
              <p><span class="required-span">* </span>不合格或偏离事实的描述:</p>
            </td>
            <td class="td-info" colspan="3">
              <el-input v-if="showStep === 0 && currentStep === 0" v-model="form.raiseResult" :rows="4"
                placeholder="请输入内容" size="small" type="textarea">
              </el-input>
              <span v-if="showStep === 0 && currentStep !== 0" class="td-info1"> {{ form.raiseResult }}</span>
            </td>
          </tr>
          <tr v-if="showStep === 0">
            <td v-if="currentStep === 0" class="td-title">
              <p><span class="required-span">* </span>请选择下一步负责人:</p>
            </td>
            <td v-if="currentStep === 0" class="td-info" colspan="3">
              <el-select v-model="form.causeUserId" clearable filterable placeholder="请选择" size="small">
                <el-option v-for="(item, i) in personList" :key="i" :label="item.label" :value="item.value">
                </el-option>
              </el-select>
            </td>
          </tr>
          <tr v-if="showStep === 0 && currentStep !== 0">
            <td class="td-title">
              <p>提出人:</p>
            </td>
            <td class="td-info">
              {{ form.raiseUserName }}
            </td>
            <td class="td-title">
              <p>提出部门:</p>
            </td>
            <td class="td-info">
              {{ form.raiseDepartment }}
            </td>
          </tr>
          <tr v-if="showStep === 0 && currentStep !== 0">
            <td class="td-title">
              <p>日期:</p>
            </td>
            <td class="td-info" colspan="3">
              {{ form.raiseTime }}
            </td>
          </tr>
          <tr v-if="showStep === 1">
            <td class="td-title">
              <p><span class="required-span">* </span>原因分析:</p>
            </td>
            <td class="td-info" colspan="3">
              <el-input v-if="showStep === 1 && currentStep === 1" v-model="form.causeResult" :rows="5"
                placeholder="请输入内容" size="small" type="textarea">
              </el-input>
              <span v-if="showStep === 1 && currentStep !== 1" class="td-info1"> {{ form.causeResult }}</span>
            </td>
          </tr>
          <tr v-if="showStep === 1 && currentStep !== 1">
            <td class="td-title">
              <p>原因分析人:</p>
            </td>
            <td class="td-info">
              {{ form.causeUserName }}
            </td>
            <td class="td-title">
              <p>责任部门:</p>
            </td>
            <td class="td-info">
              {{ form.causeDepartment }}
            </td>
          </tr>
          <tr v-if="showStep === 1 && currentStep !== 1">
            <td class="td-title">
              <p>原因分析日期:</p>
            </td>
            <td class="td-info" colspan="3">
              {{ form.causeTime }}
            </td>
          </tr>
          <tr v-if="showStep === 1">
            <td v-if="currentStep === 1" class="td-title">
              <p><span class="required-span">* </span>请选择下一步负责人:</p>
            </td>
            <td v-if="currentStep === 1" class="td-info" colspan="3">
              <el-select v-model="form.correctUserId" clearable filterable placeholder="请选择" size="small">
                <el-option v-for="(item, i) in personList" :key="i" :label="item.label" :value="item.value">
                </el-option>
              </el-select>
            </td>
          </tr>
          <tr v-if="showStep === 2">
            <td class="td-title">
              <p><span class="required-span">* </span>纠正措施:</p>
            </td>
            <td class="td-info" colspan="3">
              <el-input v-if="showStep === 2 && currentStep === 2" v-model="form.correctResult" :rows="5"
                placeholder="请输入内容" size="small" type="textarea">
              </el-input>
              <span v-if="showStep === 2 && currentStep !== 2" class="td-info1"> {{ form.correctResult }}</span>
            </td>
          </tr>
          <tr v-if="showStep === 2">
            <td class="td-title">
              <p>提出要求部门确认:</p>
            </td>
            <td class="td-info" colspan="3">
              <el-input v-if="showStep === 2 && currentStep === 2" v-model="form.raiseDepartmentAffirm" :rows="5"
                placeholder="请输入内容" size="small" type="textarea">
              </el-input>
              <span v-if="showStep === 2 && currentStep !== 2" class="td-info1"> {{ form.raiseDepartmentAffirm }}</span>
            </td>
          </tr>
          <tr v-if="showStep === 2 && currentStep !== 2">
            <td class="td-title">
              <p>纠正人:</p>
            </td>
            <td class="td-info">
              {{ form.correctUserName }}
            </td>
            <td class="td-title">
              <p>责任部门:</p>
            </td>
            <td class="td-info">
              {{ form.correctDepartment }}
            </td>
          </tr>
          <tr v-if="showStep === 2 && currentStep !== 2">
            <td class="td-title">
              <p>纠正日期:</p>
            </td>
            <td class="td-info" colspan="3">
              {{ form.correctTime }}
            </td>
          </tr>
          <tr v-if="showStep === 2">
            <td v-if="currentStep === 2" class="td-title">
              <p><span class="required-span">* </span>请选择下一步负责人:</p>
            </td>
            <td v-if="currentStep === 2" class="td-info" colspan="3">
              <el-select v-model="form.validationUserId" clearable filterable placeholder="请选择" size="small">
                <el-option v-for="(item, i) in personList" :key="i" :label="item.label" :value="item.value">
                </el-option>
              </el-select>
            </td>
          </tr>
          <tr v-if="showStep === 3">
            <td class="td-title">
              <p><span class="required-span">* </span>实施验证结果:</p>
            </td>
            <td class="td-info" colspan="3">
              <el-input v-if="showStep === 3 && currentStep === 3" v-model="form.validationResult" :rows="5"
                placeholder="请输入内容" size="small" type="textarea">
              </el-input>
              <span v-if="showStep === 3 && currentStep !== 3" class="td-info1"> {{ form.validationResult }}</span>
            </td>
          </tr>
          <tr v-if="showStep === 3 && currentStep !== 3">
            <td class="td-title">
              <p>验证人:</p>
            </td>
            <td class="td-info">
              {{ form.validationUserName }}
            </td>
            <td class="td-title">
              <p>责任部门:</p>
            </td>
            <td class="td-info">
              {{ form.validationDepartment }}
            </td>
          </tr>
          <tr v-if="showStep === 3 && currentStep !== 3">
            <td class="td-title">
              <p>验证日期:</p>
            </td>
            <td class="td-info" colspan="3">
              {{ form.validationTime }}
            </td>
          </tr>
        </table>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="closeRectifyDia">取 æ¶ˆ</el-button>
        <el-button v-if="currentStep !== 4" :loading="editLoad" type="primary" @click="handleEdit">提 äº¤</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import {
  getInternalCorrect,
  addInternalCorrect,
} from '@/api/cnas/systemManagement/internalAuditManagement.js'
import {
  selectUserCondition,
} from "@/api/business/inspectionTask.js";
export default {
  name: 'correctiveActionDIa',
  // import å¼•入的组件需要注入到对象中才能使用
  components: {},
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      formDia: false,
      currentStep: 0,
      showStep: 0,
      form: {
        superviseDetailsId: '',
        raiseResult: '',
        vdeRaiseResult: '',
        causeUserId: '',
        raiseUserName: '',
        raiseDepartment: '',
        raiseTime: '',
        causeResult: '',
        causeUserName: '',
        causeDepartment: '',
        causeTime: '',
        correctUserId: '',
        correctResult: '',
        raiseDepartmentAffirm: '',
        correctUserName: '',
        correctDepartment: '',
        correctTime: '',
        validationUserId: '',
        validationResult: '',
        validationUserName: '',
        validationDepartment: '',
        validationTime: '',
      },
      editLoad: false,
      personList: [],
      supervisedUserList: [],
    };
  },
  mounted() {
  },
  // æ–¹æ³•集合
  methods: {
    openDia(type, row) {
      this.formDia = true
      if (type !== 'add') {
        this.searchInfo(row)
        this.form.superviseDetailsId = row.superviseDetailsId
      }
      this.getAuthorizedPerson() // èŽ·å–äººå‘˜åˆ—è¡¨
      this.getSupervisedUserList() // èŽ·å–å½“å‰éƒ¨é—¨äººå‘˜
    },
    // æŸ¥è¯¢ç›‘控计划详情实施信息
    searchInfo(row) {
      this.form.qualityMonitorDetailsId = row.qualityMonitorDetailsId
      getInternalCorrect({ correctId: row.correctId }).then(res => {
        if (res.code === 201) return
        if (res.data.superviseDetailsCorrectId === null) {
          this.showStep = 0
          this.currentStep = 0
        } else {
          this.form = res.data
          if (res.data.isFinish === 0) {
            if (res.data.causeUserId) {
              this.showStep = 1
              this.currentStep = 1
            }
            if (res.data.correctUserId) {
              this.showStep = 2
              this.currentStep = 2
            }
            if (res.data.validationUserId) {
              this.showStep = 3
              this.currentStep = 3
            }
          } else {
            this.currentStep = 4
            this.showStep = 3
          }
        }
      }).catch(err => {
        console.log('err---', err);
      })
    },
    // æäº¤
    handleEdit() {
      if (this.currentStep === 0) {
        if (!this.form.raiseResult) {
          this.$message.warning('请填写不合格描述')
          return
        }
        if (!this.form.causeUserId) {
          this.$message.warning('请选择下一步负责人')
          return
        }
      } else if (this.currentStep === 1) {
        if (!this.form.causeResult) {
          this.$message.warning('请填写原因分析')
          return
        }
        if (!this.form.correctUserId) {
          this.$message.warning('请选择下一步负责人')
          return
        }
      } else if (this.currentStep === 2) {
        if (!this.form.correctResult) {
          this.$message.warning('请填写纠正措施')
          return
        }
        if (!this.form.validationUserId) {
          this.$message.warning('请选择下一步负责人')
          return
        }
      } else if (this.currentStep === 3) {
        if (!this.form.validationResult) {
          this.$message.warning('请填写实施验证结果')
          return
        }
      }
      this.editLoad = true
      this.form.supervisedTime = ''
      this.form.flowType = this.currentStep
      addInternalCorrect(this.form).then(res => {
        this.editLoad = false
        if (res.code === 201) return
        this.$message.success('提交成功')
        this.closeRectifyDia()
      }).catch(err => {
        console.log('err---', err);
        this.editLoad = false
      })
    },
    // å…³é—­å¼¹æ¡†
    closeRectifyDia() {
      this.formDia = false
      this.$emit('closeRectifyDia')
    },
    setStep(step) {
      this.showStep = step
    },
    getAuthorizedPerson() {
      selectUserCondition().then(res => {
        let data = []
        res.data.forEach(a => {
          data.push({
            label: a.name,
            value: a.id
          })
        })
        this.personList = data
      })
    },
    getSupervisedUserList() {
      selectUserCondition({ type: 2 }).then(res => {
        let data = []
        res.data.forEach(a => {
          data.push({
            label: a.name,
            value: a.id
          })
        })
        this.supervisedUserList = data
      })
    },
  }
};
</script>
<style scoped>
>>>.el-dialog {
  margin: 10vh auto 50px !important;
}
.tables {
  table-layout: fixed;
  width: 100%;
  margin-top: 10px;
}
.td-title {
  height: 40px;
  width: 170px;
  text-align: center;
  font-size: 14px;
  word-wrap: break-word;
  white-space: normal;
  padding: 6px;
}
.td-info {
  padding: 6px;
}
.td-info1 {
  display: inline-block;
  width: 100%;
  text-align: left;
  font-size: 14px;
  word-wrap: break-word;
  white-space: normal;
}
</style>
src/views/CNAS/systemManagement/internalAuditManagement/components/implementPlanDia.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,307 @@
<template>
  <div>
    <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false"
      :visible.sync="formDia" title="内部审核实施计划" width="80%" @close="closeImplementDia">
      <el-form ref="form" :model="form" :rules="rules" label-width="auto">
        <el-col :span="24">
          <el-form-item label="审核目的" prop="purposes">
            <el-input v-model="form.purposes" :disabled="operationType === 'ratify'" clearable size="small"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="审核性质" prop="nature">
            <el-input v-model="form.nature" :disabled="operationType === 'ratify'" clearable size="small"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="审核范围" prop="scope">
            <el-input v-model="form.scope" :disabled="operationType === 'ratify'" clearable size="small"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="审核依据" prop="basis">
            <el-input v-model="form.basis" :disabled="operationType === 'ratify'" clearable size="small"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="审核组长" prop="teamLeader">
            <el-input v-model="form.teamLeader" :disabled="operationType === 'ratify'" clearable
              size="small"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="内审员" prop="internalAuditor">
            <el-input v-model="form.internalAuditor" :disabled="operationType === 'ratify'" clearable
              size="small"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="审核日期" prop="reviewDate">
            <el-date-picker v-model="form.reviewDate" :disabled="operationType === 'ratify'" clearable
              format="yyyy-MM-dd" placeholder="选择日期" size="small" style="width: 100%" type="date"
              value-format="yyyy-MM-dd">
            </el-date-picker>
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="审核方法" prop="auditMethod">
            <el-input v-model="form.auditMethod" :disabled="operationType === 'ratify'" clearable
              size="small"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="首次会议时间" prop="firstMeetingTime">
            <el-date-picker v-model="form.firstMeetingTime" :disabled="operationType === 'ratify'" clearable
              format="yyyy-MM-dd" placeholder="选择日期" size="small" style="width: 100%" type="date"
              value-format="yyyy-MM-dd">
            </el-date-picker>
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="末次会议时间" prop="lastMeetingTime">
            <el-date-picker v-model="form.lastMeetingTime" :disabled="operationType === 'ratify'" clearable
              format="yyyy-MM-dd" placeholder="选择日期" size="small" style="width: 100%" type="date"
              value-format="yyyy-MM-dd">
            </el-date-picker>
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="审核报告提交日期" prop="submitTime">
            <el-date-picker v-model="form.submitTime" :disabled="operationType === 'ratify'" clearable
              format="yyyy-MM-dd" placeholder="选择日期" size="small" style="width: 100%" type="date"
              value-format="yyyy-MM-dd">
            </el-date-picker>
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="审核报告发放范围" prop="submitScope">
            <el-input v-model="form.submitScope" :disabled="operationType === 'ratify'" clearable
              size="small"></el-input>
          </el-form-item>
        </el-col>
      </el-form>
      <div v-if="operationType !== 'ratify'" style="text-align: right;margin-bottom: 10px">
        <el-button size="small" type="primary" @click="addRow">添加</el-button>
        <el-button size="small" type="danger" @click="clearTable">清空</el-button>
      </div>
      <el-table :data="implementDetailList" border height="300" style="width: 100%">
        <el-table-column align="center" label="序号" type="index" width="60" />
        <el-table-column header-align="center" label="时间" prop="implement">
          <template slot-scope="{row}">
            <el-input v-model="row.implement" :disabled="operationType === 'ratify'" size="small" />
          </template>
        </el-table-column>
        <el-table-column header-align="center" label="受审核部门" prop="department">
          <template slot-scope="{row}">
            <el-input v-model="row.department" :disabled="operationType === 'ratify'" size="small" />
          </template>
        </el-table-column>
        <el-table-column header-align="center" label="责任人" prop="responsible">
          <template slot-scope="{row}">
            <el-input v-model="row.responsible" :disabled="operationType === 'ratify'" size="small" />
          </template>
        </el-table-column>
        <el-table-column header-align="center" label="审核员" prop="auditor" width="180">
          <template slot-scope="{row}">
            <el-input v-model="row.auditor" :disabled="operationType === 'ratify'" size="small" />
          </template>
        </el-table-column>
        <el-table-column header-align="center" label="审核内容" prop="reviewContent" width="180">
          <template slot-scope="{row}">
            <el-input v-model="row.reviewContent" :disabled="operationType === 'ratify'" size="small" />
          </template>
        </el-table-column>
      </el-table>
      <span slot="footer" class="dialog-footer">
        <el-button v-if="operationType === 'ratify'" :loading="loading" @click="ratify(0)">不批准</el-button>
        <el-button v-if="operationType === 'ratify'" :loading="loading" type="primary" @click="ratify(1)">批
          å‡†</el-button>
        <el-button v-if="operationType !== 'ratify'" @click="closeImplementDia">取 æ¶ˆ</el-button>
        <el-button v-if="operationType !== 'ratify'" :loading="loading" type="primary" @click="handleEdit">提
          äº¤</el-button>
      </span>
    </el-dialog>
    <el-dialog :visible.sync="approvalDialog" title="批准" width="30%" @close="approvalDialog = false">
      <span>
        æ‰¹å‡†å¤‡æ³¨ï¼š
        <el-input v-model="ratifyRemark" type="textarea"></el-input>
      </span>
      <span slot="footer" class="dialog-footer">
        <el-button :loading="approvalLoading" @click="approvalDialog = false">取 æ¶ˆ</el-button>
        <el-button :loading="approvalLoading" type="primary" @click="handleApproval(0)">ç¡® å®š</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import {
  getInternalImplementOne,
  addInternalImplement,
  updateInternalImplement,
  ratifyInternalImplement,
} from '@/api/cnas/systemManagement/internalAuditManagement.js'
export default {
  name: 'implementPlanDia',
  // import å¼•入的组件需要注入到对象中才能使用
  components: {},
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      formDia: false,
      diaLoading: false,
      loading: false,
      form: {
        purposes: '',
        nature: '',
        scope: '',
        basis: '',
        teamLeader: '',
        internalAuditor: '',
        reviewDate: '',
        auditMethod: '',
        firstMeetingTime: '',
        lastMeetingTime: '',
        submitTime: '',
        submitScope: '',
      },
      rules: {
        purposes: [{ required: true, message: '请填写审核目的', trigger: 'blur' }],
        nature: [{ required: true, message: '请填写审核性质', trigger: 'blur' }],
        scope: [{ required: true, message: '请填写审核范围', trigger: 'blur' }],
        basis: [{ required: true, message: '请填写审核依据', trigger: 'blur' }],
        teamLeader: [{ required: true, message: '请填写审核组长', trigger: 'blur' }],
        internalAuditor: [{ required: true, message: '请填写内审员', trigger: 'blur' }],
        reviewDate: [{ required: true, message: '请填写审核时间', trigger: 'blur' }],
        auditMethod: [{ required: true, message: '请填写审核方法', trigger: 'blur' }],
        firstMeetingTime: [{ required: true, message: '请填写首次会议时间', trigger: 'blur' }],
        lastMeetingTime: [{ required: true, message: '请填写末次会议时间', trigger: 'blur' }],
        submitTime: [{ required: true, message: '请填写审核报告提交日期', trigger: 'blur' }],
        submitScope: [{ required: true, message: '请填写审核报告发放范围', trigger: 'blur' }],
      },
      implementDetailList: [],
      operationType: '',
      approvalDialog: false,
      approvalLoading: false,
      ratifyRemark: '',
    };
  },
  // æ–¹æ³•集合
  methods: {
    // æ‰“开弹框
    openDia(type, row) {
      this.formDia = true
      this.operationType = type
      if (type !== 'add') {
        this.searchInfo(row)
      }
    },
    // æŸ¥è¯¢è¯¦æƒ…
    searchInfo(row) {
      this.diaLoading = true
      getInternalImplementOne({ implementId: row.implementId }).then(res => {
        this.diaLoading = false
        if (res.code === 201) return
        this.form = res.data
        this.implementDetailList = this.form.implementDetailList
      }).catch(err => {
        console.log(err)
        this.diaLoading = false
      })
    },
    // æäº¤å¼¹æ¡†æ•°æ®
    handleEdit() {
      this.$refs['form'].validate((valid) => {
        if (valid) {
          if (this.implementDetailList.length === 0) {
            this.$message.warning('请添加表格数据')
            return
          }
          this.loading = true
          const internalImplementDto = this.HaveJson(this.form)
          internalImplementDto.implementDetailList = this.HaveJson(this.implementDetailList)
          if (this.operationType === 'add') {
            addInternalImplement(internalImplementDto).then(res => {
              this.loading = false
              if (res.code === 201) return
              this.$message.success('操作成功')
              this.closeImplementDia()
            }).catch(err => {
              console.log('err---', err);
              this.loading = false
            })
          } else if (this.operationType === 'edit') {
            updateInternalImplement(internalImplementDto).then(res => {
              this.loading = false
              if (res.code === 201) return
              this.$message.success('操作成功')
              this.closeImplementDia()
            }).catch(err => {
              console.log('err---', err);
              this.loading = false
            })
          }
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    },
    ratify(ratifyStatus) {
      // ä¸æ‰¹å‡†éœ€è¦å¡«å†™æ‰¹å‡†å†…容
      if (ratifyStatus === 0) {
        this.approvalDialog = true
      } else {
        this.handleApproval(ratifyStatus)
      }
    },
    // æäº¤æ‰¹å‡†ä¿¡æ¯
    handleApproval(ratifyStatus) {
      this.approvalLoading = true
      const internalImplementDto = this.HaveJson(this.form)
      internalImplementDto.ratifyStatus = ratifyStatus
      internalImplementDto.ratifyRemark = ratifyStatus === 0 ? this.ratifyRemark : ''
      ratifyInternalImplement(internalImplementDto).then(res => {
        if (res.code === 200) {
          this.$message.success('提交成功!');
          this.approvalDialog = false
          this.closeImplementDia(this.departId);
        }
        this.approvalLoading = false
      }).catch(() => {
        this.approvalLoading = false
      })
    },
    // å¢žåŠ è¡¨æ ¼è¡Œæ•°æ®
    addRow() {
      this.implementDetailList.push({
        implement: '',
        department: '',
        responsible: '',
        auditor: '',
        reviewContent: '',
      })
    },
    // æ¸…空表格数据
    clearTable() {
      this.implementDetailList = []
    },
    closeImplementDia() {
      this.$refs.form.resetFields();
      this.formDia = false
      this.$emit('closeImplementDia')
    },
  }
};
</script>
<style scoped>
>>>.el-dialog {
  margin: 10vh auto 50px !important;
}
>>>.el-dialog__body {
  max-height: 38em;
  overflow-y: auto;
}
</style>
src/views/CNAS/systemManagement/internalAuditManagement/components/implementationPlan.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,292 @@
<template>
  <div>
    <div class="search-background">
      <span class="search-group">
        <span style="width: 160px">审核目的:</span>
        <el-input v-model="searchForm.purposes" clearable size="small"></el-input>
        <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">重 ç½®</el-button>
        <el-button size="medium" type="primary" @click="searchList">查 è¯¢</el-button>
      </span>
      <span class="search-group">
        <el-button size="medium" type="primary" @click="openFormDia('add')">新 å¢ž</el-button>
      </span>
    </div>
    <div class="table">
      <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData"
        :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" @pagination="pagination" :page="page">
      </limsTable>
    </div>
    <implement-plan-dia v-if="implementPlanDia" ref="implementPlanDia"
      @closeImplementDia="closeImplementDia"></implement-plan-dia>
  </div>
</template>
<script>
import {
  pageInternalImplement,
  delInternalImplement,
  exportInternalImplement,
} from '@/api/cnas/systemManagement/internalAuditManagement.js'
import limsTable from "@/components/Table/lims-table.vue";
import ImplementPlanDia from './implementPlanDia.vue';
export default {
  name: 'implementationPlan',
  // import å¼•入的组件需要注入到对象中才能使用
  components: { ImplementPlanDia, limsTable },
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      searchForm: {
        purposes: '',
      },
      tableColumn: [
        {
          label: '审核目的',
          prop: 'purposes',
          minWidth: '100'
        },
        {
          label: '审核性质',
          prop: 'nature',
          minWidth: '100'
        },
        {
          label: '审核范围',
          prop: 'scope',
          minWidth: '100'
        },
        {
          label: '审核依据',
          prop: 'basis',
          minWidth: '100'
        },
        {
          label: '审核组长',
          prop: 'teamLeader',
          minWidth: '100'
        },
        {
          label: '内审员',
          prop: 'internalAuditor',
          minWidth: '100',
        },
        {
          label: '审核日期',
          prop: 'reviewDate',
          minWidth: '100',
        },
        {
          label: '审核方法',
          prop: 'auditMethod',
          minWidth: '100',
        },
        {
          label: '首次会议时间',
          prop: 'firstMeetingTime',
          minWidth: '100',
        },
        {
          label: '末次会议时间',
          prop: 'lastMeetingTime',
          minWidth: '100',
        },
        {
          label: '审核报告提交日期',
          prop: 'submitTime',
          minWidth: '100',
        },
        {
          label: '审核报告发放范围',
          prop: 'submitScope',
          minWidth: '100',
        }, {
          dataType: 'tag',
          label: '批准状态',
          prop: 'ratifyStatus',
          minWidth: '100',
          formatData: (params) => {
            if (params === 0) {
              return '不批准';
            } else if (params === 1) {
              return '批准';
            } else {
              return null;
            }
          },
          formatType: (params) => {
            if (params === 0) {
              return 'danger';
            } else if (params === 1) {
              return 'success';
            } else {
              return null;
            }
          }
        }, {
          label: '批准内容',
          prop: 'ratifyRemark',
          minWidth: '100'
        },
        {
          dataType: 'action',
          minWidth: '220',
          fixed: 'right',
          label: '操作',
          operation: [
            {
              name: '导出',
              type: 'text',
              clickFun: (row) => {
                this.handleDown(row)
              }
            },
            {
              name: '编辑',
              type: 'text',
              clickFun: (row) => {
                this.openFormDia('edit', row);
              },
              disabled: (row) => {
                if (row.ratifyStatus === 1) {
                  return true
                } else {
                  return false
                }
              },
            },
            {
              name: '批准',
              type: 'text',
              clickFun: (row) => {
                this.openFormDia('ratify', row);
              },
              disabled: (row) => {
                if (row.ratifyStatus === 1) {
                  return true
                } else {
                  return false
                }
              },
            },
            {
              name: '删除',
              type: 'text',
              color: '#f56c6c',
              clickFun: (row) => {
                this.delPlan(row)
              },
              disabled: (row) => {
                if (row.ratifyStatus === 1) {
                  return true
                } else {
                  return false
                }
              },
            }
          ]
        }
      ],
      tableData: [],
      tableLoading: false,
      page: {
        size: 20,
        current: 1,
        total: 0,
      },
      implementPlanDia: false,
    };
  },
  mounted() {
    this.searchList()
  },
  // æ–¹æ³•集合
  methods: {
    // æŸ¥è¯¢åˆ—表
    searchList() {
      const entity = this.searchForm
      const page = this.page
      this.tableLoading = true
      pageInternalImplement({ ...entity, ...page }).then(res => {
        this.tableLoading = false
        if (res.code === 201) return
        this.tableData = res.data.records
        this.page.total = res.data.total
      }).catch(err => {
        console.log('err---', err);
        this.tableLoading = false
      })
    },
    // æ–°å¢žï¼Œç¼–辑,批准弹框
    openFormDia(type, row) {
      this.implementPlanDia = true
      this.$nextTick(() => {
        this.$refs.implementPlanDia.openDia(type, row)
      })
    },
    closeImplementDia() {
      this.implementPlanDia = false
      this.searchList()
    },
    // é‡ç½®æŸ¥è¯¢æ¡ä»¶
    resetSearchForm() {
      this.searchForm.purposes = '';
      this.searchList()
    },
    // åˆ é™¤
    delPlan(row) {
      this.$confirm('此操作将永久删除该数据, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.tableLoading = true
        delInternalImplement({ implementId: row.implementId }).then(res => {
          this.tableLoading = false
          if (res.code === 201) return
          this.$message.success('删除成功')
          this.searchList()
        }).catch(err => {
          this.tableLoading = false
          console.log('err---', err);
        })
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        });
      });
    },
    // å¯¼å‡º
    handleDown(row) {
      exportInternalImplement({ implementId: row.implementId }).then(res => {
        this.outLoading = false
        this.$message.success('导出成功')
        const blob = new Blob([res], { type: 'application/msword' });
        this.$download.saveAs(blob, '内审实施计划' + '.docx');
      })
    },
    pagination({ page, limit }) {
      this.page.current = page;
      this.page.size = limit;
      this.searchList();
    },
  }
};
</script>
<style scoped>
.search-background {
  width: 100%;
  height: 60px;
  line-height: 60px;
  display: flex;
  justify-content: space-between;
}
.search-group {
  display: flex;
  align-items: center;
  margin: 0 20px;
}
</style>
src/views/CNAS/systemManagement/internalAuditManagement/components/yearPlan.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,314 @@
<template>
  <div>
    <div class="search-background">
      <span class="search-group">
        <span style="width: 160px">内审目的:</span>
        <el-input v-model="searchForm.purpose" clearable size="small"></el-input>
        <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">重 ç½®</el-button>
        <el-button size="medium" type="primary" @click="searchList">查 è¯¢</el-button>
      </span>
      <span class="search-group">
        <el-button size="medium" type="primary" @click="openFormDia('add')">新 å¢ž</el-button>
      </span>
    </div>
    <div class="table">
      <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData"
        :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" @pagination="pagination" :page="page">
      </limsTable>
    </div>
    <year-plan-dia v-if="yearPlanDia" ref="yearPlanDia" @closeYearDia="closeYearDia"></year-plan-dia>
  </div>
</template>
<script>
import limsTable from "@/components/Table/lims-table.vue";
import YearPlanDia from './yearPlanDia.vue';
import {
  pageInternalPlan,
  delInternalPlan,
  exportInternalPlan,
} from '@/api/cnas/systemManagement/internalAuditManagement.js'
export default {
  name: 'yearPlan',
  // import å¼•入的组件需要注入到对象中才能使用
  components: { YearPlanDia, limsTable },
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      searchForm: {
        purpose: '',
      },
      tableColumn: [
        {
          label: '内审目的',
          prop: 'purpose',
          minWidth: '100'
        },
        {
          label: '内审范围',
          prop: 'scope',
          minWidth: '100'
        },
        {
          label: '内审依据',
          prop: 'basis',
          minWidth: '100'
        },
        {
          label: '组长',
          prop: 'leader',
          minWidth: '100'
        },
        {
          label: '组员',
          prop: 'crew',
          minWidth: '100'
        },
        {
          dataType: 'tag',
          label: '审核状态',
          prop: 'examineStatus',
          minWidth: '100',
          formatData: (params) => {
            if (params === 0) {
              return '不通过';
            } else if (params === 1) {
              return '通过';
            } else {
              return null;
            }
          },
          formatType: (params) => {
            if (params === 0) {
              return 'danger';
            } else if (params === 1) {
              return 'success';
            } else {
              return null;
            }
          }
        }, {
          label: '审核内容',
          prop: 'examineRemark',
          minWidth: '100'
        }, {
          label: '审核人',
          prop: 'examineUserName',
          minWidth: '100'
        }, {
          label: '审核日期',
          prop: 'examineTime',
          minWidth: '160'
        }, {
          dataType: 'tag',
          label: '批准状态',
          prop: 'ratifyStatus',
          minWidth: '100',
          formatData: (params) => {
            if (params === 0) {
              return '不批准';
            } else if (params === 1) {
              return '批准';
            } else {
              return null;
            }
          },
          formatType: (params) => {
            if (params === 0) {
              return 'danger';
            } else if (params === 1) {
              return 'success';
            } else {
              return null;
            }
          }
        }, {
          label: '批准内容',
          prop: 'ratifyRemark',
          minWidth: '100'
        }, {
          label: '批准人',
          prop: 'ratifyUserName',
          minWidth: '100'
        }, {
          label: '批准日期',
          prop: 'ratifyTime',
          minWidth: '160'
        },
        {
          dataType: 'action',
          fixed: 'right',
          minWidth: '220',
          label: '操作',
          operation: [
            {
              name: '导出',
              type: 'text',
              clickFun: (row) => {
                this.handleDown(row)
              }
            },
            {
              name: '编辑',
              type: 'text',
              clickFun: (row) => {
                this.openFormDia('edit', row);
              },
              disabled: (row) => {
                if (row.ratifyStatus === 1) {
                  return true
                } else {
                  return false
                }
              },
            },
            {
              name: '审核',
              type: 'text',
              clickFun: (row) => {
                this.openFormDia('examine', row);
              },
              disabled: (row) => {
                if (row.examineStatus === 1) {
                  return true
                } else {
                  return false
                }
              },
            },
            {
              name: '批准',
              type: 'text',
              clickFun: (row) => {
                this.openFormDia('ratify', row);
              },
              disabled: (row) => {
                if (row.ratifyStatus === 1 || row.examineStatus === 0 || row.examineStatus === null) {
                  return true
                } else {
                  return false
                }
              },
            },
            {
              name: '删除',
              type: 'text',
              color: '#f56c6c',
              clickFun: (row) => {
                this.delPlan(row)
              },
              disabled: (row) => {
                if (row.ratifyStatus === 1) {
                  return true
                } else {
                  return false
                }
              },
            }
          ]
        }
      ],
      tableData: [],
      tableLoading: false,
      page: {
        size: 20,
        current: 1,
        total: 0,
      },
      yearPlanDia: false,
    };
  },
  mounted() {
    this.searchList()
  },
  // æ–¹æ³•集合
  methods: {
    // æŸ¥è¯¢åˆ—表
    searchList() {
      const entity = this.searchForm
      const page = this.page
      this.tableLoading = true
      pageInternalPlan({ ...entity, ...page }).then(res => {
        this.tableLoading = false
        if (res.code === 201) return
        this.tableData = res.data.records
        this.page.total = res.data.total
      }).catch(err => {
        console.log('err---', err);
        this.tableLoading = false
      })
    },
    // åˆ é™¤
    delPlan(row) {
      this.$confirm('此操作将永久删除该数据, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.tableLoading = true
        delInternalPlan({ planId: row.planId }).then(res => {
          this.tableLoading = false
          if (res.code === 201) return
          this.$message.success('删除成功')
          this.searchList()
        }).catch(err => {
          this.tableLoading = false
          console.log('err---', err);
        })
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        });
      });
    },
    // æ–°å¢žï¼Œç¼–辑,批准弹框
    openFormDia(type, row) {
      this.yearPlanDia = true
      this.$nextTick(() => {
        this.$refs.yearPlanDia.openDia(type, row)
      })
    },
    // å¯¼å‡º
    handleDown(row) {
      exportInternalPlan({ planId: row.planId }).then(res => {
        this.outLoading = false
        this.$message.success('导出成功')
        const blob = new Blob([res], { type: 'application/msword' });
        this.$download.saveAs(blob, '内审年度计划' + '.docx');
      })
    },
    closeYearDia() {
      this.yearPlanDia = false
      this.searchList()
    },
    // é‡ç½®æŸ¥è¯¢æ¡ä»¶
    resetSearchForm() {
      this.searchForm.purpose = '';
      this.searchList()
    },
    pagination({ page, limit }) {
      this.page.current = page;
      this.page.size = limit;
      this.searchList();
    },
  }
};
</script>
<style scoped>
.search-background {
  width: 100%;
  height: 60px;
  line-height: 60px;
  display: flex;
  justify-content: space-between;
}
.search-group {
  display: flex;
  align-items: center;
  margin: 0 20px;
}
</style>
src/views/CNAS/systemManagement/internalAuditManagement/components/yearPlanDia.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,342 @@
<template>
  <div>
    <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false"
      :visible.sync="formDia" title="内部审核年度计划" width="1000px" @close="closeYearDia">
      <el-form ref="form" :model="form" :rules="rules" label-position="top" label-width="auto">
        <el-row :gutter="20">
          <el-col :span="24">
            <el-form-item label="内审目的" prop="purpose">
              <el-input v-model="form.purpose" :disabled="operationType === 'examine' || operationType === 'ratify'"
                :rows="3" clearable size="small" type="textarea"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="内审范围" prop="scope">
              <el-input v-model="form.scope" :disabled="operationType === 'examine' || operationType === 'ratify'"
                :rows="3" clearable size="small" type="textarea"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="内审依据" prop="basis">
              <el-input v-model="form.basis" :disabled="operationType === 'examine' || operationType === 'ratify'"
                clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="组长" prop="leader">
              <el-input v-model="form.leader" :disabled="operationType === 'examine' || operationType === 'ratify'"
                clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="组员" prop="crew">
              <el-input v-model="form.crew" :disabled="operationType === 'examine' || operationType === 'ratify'"
                clearable size="small"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <table border="1" cellspacing="10" class="table">
        <tr>
          <td class="div-with-line">
            <span style="float: left;">部门</span>
            <span style="float: right;">月份</span>
          </td>
          <th v-for="(item, index) in dic1" :key="index">{{ item }}</th>
        </tr>
        <tr v-for="(item, index) in planDetailList" :key="index">
          <td>{{ item.department }}</td>
          <th>
            <el-input v-model="item.january" :disabled="operationType === 'examine' || operationType === 'ratify'"
              clearable size="small"></el-input>
          </th>
          <th>
            <el-input v-model="item.february" :disabled="operationType === 'examine' || operationType === 'ratify'"
              clearable size="small"></el-input>
          </th>
          <th>
            <el-input v-model="item.march" :disabled="operationType === 'examine' || operationType === 'ratify'"
              clearable size="small"></el-input>
          </th>
          <th>
            <el-input v-model="item.april" :disabled="operationType === 'examine' || operationType === 'ratify'"
              clearable size="small"></el-input>
          </th>
          <th>
            <el-input v-model="item.may" :disabled="operationType === 'examine' || operationType === 'ratify'" clearable
              size="small"></el-input>
          </th>
          <th>
            <el-input v-model="item.june" :disabled="operationType === 'examine' || operationType === 'ratify'"
              clearable size="small"></el-input>
          </th>
          <th>
            <el-input v-model="item.july" :disabled="operationType === 'examine' || operationType === 'ratify'"
              clearable size="small"></el-input>
          </th>
          <th>
            <el-input v-model="item.august" :disabled="operationType === 'examine' || operationType === 'ratify'"
              clearable size="small"></el-input>
          </th>
          <th>
            <el-input v-model="item.september" :disabled="operationType === 'examine' || operationType === 'ratify'"
              clearable size="small"></el-input>
          </th>
          <th>
            <el-input v-model="item.october" :disabled="operationType === 'examine' || operationType === 'ratify'"
              clearable size="small"></el-input>
          </th>
          <th>
            <el-input v-model="item.november" :disabled="operationType === 'examine' || operationType === 'ratify'"
              clearable size="small"></el-input>
          </th>
          <th>
            <el-input v-model="item.december" :disabled="operationType === 'examine' || operationType === 'ratify'"
              clearable size="small"></el-input>
          </th>
        </tr>
      </table>
      <span slot="footer" class="dialog-footer">
        <el-button v-if="operationType === 'examine'" :loading="loading" @click="examine(0)">不通过</el-button>
        <el-button v-if="operationType === 'examine'" :loading="loading" type="primary" @click="examine(1)">通
          è¿‡</el-button>
        <el-button v-if="operationType === 'ratify'" :loading="loading" @click="approval(0)">不批准</el-button>
        <el-button v-if="operationType === 'ratify'" :loading="loading" type="primary" @click="handleApproval(1)">批
          å‡†</el-button>
        <el-button v-if="operationType !== 'ratify' && operationType !== 'examine'" @click="closeYearDia">取
          æ¶ˆ</el-button>
        <el-button v-if="operationType !== 'ratify' && operationType !== 'examine'" :loading="loading" type="primary"
          @click="handleEdit">提 äº¤</el-button>
      </span>
    </el-dialog>
    <el-dialog :visible.sync="examineDialog" title="审核" width="30%" @close="examineDialog = false">
      <span>
        å®¡æ ¸å¤‡æ³¨ï¼š
        <el-input v-model="examineRemark" type="textarea"></el-input>
      </span>
      <span slot="footer" class="dialog-footer">
        <el-button :loading="examineLoading" @click="examineDialog = false">取 æ¶ˆ</el-button>
        <el-button :loading="examineLoading" type="primary" @click="handleExamine(0)">ç¡® å®š</el-button>
      </span>
    </el-dialog>
    <el-dialog :visible.sync="approvalDialog" title="批准" width="30%" @close="approvalDialog = false">
      <span>
        æ‰¹å‡†å¤‡æ³¨ï¼š
        <el-input v-model="ratifyRemark" type="textarea"></el-input>
      </span>
      <span slot="footer" class="dialog-footer">
        <el-button :loading="approvalLoading" @click="approvalDialog = false">取 æ¶ˆ</el-button>
        <el-button :loading="approvalLoading" type="primary" @click="handleApproval(0)">ç¡® å®š</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import {
  getInternalPlanOne,
  addInternalPlan,
  updateInternalPlan,
  examineInternalPlan,
  ratifyInternalPlan,
} from '@/api/cnas/systemManagement/internalAuditManagement.js'
export default {
  name: 'yearPlanDia',
  // import å¼•入的组件需要注入到对象中才能使用
  components: {},
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      formDia: false,
      diaLoading: false,
      loading: false,
      form: {
        purpose: '',
        scope: '',
        basis: '',
        leader: '',
        crew: '',
      },
      rules: {
        purpose: [{ required: true, message: '请填写内审目的', trigger: 'blur' }],
        scope: [{ required: true, message: '请填写内审范围', trigger: 'blur' }],
        basis: [{ required: true, message: '请填写内审依据', trigger: 'blur' }],
        leader: [{ required: true, message: '请填写组长', trigger: 'blur' }],
        crew: [{ required: true, message: '请填写组员', trigger: 'blur' }],
      },
      operationType: '',
      approvalDialog: false,
      approvalLoading: false,
      examineDialog: false,
      examineLoading: false,
      ratifyRemark: '',
      examineRemark: '',
      dic1: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
      planDetailList: [{ department: '装备电缆实验室' }, { department: '通信产品实验室' }, { department: '电力产品实验室' }, { department: '储能产品实验室' }, { department: '射频线缆实验室' }],
    };
  },
  mounted() {
  },
  // æ–¹æ³•集合
  methods: {
    // æ‰“开弹框
    openDia(type, row) {
      this.formDia = true
      this.operationType = type
      if (type !== 'add') {
        this.searchInfo(row)
      }
    },
    // æŸ¥è¯¢è¯¦æƒ…
    searchInfo(row) {
      this.diaLoading = true
      getInternalPlanOne({ planId: row.planId }).then(res => {
        this.diaLoading = false
        if (res.code === 201) return
        this.form = res.data
        this.planDetailList = this.form.planDetailList
      }).catch(err => {
        console.log(err)
        this.diaLoading = false
      })
    },
    // æäº¤å¼¹æ¡†æ•°æ®
    handleEdit() {
      this.$refs['form'].validate((valid) => {
        if (valid) {
          this.loading = true
          const internalPlan = this.HaveJson(this.form)
          internalPlan.planDetailList = this.HaveJson(this.planDetailList)
          if (this.operationType === 'add') {
            addInternalPlan(internalPlan).then(res => {
              this.loading = false
              if (res.code === 201) return
              this.$message.success('操作成功')
              this.closeYearDia()
            }).catch(err => {
              console.log('err---', err);
              this.loading = false
            })
          } else if (this.operationType === 'edit') {
            updateInternalPlan(internalPlan).then(res => {
              this.loading = false
              if (res.code === 201) return
              this.$message.success('操作成功')
              this.closeYearDia()
            }).catch(err => {
              console.log('err---', err);
              this.loading = false
            })
          }
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    },
    // å®¡æ ¸æµç¨‹
    examine(examineStatus) {
      if (examineStatus === 0) {
        this.examineDialog = true
      } else {
        this.handleExamine(examineStatus)
      }
    },
    handleExamine(examineStatus) {
      this.examineLoading = true
      const internalReport = this.HaveJson(this.form)
      internalReport.examineStatus = examineStatus
      internalReport.examineRemark = this.examineRemark
      examineInternalPlan(internalReport).then(res => {
        if (res.code === 200) {
          this.$message.success('提交成功!');
          this.approvalDialog = false
          this.closeYearDia(this.departId);
        }
        this.examineLoading = false
      }).catch(() => {
        this.examineLoading = false
      })
    },
    // æäº¤æ‰¹å‡†ä¿¡æ¯
    approval(ratifyStatus) {
      if (ratifyStatus === 0) {
        this.approvalDialog = true
      } else {
        this.handleApproval(ratifyStatus)
      }
    },
    handleApproval(ratifyStatus) {
      this.approvalLoading = true
      const internalReport = this.HaveJson(this.form)
      internalReport.ratifyStatus = ratifyStatus
      internalReport.ratifyRemark = this.ratifyRemark
      ratifyInternalPlan(internalReport).then(res => {
        if (res.code === 200) {
          this.$message.success('提交成功!');
          this.approvalDialog = false
          this.closeYearDia(this.departId);
        }
        this.approvalLoading = false
      }).catch(() => {
        this.approvalLoading = false
      })
    },
    closeYearDia() {
      this.$refs.form.resetFields();
      this.formDia = false
      this.$emit('closeYearDia')
    },
  }
};
</script>
<style scoped>
>>>.el-dialog {
  margin: 6vh auto 50px !important;
}
>>>.el-dialog__body {
  max-height: 42em;
  overflow-y: auto;
}
>>>.is-required {
  margin-bottom: 6px;
}
.table {
  width: 100%;
  margin-top: 20px;
}
.table th {
  width: 70px;
}
.table td {
  width: 70px;
  height: 70px;
  text-align: center;
}
.div-with-line {
  width: 70px;
  height: 70px;
  position: relative;
  /*overflow: hidden; /* éšè—æº¢å‡ºå†…容 */
}
.div-with-line::after {
  content: '';
  position: absolute;
  bottom: 0;
  height: 1px;
  background-color: #000000;
  left: 50%;
  transform: translateX(-50%) rotate(45deg);
  transform-origin: center 50%;
  top: 50%;
  width: 100px;
}
</style>
src/views/CNAS/systemManagement/internalAuditManagement/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
<template>
  <div class="main">
    <el-tabs v-model="activeName" class="tab-panel" type="border-card">
      <el-tab-pane label="年度计划" name="yearPlan">
        <year-plan></year-plan>
      </el-tab-pane>
      <el-tab-pane label="内部实施计划" name="implementationPlan">
        <implementation-plan></implementation-plan>
      </el-tab-pane>
      <el-tab-pane label="内审会议签到" name="meetingSignIn">
        <audit-meeting-sign></audit-meeting-sign>
      </el-tab-pane>
      <el-tab-pane label="内审检查" name="auditInspection">
        <audit-inspection></audit-inspection>
      </el-tab-pane>
      <el-tab-pane label="纠正措施" name="correctiveAction">
        <corrective-action></corrective-action>
      </el-tab-pane>
      <el-tab-pane label="内审报告" name="auditReport">
        <audit-report></audit-report>
      </el-tab-pane>
    </el-tabs>
  </div>
</template>
<script>
import YearPlan from './components/yearPlan.vue';
import implementationPlan from './components/implementationPlan.vue';
import AuditInspection from './components/auditInspection.vue';
import AuditReport from './components/auditReport.vue';
import AuditMeetingSign from './components/auditMeetingSign.vue';
import CorrectiveAction from './components/correctiveAction.vue';
export default {
  name: 'InternalAuditManagement',
  // import å¼•入的组件需要注入到对象中才能使用
  components: { CorrectiveAction, AuditMeetingSign, AuditReport, AuditInspection, YearPlan, implementationPlan },
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      activeName: 'yearPlan',
    };
  },
  // æ–¹æ³•集合
  methods: {}
};
</script>
<style scoped>
.main {
  padding: 15px 0;
}
.tab-panel {
  background: #fff;
}
</style>