gaoluyang
2025-02-25 8696b4d4c235a73f2bc5c030e20f1ad7c0a7166e
Merge remote-tracking branch 'origin/dev' into dev
已修改12个文件
已添加8个文件
2017 ■■■■■ 文件已修改
src/api/cnas/process/demand/demand.js 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/cnas/systemManagement/documentControl.js 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/cnas/systemManagement/internalAuditManagement.js 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/cnas/systemManagement/managementReview.js 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/cnas/systemManagement/measuresDealRisks.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/request.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/demand/AddContracts.vue 69 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/demand/Edit.vue 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/process/demand/index.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/documentControl/components/DistributionCollectionRecord.vue 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/documentRecords/approvalRecord.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/managementReview/components/managementFormDIa.vue 246 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/managementReview/components/managementReviewPlan.vue 339 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/managementReview/components/meetingRecords.vue 221 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/managementReview/components/meetingRecordsDia.vue 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/managementReview/components/reviewReport.vue 291 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/managementReview/components/reviewReportDia.vue 259 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/managementReview/index.vue 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/performance/manHour/workTimeConfig.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/standard/standardLibrary/index.vue 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/cnas/process/demand/demand.js
@@ -1,3 +1,7 @@
/**
 * @description æ£€éªŒå§”托单
 */
