From 2203e220e71fe69bb89b7c01e431eaea08bdaf0d Mon Sep 17 00:00:00 2001 From: spring <2396852758@qq.com> Date: 星期二, 25 二月 2025 14:23:22 +0800 Subject: [PATCH] 搬迁内审管理 --- src/api/cnas/systemManagement/documentControl.js | 13 src/views/CNAS/systemManagement/documentControl/components/DistributionCollectionRecord.vue | 52 src/views/standard/standardLibrary/index.vue | 35 src/views/CNAS/systemManagement/managementReview/components/reviewReport.vue | 291 +++++++++ src/views/CNAS/systemManagement/documentRecords/approvalRecord.vue | 2 src/views/CNAS/systemManagement/managementReview/components/meetingRecordsDia.vue | 158 ++++ src/views/CNAS/systemManagement/managementReview/components/managementReviewPlan.vue | 339 ++++++++++ src/views/CNAS/systemManagement/managementReview/components/meetingRecords.vue | 221 ++++++ src/api/cnas/systemManagement/measuresDealRisks.js | 8 src/api/cnas/systemManagement/internalAuditManagement.js | 24 src/utils/request.js | 3 src/views/CNAS/systemManagement/managementReview/components/reviewReportDia.vue | 259 ++++++++ src/views/CNAS/systemManagement/managementReview/components/managementFormDIa.vue | 246 +++++++ src/views/CNAS/systemManagement/managementReview/index.vue | 48 + src/views/performance/manHour/workTimeConfig.vue | 4 src/api/cnas/systemManagement/managementReview.js | 159 ++++ 16 files changed, 1,785 insertions(+), 77 deletions(-) diff --git a/src/api/cnas/systemManagement/documentControl.js b/src/api/cnas/systemManagement/documentControl.js index 2d35c9e..3fc97b7 100644 --- a/src/api/cnas/systemManagement/documentControl.js +++ b/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, }); } diff --git a/src/api/cnas/systemManagement/internalAuditManagement.js b/src/api/cnas/systemManagement/internalAuditManagement.js index e7ae621..4e22f4f 100644 --- a/src/api/cnas/systemManagement/internalAuditManagement.js +++ b/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, }); } diff --git a/src/api/cnas/systemManagement/managementReview.js b/src/api/cnas/systemManagement/managementReview.js new file mode 100644 index 0000000..5d410d3 --- /dev/null +++ b/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, + }); +} diff --git a/src/api/cnas/systemManagement/measuresDealRisks.js b/src/api/cnas/systemManagement/measuresDealRisks.js index 2649410..268b1a0 100644 --- a/src/api/cnas/systemManagement/measuresDealRisks.js +++ b/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, }); } diff --git a/src/utils/request.js b/src/utils/request.js index 1a89ee8..dc2024b 100644 --- a/src/utils/request.js +++ b/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 && diff --git a/src/views/CNAS/systemManagement/documentControl/components/DistributionCollectionRecord.vue b/src/views/CNAS/systemManagement/documentControl/components/DistributionCollectionRecord.vue index 1aba02d..0548ea4 100644 --- a/src/views/CNAS/systemManagement/documentControl/components/DistributionCollectionRecord.vue +++ b/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') //灏咮lob 瀵硅薄杞崲鎴愬瓧绗︿覆 - // 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) { diff --git a/src/views/CNAS/systemManagement/documentRecords/approvalRecord.vue b/src/views/CNAS/systemManagement/documentRecords/approvalRecord.vue index 7e956bd..8431ad9 100644 --- a/src/views/CNAS/systemManagement/documentRecords/approvalRecord.vue +++ b/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, '鏂囦欢瀹℃壒璁板綍') }) }, diff --git a/src/views/CNAS/systemManagement/managementReview/components/managementFormDIa.vue b/src/views/CNAS/systemManagement/managementReview/components/managementFormDIa.vue new file mode 100644 index 0000000..5f1d57a --- /dev/null +++ b/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> diff --git a/src/views/CNAS/systemManagement/managementReview/components/managementReviewPlan.vue b/src/views/CNAS/systemManagement/managementReview/components/managementReviewPlan.vue new file mode 100644 index 0000000..db15a30 --- /dev/null +++ b/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' }); + //灏咮lob 瀵硅薄杞崲鎴愬瓧绗︿覆 + 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> diff --git a/src/views/CNAS/systemManagement/managementReview/components/meetingRecords.vue b/src/views/CNAS/systemManagement/managementReview/components/meetingRecords.vue new file mode 100644 index 0000000..819fa92 --- /dev/null +++ b/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' }); + //灏咮lob 瀵硅薄杞崲鎴愬瓧绗︿覆 + 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> diff --git a/src/views/CNAS/systemManagement/managementReview/components/meetingRecordsDia.vue b/src/views/CNAS/systemManagement/managementReview/components/meetingRecordsDia.vue new file mode 100644 index 0000000..835e5e4 --- /dev/null +++ b/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> diff --git a/src/views/CNAS/systemManagement/managementReview/components/reviewReport.vue b/src/views/CNAS/systemManagement/managementReview/components/reviewReport.vue new file mode 100644 index 0000000..72a90bc --- /dev/null +++ b/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' }); + //灏咮lob 瀵硅薄杞崲鎴愬瓧绗︿覆 + 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> diff --git a/src/views/CNAS/systemManagement/managementReview/components/reviewReportDia.vue b/src/views/CNAS/systemManagement/managementReview/components/reviewReportDia.vue new file mode 100644 index 0000000..b8afafc --- /dev/null +++ b/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: '璇峰~鍐欒礋璐d汉', 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> diff --git a/src/views/CNAS/systemManagement/managementReview/index.vue b/src/views/CNAS/systemManagement/managementReview/index.vue new file mode 100644 index 0000000..9111484 --- /dev/null +++ b/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> diff --git a/src/views/performance/manHour/workTimeConfig.vue b/src/views/performance/manHour/workTimeConfig.vue index 5364c89..4fcad16 100644 --- a/src/views/performance/manHour/workTimeConfig.vue +++ b/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"> diff --git a/src/views/standard/standardLibrary/index.vue b/src/views/standard/standardLibrary/index.vue index 4ead05c..180ad2c 100644 --- a/src/views/standard/standardLibrary/index.vue +++ b/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; }) -- Gitblit v1.9.3