// å®žéªŒå®¤çš„æ£€æµ‹èƒ½åŠ›æ¡£æ¡ˆç›¸å…³æŽ¥å£
import request from "@/utils/request";
@@ -8,4 +12,49 @@
        method: "get",
        params: params
    })
}
// æ–°å¢žæ—¶æ ¹æ®æˆå“è®¢å•查询委托单详情
export const getInspectionOrderByInsOderId = (params) => {
    return request({
        url: "/inspectionOrder/getInspectionOrderByInsOderId",
        method: "get",
        params: params
    })
}
// æŸ¥è¯¢å¯æ–°å¢žçš„æ£€éªŒå•
export const getInsOrderOnInspection = (data) => {
    return request({
        url: "/inspectionOrder/getInsOrderOnInspection",
        method: "post",
        data: data
    })
}
// æŸ¥çœ‹å§”托单详情
export const getInspectionOrderOne = (params) => {
    return request({
        url: "/inspectionOrder/getInspectionOrderOne",
        method: "get",
        params: params
    })
}
// æ–°å¢žæ£€éªŒå•
export const addInspectionOrder = (data) => {
    return request({
        url: "/inspectionOrder/addInspectionOrder",
        method: "post",
        data: data
    })
}
// ç¼–辑检验单
export const editInspectionOrder = (data) => {
    return request({
        url: "/inspectionOrder/editInspectionOrder",
        method: "post",
        data: data
    })
}
src/api/cnas/systemManagement/documentControl.js
@@ -63,9 +63,7 @@
  return request({
    url: "/manageDocumentControlled/checkManageDocumentControlledPdf",
    method: "get",
    headers: {
      responseType: "blob",
    },
    responseType: "blob",
    params: query,
  });
}
@@ -112,6 +110,7 @@
  return request({
    url: "/manageDocumentIssueRecycle/exportManageDocumentIssueRecycle",
    method: "get",
    responseType: "blob",
    params: query,
  });
}
@@ -121,7 +120,7 @@
  return request({
    url: "/manageDocumentIssueRecycle/addManageDocumentIssueRecycle",
    method: "post",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    responseType: "blob",
    data: data,
  });
}
@@ -167,7 +166,7 @@
  return request({
    url: "/manageDocumentAlter/exportManageDocumentAlter",
    method: "get",
    headers: { responseType: "blob" },
    responseType: "blob",
    params: query,
  });
}
@@ -197,7 +196,7 @@
  return request({
    url: "/manageDocumentAlter/checkManageDocumentAlterPdf",
    method: "get",
    headers: { responseType: "blob" },
    responseType: "blob",
    params: query,
  });
}
@@ -262,7 +261,7 @@
  return request({
    url: "/manageDocumentCancel/exportManageDocumentCancel",
    method: "get",
    headers: { responseType: "blob" },
    responseType: "blob",
    params: query,
  });
}
src/api/cnas/systemManagement/internalAuditManagement.js
@@ -24,9 +24,7 @@
  return request({
    url: "/internalPlan/exportInternalPlan",
    method: "get",
    headers: {
      responseType: "blob",
    },
    responseType: "blob",
    params: query,
  });
}
@@ -99,9 +97,7 @@
  return request({
    url: "/internalImplement/exportInternalImplement",
    method: "get",
    headers: {
      responseType: "blob",
    },
    responseType: "blob",
    params: query,
  });
}
@@ -165,9 +161,7 @@
  return request({
    url: "/internalMeeting/exportInternalMeeting",
    method: "get",
    headers: {
      responseType: "blob",
    },
    responseType: "blob",
    params: query,
  });
}
@@ -222,9 +216,7 @@
  return request({
    url: "/internalCheck/exportInternalCheck",
    method: "get",
    headers: {
      responseType: "blob",
    },
    responseType: "blob",
    params: query,
  });
}
@@ -279,9 +271,7 @@
  return request({
    url: "/internalCorrect/exportInternalCorrect",
    method: "get",
    headers: {
      responseType: "blob",
    },
    responseType: "blob",
    params: query,
  });
}
@@ -327,9 +317,7 @@
  return request({
    url: "/internalReport/exportInternalReport",
    method: "get",
    headers: {
      responseType: "blob",
    },
    responseType: "blob",
    params: query,
  });
}
src/api/cnas/systemManagement/managementReview.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,159 @@
// ç®¡ç†è¯„审相关接口
import request from "@/utils/request";
// ç®¡ç†è®¡åˆ’-上传附件
export function addReviewProgramFile(data) {
  return request({
    url: "/manageReviewProgramFile/addReviewProgramFile",
    method: "post",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    data: data,
  });
}
//管理计划-附件列表
export function selectReviewProgramFile(query) {
  return request({
    url: "/manageReviewProgramFile/selectReviewProgramFile",
    method: "get",
    params: query,
  });
}
//管理计划-查询管理评审计划
export function getPageReviewProgram(query) {
  return request({
    url: "/manageReviewProgram/getPageReviewProgram",
    method: "get",
    params: query,
  });
}
//管理计划-删除管理评审计划
export function deleteReviewProgram(query) {
  return request({
    url: "/manageReviewProgram/deleteReviewProgram",
    method: "delete",
    params: query,
  });
}
//管理计划
export function exportReviewProgram(query) {
  return request({
    url: "/manageReviewProgram/exportReviewProgram",
    method: "get",
    responseType: "blob",
    params: query,
  });
}
// ç®¡ç†è®¡åˆ’-编辑管理评审计划
export function modifyReviewProgram(data) {
  return request({
    url: "/manageReviewProgram/modifyReviewProgram",
    method: "post",
    data: data,
  });
}
//会议记录-查询管理评审会议记录
export function getPageMeeting(query) {
  return request({
    url: "/manageMeeting/getPageMeeting",
    method: "get",
    params: query,
  });
}
//会议记录-删除管理评审会议记录
export function deleteMeeting(query) {
  return request({
    url: "/manageMeeting/deleteMeeting",
    method: "delete",
    params: query,
  });
}
//会议记录-下载管理评审会议记录
export function exportMeeting(query) {
  return request({
    url: "/manageMeeting/exportMeeting",
    method: "get",
    responseType: "blob",
    params: query,
  });
}
// ç®¡ç†è®¡åˆ’-新增管理评审会议记录
export function addMeeting(data) {
  return request({
    url: "/manageMeeting/addMeeting",
    method: "post",
    data: data,
  });
}
// ç®¡ç†è®¡åˆ’-修改管理评审会议记录
export function modifyMeeting(data) {
  return request({
    url: "/manageMeeting/modifyMeeting",
    method: "post",
    data: data,
  });
}
//评审会议报告-查询管理评审会议报告
export function getPageReviewReport(query) {
  return request({
    url: "/manageReviewReport/getPageReviewReport",
    method: "get",
    params: query,
  });
}
//评审会议报告-删除管理评审会议报告
export function deleteReviewReport(query) {
  return request({
    url: "/manageReviewReport/deleteReviewReport",
    method: "delete",
    params: query,
  });
}
//评审会议报告-下载
export function exportReviewReport(query) {
  return request({
    url: "/manageReviewReport/exportReviewReport",
    method: "get",
    responseType: "blob",
    params: query,
  });
}
// è¯„审会议报告-编辑管理评审会议报告
export function modifyReviewReport(data) {
  return request({
    url: "/manageReviewReport/modifyReviewReport",
    method: "post",
    data: data,
  });
}
// è¯„审会议报告-新增管理评审会议报告
export function addReviewReport(data) {
  return request({
    url: "/manageReviewReport/addReviewReport",
    method: "post",
    data: data,
  });
}
// è¯„审会议报告-新增管理评审计划
export function addReviewProgram(data) {
  return request({
    url: "/manageReviewProgram/addReviewProgram",
    method: "post",
    data: data,
  });
}
src/api/cnas/systemManagement/measuresDealRisks.js
@@ -51,9 +51,7 @@
  return request({
    url: "/manageRiskAssessmentResults/exportHazardFactorIdentification",
    method: "get",
    headers: {
      responseType: "blob",
    },
    responseType: "blob",
    params: query,
  });
}
@@ -108,9 +106,7 @@
  return request({
    url: "/manageControlPlanList/exportSignificantRiskFactors",
    method: "get",
    headers: {
      responseType: "blob",
    },
    responseType: "blob",
    params: query,
  });
}
src/utils/request.js
@@ -36,6 +36,9 @@
      url = url.slice(0, -1);
      config.params = {};
      config.url = url;
      config.headers["responseType"] = config.headers["responseType"]
        ? config.headers["responseType"]
        : ""; // è®©æ¯ä¸ªè¯·æ±‚携带自定义token è¯·æ ¹æ®å®žé™…情况自行修改
    }
    if (
      !isRepeatSubmit &&
src/views/CNAS/process/demand/AddContracts.vue
@@ -1,5 +1,5 @@
<template>
    <el-dialog title="新增检验委托单" :visible.sync="visible" width="1200px">
    <el-dialog :title="title" :visible.sync="visible" width="1200px">
        <div id="dialogBody">
            <div style="max-height: 75vh;overflow-y: auto;">
                <div id="dialogBody">
@@ -119,7 +119,6 @@
                                <el-radio-group 
                                    v-if="operationType !== 'view'"
                                    v-model="currentInfo.isLeave" 
                                    v-removeAriaHidden
                                >
                                    <el-radio :label="1">是</el-radio>
                                    <el-radio :label="0">否</el-radio>
@@ -133,7 +132,7 @@
                                <p>样品处理方式</p>
                            </td>
                            <td v-if="operationType !== 'view'">
                                <el-radio-group v-model="currentInfo.processing" v-removeAriaHidden>
                                <el-radio-group v-model="currentInfo.processing">
                                    <el-radio :label="0">委托单位取回</el-radio>
                                    <el-radio :label="1">实验室处理</el-radio>
                                </el-radio-group>
@@ -169,7 +168,7 @@
                            <td >
                                <el-radio-group 
                                    v-if="operationType !== 'view'"
                                    v-model="currentInfo.send" v-removeAriaHidden
                                    v-model="currentInfo.send"
                                >
                                    <el-radio :label="1">自取</el-radio>
                                    <el-radio :label="0">其他</el-radio>
@@ -222,7 +221,7 @@
                                <p>判定规则</p>
                            </td>
                            <td v-if="operationType !== 'view'" colspan="3">
                                <el-radio-group v-model="currentInfo.criterionRule" v-removeAriaHidden>
                                <el-radio-group v-model="currentInfo.criterionRule">
                                    <el-radio :label="0">不考虑不确定度</el-radio>
                                    <el-radio :label="1">考虑不确定度</el-radio>
                                </el-radio-group>
@@ -348,10 +347,7 @@
        </div>
        <span v-if="operationType !== 'view'" slot="footer" class="dialog-footer">
            <el-button @click="detailDialogVisible = false">取 æ¶ˆ</el-button>
            <el-button v-if="operationType === 'add'" :loading="buttonLoading" type="primary" @click="handleAdd">
                ç¡® å®š
            </el-button>
            <el-button v-if="operationType === 'edit'" :loading="buttonLoading" type="primary" @click="handleEdit">
            <el-button :loading="buttonLoading" type="primary" @click="handleSubmit">
                ç¡® å®š
            </el-button>
        </span>
@@ -359,21 +355,72 @@
</template>
<script>
import ZTTLogo from "@/assets/logo/ZTTlogo.png"
import { getInspectionOrderByInsOderId, getInspectionOrderOne, addInspectionOrder, editInspectionOrder } from "@/api/cnas/process/demand/demand.js"
export default {
    name: 'AddContracts',
    props: {
        operationType: {
            type: String,
            default: ''
        },
    },
    data() {
        return {
            title: '',
            ZTTLogo,
            visible: false,
            operationType: '',
            currentInfo:{
                orderDetailList: []
            },
            buttonLoading: false
        }
    },
    methods: {
        open() {
        open(row) {
            this.visible = true
            if(operationType == 'add') {
                this.goAddOrder(row)
            } else {
            }
        },
        // æ‰“开弹窗的时候,查询需要新增的委托单详情
        async goAddOrder(row) {
            this.title = '新增检验委托单';
            const { code, data } = await getInspectionOrderByInsOderId({
                insOrderId: row.id
            })
            if(code == 200) {
                this.currentInfo = res.data
                this.detailDialogVisible = true
            }
        },
        async goUpdateOrder(row) {
            this.title = '编辑检验委托单';
            const { code, data } = await getInspectionOrderOne({
                insOrderId: row.inspectionOrderId
            })
            if(code == 200) {
                this.currentInfo = res.data
                this.detailDialogVisible = true
            }
        },
        addOrderDetailList() {
            if (this.currentInfo.orderDetailList == null) {
                this.currentInfo.orderDetailList = []
            }
            this.currentInfo.orderDetailList.push({
                sampleNumber: '',
                testItem: '',
                testStandard: '',
                standardMethodList: '',
                remark: '',
            })
        },
        async handleSubmit() {
            this.operationType == 'add' ? await addInspectionOrder(this.currentInfo) : await editInspectionOrder(this.currentInfo)
        }
    }
}
src/views/CNAS/process/demand/Edit.vue
@@ -16,13 +16,15 @@
                :page="page"
            />
        </el-dialog>
        <AddContracts ref="addContractsRef" />
        <AddContracts ref="addContractsRef" :operationType="operationType" />
    </div>
</template>
<script>
    import limsTable from "@/components/Table/lims-table.vue";
    import AddContracts from "./AddContracts.vue";
    import { getInsOrderOnInspection } from "@/api/cnas/process/demand/demand.js"
    export default {
        name: 'EditDemand',
        components: {
@@ -33,6 +35,7 @@
            return {
                visible: false,
                search: {},
                operationType: '',
                column: [
                    { label: '序号', minWidth: '100px' },
                    { label: '委托编号', minWidth: '100px' },
@@ -46,7 +49,8 @@
                                name: "新增委托单",
                                type: "text",
                                clickFun: (row) => {
                                    this.$refs.addContractsRef.open()
                                    this.operationType = 'add'
                                    this.$refs.addContractsRef.open(row)
                                }
                            }
                        ],
@@ -60,9 +64,25 @@
                },
            }
        },
        // æ‰“开弹窗
        methods: {
            open() {
            open(type) {
                this.visible = true
                this.operationType = type
                this.getTableData()
            },
            openAddContracts(row) {
                this.operationType = 'edit'
                this.$refs.addContractsRef.open(row)
            },
            async getTableData() {
                // æŸ¥è¯¢å½“前弹窗表数据
               const { code, data } = await getInsOrderOnInspection({
                    ...this.search, ...this.page
               })
               if (code === 200) {
                   this.tableData = data
               }
            }
        }
    }
src/views/CNAS/process/demand/index.vue
@@ -75,7 +75,7 @@
            </el-form-item>
        </el-form>
        <div style="margin-bottom: 10px">
            <el-button size="small" type="primary" icon="el-icon-plus" @click="openDialog">
            <el-button size="small" type="primary" icon="el-icon-plus" @click="openDialog('add')">
                æ–° å¢ž
            </el-button>
        </div>
@@ -126,7 +126,10 @@
                    operation: [
                        {
                            name: "编 è¾‘",
                            type: "text"
                            type: "text",
                            clickFun: (row) => {
                                this.$refs.editRef.openAddContracts(row)
                            }
                        }
                    ],
                },
@@ -152,8 +155,8 @@
        /**
         * @desc æ‰“开模态框
         */
        openDialog() {
            this.$refs.editRef.open()
        openDialog(type) {
            this.$refs.editRef.open(type)
        }
    }
}
src/views/CNAS/systemManagement/documentControl/components/DistributionCollectionRecord.vue
@@ -394,33 +394,33 @@
      exportManageDocumentIssueRecycle(this.queryParams).then(res => {
        this.outLoading = false
        const blob = new Blob([res], { type: 'application/octet-stream' });
        this.$download.saveAs(blob, '发放回收记录.xlsx')
        // this.$download.saveAs(blob, '发放回收记录.xlsx')
        //将Blob å¯¹è±¡è½¬æ¢æˆå­—符串
        // let reader = new FileReader();
        // reader.readAsText(blob, 'utf-8');
        // reader.onload = () => {
        //   try {
        //     let result = JSON.parse(reader.result);
        //     if (result.message) {
        //       this.$message.error(result.message);
        //     } else {
        //       const url = URL.createObjectURL(blob);
        //       const link = document.createElement('a');
        //       link.href = url;
        //       link.download = '发放回收记录.xlsx';
        //       link.click();
        //       this.$message.success('导出成功')
        //     }
        //   } catch (err) {
        //     console.log(err);
        //     const url = URL.createObjectURL(blob);
        //     const link = document.createElement('a');
        //     link.href = url;
        //     link.download = '发放回收记录.xlsx';
        //     link.click();
        //     this.$message.success('导出成功')
        //   }
        // }
        let reader = new FileReader();
        reader.readAsText(blob, 'utf-8');
        reader.onload = () => {
          try {
            let result = JSON.parse(reader.result);
            if (result.message) {
              this.$message.error(result.message);
            } else {
              const url = URL.createObjectURL(blob);
              const link = document.createElement('a');
              link.href = url;
              link.download = '发放回收记录.xlsx';
              link.click();
              this.$message.success('导出成功')
            }
          } catch (err) {
            console.log(err);
            const url = URL.createObjectURL(blob);
            const link = document.createElement('a');
            link.href = url;
            link.download = '发放回收记录.xlsx';
            link.click();
            this.$message.success('导出成功')
          }
        }
      })
    },
    changeFileList(e) {
src/views/CNAS/systemManagement/documentRecords/approvalRecord.vue
@@ -285,7 +285,7 @@
        this.outLoading = false
        if (res.code == 201) return this.$message.error('导出失败')
        this.$message.success('导出成功')
        let url = this.javaApi + 'word/' + res.message
        let url = this.javaApi + '/word/' + res.message
        this.$download.saveAs(url, '文件审批记录')
      })
    },
src/views/CNAS/systemManagement/managementReview/components/managementFormDIa.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,246 @@
<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="right" label-width="auto">
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="评审时间" prop="reviewTime">
              <el-date-picker v-model="form.reviewTime" :disabled="operationType === 'ratify'" 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="judgingLocation">
              <el-input v-model="form.judgingLocation" :disabled="operationType === 'ratify'" clearable
                size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="评审目的" prop="judgingPurpose">
              <el-input v-model="form.judgingPurpose" :disabled="operationType === 'ratify'" clearable
                size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="评审方式" prop="judgingMethod">
              <el-input v-model="form.judgingMethod" :disabled="operationType === 'ratify'" clearable
                size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="参加人员" prop="participants">
              <!-- <el-input v-model="form.participants" :disabled="operationType === 'ratify'" clearable size="small"></el-input> -->
              <el-select v-model="form.participants" size="small" style="width: 100%;" filterable
                :disabled="operationType === 'ratify'" clearable multiple>
                <el-option v-for="item in personList" :key="item.value" :label="item.label" :value="item.value">
                </el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="评审范围" prop="judgingScope">
              <el-input v-model="form.judgingScope" :disabled="operationType === 'ratify'" clearable
                size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="评审依据" prop="judgingBasis">
              <el-input v-model="form.judgingBasis" :disabled="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="mainContext">
              <el-input v-model="form.mainContext" :disabled="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="preparationRequirements">
              <el-input v-model="form.preparationRequirements" :disabled="operationType === 'ratify'" :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 @click="closeImplementDia">取 æ¶ˆ</el-button>
        <el-button v-if="operationType === 'ratify'" :loading="loading" type="primary" @click="handleApproval(1)">批
          å‡†</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="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 {
  addReviewProgram,
  modifyReviewProgram,
} from '@/api/cnas/systemManagement/managementReview.js'
import { dateFormat } from '@/utils/date'
import {
  selectUserCondition,
} from "@/api/business/inspectionTask.js";
import { mapGetters } from "vuex";
export default {
  name: 'managementFormDIa',
  // import å¼•入的组件需要注入到对象中才能使用
  components: {},
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      formDia: false,
      diaLoading: false,
      loading: false,
      form: {
        id: '',
        reviewTime: '',
        judgingLocation: '',
        judgingPurpose: '',
        judgingMethod: '',
        participants: [],
        judgingScope: '',
        judgingBasis: '',
        mainContext: '',
        preparationRequirements: '',
      },
      rules: {
        reviewTime: [{ required: true, message: '请选择评审时间', trigger: 'blur' }],
        judgingLocation: [{ required: true, message: '请填写评审地点', trigger: 'blur' }],
        judgingPurpose: [{ required: true, message: '请填写评审目的', trigger: 'blur' }],
        judgingMethod: [{ required: true, message: '请填写评审方式', trigger: 'blur' }],
        participants: [{ required: true, message: '请填写参加人员', trigger: 'change' }],
        judgingScope: [{ required: true, message: '请填写评审范围', trigger: 'blur' }],
        judgingBasis: [{ required: true, message: '请填写评审依据', trigger: 'blur' }],
        mainContext: [{ required: true, message: '请填写评审主要内容', trigger: 'blur' }],
        preparationRequirements: [{ required: true, message: '请填写准备工作要求', trigger: 'blur' }],
      },
      operationType: '',
      approvalDialog: false,
      approvalLoading: false,
      qualityRemark: '',
      personList: [],
    };
  },
  computed: {
    ...mapGetters(['nickName'])
  },
  mounted() {
    this.getAuthorizedPerson()
  },
  // æ–¹æ³•集合
  methods: {
    // æ‰“开弹框
    openDia(type, row) {
      this.formDia = true
      this.operationType = type
      if (type !== 'add') {
        this.form = row
        this.form.participants = row.participants ? row.participants.split(',').map(m => Number(m)) : []
      }
    },
    // æŸ¥è¯¢è¯¦æƒ…
    // searchInfo (row) {
    //   this.diaLoading = true
    //   this.$axios(this.$api.internalReport.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)
          internalReport.participants = internalReport.participants.join(',')
          if (this.operationType === 'add') {
            addReviewProgram(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') {
            modifyReviewProgram(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;
        }
      });
    },
    // æäº¤æ‰¹å‡†ä¿¡æ¯
    handleApproval(qualityStatus) {
      this.approvalLoading = true
      const internalReport = this.HaveJson(this.form)
      internalReport.approve = this.nickName
      internalReport.approveDate = dateFormat(new Date())
      internalReport.participants = internalReport.participants.join(',')
      modifyReviewProgram(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')
    },
    getAuthorizedPerson() {
      selectUserCondition().then(res => {
        let data = []
        res.data.forEach(a => {
          data.push({
            label: a.name,
            value: a.id
          })
        })
        this.personList = data
      })
    },
  }
};
</script>
<style scoped>
>>>.el-dialog {
  margin: 6vh auto 50px !important;
}
</style>
src/views/CNAS/systemManagement/managementReview/components/managementReviewPlan.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,339 @@
<template>
  <div>
    <div class="search-background">
      <span class="search-group">
        <span style="width: 160px">评审地点:</span>
        <el-input v-model="searchForm.judgingLocation" 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>
    <management-form-d-ia v-if="managementFormDIa" ref="managementFormDIa"
      @closeImplementDia="closeImplementDia"></management-form-d-ia>
    <el-dialog :visible.sync="listDialogVisible" title="文件查看" top="15vh" width="400px">
      <div style="max-height:60vh;overflow-y: auto;">
        <p v-for="(item, index) in fileList" :key="index">
          <span>{{ item.fileName }}</span>
          <el-button icon="el-icon-view" size="small" style="margin-left: 20px;" type="text"
            @click="lookFile(item.url, item.fileName)">预览</el-button>
          <el-button icon="el-icon-bottom" size="small" style="margin-left: 20px;" type="text"
            @click="handleDown0(item.url, item.fileName)">下载</el-button>
        </p>
      </div>
    </el-dialog>
    <el-dialog :visible.sync="lookDialogVisible" fullscreen title="查看附件" top="5vh" width="800px">
      <filePreview v-if="lookDialogVisible" :currentFile="{}" :fileUrl="javaApi + '/word/' + currentInfo.url"
        style="height: 90vh;overflow-y: auto;" />
    </el-dialog>
  </div>
</template>
<script>
import limsTable from "@/components/Table/lims-table.vue";
import ManagementFormDIa from './managementFormDIa.vue';
import filePreview from "@/components/Preview/filePreview.vue";
import {
  addReviewProgramFile,
  selectReviewProgramFile,
  getPageReviewProgram,
  deleteReviewProgram,
  exportReviewProgram,
} from '@/api/cnas/systemManagement/managementReview.js'
export default {
  name: 'managementReviewPlan',
  // import å¼•入的组件需要注入到对象中才能使用
  components: { ManagementFormDIa, limsTable, filePreview },
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      searchForm: {
        judgingLocation: '',
      },
      listDialogVisible: false,
      lookDialogVisible: false,
      fileList: [],
      currentInfo: {},
      tableColumn: [
        {
          label: '评审时间',
          prop: 'reviewTime',
        },
        {
          label: '评审地点',
          prop: 'judgingLocation',
        },
        {
          label: '评审目的',
          prop: 'judgingPurpose',
        },
        {
          label: '评审方式',
          prop: 'judgingMethod',
        },
        {
          label: '评审范围',
          prop: 'judgingScope',
        },
        // {
        //   dataType: 'tag',
        //   label: '批准状态',
        //   prop: 'approve',
        //   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;
        //     }
        //   }
        // },
        {
          dataType: 'action',
          minWidth: '110',
          label: '操作',
          operation: [
            {
              name: '编辑',
              type: 'text',
              clickFun: (row) => {
                this.openFormDia('edit', row);
              },
              disabled: (row) => {
                return !!row.approve
              },
            },
            {
              name: '上传',
              type: 'upload',
              multiple: true,
              limit: 20,
              accept: '.doc,.docx,.xls,.xlsx,.jpg,.jpeg,.png,.pdf',
              clickFun: async (row, file, fileList) => {
                const formData = new FormData();
                formData.append('file', file.raw); // æ–‡ä»¶å­—段
                formData.append('id', row.id); // æ–‡ä»¶åå­—段
                let res = await addReviewProgramFile(formData)
                if (res.code == 200) {
                  this.$message({ message: '上传成功', type: 'success' });
                  // this.searchList()
                  return
                } else {
                  this.$message({ message: '上传失败', type: 'error' });
                  return
                }
              },
              disabled: (row) => {
                return !!row.approve
              },
            },
            {
              name: '查看附件',
              type: 'text',
              clickFun: (row) => {
                selectReviewProgramFile({ id: row.id }).then(res => {
                  this.listDialogVisible = true;
                  this.fileList = res.data.fileList
                });
              },
            },
            {
              name: '批准',
              type: 'text',
              clickFun: (row) => {
                this.openFormDia('ratify', row);
              },
              disabled: (row) => {
                return !!row.approve
              },
            },
            {
              name: '删除',
              type: 'text',
              color: '#f56c6c',
              clickFun: (row) => {
                this.delPlan(row)
              },
              disabled: (row) => {
                if (row.qualityStatus === 1) {
                  return true
                } else {
                  return false
                }
              },
            },
            {
              name: '下载',
              type: 'text',
              clickFun: (row) => {
                this.handleDown(row)
              }
            },
          ]
        }
      ],
      tableData: [],
      tableLoading: false,
      page: {
        size: 20,
        current: 1,
        total: 0,
      },
      managementFormDIa: false,
    };
  },
  mounted() {
    this.searchList()
  },
  // æ–¹æ³•集合
  methods: {
    // æŸ¥è¯¢åˆ—表
    searchList() {
      this.tableLoading = true
      getPageReviewProgram({
        judgingLocation: this.searchForm.judgingLocation,
        pages: this.page.current,
        size: this.page.size
      }).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.managementFormDIa = true
      this.$nextTick(() => {
        this.$refs.managementFormDIa.openDia(type, row)
      })
    },
    closeImplementDia() {
      this.managementFormDIa = false
      this.searchList()
    },
    // é‡ç½®æŸ¥è¯¢æ¡ä»¶
    resetSearchForm() {
      this.searchForm.judgingLocation = '';
      this.searchList()
    },
    // åˆ é™¤
    delPlan(row) {
      this.$confirm('此操作将永久删除该数据, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.tableLoading = true
        deleteReviewProgram({ id: row.id }).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: '已取消删除'
        });
      });
    },
    // åˆ†é¡µ
    pagination({ page, limit }) {
      this.page.current = page;
      this.page.size = limit;
      this.searchList();
    },
    handleDown(row) {
      exportReviewProgram({ id: row.id }).then(res => {
        if (res.code == 201) {
          this.$message.error(res.message)
          return
        }
        const blob = new Blob([res], { type: 'application/octet-stream' });
        //将Blob å¯¹è±¡è½¬æ¢æˆå­—符串
        let reader = new FileReader();
        reader.readAsText(blob, 'utf-8');
        reader.onload = () => {
          try {
            let result = JSON.parse(reader.result);
            if (result.message) {
              this.$message.error(result.message);
            } else {
              const url = URL.createObjectURL(blob);
              const link = document.createElement('a');
              link.href = url;
              link.download = '评审计划.docx';
              link.click();
              this.$download.saveAs(blob, name)
              this.$message.success('导出成功')
            }
          } catch (err) {
            console.log(err);
            const url = URL.createObjectURL(blob);
            const link = document.createElement('a');
            link.href = url;
            link.download = '评审计划.docx';
            link.click();
            this.$message.success('导出成功')
          }
        }
      })
    },
    lookFile(url, name) {
      this.currentInfo.url = url
      this.currentInfo.name = name
      this.lookDialogVisible = true
    },
    handleDown0(url, name) {
      if (!url) return this.$message.warning('文件未上传')
      let url0 = this.javaApi + '/word/' + url
      const link = document.createElement('a');
      link.href = url0;
      link.target = '_blank';
      link.click();
    }
  }
};
</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/managementReview/components/meetingRecords.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,221 @@
<template>
  <div>
    <div class="search-background">
      <span class="search-group">
        <span style="width: 160px">会议地点:</span>
        <el-input v-model="searchForm.place" 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>
    <meeting-records-dia v-if="meetingRecordsDia" ref="meetingRecordsDia"
      @closeYearDia="closeYearDia"></meeting-records-dia>
  </div>
</template>
<script>
import limsTable from "@/components/Table/lims-table.vue";
import MeetingRecordsDia from './meetingRecordsDia.vue';
import ManagementFormDIa from './managementFormDIa.vue';
import {
  getPageMeeting,
  deleteMeeting,
  exportMeeting,
} from '@/api/cnas/systemManagement/managementReview.js'
export default {
  name: 'meetingRecords',
  // import å¼•入的组件需要注入到对象中才能使用
  components: { ManagementFormDIa, MeetingRecordsDia, limsTable },
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      searchForm: {
        place: '',
      },
      tableColumn: [
        {
          label: '时间',
          prop: 'meetingTime',
          minWidth: '100'
        },
        {
          label: '主持人',
          prop: 'compere',
          minWidth: '100'
        },
        {
          label: '会议地点',
          prop: 'place',
          minWidth: '100'
        },
        {
          label: '会议内容摘要',
          prop: 'content',
          minWidth: '100'
        },
        {
          dataType: 'action',
          minWidth: '120',
          label: '操作',
          operation: [
            {
              name: '编辑',
              type: 'text',
              clickFun: (row) => {
                this.openFormDia('edit', row);
              },
            },
            {
              name: '删除',
              type: 'text',
              color: '#f56c6c',
              clickFun: (row) => {
                this.delPlan(row)
              }
            },
            {
              name: '下载',
              type: 'text',
              clickFun: (row) => {
                this.handleDown(row)
              }
            },
          ]
        }
      ],
      tableData: [],
      tableLoading: false,
      page: {
        size: 20,
        current: 1,
        total: 0,
      },
      meetingRecordsDia: false
    };
  },
  mounted() {
    this.searchList()
  },
  // æ–¹æ³•集合
  methods: {
    // æŸ¥è¯¢åˆ—表
    searchList() {
      this.tableLoading = true
      getPageMeeting({ place: this.searchForm.place, pages: this.page.current, size: this.page.size }).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.meetingRecordsDia = true
      this.$nextTick(() => {
        this.$refs.meetingRecordsDia.openDia(type, row)
      })
    },
    closeYearDia() {
      this.meetingRecordsDia = false
      this.searchList()
    },
    // é‡ç½®æŸ¥è¯¢æ¡ä»¶
    resetSearchForm() {
      this.searchForm.place = '';
      this.searchList()
    },
    // åˆ é™¤
    delPlan(row) {
      this.$confirm('此操作将永久删除该数据, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.tableLoading = true
        deleteMeeting({ id: row.id }).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: '已取消删除'
        });
      });
    },
    pagination({ page, limit }) {
      this.page.current = page;
      this.page.size = limit;
      this.searchList();
    },
    handleDown(row) {
      exportMeeting({ id: row.id }).then(res => {
        if (res.code == 201) {
          this.$message.error(res.message)
          return
        }
        const blob = new Blob([res], { type: 'application/octet-stream' });
        //将Blob å¯¹è±¡è½¬æ¢æˆå­—符串
        let reader = new FileReader();
        reader.readAsText(blob, 'utf-8');
        reader.onload = () => {
          try {
            let result = JSON.parse(reader.result);
            if (result.message) {
              this.$message.error(result.message);
            } else {
              const url = URL.createObjectURL(blob);
              const link = document.createElement('a');
              link.href = url;
              link.download = '会议记录.docx';
              link.click();
              this.$message.success('导出成功')
            }
          } catch (err) {
            console.log(err);
            const url = URL.createObjectURL(blob);
            const link = document.createElement('a');
            link.href = url;
            link.download = '会议记录.docx';
            link.click();
            this.$message.success('导出成功')
          }
        }
      })
    },
  }
};
</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/managementReview/components/meetingRecordsDia.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,158 @@
<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="meetingTime">
              <el-date-picker v-model="form.meetingTime" 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="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="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="content">
              <el-input v-model="form.content" 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 {
  addMeeting,
  modifyMeeting,
} from '@/api/cnas/systemManagement/managementReview.js'
import {
  selectUserCondition,
} from "@/api/business/inspectionTask.js";
export default {
  name: 'meetingRecordsDia',
  // import å¼•入的组件需要注入到对象中才能使用
  components: {},
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      formDia: false,
      diaLoading: false,
      loading: false,
      form: {
        id: '',
        meetingTime: '',
        compere: '',
        place: '',
        content: '',
        participant: [],
      },
      rules: {
        meetingTime: [{ required: true, message: '请填写会议时间', trigger: 'blur' }],
        compere: [{ required: true, message: '请填写主持人', trigger: 'blur' }],
        place: [{ required: true, message: '请填写地点', trigger: 'blur' }],
        content: [{ required: true, message: '请填写会议内容摘要', trigger: 'blur' }],
        participant: [{ required: true, message: '请选择参加人员', trigger: 'change' }],
      },
      operationType: '',
      personList: []
    };
  },
  mounted() {
  },
  // æ–¹æ³•集合
  methods: {
    // æ‰“开弹框
    openDia(type, row) {
      this.operationType = type
      this.getAuthorizedPerson()
      if (type !== 'add') {
        this.form = row
        this.form.participant = row.participant.split(',').map(a => {
          a = Number(a)
          return a
        })
      }
      this.formDia = true
    },
    // æäº¤å¼¹æ¡†æ•°æ®
    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') {
            addMeeting(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') {
            modifyMeeting(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></style>
src/views/CNAS/systemManagement/managementReview/components/reviewReport.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,291 @@
<template>
  <div>
    <div class="search-background">
      <span class="search-group">
        <span style="width: 160px">地点:</span>
        <el-input v-model="searchForm.place" 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>
    <review-report-dia v-if="reviewReportDia" ref="reviewReportDia" @closeYearDia="closeYearDia"></review-report-dia>
  </div>
</template>
<script>
import limsTable from "@/components/Table/lims-table.vue";
import ReviewReportDia from './reviewReportDia.vue';
import {
  getPageReviewReport,
  deleteReviewReport,
  exportReviewReport,
  modifyReviewReport,
} from '@/api/cnas/systemManagement/managementReview.js'
import { mapGetters } from "vuex";
export default {
  name: 'reviewReport',
  // import å¼•入的组件需要注入到对象中才能使用
  components: { ReviewReportDia, limsTable },
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      searchForm: {
        place: '',
      },
      tableColumn: [
        {
          label: '目的',
          prop: 'objective',
          minWidth: '100'
        },
        {
          label: '地点',
          prop: 'place',
          minWidth: '100'
        },
        {
          label: '主持人',
          prop: 'compere',
          minWidth: '100'
        },
        {
          label: '记录人',
          prop: 'recordPeople',
          minWidth: '100'
        },
        {
          label: '日期',
          prop: 'date',
          minWidth: '100'
        },
        {
          label: '页次',
          prop: 'page',
          minWidth: '100'
        },
        {
          label: '评审方式',
          prop: 'judgingMethod',
          minWidth: '100'
        },
        {
          label: '评审依据',
          prop: 'reviewBasis',
          minWidth: '100'
        },
        {
          dataType: 'action',
          minWidth: '160',
          label: '操作',
          operation: [
            {
              name: '编辑',
              type: 'text',
              clickFun: (row) => {
                this.openFormDia('edit', row);
              },
              disabled: (row) => {
                return !!row.audit || !!row.approval
              }
            },
            {
              name: '审核',
              type: 'text',
              clickFun: (row) => {
                this.$confirm('确定审核通过?', '提示', {
                  confirmButtonText: '确定',
                  cancelButtonText: '取消',
                  type: 'warning'
                }).then(() => {
                  this.submit('audit', row)
                }).catch(() => {
                });
              },
              disabled: (row) => {
                return !!row.audit
              }
            },
            {
              name: '批准',
              type: 'text',
              clickFun: (row) => {
                this.$confirm('确定批准通过?', '提示', {
                  confirmButtonText: '确定',
                  cancelButtonText: '取消',
                  type: 'warning'
                }).then(() => {
                  this.submit('approval', row)
                }).catch(() => {
                });
              },
              disabled: (row) => {
                return !row.audit || !!row.approval
              }
            },
            {
              name: '删除',
              type: 'text',
              color: '#f56c6c',
              clickFun: (row) => {
                this.delPlan(row)
              }
            },
            {
              name: '下载',
              type: 'text',
              clickFun: (row) => {
                this.handleDown(row)
              }
            },
          ]
        }
      ],
      tableData: [],
      tableLoading: false,
      page: {
        size: 20,
        current: 1,
        total: 0,
      },
      reviewReportDia: false,
    };
  },
  computed: {
    ...mapGetters(['nickName'])
  },
  mounted() {
    this.searchList()
  },
  // æ–¹æ³•集合
  methods: {
    // æŸ¥è¯¢åˆ—表
    searchList() {
      this.tableLoading = true
      getPageReviewReport({ place: this.searchForm.place, pages: this.page.current, size: this.page.size }).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.reviewReportDia = true
      this.$nextTick(() => {
        this.$refs.reviewReportDia.openDia(type, row)
      })
    },
    closeYearDia() {
      this.reviewReportDia = false
      this.searchList()
    },
    // é‡ç½®æŸ¥è¯¢æ¡ä»¶
    resetSearchForm() {
      this.searchForm.place = '';
      this.searchList()
    },
    // åˆ é™¤
    delPlan(row) {
      this.$confirm('此操作将永久删除该数据, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.tableLoading = true
        deleteReviewReport({ id: row.id }).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: '已取消删除'
        });
      });
    },
    pagination({ page, limit }) {
      this.page.current = page;
      this.page.size = limit;
      this.searchList();
    },
    handleDown(row) {
      exportReviewReport({ id: row.id }).then(res => {
        if (res.code == 201) {
          this.$message.error(res.message)
          return
        }
        const blob = new Blob([res], { type: 'application/octet-stream' });
        //将Blob å¯¹è±¡è½¬æ¢æˆå­—符串
        let reader = new FileReader();
        reader.readAsText(blob, 'utf-8');
        reader.onload = () => {
          try {
            let result = JSON.parse(reader.result);
            if (result.message) {
              this.$message.error(result.message);
            } else {
              const url = URL.createObjectURL(blob);
              const link = document.createElement('a');
              link.href = url;
              link.download = '评审报告.docx';
              link.click();
              this.$message.success('导出成功')
            }
          } catch (err) {
            console.log(err);
            const url = URL.createObjectURL(blob);
            const link = document.createElement('a');
            link.href = url;
            link.download = '评审报告.docx';
            link.click();
            this.$message.success('导出成功')
          }
        }
      })
    },
    submit(type, row) {
      let obj = row
      obj[type] = this.nickNamee;
      modifyReviewReport(obj).then(res => {
        if (res.code === 201) return
        this.$message.success('操作成功')
        this.searchList()
      }).catch(err => {
        console.log('err---', err);
      })
    }
  }
};
</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/managementReview/components/reviewReportDia.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,259 @@
<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="objective">
              <el-input v-model="form.objective" 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="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="recordPeople">
              <el-input v-model="form.recordPeople" clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="日期" prop="date">
              <el-date-picker v-model="form.date" 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="page">
              <el-input v-model="form.page" clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="评审方式" prop="judgingMethod">
              <el-input v-model="form.judgingMethod" clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="评审依据" prop="reviewBasis">
              <el-input v-model="form.reviewBasis" clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="出席人员" prop="attendess">
              <!-- <el-input v-model="form.attendess    " clearable size="small"></el-input> -->
              <el-select v-model="form.attendess" size="small" style="width: 100%;" filterable clearable multiple>
                <el-option v-for="item in personList" :key="item.value" :label="item.label" :value="item.value">
                </el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="评审输入情况" prop="reviewInputs">
              <el-input v-model="form.reviewInputs" clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="评审过程概况" prop="reviewProcess">
              <el-input v-model="form.reviewProcess" clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="主要议题概述" prop="mainTopic">
              <el-input v-model="form.mainTopic" :rows="5" clearable placeholder="请输入内容,可输入几千字" size="small"
                type="textarea">
              </el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="事项" prop="matters">
              <el-input v-model="form.matters" clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="负责人" prop="head">
              <el-input v-model="form.head" clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="完成日期" prop="completionDate">
              <el-date-picker v-model="form.completionDate" 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="24">
            <el-form-item label="跟踪确认人" prop="trackingConfirmed">
              <el-input v-model="form.trackingConfirmed" clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="跟踪情况确认记录" prop="follerUp">
              <el-input v-model="form.follerUp" clearable size="small"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="体系评价" prop="overallEvaluation">
              <el-input v-model="form.overallEvaluation" clearable size="small"></el-input>
            </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 {
  addReviewReport,
  modifyReviewReport,
} from '@/api/cnas/systemManagement/managementReview.js'
import {
  selectUserCondition,
} from "@/api/business/inspectionTask.js";
export default {
  name: 'reviewReportDia',
  // import å¼•入的组件需要注入到对象中才能使用
  components: {},
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      formDia: false,
      diaLoading: false,
      loading: false,
      form: {
        id: '',
        objective: '',
        place: '',
        compere: '',
        recordPeople: '',
        date: '',
        page: '',
        judgingMethod: '',
        reviewBasis: '',
        attendess: [],
        reviewInputs: '',
        reviewProcess: '',
        mainTopic: '',
        matters: '',
        head: '',
        completionDate: '',
        trackingConfirmed: '',
        follerUp: '',
        overallEvaluation: '',
      },
      rules: {
        objective: [{ required: true, message: '请填写目的', trigger: 'blur' }],
        place: [{ required: true, message: '请填写地点', trigger: 'blur' }],
        compere: [{ required: true, message: '请填写主持人', trigger: 'blur' }],
        recordPeople: [{ required: true, message: '请填写记录人', trigger: 'blur' }],
        date: [{ required: true, message: '请选择日期', trigger: 'change' }],
        completionDate: [{ required: true, message: '请选择完成日期', trigger: 'change' }],
        page: [{ required: true, message: '请填写页次', trigger: 'blur' }],
        judgingMethod: [{ required: true, message: '请填写评审方式', trigger: 'blur' }],
        reviewBasis: [{ required: true, message: '请填写评审依据', trigger: 'blur' }],
        attendess: [{ required: true, message: '请填写出席人员', trigger: 'change' }],
        reviewInputs: [{ required: true, message: '请填写评审输入情况', trigger: 'blur' }],
        reviewProcess: [{ required: true, message: '请填写评审输入情况', trigger: 'blur' }],
        mainTopic: [{ required: true, message: '请填写主要议题概述', trigger: 'blur' }],
        matters: [{ required: true, message: '请填写主要议题概述', trigger: 'blur' }],
        head: [{ required: true, message: '请填写负责人', trigger: 'blur' }],
        trackingConfirmed: [{ required: true, message: '请填写跟踪确认人', trigger: 'blur' }],
        follerUp: [{ required: true, message: '请填写跟踪确认人', trigger: 'blur' }],
        overallEvaluation: [{ required: true, message: '请填写体系评价', trigger: 'blur' }],
      },
      operationType: '',
      personList: []
    };
  },
  mounted() {
  },
  // æ–¹æ³•集合
  methods: {
    // æ‰“开弹框
    openDia(type, row) {
      this.formDia = true
      this.operationType = type
      this.getAuthorizedPerson()
      if (type !== 'add') {
        this.form = row
        this.form.attendess = this.form.attendess ? this.form.attendess.split(',').map(m => Number(m)) : []
      }
    },
    // æäº¤å¼¹æ¡†æ•°æ®
    handleEdit() {
      this.$refs['form'].validate((valid) => {
        if (valid) {
          this.loading = true
          const internalMeeting = this.HaveJson(this.form)
          internalMeeting.attendess = internalMeeting.attendess ? internalMeeting.attendess.join(',') : ''
          if (this.operationType === 'add') {
            addReviewReport(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') {
            modifyReviewReport(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>
>>>.el-dialog {
  margin: 4vh auto 50px !important;
}
>>>.el-dialog__body {
  max-height: 600px;
  overflow-y: auto;
}
</style>
src/views/CNAS/systemManagement/managementReview/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
<template>
  <div class="main">
    <el-tabs v-model="activeName" class="tab-panel" type="border-card">
      <el-tab-pane label="管理评审计划" name="yearPlan">
        <management-review-plan></management-review-plan>
      </el-tab-pane>
      <el-tab-pane label="会议记录" name="implementationPlan">
        <meeting-records></meeting-records>
      </el-tab-pane>
      <el-tab-pane label="评审报告" name="meetingSignIn">
        <review-report></review-report>
      </el-tab-pane>
    </el-tabs>
  </div>
</template>
<script>
import ManagementReviewPlan from './components/managementReviewPlan.vue';
import MeetingRecords from './components/meetingRecords.vue';
import ReviewReport from './components/reviewReport.vue';
export default {
  name: 'a9-management-review',
  // import å¼•入的组件需要注入到对象中才能使用
  components: { ReviewReport, MeetingRecords, ManagementReviewPlan },
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      activeName: 'yearPlan',
    };
  },
  mounted() {
  },
  // æ–¹æ³•集合
  methods: {}
};
</script>
<style scoped>
.main {
  padding: 15px 0;
}
.tab-panel {
  background: #fff;
}
</style>
src/views/performance/manHour/workTimeConfig.vue
@@ -30,8 +30,8 @@
        v-if="checkPermi(['performance:manHour:workTimeConfig:add'])">新 å¢ž</el-button>
    </div>
    <div class="table">
      <lims-table :tableData="tableData" :column="column" :page="page" :tableLoading="tableLoading"
        :height="'calc(100vh - 290px)'" @pagination="pagination"></lims-table>
      <lims-table :tableData="tableData" :column="column" :tableLoading="tableLoading" :height="'calc(100vh - 290px)'"
        :page="page" @pagination="pagination"></lims-table>
    </div>
    <!-- æ–°å¢ž/编辑 -->
    <el-dialog :title="title" :visible.sync="timeDia" width="500px">
src/views/standard/standardLibrary/index.vue
@@ -212,10 +212,10 @@
            <el-col :class="{ sort: node.level > 3 }" :span="19" :title="data.label" style="text-align: left">
              <span>
                <i :class="`node_i ${data.children != undefined
                    ? data.code === '[1]'
                      ? 'el-icon-folder-opened'
                      : 'el-icon-folder'
                    : 'el-icon-tickets'
                  ? data.code === '[1]'
                    ? 'el-icon-folder-opened'
                    : 'el-icon-folder'
                  : 'el-icon-tickets'
                  }`"></i>
                {{ data.label }}
              </span>
@@ -225,7 +225,7 @@
              (node.data.children === null ||
                node.data.children === undefined)
            " :span="2" style="text-align: right">
              <el-button size="mini" type="text" @click="editTreeName(node.data)">
              <el-button size="mini" type="text" @click.stop="editTreeName(node.data)">
                <i class="el-icon-edit"></i>
              </el-button>
            </el-col>
@@ -286,8 +286,8 @@
            <template slot-scope="scope">
              <el-input v-if="
                checkPermi(['standard:standardLibrary:upStandardProduct'])
              " v-model="scope.row.ask" :autosize="{ minRows: 1, maxRows: 3 }" clearable placeholder="要求值"
                size="small" type="textarea" @change="(value) => upStandardProductList(value, scope.row.id)"></el-input>
              " v-model="scope.row.ask" :autosize="{ minRows: 1, maxRows: 3 }" clearable placeholder="要求值" size="small"
                type="textarea" @change="(value) => upStandardProductList(value, scope.row.id)"></el-input>
              <span v-else>{{ scope.row.ask }}</span>
            </template>
          </el-table-column>
@@ -306,7 +306,7 @@
              <el-select v-if="
                checkPermi(['standard:standardLibrary:upStandardProduct'])
              " v-model="scope.row.methodS" clearable placeholder="试验方法" size="small" @change="(value) => upStandardProductListOfMethodS(value, scope.row.id)
                  ">
                ">
                <el-option v-for="(a, i) in scope.row.method &&
                  JSON.parse(scope.row.method)" :key="i" :label="a" :value="a"></el-option>
              </el-select>
@@ -318,7 +318,7 @@
              <el-select v-if="
                checkPermi(['standard:standardLibrary:upStandardProduct'])
              " v-model="scope.row.radius" clearable placeholder="条件" size="small" @change="(value) => upStandardProductListOfRadius(value, scope.row.id)
                  ">
                ">
                <el-option v-for="(a, i) in scope.row.radiusList &&
                  JSON.parse(scope.row.radiusList)" :key="i" :label="a" :value="a"></el-option>
              </el-select>
@@ -331,7 +331,7 @@
              <el-input v-if="
                checkPermi(['standard:standardLibrary:upStandardProduct'])
              " v-model="scope.row.price" placeholder="单价(元)" size="small" @change="(value) => upStandardProductListOfPrice(value, scope.row.id)
                  ">
                ">
              </el-input>
              <span v-else>{{ scope.row.price }}</span>
            </template>
@@ -341,7 +341,7 @@
              <el-input v-if="
                checkPermi(['standard:standardLibrary:upStandardProduct'])
              " v-model="scope.row.manHour" placeholder="单价(元)" size="small" @change="(value) => upStandardProductListOfManHour(value, scope.row.id)
                  ">
                ">
              </el-input>
              <span v-else>{{ scope.row.manHour }}</span>
            </template>
@@ -351,7 +351,7 @@
            <template slot-scope="scope">
              <el-select v-model="scope.row.templateId" :disabled="!checkPermi(['standard:standardLibrary:upStandardProduct'])
                " filterable size="small" @change="(value) =>
                    upStandardProductListOfTemplate(value, scope.row.id)
                  upStandardProductListOfTemplate(value, scope.row.id)
                  ">
                <el-option v-for="(a, ai) in templateList" :key="ai" :label="a.name" :value="a.id"></el-option>
              </el-select>
@@ -367,10 +367,10 @@
            </template>
          </el-table-column>
        </el-table>
        <el-pagination :current-page="currentPage" :page-size="300" :total="total"
          layout="total, prev, pager, next, jumper" style="position: absolute; right: 16px; bottom: 1px"
          @current-change="handleCurrentChange">
        </el-pagination>
        <!-- <el-pagination :current-page="currentPage" :page-size="300" :total="total" layout="total"
          style="position: absolute; right: 16px; bottom: 1px" @current-change="handleCurrentChange">
        </el-pagination> -->
        <p style="text-align: right;margin-right: 20px;color: #333;">共{{ total }}条</p>
      </el-row>
    </div>
@@ -897,7 +897,8 @@
            return;
          }
          this.$message.success("添加成功");
          this.selectStandardTreeList();
          this.$tab.refreshPage();
          // this.selectStandardTreeList();
          this.updateDia = false;
          this.updateLoad = false;
        })