From 5205fd013d3f89f2d8085f8f62b1f32567632a21 Mon Sep 17 00:00:00 2001 From: gaoluyang <2820782392@qq.com> Date: 星期一, 24 二月 2025 17:32:40 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev --- src/views/standard/standardLibrary/index.vue | 91 src/views/CNAS/systemManagement/internalAuditManagement/components/ViewTestRecord.vue | 176 + src/views/CNAS/systemManagement/internalAuditManagement/components/auditReportDia.vue | 333 +++ src/views/business/inspectionReview/index.vue | 82 src/views/CNAS/systemManagement/internalAuditManagement/components/correctiveActionDIa.vue | 409 ++++ src/views/CNAS/systemManagement/internalAuditManagement/components/implementationPlan.vue | 292 +++ src/api/cnas/systemManagement/internalAuditManagement.js | 398 ++++ src/views/CNAS/systemManagement/customerSatisfaction/index.vue | 3 src/views/CNAS/systemManagement/internalAuditManagement/components/implementPlanDia.vue | 307 +++ src/views/CNAS/systemManagement/internalAuditManagement/components/auditReport.vue | 312 +++ src/views/CNAS/systemManagement/internalAuditManagement/index.vue | 57 src/views/CNAS/systemManagement/internalAuditManagement/components/auditInspection.vue | 254 ++ src/views/CNAS/systemManagement/internalAuditManagement/components/correctiveAction.vue | 182 + src/components/Table/lims-table.vue | 2 public/index.html | 1 src/views/business/reportPreparation/index.vue | 1221 +++++++++++++ src/views/CNAS/systemManagement/internalAuditManagement/components/auditMeetingSignDia.vue | 183 + src/views/business/inspectionTask/inspection.vue | 16 src/views/CNAS/systemManagement/internalAuditManagement/components/yearPlanDia.vue | 342 +++ src/views/CNAS/systemManagement/internalAuditManagement/components/yearPlan.vue | 314 +++ src/views/CNAS/systemManagement/internalAuditManagement/components/auditMeetingSign.vue | 202 ++ src/api/standard/standardLibrary.js | 35 src/api/business/inspectionTask.js | 2 src/views/business/unpass/components/PurchaseVerification.vue | 31 src/views/CNAS/systemManagement/correctiveAction/index.vue | 3 src/views/CNAS/systemManagement/internalAuditManagement/components/auditInspectionDia.vue | 231 ++ 26 files changed, 5,296 insertions(+), 183 deletions(-) diff --git a/public/index.html b/public/index.html index 0a54df5..aba4f3e 100644 --- a/public/index.html +++ b/public/index.html @@ -225,6 +225,7 @@ </div> </div> </body> + <script type='text/javascript' src='http://192.168.21.53:9001/web-apps/apps/api/documents/api.js'></script> <script src="<%= BASE_URL %>luckysheet/plugins/js/plugin.js"></script> <script src="<%= BASE_URL %>luckysheet/luckysheet.umd.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.16.105/pdf.min.js"></script> diff --git a/src/api/business/inspectionTask.js b/src/api/business/inspectionTask.js index 5e50039..4187ad6 100644 --- a/src/api/business/inspectionTask.js +++ b/src/api/business/inspectionTask.js @@ -213,7 +213,7 @@ return request({ url: "/insOrderPlan/verifyPlan", method: "post", - data: data, + params: data, }); } diff --git a/src/api/cnas/systemManagement/internalAuditManagement.js b/src/api/cnas/systemManagement/internalAuditManagement.js new file mode 100644 index 0000000..e7ae621 --- /dev/null +++ b/src/api/cnas/systemManagement/internalAuditManagement.js @@ -0,0 +1,398 @@ +// 鍐呭绠$悊鐩稿叧鎺ュ彛 +import request from "@/utils/request"; + +//骞村害璁″垝-鍒嗛〉 +export function pageInternalPlan(query) { + return request({ + url: "/internalPlan/pageInternalPlan", + method: "get", + params: query, + }); +} + +//骞村害璁″垝-鍒犻櫎 +export function delInternalPlan(query) { + return request({ + url: "/internalPlan/delInternalPlan", + method: "delete", + params: query, + }); +} + +//骞村害璁″垝-瀵煎嚭 +export function exportInternalPlan(query) { + return request({ + url: "/internalPlan/exportInternalPlan", + method: "get", + headers: { + responseType: "blob", + }, + params: query, + }); +} + +//骞村害璁″垝璇︽儏 +export function getInternalPlanOne(query) { + return request({ + url: "/internalPlan/getInternalPlanOne", + method: "get", + params: query, + }); +} + +// 骞村害璁″垝-鏂板 +export function addInternalPlan(data) { + return request({ + url: "/internalPlan/addInternalPlan", + method: "post", + data: data, + }); +} + +// 骞村害璁″垝-淇敼 +export function updateInternalPlan(data) { + return request({ + url: "/internalPlan/updateInternalPlan", + method: "post", + data: data, + }); +} + +// 骞村害璁″垝-瀹℃牳 +export function examineInternalPlan(data) { + return request({ + url: "/internalPlan/examineInternalPlan", + method: "post", + data: data, + }); +} + +// 骞村害璁″垝-鎵瑰噯 +export function ratifyInternalPlan(data) { + return request({ + url: "/internalPlan/ratifyInternalPlan", + method: "post", + data: data, + }); +} + +//鍐呭瀹炴柦璁″垝鍒嗛〉鏌ヨ +export function pageInternalImplement(query) { + return request({ + url: "/internalImplement/pageInternalImplement", + method: "get", + params: query, + }); +} + +//鍐呭瀹炴柦璁″垝鍒犻櫎 +export function delInternalImplement(query) { + return request({ + url: "/internalImplement/delInternalImplement", + method: "delete", + params: query, + }); +} + +//瀵煎嚭鍐呭瀹炴柦璁″垝 +export function exportInternalImplement(query) { + return request({ + url: "/internalImplement/exportInternalImplement", + method: "get", + headers: { + responseType: "blob", + }, + params: query, + }); +} + +//鍐呭瀹炴柦璁″垝璇︽儏 +export function getInternalImplementOne(query) { + return request({ + url: "/internalImplement/getInternalImplementOne", + method: "get", + params: query, + }); +} + +// 鍐呭瀹炴柦璁″垝鏂板 +export function addInternalImplement(data) { + return request({ + url: "/internalImplement/addInternalImplement", + method: "post", + data: data, + }); +} + +// 鍐呭瀹炴柦璁″垝淇敼 +export function updateInternalImplement(data) { + return request({ + url: "/internalImplement/updateInternalImplement", + method: "post", + data: data, + }); +} + +// 鍐呭瀹炴柦璁″垝淇敼 +export function ratifyInternalImplement(data) { + return request({ + url: "/internalImplement/ratifyInternalImplement", + method: "post", + data: data, + }); +} + +//浼氳绛惧埌鏌ヨ +export function pageInternalMeeting(query) { + return request({ + url: "/internalMeeting/pageInternalMeeting", + method: "get", + params: query, + }); +} + +// 浼氳绛惧埌鍒犻櫎 +export function delInternalMeeting(query) { + return request({ + url: "/internalMeeting/delInternalMeeting", + method: "delete", + params: query, + }); +} + +//瀵煎嚭鍐呭浼氳 +export function exportInternalMeeting(query) { + return request({ + url: "/internalMeeting/exportInternalMeeting", + method: "get", + headers: { + responseType: "blob", + }, + params: query, + }); +} + +//浼氳绛惧埌鏌ヨ璇︽儏 +export function getInternalMeetingOne(query) { + return request({ + url: "/internalMeeting/getInternalMeetingOne", + method: "get", + params: query, + }); +} + +// 鏂板浼氳绛惧埌 +export function addInternalMeeting(data) { + return request({ + url: "/internalMeeting/addInternalMeeting", + method: "post", + data: data, + }); +} + +// 浼氳绛惧埌淇敼 +export function updateInternalMeeting(data) { + return request({ + url: "/internalMeeting/updateInternalMeeting", + method: "post", + data: data, + }); +} + +//鍐呭妫�鏌ュ垎椤垫煡璇� +export function pageInternalCheck(query) { + return request({ + url: "/internalCheck/pageInternalCheck", + method: "get", + params: query, + }); +} + +//鍐呭妫�鏌ュ垹闄� +export function delInternalCheck(query) { + return request({ + url: "/internalCheck/delInternalCheck", + method: "delete", + params: query, + }); +} + +//瀵煎嚭鍐呭妫�鏌� +export function exportInternalCheck(query) { + return request({ + url: "/internalCheck/exportInternalCheck", + method: "get", + headers: { + responseType: "blob", + }, + params: query, + }); +} + +//鍐呭妫�鏌ヨ鎯� +export function getInternalCheckOne(query) { + return request({ + url: "/internalCheck/getInternalCheckOne", + method: "get", + params: query, + }); +} + +// 鍐呭妫�鏌ユ柊澧� +export function addInternalCheck(data) { + return request({ + url: "/internalCheck/addInternalCheck", + method: "post", + data: data, + }); +} + +// 鍐呭妫�鏌ヤ慨鏀� +export function updateInternalCheck(data) { + return request({ + url: "/internalCheck/updateInternalCheck", + method: "post", + data: data, + }); +} + +// 鍐呭妫�鏌ユ壒鍑� +export function ratifyInternalCheck(data) { + return request({ + url: "/internalCheck/ratifyInternalCheck", + method: "post", + data: data, + }); +} + +//鏌ヨ鍐呭绠$悊绾犳鎺柦鍒楄〃 +export function pageInternalCorrect(query) { + return request({ + url: "/internalCorrect/pageInternalCorrect", + method: "get", + params: query, + }); +} + +//瀵煎嚭鍐呭绠$悊绾犳鎺柦闄勪欢 +export function exportInternalCorrect(query) { + return request({ + url: "/internalCorrect/exportInternalCorrect", + method: "get", + headers: { + responseType: "blob", + }, + params: query, + }); +} + +//鏌ヨ鍐呭绠$悊绾犳澶勭悊璇︽儏 +export function getInternalCorrect(query) { + return request({ + url: "/internalCorrect/getInternalCorrect", + method: "get", + params: query, + }); +} + +// 鎻愪氦鍐呭绠$悊绾犳鎺柦鍒楄〃 +export function addInternalCorrect(data) { + return request({ + url: "/internalCorrect/addInternalCorrect", + method: "post", + data: data, + }); +} + +//鍐呭鎶ュ憡鍒犻櫎 +export function delInternalReport(query) { + return request({ + url: "/internalReport/delInternalReport", + method: "delete", + params: query, + }); +} + +//鍐呭鎶ュ憡鍒嗛〉鏌ヨ +export function pageInternalReport(query) { + return request({ + url: "/internalReport/pageInternalReport", + method: "get", + params: query, + }); +} + +//瀵煎嚭鍐呭鎶ュ憡 +export function exportInternalReport(query) { + return request({ + url: "/internalReport/exportInternalReport", + method: "get", + headers: { + responseType: "blob", + }, + params: query, + }); +} + +//鍐呭鎶ュ憡璇︽儏 +export function getInternalReportOne(query) { + return request({ + url: "/internalReport/getInternalReportOne", + method: "get", + params: query, + }); +} + +// 鍐呭鎶ュ憡鏂板 +export function addInternalReport(data) { + return request({ + url: "/internalReport/addInternalReport", + method: "post", + data: data, + }); +} + +// 鍐呭鎶ュ憡淇敼 +export function updateInternalReport(data) { + return request({ + url: "/internalReport/updateInternalReport", + method: "post", + data: data, + }); +} + +// 鍐呭鎶ュ憡瀹℃牳 +export function examineInternalReport(data) { + return request({ + url: "/internalReport/examineInternalReport", + method: "post", + data: data, + }); +} + +// 鍐呭鎶ュ憡璐熻矗浜哄~鍐� +export function qualityInternalReport(data) { + return request({ + url: "/internalReport/qualityInternalReport", + method: "post", + data: data, + }); +} + +//鏌ヨ鍐呭绠$悊绾犳鎺柦闄勪欢 +export function getInternalCorrectFileList(query) { + return request({ + url: "/internalCorrect/getInternalCorrectFileList", + method: "get", + params: query, + }); +} + +//鍒犻櫎鍐呭绠$悊绾犳鎺柦闄勪欢 +export function delInternalCorrectFile(query) { + return request({ + url: "/internalCorrect/delInternalCorrectFile", + method: "delete", + params: query, + }); +} diff --git a/src/api/standard/standardLibrary.js b/src/api/standard/standardLibrary.js index ad374ed..785c6fb 100644 --- a/src/api/standard/standardLibrary.js +++ b/src/api/standard/standardLibrary.js @@ -56,15 +56,6 @@ }); } -// 缁欐爣鍑嗘爲娣诲姞妫�楠屾爣鍑� -export function addStandardMethodList(data) { - return request({ - url: "/standardTree/addStandardMethodList", - method: "post", - data: data, - }); -} - // 娣诲姞鏍囧噯鏍� export function addStandardTree(data) { return request({ @@ -101,32 +92,6 @@ }); } -// 鍒犻櫎鏍囧噯鏍戜笅鐨勬楠屾爣鍑� -export function delStandardMethodByFLSSM(data) { - return request({ - url: "/standardTree/delStandardMethodByFLSSM", - method: "post", - data: data, - }); -} - -// 鍒犻櫎鏍囧噯鏍戜笅鐨勬楠屾爣鍑� -export function delStandardProductByIds(data) { - return request({ - url: "/standardTree/delStandardProductByIds", - method: "post", - data: data, - }); -} - -// 鏂板鏍囧噯鏍戜笅鐨勬楠岄」鐩� -export function addStandardProduct(data) { - return request({ - url: "/standardTree/addStandardProduct", - method: "post", - data: data, - }); -} // 閫氳繃妫�楠屾爣鍑嗘煡璇㈡楠岄」鐩� export function selectStandardProductListByMethodId(query) { diff --git a/src/components/Table/lims-table.vue b/src/components/Table/lims-table.vue index fb86ea4..339a50f 100644 --- a/src/components/Table/lims-table.vue +++ b/src/components/Table/lims-table.vue @@ -268,7 +268,7 @@ row.forEach((a) => { count += a.name.length; }); - return count * 15 + 60 + "px"; + return count * 15 + 70 + "px"; }, iconFn(row) { if (row.name === "缂栬緫" || row.name === "淇敼") { diff --git a/src/views/CNAS/systemManagement/correctiveAction/index.vue b/src/views/CNAS/systemManagement/correctiveAction/index.vue index 85c46e0..6e92fbd 100644 --- a/src/views/CNAS/systemManagement/correctiveAction/index.vue +++ b/src/views/CNAS/systemManagement/correctiveAction/index.vue @@ -15,7 +15,8 @@ <TableCard :showForm="false" :showTitle="false"> <template v-slot:table> <limsTable :column="tableColumn" :height="'calc(100vh - 17em)'" :table-data="tableData" - :table-loading="tableLoading" style="padding: 0 15px;margin-bottom: 16px" @pagination="pagination"> + :table-loading="tableLoading" style="padding: 0 15px;margin-bottom: 16px" @pagination="pagination" + :page="page"> </limsTable> </template> </TableCard> diff --git a/src/views/CNAS/systemManagement/customerSatisfaction/index.vue b/src/views/CNAS/systemManagement/customerSatisfaction/index.vue index 7b76b7c..414a023 100644 --- a/src/views/CNAS/systemManagement/customerSatisfaction/index.vue +++ b/src/views/CNAS/systemManagement/customerSatisfaction/index.vue @@ -34,7 +34,8 @@ <TableCard :showForm="false" :showTitle="false"> <template v-slot:table> <limsTable :column="tableColumn" :height="'calc(100vh - 22em)'" :table-data="tableData" - :table-loading="tableLoading" style="padding: 0 15px;margin-bottom: 16px" @pagination="pagination"> + :table-loading="tableLoading" style="padding: 0 15px;margin-bottom: 16px" @pagination="pagination" + :page="page"> </limsTable> </template> </TableCard> diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/ViewTestRecord.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/ViewTestRecord.vue new file mode 100644 index 0000000..fac2da1 --- /dev/null +++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/ViewTestRecord.vue @@ -0,0 +1,176 @@ +<template> + <div> + <el-dialog :visible.sync="filesDialogVisible" title="闄勪欢" width="80%" @closed="closeFilesLook"> + <div style="display: flex;justify-content: space-between;"> + <el-upload ref='upload' :action="fileAction" :auto-upload="true" :before-upload="fileBeforeUpload" + :data="{ correctId: info.correctId }" :headers="uploadHeader" :on-error="onError" + :on-success="handleSuccessUp" :show-file-list="false" + accept='.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip,.rar' style="width: 80px !important;"> + <el-button size="small" style="height: 38px" type="primary">闄勪欢涓婁紶</el-button> + </el-upload> + </div> + <div> + <limsTable ref="yearTable" :column="columnData" :height="'calc(100vh - 30em)'" :highlightCurrentRow="true" + :table-data="tableData" :table-loading="tableLoading" style="margin-top: 0.5em;" :page="page"> + </limsTable> + </div> + </el-dialog> + <el-dialog :visible.sync="lookDialogVisible" fullscreen title="鏌ョ湅闄勪欢" top="5vh" width="800px"> + <filePreview v-if="lookDialogVisible" :currentFile="{}" :fileUrl="javaApi + '/word/' + currentInfo.fileUrl" + style="height: 90vh;overflow-y: auto;" /> + </el-dialog> + </div> +</template> + +<script> +import limsTable from "@/components/Table/lims-table.vue"; +import filePreview from '@/components/Preview/filePreview.vue' +import { + getInternalCorrectFileList, + delInternalCorrectFile, +} from '@/api/cnas/systemManagement/internalAuditManagement.js' +export default { + name: 'ViewTestRecord', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: { filePreview, limsTable }, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + filesDialogVisible: false, + tableLoading: false, + filesLookInfo: {}, + columnData: [ + { + label: '鏂囦欢鍚嶇О', + prop: 'fileName', + minWidth: '150px' + }, + { + dataType: 'action', + minWidth: '100', + label: '鎿嶄綔', + fixed: 'right', + operation: [ + { + name: '棰勮', + type: 'text', + clickFun: (row) => { + this.handleLook(row) + } + }, + { + name: '涓嬭浇', + type: 'text', + clickFun: (row) => { + this.upload(row) + } + }, + { + name: '鍒犻櫎', + type: 'text', + color: '#f56c6c', + clickFun: (row) => { + this.delete(row) + } + } + ] + } + ], + tableData: [], + info: {}, + currentInfo: {}, + lookDialogVisible: false, + page: { + total: 0, + size: -1, + current: -1, + }, + }; + }, + // 鏂规硶闆嗗悎 + methods: { + openDia(row) { + this.filesDialogVisible = true + this.info = row + this.searchTableList() + }, + // 鏌ヨ闄勪欢鍒楄〃 + searchTableList() { + this.tableLoading = true + getInternalCorrectFileList({ correctId: this.info.correctId }).then(res => { + this.tableLoading = false + if (res.code === 201) return + this.tableData = res.data + }).catch(err => { + this.tableLoading = false + console.log('err---', err); + }) + }, + closeFilesLook() { + this.filesDialogVisible = false + }, + // 鏌ョ湅鏂囦欢 + handleLook(row) { + this.currentInfo = row + this.lookDialogVisible = true + }, + // 涓嬭浇 + upload(row) { + let url = ''; + if (row.type == 1) { + url = this.javaApi + '/img/' + row.fileUrl + this.$download.saveAs(url, row.fileName) + } else { + url = this.javaApi + '/word/' + row.fileUrl + this.$download.saveAs(url, row.fileName) + } + }, + // 鍒犻櫎 + delete(row) { + this.tableLoading = true + delInternalCorrectFile({ correctFileId: row.correctFileId }).then(res => { + this.tableLoading = false + if (res.code === 201) return + this.$message.success('鍒犻櫎鎴愬姛') + this.searchTableList() + }).catch(err => { + this.tableLoading = false + console.log('err---', err); + }) + }, + // 涓婁紶楠岃瘉 + fileBeforeUpload(file) { + let flag = true + if (file.size > 1024 * 1024 * 10) { + this.$message.error('涓婁紶鏂囦欢涓嶈秴杩�10M'); + this.$refs.upload.clearFiles() + flag = false + } + if (!flag) { + return Promise.reject(flag); //姝g‘鐨勭粓姝� + } + }, + onError(err, file, fileList, type) { + this.$message.error('涓婁紶澶辫触') + this.$refs.upload.clearFiles() + }, + handleSuccessUp(response,) { + this.upLoading = false; + if (response.code == 200) { + this.$message.success('涓婁紶鎴愬姛'); + this.searchTableList() + } else { + this.$message.error(response.message); + } + }, + }, + computed: { + fileAction() { + return this.javaApi + '/internalCorrect/uploadInternalCorrectFile' + + } + }, +}; +</script> + +<style scoped></style> diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/auditInspection.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditInspection.vue new file mode 100644 index 0000000..ecbc0cf --- /dev/null +++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditInspection.vue @@ -0,0 +1,254 @@ +<template> + <div> + <div class="search-background"> + <span class="search-group"> + <span style="width: 160px">鍙楀閮ㄩ棬锛�</span> + <el-input v-model="searchForm.department" clearable size="small"></el-input> + <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">閲� 缃�</el-button> + <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button> + </span> + <span class="search-group"> + <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button> + </span> + </div> + <div class="table"> + <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData" + :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" :page="page" @pagination="pagination"> + </limsTable> + </div> + <audit-inspection-dia v-if="auditInspectionDia" ref="auditInspectionDia" + @closeImplementDia="closeImplementDia"></audit-inspection-dia> + </div> +</template> + +<script> +import limsTable from "@/components/Table/lims-table.vue"; +import AuditInspectionDia from './auditInspectionDia.vue'; +import { + pageInternalCheck, + delInternalCheck, + exportInternalCheck +} from '@/api/cnas/systemManagement/internalAuditManagement.js' + +export default { + name: 'auditInspection', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: { AuditInspectionDia, limsTable }, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + searchForm: { + department: '', + }, + tableColumn: [ + { + label: '鍙楀閮ㄩ棬', + prop: 'department', + }, + { + label: '閮ㄩ棬璐熻矗浜�', + prop: 'departmentHead', + }, + { + label: '瀹℃牳鍛�', + prop: 'auditor', + }, + { + label: '瀹℃牳鏃ユ湡', + prop: 'reviewDate', + }, { + dataType: 'tag', + label: '鎵瑰噯鐘舵��', + prop: 'ratifyStatus', + minWidth: '100', + formatData: (params) => { + if (params === 0) { + return '涓嶆壒鍑�'; + } else if (params === 1) { + return '鎵瑰噯'; + } else { + return null; + } + }, + formatType: (params) => { + if (params === 0) { + return 'danger'; + } else if (params === 1) { + return 'success'; + } else { + return null; + } + } + }, { + label: '鎵瑰噯鍐呭', + prop: 'ratifyRemark', + minWidth: '140' + }, + { + dataType: 'action', + minWidth: '220', + label: '鎿嶄綔', + operation: [ + { + name: '瀵煎嚭', + type: 'text', + clickFun: (row) => { + this.handleDown(row) + }, + disabled: (row) => { + if (row.ratifyStatus === 1) { + return false + } else { + return true + } + }, + }, + { + name: '缂栬緫', + type: 'text', + clickFun: (row) => { + this.openFormDia('edit', row); + }, + disabled: (row) => { + if (row.ratifyStatus === 1) { + return true + } else { + return false + } + }, + }, + { + name: '鎵瑰噯', + type: 'text', + clickFun: (row) => { + this.openFormDia('ratify', row); + }, + disabled: (row) => { + if (row.ratifyStatus === 1) { + return true + } else { + return false + } + }, + }, + { + name: '鍒犻櫎', + type: 'text', + color: '#f56c6c', + clickFun: (row) => { + this.delPlan(row) + }, + disabled: (row) => { + if (row.ratifyStatus === 1) { + return true + } else { + return false + } + }, + } + ] + } + ], + tableData: [], + tableLoading: false, + page: { + size: 20, + current: 1, + total: 0, + }, + auditInspectionDia: false + }; + }, + mounted() { + this.searchList() + }, + // 鏂规硶闆嗗悎 + methods: { + // 鏌ヨ鍒楄〃 + searchList() { + const entity = this.searchForm + const page = this.page + this.tableLoading = true + pageInternalCheck({ ...entity, ...page }).then(res => { + this.tableLoading = false + if (res.code === 201) return + this.tableData = res.data.records + this.page.total = res.data.total + }).catch(err => { + console.log('err---', err); + this.tableLoading = false + }) + }, + // 鏂板锛岀紪杈戯紝鎵瑰噯寮规 + openFormDia(type, row) { + this.auditInspectionDia = true + this.$nextTick(() => { + this.$refs.auditInspectionDia.openDia(type, row) + }) + }, + closeImplementDia() { + this.auditInspectionDia = false + this.searchList() + }, + // 閲嶇疆鏌ヨ鏉′欢 + resetSearchForm() { + this.searchForm.department = ''; + this.searchList() + }, + // 鍒犻櫎 + delPlan(row) { + this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + this.tableLoading = true + delInternalCheck({ checkId: row.checkId }).then(res => { + this.tableLoading = false + if (res.code === 201) return + this.$message.success('鍒犻櫎鎴愬姛') + this.searchList() + }).catch(err => { + this.tableLoading = false + console.log('err---', err); + }) + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堝垹闄�' + }); + }); + }, + // 瀵煎嚭 + handleDown(row) { + exportInternalCheck({ checkId: row.checkId }).then(res => { + this.outLoading = false + this.$message.success('瀵煎嚭鎴愬姛') + const blob = new Blob([res], { type: 'application/msword' }); + this.$download.saveAs(blob, '鍐呭妫�鏌�' + '.docx'); + }) + }, + pagination({ page, limit }) { + this.page.current = page; + this.page.size = limit; + this.searchList(); + }, + } +}; +</script> + +<style scoped> +.search-background { + width: 100%; + height: 60px; + line-height: 60px; + display: flex; + justify-content: space-between; +} + +.search-group { + display: flex; + align-items: center; + margin: 0 20px; +} +</style> diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/auditInspectionDia.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditInspectionDia.vue new file mode 100644 index 0000000..a1f1e58 --- /dev/null +++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditInspectionDia.vue @@ -0,0 +1,231 @@ +<template> + <div> + <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false" + :visible.sync="formDia" title="鍐呴儴瀹℃牳瀹炴柦璁″垝" width="80%" @close="closeImplementDia"> + <el-form ref="form" :model="form" :rules="rules" label-width="auto"> + <el-col :span="12"> + <el-form-item label="鍙楀閮ㄩ棬" prop="department"> + <el-input v-model="form.department" :disabled="operationType === 'ratify'" clearable + size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="閮ㄩ棬璐熻矗浜�" prop="departmentHead"> + <el-input v-model="form.departmentHead" :disabled="operationType === 'ratify'" clearable + size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="瀹℃牳鍛�" prop="auditor"> + <el-input v-model="form.auditor" :disabled="operationType === 'ratify'" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="瀹℃牳鏃ユ湡" prop="reviewDate"> + <el-date-picker v-model="form.reviewDate" :disabled="operationType === 'ratify'" clearable + format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" size="small" style="width: 100%" type="date" + value-format="yyyy-MM-dd"> + </el-date-picker> + </el-form-item> + </el-col> + </el-form> + <div v-if="operationType !== 'ratify'" style="text-align: right;margin-bottom: 10px"> + <el-button size="small" type="primary" @click="addRow">娣诲姞</el-button> + <el-button size="small" type="danger" @click="clearTable">娓呯┖</el-button> + </div> + <el-table :data="checkDetailList" border height="300" style="width: 100%"> + <el-table-column align="center" label="搴忓彿" type="index" width="60" /> + <el-table-column header-align="center" label="娑夊強瑕佺礌鍜岃川閲忎綋绯绘枃浠舵潯娆�" prop="element"> + <template slot-scope="{row}"> + <el-input v-model="row.element" :disabled="operationType === 'ratify'" size="small" /> + </template> + </el-table-column> + <el-table-column header-align="center" label="瀹℃牳鍐呭" prop="content"> + <template slot-scope="{row}"> + <el-input v-model="row.content" :disabled="operationType === 'ratify'" size="small" /> + </template> + </el-table-column> + <el-table-column header-align="center" label="瀹℃牳鏂瑰紡" prop="method"> + <template slot-scope="{row}"> + <el-input v-model="row.method" :disabled="operationType === 'ratify'" size="small" /> + </template> + </el-table-column> + <el-table-column header-align="center" label="瀹℃牳缁撴灉璁板綍" prop="resultRecords" width="180"> + <template slot-scope="{row}"> + <el-input v-model="row.resultRecords" :disabled="operationType === 'ratify'" size="small" /> + </template> + </el-table-column> + <el-table-column header-align="center" label="涓嶇鍚堟�ц川" prop="nonNature" width="180"> + <template slot-scope="{row}"> + <el-input v-model="row.nonNature" :disabled="operationType === 'ratify'" size="small" /> + </template> + </el-table-column> + </el-table> + <span slot="footer" class="dialog-footer"> + <el-button v-if="operationType === 'ratify'" :loading="loading" @click="ratify(0)">涓嶆壒鍑�</el-button> + <el-button v-if="operationType === 'ratify'" :loading="loading" type="primary" @click="ratify(1)">鎵� + 鍑�</el-button> + <el-button v-if="operationType !== 'ratify'" @click="closeImplementDia">鍙� 娑�</el-button> + <el-button v-if="operationType !== 'ratify'" :loading="loading" type="primary" @click="handleEdit">鎻� + 浜�</el-button> + </span> + </el-dialog> + <el-dialog :visible.sync="approvalDialog" title="鎵瑰噯" width="30%" @close="approvalDialog = false"> + <span> + 鎵瑰噯澶囨敞锛� + <el-input v-model="ratifyRemark" type="textarea"></el-input> + </span> + <span slot="footer" class="dialog-footer"> + <el-button :loading="approvalLoading" @click="approvalDialog = false">鍙� 娑�</el-button> + <el-button :loading="approvalLoading" type="primary" @click="handleApproval(0)">纭� 瀹�</el-button> + </span> + </el-dialog> + </div> +</template> + +<script> +import { + getInternalCheckOne, + addInternalCheck, + updateInternalCheck, + ratifyInternalCheck, +} from '@/api/cnas/systemManagement/internalAuditManagement.js' +export default { + name: 'auditInspectionDia', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: {}, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + formDia: false, + diaLoading: false, + loading: false, + form: { + department: '', + departmentHead: '', + auditor: '', + reviewDate: '', + }, + rules: { + department: [{ required: true, message: '璇峰~鍐欏彈瀹¢儴闂�', trigger: 'blur' }], + departmentHead: [{ required: true, message: '璇峰~鍐欓儴闂ㄨ礋璐d汉', trigger: 'blur' }], + auditor: [{ required: true, message: '璇峰~鍐欏鏍稿憳', trigger: 'blur' }], + reviewDate: [{ required: true, message: '璇峰~鍐欏鏍告棩鏈�', trigger: 'blur' }], + }, + checkDetailList: [], + operationType: '', + approvalDialog: false, + approvalLoading: false, + ratifyRemark: '', + }; + }, + // 鏂规硶闆嗗悎 + methods: { + // 鎵撳紑寮规 + openDia(type, row) { + this.formDia = true + this.operationType = type + if (type !== 'add') { + this.searchInfo(row) + } + }, + // 鏌ヨ璇︽儏 + searchInfo(row) { + this.diaLoading = true + getInternalCheckOne({ checkId: row.checkId }).then(res => { + this.diaLoading = false + if (res.code === 201) return + this.form = res.data + this.checkDetailList = this.form.checkDetailList + }).catch(err => { + console.log(err) + this.diaLoading = false + }) + }, + // 鎻愪氦寮规鏁版嵁 + handleEdit() { + this.$refs['form'].validate((valid) => { + if (valid) { + if (this.checkDetailList.length === 0) { + this.$message.warning('璇锋坊鍔犺〃鏍兼暟鎹�') + return + } + this.loading = true + const internalCheckDto = this.HaveJson(this.form) + internalCheckDto.checkDetailList = this.HaveJson(this.checkDetailList) + if (this.operationType === 'add') { + addInternalCheck(internalCheckDto).then(res => { + this.loading = false + if (res.code === 201) return + this.$message.success('鎿嶄綔鎴愬姛') + this.closeImplementDia() + }).catch(err => { + console.log('err---', err); + this.loading = false + }) + } else if (this.operationType === 'edit') { + updateInternalCheck(internalCheckDto).then(res => { + this.loading = false + if (res.code === 201) return + this.$message.success('鎿嶄綔鎴愬姛') + this.closeImplementDia() + }).catch(err => { + console.log('err---', err); + this.loading = false + }) + } + } else { + console.log('error submit!!'); + return false; + } + }); + }, + ratify(ratifyStatus) { + // 涓嶆壒鍑嗛渶瑕佸~鍐欐壒鍑嗗唴瀹� + if (ratifyStatus === 0) { + this.approvalDialog = true + } else { + this.handleApproval(ratifyStatus) + } + }, + // 鎻愪氦鎵瑰噯淇℃伅 + handleApproval(ratifyStatus) { + this.approvalLoading = true + const internalCheckDto = this.HaveJson(this.form) + internalCheckDto.ratifyStatus = ratifyStatus + internalCheckDto.ratifyRemark = ratifyStatus === 0 ? this.ratifyRemark : '' + ratifyInternalCheck(internalCheckDto).then(res => { + if (res.code === 200) { + this.$message.success('鎻愪氦鎴愬姛锛�'); + this.approvalDialog = false + this.closeImplementDia(this.departId); + } + this.approvalLoading = false + }).catch(() => { + this.approvalLoading = false + }) + }, + // 澧炲姞琛ㄦ牸琛屾暟鎹� + addRow() { + this.checkDetailList.push({ + element: '', + content: '', + method: '', + resultRecords: '', + nonNature: '', + }) + }, + // 娓呯┖琛ㄦ牸鏁版嵁 + clearTable() { + this.checkDetailList = [] + }, + closeImplementDia() { + this.$refs.form.resetFields(); + this.formDia = false + this.$emit('closeImplementDia') + }, + } +}; +</script> + +<style scoped></style> diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/auditMeetingSign.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditMeetingSign.vue new file mode 100644 index 0000000..1ea5e3a --- /dev/null +++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditMeetingSign.vue @@ -0,0 +1,202 @@ +<template> + <div> + <div class="search-background"> + <span class="search-group"> + <span style="width: 160px">鏃堕棿锛�</span> + <el-input v-model="searchForm.meetingDate" clearable size="small"></el-input> + <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">閲� 缃�</el-button> + <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button> + </span> + <span class="search-group"> + <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button> + </span> + </div> + <div class="table"> + <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData" + :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" :page="page" @pagination="pagination"> + </limsTable> + </div> + <audit-meeting-sign-dia v-if="auditMeetingSignDia" ref="auditMeetingSignDia" + @closeYearDia="closeYearDia"></audit-meeting-sign-dia> + </div> +</template> + +<script> +import limsTable from "@/components/Table/lims-table.vue"; +import AuditMeetingSignDia from './auditMeetingSignDia.vue'; +import { + pageInternalMeeting, + delInternalMeeting, + exportInternalMeeting, +} from '@/api/cnas/systemManagement/internalAuditManagement.js' + +export default { + name: 'auditMeetingSign', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: { AuditMeetingSignDia, limsTable }, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + searchForm: { + meetingDate: '', + }, + tableColumn: [ + { + label: '鏃堕棿', + prop: 'meetingDate', + minWidth: '100' + }, + { + label: '涓绘寔浜�', + prop: 'compere', + minWidth: '100' + }, + { + label: '鍦扮偣', + prop: 'place', + minWidth: '100' + }, + { + label: '浼氳涓婚', + prop: 'subject', + minWidth: '100' + }, + { + label: '鍙備細浜哄憳', + prop: 'participantName', + minWidth: '120' + }, + { + dataType: 'action', + fixed: 'right', + minWidth: '220', + label: '鎿嶄綔', + operation: [ + { + name: '瀵煎嚭', + type: 'text', + clickFun: (row) => { + this.handleDown(row) + } + }, + { + name: '缂栬緫', + type: 'text', + clickFun: (row) => { + this.openFormDia('edit', row); + }, + }, + { + name: '鍒犻櫎', + type: 'text', + color: '#f56c6c', + clickFun: (row) => { + this.delPlan(row) + } + } + ] + } + ], + tableData: [], + tableLoading: false, + page: { + size: 20, + current: 1, + total: 0, + }, + auditMeetingSignDia: false, + }; + }, + mounted() { + this.searchList() + }, + // 鏂规硶闆嗗悎 + methods: { + // 鏌ヨ鍒楄〃 + searchList() { + const entity = this.searchForm + const page = this.page + this.tableLoading = true + pageInternalMeeting({ ...entity, ...page }).then(res => { + this.tableLoading = false + if (res.code === 201) return + this.tableData = res.data.records + this.page.total = res.data.total + }).catch(err => { + console.log('err---', err); + this.tableLoading = false + }) + }, + // 鏂板锛岀紪杈戝脊妗� + openFormDia(type, row) { + this.auditMeetingSignDia = true + this.$nextTick(() => { + this.$refs.auditMeetingSignDia.openDia(type, row) + }) + }, + closeYearDia() { + this.auditMeetingSignDia = false + this.searchList() + }, + // 閲嶇疆鏌ヨ鏉′欢 + resetSearchForm() { + this.searchForm.meetingDate = ''; + this.searchList() + }, + // 鍒犻櫎 + delPlan(row) { + this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + this.tableLoading = true + delInternalMeeting({ meetingId: row.meetingId }).then(res => { + this.tableLoading = false + if (res.code === 201) return + this.$message.success('鍒犻櫎鎴愬姛') + this.searchList() + }).catch(err => { + this.tableLoading = false + console.log('err---', err); + }) + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堝垹闄�' + }); + }); + }, + // 瀵煎嚭 + handleDown(row) { + exportInternalMeeting({ meetingId: row.meetingId }).then(res => { + this.outLoading = false + this.$message.success('瀵煎嚭鎴愬姛') + const blob = new Blob([res], { type: 'application/msword' }); + this.$download.saveAs(blob, '鍐呭浼氳绛惧埌' + '.docx'); + }) + }, + pagination({ page, limit }) { + this.page.current = page; + this.page.size = limit; + this.searchList(); + }, + } +}; +</script> + +<style scoped> +.search-background { + width: 100%; + height: 60px; + line-height: 60px; + display: flex; + justify-content: space-between; +} + +.search-group { + display: flex; + align-items: center; + margin: 0 20px; +} +</style> diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/auditMeetingSignDia.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditMeetingSignDia.vue new file mode 100644 index 0000000..e648ee2 --- /dev/null +++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditMeetingSignDia.vue @@ -0,0 +1,183 @@ +<template> + <div> + <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false" + :visible.sync="formDia" title="鍐呭浼氳绛惧埌琛�" width="1000px" @close="closeYearDia"> + <el-form ref="form" :model="form" :rules="rules" label-position="top" label-width="auto"> + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item label="鏃堕棿" prop="meetingDate"> + <el-date-picker v-model="form.meetingDate" clearable format="yyyy-MM-dd HH:mm:ss" placeholder="璇烽�夋嫨" + size="small" style="width: 100%" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"> + </el-date-picker> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="涓绘寔浜�" prop="compere"> + <el-input v-model="form.compere" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="鍦扮偣" prop="place"> + <el-input v-model="form.place" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="浼氳涓婚" prop="subject"> + <el-input v-model="form.subject" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="鍙備細浜哄憳" prop="participant"> + <el-select v-model="form.participant" clearable filterable multiple placeholder="璇烽�夋嫨" size="small" + style="width: 100%;"> + <el-option v-for="(item, i) in personList" :key="i" :label="item.label" :value="item.value"> + </el-option> + </el-select> + </el-form-item> + </el-col> + </el-row> + </el-form> + <span slot="footer" class="dialog-footer"> + <el-button @click="closeYearDia">鍙� 娑�</el-button> + <el-button :loading="loading" type="primary" @click="handleEdit">鎻� 浜�</el-button> + </span> + </el-dialog> + </div> +</template> + +<script> +import { + selectUserCondition, +} from "@/api/business/inspectionTask.js"; +import { + getInternalMeetingOne, + addInternalMeeting, + updateInternalMeeting, +} from '@/api/cnas/systemManagement/internalAuditManagement.js' +export default { + name: 'auditMeetingSignDia', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: {}, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + formDia: false, + diaLoading: false, + loading: false, + form: { + meetingDate: '', + compere: '', + place: '', + subject: '', + participant: [], + }, + rules: { + meetingDate: [{ required: true, message: '璇峰~鍐欎細璁椂闂�', trigger: 'blur' }], + compere: [{ required: true, message: '璇峰~鍐欎富鎸佷汉', trigger: 'blur' }], + place: [{ required: true, message: '璇峰~鍐欏湴鐐�', trigger: 'blur' }], + subject: [{ required: true, message: '璇峰~鍐欎細璁富棰�', trigger: 'blur' }], + participant: [{ required: true, message: '璇烽�夋嫨鍙傚姞浜哄憳', trigger: 'change' }], + }, + operationType: '', + personList: [] + }; + }, + mounted() { + + }, + // 鏂规硶闆嗗悎 + methods: { + // 鎵撳紑寮规 + openDia(type, row) { + this.formDia = true + this.operationType = type + this.getAuthorizedPerson() + if (type !== 'add') { + this.searchInfo(row) + } + }, + // 鏌ヨ璇︽儏 + searchInfo(row) { + this.diaLoading = true + getInternalMeetingOne({ meetingId: row.meetingId }).then(res => { + this.diaLoading = false + if (res.code === 201) return + this.form = res.data + this.form.participant = this.form.participant.split(',').map(Number) + }).catch(err => { + console.log(err) + this.diaLoading = false + }) + }, + // 鎻愪氦寮规鏁版嵁 + handleEdit() { + this.$refs['form'].validate((valid) => { + if (valid) { + this.loading = true + const internalMeeting = this.HaveJson(this.form) + internalMeeting.participant = internalMeeting.participant.join(',') + if (this.operationType === 'add') { + addInternalMeeting(internalMeeting).then(res => { + this.loading = false + if (res.code === 201) return + this.$message.success('鎿嶄綔鎴愬姛') + this.closeYearDia() + }).catch(err => { + console.log('err---', err); + this.loading = false + }) + } else if (this.operationType === 'edit') { + updateInternalMeeting(internalMeeting).then(res => { + this.loading = false + if (res.code === 201) return + this.$message.success('鎿嶄綔鎴愬姛') + this.closeYearDia() + }).catch(err => { + console.log('err---', err); + this.loading = false + }) + } + } else { + console.log('error submit!!'); + return false; + } + }); + }, + closeYearDia() { + this.$refs.form.resetFields(); + this.formDia = false + this.$emit('closeYearDia') + }, + getAuthorizedPerson() { + selectUserCondition().then(res => { + let data = [] + res.data.forEach(a => { + data.push({ + label: a.name, + value: a.id + }) + }) + this.personList = data + }) + }, + } +}; +</script> + +<style scoped> +.table { + table-layout: fixed; + width: 100%; + margin-top: 10px; +} + +.table td { + height: 34px; + width: 100px; + text-align: center; + font-size: 14px; + word-wrap: break-word; + white-space: normal; + padding: 4px; +} +</style> diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/auditReport.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditReport.vue new file mode 100644 index 0000000..1eb6332 --- /dev/null +++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditReport.vue @@ -0,0 +1,312 @@ +<template> + <div> + <div class="search-background"> + <span class="search-group"> + <span style="width: 160px">瀹℃牳鐩殑锛�</span> + <el-input v-model="searchForm.purposes" clearable size="small"></el-input> + <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">閲� 缃�</el-button> + <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button> + </span> + <span class="search-group"> + <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button> + </span> + </div> + <div class="table"> + <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData" + :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" :page="page" @pagination="pagination"> + </limsTable> + </div> + <audit-report-dia v-if="auditReportDia" ref="auditReportDia" + @closeImplementDia="closeImplementDia"></audit-report-dia> + </div> +</template> + +<script> +import limsTable from "@/components/Table/lims-table.vue"; +import AuditReportDia from './auditReportDia.vue'; +import { + delInternalReport, + pageInternalReport, + exportInternalReport, +} from '@/api/cnas/systemManagement/internalAuditManagement.js' +export default { + name: 'auditReport', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: { AuditReportDia, limsTable }, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + searchForm: { + purposes: '', + }, + tableColumn: [ + { + label: '瀹℃牳鐩殑', + prop: 'purposes', + }, + { + label: '瀹℃牳渚濇嵁', + prop: 'basis', + }, + { + label: '瀹℃牳鏃ユ湡', + prop: 'reviewDate', + }, + { + label: '瀹℃牳鏂规硶', + prop: 'method', + }, + { + label: '瀹℃牳鑼冨洿', + prop: 'scope', + }, + { + label: '瀹℃牳璐d换鑰�', + prop: 'responsible', + }, + { + label: '瀹℃牳缁勯暱', + prop: 'leader', + }, + { + label: '瀹℃牳鍛�', + prop: 'auditor', + }, + { + label: '瀹℃牳缁勫垎宸ユ儏鍐�', + prop: 'division', + }, + { + dataType: 'tag', + label: '瀹℃牳鐘舵��', + prop: 'examineStatus', + minWidth: '100', + formatData: (params) => { + if (params === 0) { + return '涓嶉�氳繃'; + } else if (params === 1) { + return '閫氳繃'; + } else { + return null; + } + }, + formatType: (params) => { + if (params === 0) { + return 'danger'; + } else if (params === 1) { + return 'success'; + } else { + return null; + } + } + }, + { + label: '瀹℃牳鍐呭', + prop: 'examineRemark', + minWidth: '140' + }, + { + dataType: 'tag', + label: '璐ㄩ噺璐熻矗浜虹姸鎬�', + prop: 'qualityStatus', + minWidth: '100', + formatData: (params) => { + if (params === 0) { + return '涓嶉�氳繃'; + } else if (params === 1) { + return '閫氳繃'; + } else { + return null; + } + }, + formatType: (params) => { + if (params === 0) { + return 'danger'; + } else if (params === 1) { + return 'success'; + } else { + return null; + } + } + }, + { + label: '璐ㄩ噺璐熻矗浜烘剰瑙�', + prop: 'qualityRemark', + minWidth: '140' + }, + { + dataType: 'action', + minWidth: '220', + fixed: 'right', + label: '鎿嶄綔', + operation: [ + { + name: '瀵煎嚭', + type: 'text', + clickFun: (row) => { + this.handleDown(row) + } + }, + { + name: '缂栬緫', + type: 'text', + clickFun: (row) => { + this.openFormDia('edit', row); + }, + disabled: (row) => { + if (row.examineStatus === 1 || row.examineStatus === 1) { + return true + } else { + return false + } + }, + }, + { + name: '瀹℃牳', + type: 'text', + clickFun: (row) => { + this.openFormDia('examine', row); + }, + disabled: (row) => { + if (row.examineStatus === 1) { + return true + } else { + return false + } + }, + }, + { + name: '鎰忚', + type: 'text', + clickFun: (row) => { + this.openFormDia('ratify', row); + }, + disabled: (row) => { + if (row.qualityStatus === 1 || row.examineStatus === 0 || row.examineStatus === null) { + return true + } else { + return false + } + }, + }, + { + name: '鍒犻櫎', + type: 'text', + color: '#f56c6c', + clickFun: (row) => { + this.delPlan(row) + }, + disabled: (row) => { + if (row.qualityStatus === 1) { + return true + } else { + return false + } + }, + } + ] + } + ], + tableData: [], + tableLoading: false, + page: { + size: 20, + current: 1, + total: 0, + }, + auditReportDia: false + }; + }, + mounted() { + this.searchList() + }, + // 鏂规硶闆嗗悎 + methods: { + // 鏌ヨ鍒楄〃 + searchList() { + const entity = this.searchForm + const page = this.page + this.tableLoading = true + pageInternalReport({ ...entity, ...page }).then(res => { + this.tableLoading = false + if (res.code === 201) return + this.tableData = res.data.records + this.page.total = res.data.total + }).catch(err => { + console.log('err---', err); + this.tableLoading = false + }) + }, + // 鏂板锛岀紪杈戯紝鎵瑰噯寮规 + openFormDia(type, row) { + this.auditReportDia = true + this.$nextTick(() => { + this.$refs.auditReportDia.openDia(type, row) + }) + }, + closeImplementDia() { + this.auditReportDia = false + this.searchList() + }, + // 閲嶇疆鏌ヨ鏉′欢 + resetSearchForm() { + this.searchForm.purposes = ''; + this.searchList() + }, + // 鍒犻櫎 + delPlan(row) { + this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + this.tableLoading = true + delInternalReport({ reportId: row.reportId }).then(res => { + this.tableLoading = false + if (res.code === 201) return + this.$message.success('鍒犻櫎鎴愬姛') + this.searchList() + }).catch(err => { + this.tableLoading = false + console.log('err---', err); + }) + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堝垹闄�' + }); + }); + }, + // 瀵煎嚭 + handleDown(row) { + exportInternalReport({ reportId: row.reportId }).then(res => { + this.outLoading = false + this.$message.success('瀵煎嚭鎴愬姛') + const blob = new Blob([res], { type: 'application/msword' }); + this.$download.saveAs(blob, '鍐呭鎶ュ憡' + '.docx'); + }) + }, + pagination({ page, limit }) { + this.page.current = page; + this.page.size = limit; + this.searchList(); + }, + } +}; +</script> + +<style scoped> +.search-background { + width: 100%; + height: 60px; + line-height: 60px; + display: flex; + justify-content: space-between; +} + +.search-group { + display: flex; + align-items: center; + margin: 0 20px; +} +</style> diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/auditReportDia.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditReportDia.vue new file mode 100644 index 0000000..b2dd1fa --- /dev/null +++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/auditReportDia.vue @@ -0,0 +1,333 @@ +<template> + <div> + <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false" + :visible.sync="formDia" title="鍐呴儴瀹℃牳鎶ュ憡" width="80%" @close="closeImplementDia"> + <el-form ref="form" :model="form" :rules="rules" label-position="top" label-width="auto"> + <el-row :gutter="20"> + <el-col :span="24"> + <el-form-item label="瀹℃牳鐩殑" prop="purposes"> + <el-input v-model="form.purposes" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="瀹℃牳渚濇嵁" prop="basis"> + <el-input v-model="form.basis" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="瀹℃牳鏃ユ湡" prop="reviewDate"> + <el-date-picker v-model="form.reviewDate" + :disabled="operationType === 'examine' || operationType === 'ratify'" clearable format="yyyy-MM-dd" + placeholder="閫夋嫨鏃ユ湡" size="small" style="width: 100%" type="date" value-format="yyyy-MM-dd"> + </el-date-picker> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="瀹℃牳鏂规硶" prop="method"> + <el-input v-model="form.method" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="瀹℃牳鑼冨洿" prop="scope"> + <el-input v-model="form.scope" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="瀹℃牳璐d换鑰�" prop="responsible"> + <el-input v-model="form.responsible" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="瀹℃牳缁勯暱" prop="leader"> + <el-input v-model="form.leader" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="瀹℃牳鍛�" prop="auditor"> + <el-input v-model="form.auditor" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="瀹℃牳缁勫垎宸ユ儏鍐�" prop="division"> + <el-input v-model="form.division" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="瀹℃牳姒傚喌" prop="overview"> + <el-input v-model="form.overview" :disabled="operationType === 'examine' || operationType === 'ratify'" + :rows="3" clearable size="small" type="textarea"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="鍐呭缁勫涓績绠$悊浣撶郴鐨勭粨璁烘�ц瘎浠�" prop="conclusion"> + <el-input v-model="form.conclusion" :disabled="operationType === 'examine' || operationType === 'ratify'" + :rows="3" clearable size="small" type="textarea"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="鏀硅繘鎰忚" prop="suggest"> + <el-input v-model="form.suggest" :disabled="operationType === 'examine' || operationType === 'ratify'" + :rows="3" clearable size="small" type="textarea"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="棰勮鍙楀鏍搁儴闂ㄥ畬鎴愮籂姝f帾鏂芥墍闇�鏃堕棿" prop="actionDate"> + <el-input v-model="form.actionDate" :disabled="operationType === 'examine' || operationType === 'ratify'" + :rows="3" clearable size="small" type="textarea"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="涓嶇鍚堟儏鍐垫暣鏀规�讳綋璺熻繘纭浜�" prop="followUser"> + <el-input v-model="form.followUser" :disabled="operationType === 'examine' || operationType === 'ratify'" + :rows="3" clearable size="small" type="textarea"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="涓嶇鍚堟儏鍐垫暣鏀规�讳綋璺熻繘纭璁板綍" prop="followRecord"> + <el-input v-model="form.followRecord" + :disabled="operationType === 'examine' || operationType === 'ratify'" :rows="3" clearable size="small" + type="textarea"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="鏈姤鍛婂彂鏀捐寖鍥�" prop="reportScope"> + <el-input v-model="form.reportScope" :disabled="operationType === 'examine' || operationType === 'ratify'" + :rows="3" clearable size="small" type="textarea"></el-input> + </el-form-item> + </el-col> + <el-col v-if="operationType === 'ratify'" :span="24"> + <el-form-item label="璐ㄩ噺璐熻矗浜烘剰瑙�" prop="qualityRemark"> + <el-input v-model="form.qualityRemark" :rows="3" clearable size="small" type="textarea"></el-input> + </el-form-item> + </el-col> + </el-row> + </el-form> + <span slot="footer" class="dialog-footer"> + <el-button v-if="operationType === 'examine'" :loading="loading" @click="examine(0)">涓嶉�氳繃</el-button> + <el-button v-if="operationType === 'examine'" :loading="loading" type="primary" @click="examine(1)">閫� + 杩�</el-button> + <el-button v-if="operationType === 'ratify'" :loading="loading" @click="handleApproval(0)">涓嶆壒鍑�</el-button> + <el-button v-if="operationType === 'ratify'" :loading="loading" type="primary" @click="handleApproval(1)">鎵� + 鍑�</el-button> + <el-button v-if="operationType !== 'ratify' && operationType !== 'examine'" @click="closeImplementDia">鍙� + 娑�</el-button> + <el-button v-if="operationType !== 'ratify' && operationType !== 'examine'" :loading="loading" type="primary" + @click="handleEdit">鎻� 浜�</el-button> + </span> + </el-dialog> + <el-dialog :visible.sync="examineDialog" title="瀹℃牳" width="30%" @close="examineDialog = false"> + <span> + 瀹℃牳澶囨敞锛� + <el-input v-model="examineRemark" type="textarea"></el-input> + </span> + <span slot="footer" class="dialog-footer"> + <el-button :loading="examineLoading" @click="examineDialog = false">鍙� 娑�</el-button> + <el-button :loading="examineLoading" type="primary" @click="handleExamine(0)">纭� 瀹�</el-button> + </span> + </el-dialog> + <el-dialog :visible.sync="approvalDialog" title="鎵瑰噯" width="30%" @close="approvalDialog = false"> + <span> + 鎵瑰噯澶囨敞锛� + <el-input v-model="qualityRemark" type="textarea"></el-input> + </span> + <span slot="footer" class="dialog-footer"> + <el-button :loading="approvalLoading" @click="approvalDialog = false">鍙� 娑�</el-button> + <el-button :loading="approvalLoading" type="primary" @click="handleApproval(0)">纭� 瀹�</el-button> + </span> + </el-dialog> + </div> +</template> + +<script> +import { + getInternalReportOne, + addInternalReport, + updateInternalReport, + examineInternalReport, + qualityInternalReport, +} from '@/api/cnas/systemManagement/internalAuditManagement.js' +export default { + name: 'auditReportDia', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: {}, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + formDia: false, + diaLoading: false, + loading: false, + form: { + purposes: '', + basis: '', + reviewDate: '', + method: '', + scope: '', + responsible: '', + leader: '', + auditor: '', + division: '', + overview: '', + conclusion: '', + suggest: '', + actionDate: '', + followUser: '', + followRecord: '', + reportScope: '', + qualityRemark: '', + }, + rules: { + purposes: [{ required: true, message: '璇峰~鍐欏鏍哥洰鐨�', trigger: 'blur' }], + basis: [{ required: true, message: '璇峰~鍐欏鏍镐緷鎹�', trigger: 'blur' }], + reviewDate: [{ required: true, message: '璇峰~鍐欏鏍告棩鏈�', trigger: 'change' }], + method: [{ required: true, message: '璇峰~鍐欏鏍告柟娉�', trigger: 'blur' }], + scope: [{ required: true, message: '璇峰~鍐欏鏍歌寖鍥�', trigger: 'blur' }], + responsible: [{ required: true, message: '璇峰~鍐欏鏍歌矗浠昏��', trigger: 'blur' }], + leader: [{ required: true, message: '璇峰~鍐欏鏍哥粍闀�', trigger: 'blur' }], + auditor: [{ required: true, message: '璇峰~鍐欏鏍稿憳', trigger: 'blur' }], + division: [{ required: true, message: '璇峰~鍐欏鏍哥粍鍒嗗伐鎯呭喌', trigger: 'blur' }], + overview: [{ required: true, message: '璇峰~鍐欏鏍告鍐�', trigger: 'blur' }], + conclusion: [{ required: true, message: '璇峰~鍐�', trigger: 'blur' }], + suggest: [{ required: true, message: '璇峰~鍐�', trigger: 'blur' }], + actionDate: [{ required: true, message: '璇峰~鍐�', trigger: 'blur' }], + followUser: [{ required: true, message: '璇峰~鍐�', trigger: 'blur' }], + followRecord: [{ required: true, message: '璇峰~鍐�', trigger: 'blur' }], + reportScope: [{ required: true, message: '璇峰~鍐�', trigger: 'blur' }], + qualityRemark: [{ required: true, message: '璇峰~鍐�', trigger: 'blur' }], + }, + operationType: '', + approvalDialog: false, + approvalLoading: false, + examineDialog: false, + examineLoading: false, + qualityRemark: '', + examineRemark: '', + }; + }, + mounted() { + + }, + // 鏂规硶闆嗗悎 + methods: { + // 鎵撳紑寮规 + openDia(type, row) { + this.formDia = true + this.operationType = type + if (type !== 'add') { + this.searchInfo(row) + } + }, + // 鏌ヨ璇︽儏 + searchInfo(row) { + this.diaLoading = true + getInternalReportOne({ reportId: row.reportId }).then(res => { + this.diaLoading = false + if (res.code === 201) return + this.form = res.data + }).catch(err => { + console.log(err) + this.diaLoading = false + }) + }, + // 鎻愪氦寮规鏁版嵁 + handleEdit() { + this.$refs['form'].validate((valid) => { + if (valid) { + this.loading = true + const internalReport = this.HaveJson(this.form) + if (this.operationType === 'add') { + addInternalReport(internalReport).then(res => { + this.loading = false + if (res.code === 201) return + this.$message.success('鎿嶄綔鎴愬姛') + this.closeImplementDia() + }).catch(err => { + console.log('err---', err); + this.loading = false + }) + } else if (this.operationType === 'edit') { + updateInternalReport(internalReport).then(res => { + this.loading = false + if (res.code === 201) return + this.$message.success('鎿嶄綔鎴愬姛') + this.closeImplementDia() + }).catch(err => { + console.log('err---', err); + this.loading = false + }) + } + } else { + console.log('error submit!!'); + return false; + } + }); + }, + // 瀹℃牳娴佺▼ + examine(examineStatus) { + if (examineStatus === 0) { + this.examineDialog = true + } else { + this.handleExamine(examineStatus) + } + }, + handleExamine(examineStatus) { + this.examineLoading = true + const internalReport = this.HaveJson(this.form) + internalReport.examineStatus = examineStatus + examineInternalReport(internalReport).then(res => { + if (res.code === 200) { + this.$message.success('鎻愪氦鎴愬姛锛�'); + this.approvalDialog = false + this.closeImplementDia(this.departId); + } + this.examineLoading = false + }).catch(() => { + this.examineLoading = false + }) + }, + // 鎻愪氦瀹℃牳淇℃伅 + handleApproval(qualityStatus) { + this.approvalLoading = true + const internalReport = this.HaveJson(this.form) + internalReport.qualityStatus = qualityStatus + qualityInternalReport(internalReport).then(res => { + if (res.code === 200) { + this.$message.success('鎻愪氦鎴愬姛锛�'); + this.approvalDialog = false + this.closeImplementDia(this.departId); + } + this.approvalLoading = false + }).catch(() => { + this.approvalLoading = false + }) + }, + closeImplementDia() { + this.$refs.form.resetFields(); + this.formDia = false + this.$emit('closeImplementDia') + }, + } +}; +</script> + +<style scoped> +>>>.el-dialog { + margin: 6vh auto 50px !important; +} + +>>>.el-dialog__body { + max-height: 42em; + overflow-y: auto; +} + +>>>.is-required { + margin-bottom: 6px; +} +</style> diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/correctiveAction.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/correctiveAction.vue new file mode 100644 index 0000000..86acfd3 --- /dev/null +++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/correctiveAction.vue @@ -0,0 +1,182 @@ +<template> + <div> + <div class="search-background"> + <span class="search-group"> + <span style="width: 200px">涓嶅悎鏍兼弿杩帮細</span> + <el-input v-model="searchForm.raiseResult" clearable size="small"></el-input> + <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">閲� 缃�</el-button> + <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button> + </span> + <span class="search-group"> + <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button> + </span> + </div> + <div class="table"> + <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData" + :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" :page="page" @pagination="pagination"> + </limsTable> + </div> + <corrective-action-d-ia v-if="correctiveActionDIa" ref="correctiveActionDIa" + @closeRectifyDia="closeRectifyDia"></corrective-action-d-ia> + <view-test-record v-if="viewTestRecordDialog" ref="viewTestRecordDialog"></view-test-record> + </div> +</template> + +<script> +import TableCard from '@/components/TableCard/index.vue'; +import limsTable from "@/components/Table/lims-table.vue"; +import CorrectiveActionDIa from './correctiveActionDIa.vue'; +import ViewTestRecord from './ViewTestRecord.vue'; +import { + pageInternalCorrect, + exportInternalCorrect, +} from '@/api/cnas/systemManagement/internalAuditManagement.js' + +export default { + name: 'correctiveAction', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: { CorrectiveActionDIa, limsTable, TableCard, ViewTestRecord }, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + searchForm: { + raiseResult: '', + }, + tableColumn: [ + { + label: '涓嶅悎鏍兼垨鍋忕浜嬪疄鐨勬弿杩�', + prop: 'raiseResult', + minWidth: '100' + }, + { + label: '鍘熷洜鍒嗘瀽', + prop: 'causeResult', + minWidth: '100' + }, + { + label: '绾犳鎺柦', + prop: 'correctResult', + minWidth: '100' + }, + { + label: '瀹炴柦楠岃瘉缁撴灉', + prop: 'validationResult', + minWidth: '100' + }, + { + dataType: 'action', + minWidth: '220', + label: '鎿嶄綔', + operation: [ + { + name: '瀵煎嚭', + type: 'text', + clickFun: (row) => { + this.handleDown(row) + } + }, + { + name: '绾犳', + type: 'text', + clickFun: (row) => { + this.openFormDia('rectify', row); + }, + }, + { + name: '鏌ョ湅闄勪欢', + type: 'text', + clickFun: (row) => { + this.viewFiles(row); + }, + }, + ] + } + ], + tableData: [], + tableLoading: false, + page: { + size: 20, + current: 1, + total: 0, + }, + correctiveActionDIa: false, + viewTestRecordDialog: false, + }; + }, + mounted() { + this.searchList() + }, + // 鏂规硶闆嗗悎 + methods: { + // 鏌ヨ鍒楄〃 + searchList() { + const entity = { + raiseResult: this.searchForm.raiseResult, + } + const page = this.page + this.tableLoading = true + pageInternalCorrect({ ...entity, ...page }).then(res => { + this.tableLoading = false + if (res.code === 201) return + this.tableData = res.data.records + this.page.total = res.data.total + }).catch(err => { + console.log('err---', err); + this.tableLoading = false + }) + }, + // 閲嶇疆鏌ヨ鏉′欢 + resetSearchForm() { + this.searchForm.raiseResult = ''; + this.searchList() + }, + // 鏌ョ湅闄勪欢 + viewFiles(row) { + this.viewTestRecordDialog = true + this.$nextTick(() => { + this.$refs.viewTestRecordDialog.openDia(row) + }) + }, + openFormDia(type, row) { + this.correctiveActionDIa = true + this.$nextTick(() => { + this.$refs.correctiveActionDIa.openDia(type, row) + }) + }, + // 瀵煎嚭 + handleDown(row) { + exportInternalCorrect({ correctId: row.correctId }).then(res => { + this.outLoading = false + this.$message.success('瀵煎嚭鎴愬姛') + const blob = new Blob([res], { type: 'application/msword' }); + this.$download.saveAs(blob, '鍐呭绾犳鎺柦' + '.docx'); + }) + }, + closeRectifyDia() { + this.correctiveActionDIa = false + this.searchList() + }, + pagination({ page, limit }) { + this.page.current = page; + this.page.size = limit; + this.searchList(); + }, + } +}; +</script> + +<style scoped> +.search-background { + width: 100%; + height: 60px; + line-height: 60px; + display: flex; + justify-content: space-between; +} + +.search-group { + display: flex; + align-items: center; + margin: 0 20px; +} +</style> diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/correctiveActionDIa.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/correctiveActionDIa.vue new file mode 100644 index 0000000..267fa52 --- /dev/null +++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/correctiveActionDIa.vue @@ -0,0 +1,409 @@ +<template> + <div> + <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="formDia" title="绾犳鎺柦澶勭悊鍗�" + width="60%" @close="closeRectifyDia"> + <el-steps :active="currentStep" align-center finish-status="success"> + <el-step title="涓嶅悎鏍兼垨鍋忕浜嬪疄鐨勬弿杩�" @click.native="setStep(0)"></el-step> + <el-step title="鍘熷洜鍒嗘瀽" @click.native="setStep(1)"></el-step> + <el-step title="绾犳鎺柦" @click.native="setStep(2)"></el-step> + <el-step title="瀹炴柦楠岃瘉缁撴灉" @click.native="setStep(3)"></el-step> + </el-steps> + <div> + <table border="1" cellspacing="10" class="tables"> + <tr v-if="showStep === 0"> + <td class="td-title"> + <p><span class="required-span">* </span>涓嶅悎鏍兼垨鍋忕浜嬪疄鐨勬弿杩帮細</p> + </td> + <td class="td-info" colspan="3"> + <el-input v-if="showStep === 0 && currentStep === 0" v-model="form.raiseResult" :rows="4" + placeholder="璇疯緭鍏ュ唴瀹�" size="small" type="textarea"> + </el-input> + <span v-if="showStep === 0 && currentStep !== 0" class="td-info1"> {{ form.raiseResult }}</span> + </td> + </tr> + <tr v-if="showStep === 0"> + <td v-if="currentStep === 0" class="td-title"> + <p><span class="required-span">* </span>璇烽�夋嫨涓嬩竴姝ヨ礋璐d汉锛�</p> + </td> + <td v-if="currentStep === 0" class="td-info" colspan="3"> + <el-select v-model="form.causeUserId" clearable filterable placeholder="璇烽�夋嫨" size="small"> + <el-option v-for="(item, i) in personList" :key="i" :label="item.label" :value="item.value"> + </el-option> + </el-select> + </td> + </tr> + <tr v-if="showStep === 0 && currentStep !== 0"> + <td class="td-title"> + <p>鎻愬嚭浜猴細</p> + </td> + <td class="td-info"> + {{ form.raiseUserName }} + </td> + <td class="td-title"> + <p>鎻愬嚭閮ㄩ棬锛�</p> + </td> + <td class="td-info"> + {{ form.raiseDepartment }} + </td> + </tr> + <tr v-if="showStep === 0 && currentStep !== 0"> + <td class="td-title"> + <p>鏃ユ湡锛�</p> + </td> + <td class="td-info" colspan="3"> + {{ form.raiseTime }} + </td> + </tr> + <tr v-if="showStep === 1"> + <td class="td-title"> + <p><span class="required-span">* </span>鍘熷洜鍒嗘瀽锛�</p> + </td> + <td class="td-info" colspan="3"> + <el-input v-if="showStep === 1 && currentStep === 1" v-model="form.causeResult" :rows="5" + placeholder="璇疯緭鍏ュ唴瀹�" size="small" type="textarea"> + </el-input> + <span v-if="showStep === 1 && currentStep !== 1" class="td-info1"> {{ form.causeResult }}</span> + </td> + </tr> + <tr v-if="showStep === 1 && currentStep !== 1"> + <td class="td-title"> + <p>鍘熷洜鍒嗘瀽浜猴細</p> + </td> + <td class="td-info"> + {{ form.causeUserName }} + </td> + <td class="td-title"> + <p>璐d换閮ㄩ棬锛�</p> + </td> + <td class="td-info"> + {{ form.causeDepartment }} + </td> + </tr> + <tr v-if="showStep === 1 && currentStep !== 1"> + <td class="td-title"> + <p>鍘熷洜鍒嗘瀽鏃ユ湡锛�</p> + </td> + <td class="td-info" colspan="3"> + {{ form.causeTime }} + </td> + </tr> + <tr v-if="showStep === 1"> + <td v-if="currentStep === 1" class="td-title"> + <p><span class="required-span">* </span>璇烽�夋嫨涓嬩竴姝ヨ礋璐d汉锛�</p> + </td> + <td v-if="currentStep === 1" class="td-info" colspan="3"> + <el-select v-model="form.correctUserId" clearable filterable placeholder="璇烽�夋嫨" size="small"> + <el-option v-for="(item, i) in personList" :key="i" :label="item.label" :value="item.value"> + </el-option> + </el-select> + </td> + </tr> + <tr v-if="showStep === 2"> + <td class="td-title"> + <p><span class="required-span">* </span>绾犳鎺柦锛�</p> + </td> + <td class="td-info" colspan="3"> + <el-input v-if="showStep === 2 && currentStep === 2" v-model="form.correctResult" :rows="5" + placeholder="璇疯緭鍏ュ唴瀹�" size="small" type="textarea"> + </el-input> + <span v-if="showStep === 2 && currentStep !== 2" class="td-info1"> {{ form.correctResult }}</span> + </td> + </tr> + <tr v-if="showStep === 2"> + <td class="td-title"> + <p>鎻愬嚭瑕佹眰閮ㄩ棬纭锛�</p> + </td> + <td class="td-info" colspan="3"> + <el-input v-if="showStep === 2 && currentStep === 2" v-model="form.raiseDepartmentAffirm" :rows="5" + placeholder="璇疯緭鍏ュ唴瀹�" size="small" type="textarea"> + </el-input> + <span v-if="showStep === 2 && currentStep !== 2" class="td-info1"> {{ form.raiseDepartmentAffirm }}</span> + </td> + </tr> + <tr v-if="showStep === 2 && currentStep !== 2"> + <td class="td-title"> + <p>绾犳浜猴細</p> + </td> + <td class="td-info"> + {{ form.correctUserName }} + </td> + <td class="td-title"> + <p>璐d换閮ㄩ棬锛�</p> + </td> + <td class="td-info"> + {{ form.correctDepartment }} + </td> + </tr> + <tr v-if="showStep === 2 && currentStep !== 2"> + <td class="td-title"> + <p>绾犳鏃ユ湡锛�</p> + </td> + <td class="td-info" colspan="3"> + {{ form.correctTime }} + </td> + </tr> + <tr v-if="showStep === 2"> + <td v-if="currentStep === 2" class="td-title"> + <p><span class="required-span">* </span>璇烽�夋嫨涓嬩竴姝ヨ礋璐d汉锛�</p> + </td> + <td v-if="currentStep === 2" class="td-info" colspan="3"> + <el-select v-model="form.validationUserId" clearable filterable placeholder="璇烽�夋嫨" size="small"> + <el-option v-for="(item, i) in personList" :key="i" :label="item.label" :value="item.value"> + </el-option> + </el-select> + </td> + </tr> + <tr v-if="showStep === 3"> + <td class="td-title"> + <p><span class="required-span">* </span>瀹炴柦楠岃瘉缁撴灉锛�</p> + </td> + <td class="td-info" colspan="3"> + <el-input v-if="showStep === 3 && currentStep === 3" v-model="form.validationResult" :rows="5" + placeholder="璇疯緭鍏ュ唴瀹�" size="small" type="textarea"> + </el-input> + <span v-if="showStep === 3 && currentStep !== 3" class="td-info1"> {{ form.validationResult }}</span> + </td> + </tr> + <tr v-if="showStep === 3 && currentStep !== 3"> + <td class="td-title"> + <p>楠岃瘉浜猴細</p> + </td> + <td class="td-info"> + {{ form.validationUserName }} + </td> + <td class="td-title"> + <p>璐d换閮ㄩ棬锛�</p> + </td> + <td class="td-info"> + {{ form.validationDepartment }} + </td> + </tr> + <tr v-if="showStep === 3 && currentStep !== 3"> + <td class="td-title"> + <p>楠岃瘉鏃ユ湡锛�</p> + </td> + <td class="td-info" colspan="3"> + {{ form.validationTime }} + </td> + </tr> + </table> + </div> + <span slot="footer" class="dialog-footer"> + <el-button @click="closeRectifyDia">鍙� 娑�</el-button> + <el-button v-if="currentStep !== 4" :loading="editLoad" type="primary" @click="handleEdit">鎻� 浜�</el-button> + </span> + </el-dialog> + </div> +</template> + +<script> +import { + getInternalCorrect, + addInternalCorrect, +} from '@/api/cnas/systemManagement/internalAuditManagement.js' +import { + selectUserCondition, +} from "@/api/business/inspectionTask.js"; +export default { + name: 'correctiveActionDIa', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: {}, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + formDia: false, + currentStep: 0, + showStep: 0, + form: { + superviseDetailsId: '', + raiseResult: '', + vdeRaiseResult: '', + causeUserId: '', + raiseUserName: '', + raiseDepartment: '', + raiseTime: '', + causeResult: '', + causeUserName: '', + causeDepartment: '', + causeTime: '', + correctUserId: '', + correctResult: '', + raiseDepartmentAffirm: '', + correctUserName: '', + correctDepartment: '', + correctTime: '', + validationUserId: '', + validationResult: '', + validationUserName: '', + validationDepartment: '', + validationTime: '', + }, + editLoad: false, + personList: [], + supervisedUserList: [], + }; + }, + mounted() { + + }, + // 鏂规硶闆嗗悎 + methods: { + openDia(type, row) { + this.formDia = true + if (type !== 'add') { + this.searchInfo(row) + this.form.superviseDetailsId = row.superviseDetailsId + } + this.getAuthorizedPerson() // 鑾峰彇浜哄憳鍒楄〃 + this.getSupervisedUserList() // 鑾峰彇褰撳墠閮ㄩ棬浜哄憳 + }, + // 鏌ヨ鐩戞帶璁″垝璇︽儏瀹炴柦淇℃伅 + searchInfo(row) { + this.form.qualityMonitorDetailsId = row.qualityMonitorDetailsId + getInternalCorrect({ correctId: row.correctId }).then(res => { + if (res.code === 201) return + if (res.data.superviseDetailsCorrectId === null) { + this.showStep = 0 + this.currentStep = 0 + } else { + this.form = res.data + if (res.data.isFinish === 0) { + if (res.data.causeUserId) { + this.showStep = 1 + this.currentStep = 1 + } + if (res.data.correctUserId) { + this.showStep = 2 + this.currentStep = 2 + } + if (res.data.validationUserId) { + this.showStep = 3 + this.currentStep = 3 + } + } else { + this.currentStep = 4 + this.showStep = 3 + } + } + }).catch(err => { + console.log('err---', err); + }) + }, + // 鎻愪氦 + handleEdit() { + if (this.currentStep === 0) { + if (!this.form.raiseResult) { + this.$message.warning('璇峰~鍐欎笉鍚堟牸鎻忚堪') + return + } + if (!this.form.causeUserId) { + this.$message.warning('璇烽�夋嫨涓嬩竴姝ヨ礋璐d汉') + return + } + } else if (this.currentStep === 1) { + if (!this.form.causeResult) { + this.$message.warning('璇峰~鍐欏師鍥犲垎鏋�') + return + } + if (!this.form.correctUserId) { + this.$message.warning('璇烽�夋嫨涓嬩竴姝ヨ礋璐d汉') + return + } + } else if (this.currentStep === 2) { + if (!this.form.correctResult) { + this.$message.warning('璇峰~鍐欑籂姝f帾鏂�') + return + } + if (!this.form.validationUserId) { + this.$message.warning('璇烽�夋嫨涓嬩竴姝ヨ礋璐d汉') + return + } + } else if (this.currentStep === 3) { + if (!this.form.validationResult) { + this.$message.warning('璇峰~鍐欏疄鏂介獙璇佺粨鏋�') + return + } + } + this.editLoad = true + this.form.supervisedTime = '' + this.form.flowType = this.currentStep + addInternalCorrect(this.form).then(res => { + this.editLoad = false + if (res.code === 201) return + this.$message.success('鎻愪氦鎴愬姛') + this.closeRectifyDia() + }).catch(err => { + console.log('err---', err); + this.editLoad = false + }) + }, + // 鍏抽棴寮规 + closeRectifyDia() { + this.formDia = false + this.$emit('closeRectifyDia') + }, + setStep(step) { + this.showStep = step + }, + getAuthorizedPerson() { + selectUserCondition().then(res => { + let data = [] + res.data.forEach(a => { + data.push({ + label: a.name, + value: a.id + }) + }) + this.personList = data + }) + }, + getSupervisedUserList() { + selectUserCondition({ type: 2 }).then(res => { + let data = [] + res.data.forEach(a => { + data.push({ + label: a.name, + value: a.id + }) + }) + this.supervisedUserList = data + }) + }, + } +}; +</script> + +<style scoped> +>>>.el-dialog { + margin: 10vh auto 50px !important; +} + +.tables { + table-layout: fixed; + width: 100%; + margin-top: 10px; +} + +.td-title { + height: 40px; + width: 170px; + text-align: center; + font-size: 14px; + word-wrap: break-word; + white-space: normal; + padding: 6px; +} + +.td-info { + padding: 6px; +} + +.td-info1 { + display: inline-block; + width: 100%; + text-align: left; + font-size: 14px; + word-wrap: break-word; + white-space: normal; +} +</style> diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/implementPlanDia.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/implementPlanDia.vue new file mode 100644 index 0000000..5a94ebe --- /dev/null +++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/implementPlanDia.vue @@ -0,0 +1,307 @@ +<template> + <div> + <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false" + :visible.sync="formDia" title="鍐呴儴瀹℃牳瀹炴柦璁″垝" width="80%" @close="closeImplementDia"> + <el-form ref="form" :model="form" :rules="rules" label-width="auto"> + <el-col :span="24"> + <el-form-item label="瀹℃牳鐩殑" prop="purposes"> + <el-input v-model="form.purposes" :disabled="operationType === 'ratify'" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="瀹℃牳鎬ц川" prop="nature"> + <el-input v-model="form.nature" :disabled="operationType === 'ratify'" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="瀹℃牳鑼冨洿" prop="scope"> + <el-input v-model="form.scope" :disabled="operationType === 'ratify'" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="瀹℃牳渚濇嵁" prop="basis"> + <el-input v-model="form.basis" :disabled="operationType === 'ratify'" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="瀹℃牳缁勯暱" prop="teamLeader"> + <el-input v-model="form.teamLeader" :disabled="operationType === 'ratify'" clearable + size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="鍐呭鍛�" prop="internalAuditor"> + <el-input v-model="form.internalAuditor" :disabled="operationType === 'ratify'" clearable + size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="瀹℃牳鏃ユ湡" prop="reviewDate"> + <el-date-picker v-model="form.reviewDate" :disabled="operationType === 'ratify'" clearable + format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" size="small" style="width: 100%" type="date" + value-format="yyyy-MM-dd"> + </el-date-picker> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="瀹℃牳鏂规硶" prop="auditMethod"> + <el-input v-model="form.auditMethod" :disabled="operationType === 'ratify'" clearable + size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="棣栨浼氳鏃堕棿" prop="firstMeetingTime"> + <el-date-picker v-model="form.firstMeetingTime" :disabled="operationType === 'ratify'" clearable + format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" size="small" style="width: 100%" type="date" + value-format="yyyy-MM-dd"> + </el-date-picker> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="鏈浼氳鏃堕棿" prop="lastMeetingTime"> + <el-date-picker v-model="form.lastMeetingTime" :disabled="operationType === 'ratify'" clearable + format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" size="small" style="width: 100%" type="date" + value-format="yyyy-MM-dd"> + </el-date-picker> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="瀹℃牳鎶ュ憡鎻愪氦鏃ユ湡" prop="submitTime"> + <el-date-picker v-model="form.submitTime" :disabled="operationType === 'ratify'" clearable + format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" size="small" style="width: 100%" type="date" + value-format="yyyy-MM-dd"> + </el-date-picker> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="瀹℃牳鎶ュ憡鍙戞斁鑼冨洿" prop="submitScope"> + <el-input v-model="form.submitScope" :disabled="operationType === 'ratify'" clearable + size="small"></el-input> + </el-form-item> + </el-col> + </el-form> + <div v-if="operationType !== 'ratify'" style="text-align: right;margin-bottom: 10px"> + <el-button size="small" type="primary" @click="addRow">娣诲姞</el-button> + <el-button size="small" type="danger" @click="clearTable">娓呯┖</el-button> + </div> + <el-table :data="implementDetailList" border height="300" style="width: 100%"> + <el-table-column align="center" label="搴忓彿" type="index" width="60" /> + <el-table-column header-align="center" label="鏃堕棿" prop="implement"> + <template slot-scope="{row}"> + <el-input v-model="row.implement" :disabled="operationType === 'ratify'" size="small" /> + </template> + </el-table-column> + <el-table-column header-align="center" label="鍙楀鏍搁儴闂�" prop="department"> + <template slot-scope="{row}"> + <el-input v-model="row.department" :disabled="operationType === 'ratify'" size="small" /> + </template> + </el-table-column> + <el-table-column header-align="center" label="璐d换浜�" prop="responsible"> + <template slot-scope="{row}"> + <el-input v-model="row.responsible" :disabled="operationType === 'ratify'" size="small" /> + </template> + </el-table-column> + <el-table-column header-align="center" label="瀹℃牳鍛�" prop="auditor" width="180"> + <template slot-scope="{row}"> + <el-input v-model="row.auditor" :disabled="operationType === 'ratify'" size="small" /> + </template> + </el-table-column> + <el-table-column header-align="center" label="瀹℃牳鍐呭" prop="reviewContent" width="180"> + <template slot-scope="{row}"> + <el-input v-model="row.reviewContent" :disabled="operationType === 'ratify'" size="small" /> + </template> + </el-table-column> + </el-table> + <span slot="footer" class="dialog-footer"> + <el-button v-if="operationType === 'ratify'" :loading="loading" @click="ratify(0)">涓嶆壒鍑�</el-button> + <el-button v-if="operationType === 'ratify'" :loading="loading" type="primary" @click="ratify(1)">鎵� + 鍑�</el-button> + <el-button v-if="operationType !== 'ratify'" @click="closeImplementDia">鍙� 娑�</el-button> + <el-button v-if="operationType !== 'ratify'" :loading="loading" type="primary" @click="handleEdit">鎻� + 浜�</el-button> + </span> + </el-dialog> + <el-dialog :visible.sync="approvalDialog" title="鎵瑰噯" width="30%" @close="approvalDialog = false"> + <span> + 鎵瑰噯澶囨敞锛� + <el-input v-model="ratifyRemark" type="textarea"></el-input> + </span> + <span slot="footer" class="dialog-footer"> + <el-button :loading="approvalLoading" @click="approvalDialog = false">鍙� 娑�</el-button> + <el-button :loading="approvalLoading" type="primary" @click="handleApproval(0)">纭� 瀹�</el-button> + </span> + </el-dialog> + </div> +</template> + +<script> +import { + getInternalImplementOne, + addInternalImplement, + updateInternalImplement, + ratifyInternalImplement, +} from '@/api/cnas/systemManagement/internalAuditManagement.js' +export default { + name: 'implementPlanDia', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: {}, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + formDia: false, + diaLoading: false, + loading: false, + form: { + purposes: '', + nature: '', + scope: '', + basis: '', + teamLeader: '', + internalAuditor: '', + reviewDate: '', + auditMethod: '', + firstMeetingTime: '', + lastMeetingTime: '', + submitTime: '', + submitScope: '', + }, + rules: { + purposes: [{ required: true, message: '璇峰~鍐欏鏍哥洰鐨�', trigger: 'blur' }], + nature: [{ required: true, message: '璇峰~鍐欏鏍告�ц川', trigger: 'blur' }], + scope: [{ required: true, message: '璇峰~鍐欏鏍歌寖鍥�', trigger: 'blur' }], + basis: [{ required: true, message: '璇峰~鍐欏鏍镐緷鎹�', trigger: 'blur' }], + teamLeader: [{ required: true, message: '璇峰~鍐欏鏍哥粍闀�', trigger: 'blur' }], + internalAuditor: [{ required: true, message: '璇峰~鍐欏唴瀹″憳', trigger: 'blur' }], + reviewDate: [{ required: true, message: '璇峰~鍐欏鏍告椂闂�', trigger: 'blur' }], + auditMethod: [{ required: true, message: '璇峰~鍐欏鏍告柟娉�', trigger: 'blur' }], + firstMeetingTime: [{ required: true, message: '璇峰~鍐欓娆′細璁椂闂�', trigger: 'blur' }], + lastMeetingTime: [{ required: true, message: '璇峰~鍐欐湯娆′細璁椂闂�', trigger: 'blur' }], + submitTime: [{ required: true, message: '璇峰~鍐欏鏍告姤鍛婃彁浜ゆ棩鏈�', trigger: 'blur' }], + submitScope: [{ required: true, message: '璇峰~鍐欏鏍告姤鍛婂彂鏀捐寖鍥�', trigger: 'blur' }], + }, + implementDetailList: [], + operationType: '', + approvalDialog: false, + approvalLoading: false, + ratifyRemark: '', + }; + }, + // 鏂规硶闆嗗悎 + methods: { + // 鎵撳紑寮规 + openDia(type, row) { + this.formDia = true + this.operationType = type + if (type !== 'add') { + this.searchInfo(row) + } + }, + // 鏌ヨ璇︽儏 + searchInfo(row) { + this.diaLoading = true + getInternalImplementOne({ implementId: row.implementId }).then(res => { + this.diaLoading = false + if (res.code === 201) return + this.form = res.data + this.implementDetailList = this.form.implementDetailList + }).catch(err => { + console.log(err) + this.diaLoading = false + }) + }, + // 鎻愪氦寮规鏁版嵁 + handleEdit() { + this.$refs['form'].validate((valid) => { + if (valid) { + if (this.implementDetailList.length === 0) { + this.$message.warning('璇锋坊鍔犺〃鏍兼暟鎹�') + return + } + this.loading = true + const internalImplementDto = this.HaveJson(this.form) + internalImplementDto.implementDetailList = this.HaveJson(this.implementDetailList) + if (this.operationType === 'add') { + addInternalImplement(internalImplementDto).then(res => { + this.loading = false + if (res.code === 201) return + this.$message.success('鎿嶄綔鎴愬姛') + this.closeImplementDia() + }).catch(err => { + console.log('err---', err); + this.loading = false + }) + } else if (this.operationType === 'edit') { + updateInternalImplement(internalImplementDto).then(res => { + this.loading = false + if (res.code === 201) return + this.$message.success('鎿嶄綔鎴愬姛') + this.closeImplementDia() + }).catch(err => { + console.log('err---', err); + this.loading = false + }) + } + } else { + console.log('error submit!!'); + return false; + } + }); + }, + ratify(ratifyStatus) { + // 涓嶆壒鍑嗛渶瑕佸~鍐欐壒鍑嗗唴瀹� + if (ratifyStatus === 0) { + this.approvalDialog = true + } else { + this.handleApproval(ratifyStatus) + } + }, + // 鎻愪氦鎵瑰噯淇℃伅 + handleApproval(ratifyStatus) { + this.approvalLoading = true + const internalImplementDto = this.HaveJson(this.form) + internalImplementDto.ratifyStatus = ratifyStatus + internalImplementDto.ratifyRemark = ratifyStatus === 0 ? this.ratifyRemark : '' + ratifyInternalImplement(internalImplementDto).then(res => { + if (res.code === 200) { + this.$message.success('鎻愪氦鎴愬姛锛�'); + this.approvalDialog = false + this.closeImplementDia(this.departId); + } + this.approvalLoading = false + }).catch(() => { + this.approvalLoading = false + }) + }, + // 澧炲姞琛ㄦ牸琛屾暟鎹� + addRow() { + this.implementDetailList.push({ + implement: '', + department: '', + responsible: '', + auditor: '', + reviewContent: '', + }) + }, + // 娓呯┖琛ㄦ牸鏁版嵁 + clearTable() { + this.implementDetailList = [] + }, + closeImplementDia() { + this.$refs.form.resetFields(); + this.formDia = false + this.$emit('closeImplementDia') + }, + } +}; +</script> + +<style scoped> +>>>.el-dialog { + margin: 10vh auto 50px !important; +} + +>>>.el-dialog__body { + max-height: 38em; + overflow-y: auto; +} +</style> diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/implementationPlan.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/implementationPlan.vue new file mode 100644 index 0000000..92f721f --- /dev/null +++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/implementationPlan.vue @@ -0,0 +1,292 @@ +<template> + <div> + <div class="search-background"> + <span class="search-group"> + <span style="width: 160px">瀹℃牳鐩殑锛�</span> + <el-input v-model="searchForm.purposes" clearable size="small"></el-input> + <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">閲� 缃�</el-button> + <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button> + </span> + <span class="search-group"> + <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button> + </span> + </div> + <div class="table"> + <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData" + :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" @pagination="pagination" :page="page"> + </limsTable> + </div> + <implement-plan-dia v-if="implementPlanDia" ref="implementPlanDia" + @closeImplementDia="closeImplementDia"></implement-plan-dia> + </div> +</template> + +<script> +import { + pageInternalImplement, + delInternalImplement, + exportInternalImplement, +} from '@/api/cnas/systemManagement/internalAuditManagement.js' +import limsTable from "@/components/Table/lims-table.vue"; +import ImplementPlanDia from './implementPlanDia.vue'; + +export default { + name: 'implementationPlan', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: { ImplementPlanDia, limsTable }, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + searchForm: { + purposes: '', + }, + tableColumn: [ + { + label: '瀹℃牳鐩殑', + prop: 'purposes', + minWidth: '100' + }, + { + label: '瀹℃牳鎬ц川', + prop: 'nature', + minWidth: '100' + }, + { + label: '瀹℃牳鑼冨洿', + prop: 'scope', + minWidth: '100' + }, + { + label: '瀹℃牳渚濇嵁', + prop: 'basis', + minWidth: '100' + }, + { + label: '瀹℃牳缁勯暱', + prop: 'teamLeader', + minWidth: '100' + }, + { + label: '鍐呭鍛�', + prop: 'internalAuditor', + minWidth: '100', + }, + { + label: '瀹℃牳鏃ユ湡', + prop: 'reviewDate', + minWidth: '100', + }, + { + label: '瀹℃牳鏂规硶', + prop: 'auditMethod', + minWidth: '100', + }, + { + label: '棣栨浼氳鏃堕棿', + prop: 'firstMeetingTime', + minWidth: '100', + }, + { + label: '鏈浼氳鏃堕棿', + prop: 'lastMeetingTime', + minWidth: '100', + }, + { + label: '瀹℃牳鎶ュ憡鎻愪氦鏃ユ湡', + prop: 'submitTime', + minWidth: '100', + }, + { + label: '瀹℃牳鎶ュ憡鍙戞斁鑼冨洿', + prop: 'submitScope', + minWidth: '100', + }, { + dataType: 'tag', + label: '鎵瑰噯鐘舵��', + prop: 'ratifyStatus', + minWidth: '100', + formatData: (params) => { + if (params === 0) { + return '涓嶆壒鍑�'; + } else if (params === 1) { + return '鎵瑰噯'; + } else { + return null; + } + }, + formatType: (params) => { + if (params === 0) { + return 'danger'; + } else if (params === 1) { + return 'success'; + } else { + return null; + } + } + }, { + label: '鎵瑰噯鍐呭', + prop: 'ratifyRemark', + minWidth: '100' + }, + { + dataType: 'action', + minWidth: '220', + fixed: 'right', + label: '鎿嶄綔', + operation: [ + { + name: '瀵煎嚭', + type: 'text', + clickFun: (row) => { + this.handleDown(row) + } + }, + { + name: '缂栬緫', + type: 'text', + clickFun: (row) => { + this.openFormDia('edit', row); + }, + disabled: (row) => { + if (row.ratifyStatus === 1) { + return true + } else { + return false + } + }, + }, + { + name: '鎵瑰噯', + type: 'text', + clickFun: (row) => { + this.openFormDia('ratify', row); + }, + disabled: (row) => { + if (row.ratifyStatus === 1) { + return true + } else { + return false + } + }, + }, + { + name: '鍒犻櫎', + type: 'text', + color: '#f56c6c', + clickFun: (row) => { + this.delPlan(row) + }, + disabled: (row) => { + if (row.ratifyStatus === 1) { + return true + } else { + return false + } + }, + } + ] + } + ], + tableData: [], + tableLoading: false, + page: { + size: 20, + current: 1, + total: 0, + }, + implementPlanDia: false, + }; + }, + mounted() { + this.searchList() + }, + // 鏂规硶闆嗗悎 + methods: { + // 鏌ヨ鍒楄〃 + searchList() { + const entity = this.searchForm + const page = this.page + this.tableLoading = true + pageInternalImplement({ ...entity, ...page }).then(res => { + this.tableLoading = false + if (res.code === 201) return + this.tableData = res.data.records + this.page.total = res.data.total + }).catch(err => { + console.log('err---', err); + this.tableLoading = false + }) + }, + // 鏂板锛岀紪杈戯紝鎵瑰噯寮规 + openFormDia(type, row) { + this.implementPlanDia = true + this.$nextTick(() => { + this.$refs.implementPlanDia.openDia(type, row) + }) + }, + closeImplementDia() { + this.implementPlanDia = false + this.searchList() + }, + // 閲嶇疆鏌ヨ鏉′欢 + resetSearchForm() { + this.searchForm.purposes = ''; + this.searchList() + }, + // 鍒犻櫎 + delPlan(row) { + this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + this.tableLoading = true + delInternalImplement({ implementId: row.implementId }).then(res => { + this.tableLoading = false + if (res.code === 201) return + this.$message.success('鍒犻櫎鎴愬姛') + this.searchList() + }).catch(err => { + this.tableLoading = false + console.log('err---', err); + }) + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堝垹闄�' + }); + }); + }, + // 瀵煎嚭 + handleDown(row) { + exportInternalImplement({ implementId: row.implementId }).then(res => { + this.outLoading = false + this.$message.success('瀵煎嚭鎴愬姛') + const blob = new Blob([res], { type: 'application/msword' }); + this.$download.saveAs(blob, '鍐呭瀹炴柦璁″垝' + '.docx'); + }) + }, + pagination({ page, limit }) { + this.page.current = page; + this.page.size = limit; + this.searchList(); + }, + } +}; +</script> + +<style scoped> +.search-background { + width: 100%; + height: 60px; + line-height: 60px; + display: flex; + justify-content: space-between; +} + +.search-group { + display: flex; + align-items: center; + margin: 0 20px; +} +</style> diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/yearPlan.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/yearPlan.vue new file mode 100644 index 0000000..77b898f --- /dev/null +++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/yearPlan.vue @@ -0,0 +1,314 @@ +<template> + <div> + <div class="search-background"> + <span class="search-group"> + <span style="width: 160px">鍐呭鐩殑锛�</span> + <el-input v-model="searchForm.purpose" clearable size="small"></el-input> + <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">閲� 缃�</el-button> + <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button> + </span> + <span class="search-group"> + <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button> + </span> + </div> + <div class="table"> + <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData" + :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" @pagination="pagination" :page="page"> + </limsTable> + </div> + <year-plan-dia v-if="yearPlanDia" ref="yearPlanDia" @closeYearDia="closeYearDia"></year-plan-dia> + </div> +</template> + +<script> +import limsTable from "@/components/Table/lims-table.vue"; +import YearPlanDia from './yearPlanDia.vue'; +import { + pageInternalPlan, + delInternalPlan, + exportInternalPlan, +} from '@/api/cnas/systemManagement/internalAuditManagement.js' + +export default { + name: 'yearPlan', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: { YearPlanDia, limsTable }, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + searchForm: { + purpose: '', + }, + tableColumn: [ + { + label: '鍐呭鐩殑', + prop: 'purpose', + minWidth: '100' + }, + { + label: '鍐呭鑼冨洿', + prop: 'scope', + minWidth: '100' + }, + { + label: '鍐呭渚濇嵁', + prop: 'basis', + minWidth: '100' + }, + { + label: '缁勯暱', + prop: 'leader', + minWidth: '100' + }, + { + label: '缁勫憳', + prop: 'crew', + minWidth: '100' + }, + { + dataType: 'tag', + label: '瀹℃牳鐘舵��', + prop: 'examineStatus', + minWidth: '100', + formatData: (params) => { + if (params === 0) { + return '涓嶉�氳繃'; + } else if (params === 1) { + return '閫氳繃'; + } else { + return null; + } + }, + formatType: (params) => { + if (params === 0) { + return 'danger'; + } else if (params === 1) { + return 'success'; + } else { + return null; + } + } + }, { + label: '瀹℃牳鍐呭', + prop: 'examineRemark', + minWidth: '100' + }, { + label: '瀹℃牳浜�', + prop: 'examineUserName', + minWidth: '100' + }, { + label: '瀹℃牳鏃ユ湡', + prop: 'examineTime', + minWidth: '160' + }, { + dataType: 'tag', + label: '鎵瑰噯鐘舵��', + prop: 'ratifyStatus', + minWidth: '100', + formatData: (params) => { + if (params === 0) { + return '涓嶆壒鍑�'; + } else if (params === 1) { + return '鎵瑰噯'; + } else { + return null; + } + }, + formatType: (params) => { + if (params === 0) { + return 'danger'; + } else if (params === 1) { + return 'success'; + } else { + return null; + } + } + }, { + label: '鎵瑰噯鍐呭', + prop: 'ratifyRemark', + minWidth: '100' + }, { + label: '鎵瑰噯浜�', + prop: 'ratifyUserName', + minWidth: '100' + }, { + label: '鎵瑰噯鏃ユ湡', + prop: 'ratifyTime', + minWidth: '160' + }, + { + dataType: 'action', + fixed: 'right', + minWidth: '220', + label: '鎿嶄綔', + operation: [ + { + name: '瀵煎嚭', + type: 'text', + clickFun: (row) => { + this.handleDown(row) + } + }, + { + name: '缂栬緫', + type: 'text', + clickFun: (row) => { + this.openFormDia('edit', row); + }, + disabled: (row) => { + if (row.ratifyStatus === 1) { + return true + } else { + return false + } + }, + }, + { + name: '瀹℃牳', + type: 'text', + clickFun: (row) => { + this.openFormDia('examine', row); + }, + disabled: (row) => { + if (row.examineStatus === 1) { + return true + } else { + return false + } + }, + }, + { + name: '鎵瑰噯', + type: 'text', + clickFun: (row) => { + this.openFormDia('ratify', row); + }, + disabled: (row) => { + if (row.ratifyStatus === 1 || row.examineStatus === 0 || row.examineStatus === null) { + return true + } else { + return false + } + }, + }, + { + name: '鍒犻櫎', + type: 'text', + color: '#f56c6c', + clickFun: (row) => { + this.delPlan(row) + }, + disabled: (row) => { + if (row.ratifyStatus === 1) { + return true + } else { + return false + } + }, + } + ] + } + ], + tableData: [], + tableLoading: false, + page: { + size: 20, + current: 1, + total: 0, + }, + yearPlanDia: false, + }; + }, + mounted() { + this.searchList() + }, + // 鏂规硶闆嗗悎 + methods: { + // 鏌ヨ鍒楄〃 + searchList() { + const entity = this.searchForm + const page = this.page + this.tableLoading = true + pageInternalPlan({ ...entity, ...page }).then(res => { + this.tableLoading = false + if (res.code === 201) return + this.tableData = res.data.records + this.page.total = res.data.total + }).catch(err => { + console.log('err---', err); + this.tableLoading = false + }) + }, + // 鍒犻櫎 + delPlan(row) { + this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + this.tableLoading = true + delInternalPlan({ planId: row.planId }).then(res => { + this.tableLoading = false + if (res.code === 201) return + this.$message.success('鍒犻櫎鎴愬姛') + this.searchList() + }).catch(err => { + this.tableLoading = false + console.log('err---', err); + }) + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堝垹闄�' + }); + }); + }, + // 鏂板锛岀紪杈戯紝鎵瑰噯寮规 + openFormDia(type, row) { + this.yearPlanDia = true + this.$nextTick(() => { + this.$refs.yearPlanDia.openDia(type, row) + }) + }, + // 瀵煎嚭 + handleDown(row) { + exportInternalPlan({ planId: row.planId }).then(res => { + this.outLoading = false + this.$message.success('瀵煎嚭鎴愬姛') + const blob = new Blob([res], { type: 'application/msword' }); + this.$download.saveAs(blob, '鍐呭骞村害璁″垝' + '.docx'); + }) + }, + closeYearDia() { + this.yearPlanDia = false + this.searchList() + }, + // 閲嶇疆鏌ヨ鏉′欢 + resetSearchForm() { + this.searchForm.purpose = ''; + this.searchList() + }, + pagination({ page, limit }) { + this.page.current = page; + this.page.size = limit; + this.searchList(); + }, + } +}; +</script> + +<style scoped> +.search-background { + width: 100%; + height: 60px; + line-height: 60px; + display: flex; + justify-content: space-between; +} + +.search-group { + display: flex; + align-items: center; + margin: 0 20px; +} +</style> diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/components/yearPlanDia.vue b/src/views/CNAS/systemManagement/internalAuditManagement/components/yearPlanDia.vue new file mode 100644 index 0000000..0c1eba1 --- /dev/null +++ b/src/views/CNAS/systemManagement/internalAuditManagement/components/yearPlanDia.vue @@ -0,0 +1,342 @@ +<template> + <div> + <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false" + :visible.sync="formDia" title="鍐呴儴瀹℃牳骞村害璁″垝" width="1000px" @close="closeYearDia"> + <el-form ref="form" :model="form" :rules="rules" label-position="top" label-width="auto"> + <el-row :gutter="20"> + <el-col :span="24"> + <el-form-item label="鍐呭鐩殑" prop="purpose"> + <el-input v-model="form.purpose" :disabled="operationType === 'examine' || operationType === 'ratify'" + :rows="3" clearable size="small" type="textarea"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="鍐呭鑼冨洿" prop="scope"> + <el-input v-model="form.scope" :disabled="operationType === 'examine' || operationType === 'ratify'" + :rows="3" clearable size="small" type="textarea"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="鍐呭渚濇嵁" prop="basis"> + <el-input v-model="form.basis" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="缁勯暱" prop="leader"> + <el-input v-model="form.leader" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="缁勫憳" prop="crew"> + <el-input v-model="form.crew" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </el-form-item> + </el-col> + </el-row> + </el-form> + <table border="1" cellspacing="10" class="table"> + <tr> + <td class="div-with-line"> + <span style="float: left;">閮ㄩ棬</span> + <span style="float: right;">鏈堜唤</span> + </td> + <th v-for="(item, index) in dic1" :key="index">{{ item }}</th> + </tr> + <tr v-for="(item, index) in planDetailList" :key="index"> + <td>{{ item.department }}</td> + <th> + <el-input v-model="item.january" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </th> + <th> + <el-input v-model="item.february" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </th> + <th> + <el-input v-model="item.march" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </th> + <th> + <el-input v-model="item.april" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </th> + <th> + <el-input v-model="item.may" :disabled="operationType === 'examine' || operationType === 'ratify'" clearable + size="small"></el-input> + </th> + <th> + <el-input v-model="item.june" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </th> + <th> + <el-input v-model="item.july" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </th> + <th> + <el-input v-model="item.august" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </th> + <th> + <el-input v-model="item.september" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </th> + <th> + <el-input v-model="item.october" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </th> + <th> + <el-input v-model="item.november" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </th> + <th> + <el-input v-model="item.december" :disabled="operationType === 'examine' || operationType === 'ratify'" + clearable size="small"></el-input> + </th> + </tr> + </table> + <span slot="footer" class="dialog-footer"> + <el-button v-if="operationType === 'examine'" :loading="loading" @click="examine(0)">涓嶉�氳繃</el-button> + <el-button v-if="operationType === 'examine'" :loading="loading" type="primary" @click="examine(1)">閫� + 杩�</el-button> + <el-button v-if="operationType === 'ratify'" :loading="loading" @click="approval(0)">涓嶆壒鍑�</el-button> + <el-button v-if="operationType === 'ratify'" :loading="loading" type="primary" @click="handleApproval(1)">鎵� + 鍑�</el-button> + <el-button v-if="operationType !== 'ratify' && operationType !== 'examine'" @click="closeYearDia">鍙� + 娑�</el-button> + <el-button v-if="operationType !== 'ratify' && operationType !== 'examine'" :loading="loading" type="primary" + @click="handleEdit">鎻� 浜�</el-button> + </span> + </el-dialog> + <el-dialog :visible.sync="examineDialog" title="瀹℃牳" width="30%" @close="examineDialog = false"> + <span> + 瀹℃牳澶囨敞锛� + <el-input v-model="examineRemark" type="textarea"></el-input> + </span> + <span slot="footer" class="dialog-footer"> + <el-button :loading="examineLoading" @click="examineDialog = false">鍙� 娑�</el-button> + <el-button :loading="examineLoading" type="primary" @click="handleExamine(0)">纭� 瀹�</el-button> + </span> + </el-dialog> + <el-dialog :visible.sync="approvalDialog" title="鎵瑰噯" width="30%" @close="approvalDialog = false"> + <span> + 鎵瑰噯澶囨敞锛� + <el-input v-model="ratifyRemark" type="textarea"></el-input> + </span> + <span slot="footer" class="dialog-footer"> + <el-button :loading="approvalLoading" @click="approvalDialog = false">鍙� 娑�</el-button> + <el-button :loading="approvalLoading" type="primary" @click="handleApproval(0)">纭� 瀹�</el-button> + </span> + </el-dialog> + </div> +</template> + +<script> +import { + getInternalPlanOne, + addInternalPlan, + updateInternalPlan, + examineInternalPlan, + ratifyInternalPlan, +} from '@/api/cnas/systemManagement/internalAuditManagement.js' +export default { + name: 'yearPlanDia', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: {}, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + formDia: false, + diaLoading: false, + loading: false, + form: { + purpose: '', + scope: '', + basis: '', + leader: '', + crew: '', + }, + rules: { + purpose: [{ required: true, message: '璇峰~鍐欏唴瀹$洰鐨�', trigger: 'blur' }], + scope: [{ required: true, message: '璇峰~鍐欏唴瀹¤寖鍥�', trigger: 'blur' }], + basis: [{ required: true, message: '璇峰~鍐欏唴瀹′緷鎹�', trigger: 'blur' }], + leader: [{ required: true, message: '璇峰~鍐欑粍闀�', trigger: 'blur' }], + crew: [{ required: true, message: '璇峰~鍐欑粍鍛�', trigger: 'blur' }], + }, + operationType: '', + approvalDialog: false, + approvalLoading: false, + examineDialog: false, + examineLoading: false, + ratifyRemark: '', + examineRemark: '', + dic1: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], + planDetailList: [{ department: '瑁呭鐢电紗瀹為獙瀹�' }, { department: '閫氫俊浜у搧瀹為獙瀹�' }, { department: '鐢靛姏浜у搧瀹為獙瀹�' }, { department: '鍌ㄨ兘浜у搧瀹為獙瀹�' }, { department: '灏勯绾跨紗瀹為獙瀹�' }], + }; + }, + mounted() { + }, + // 鏂规硶闆嗗悎 + methods: { + // 鎵撳紑寮规 + openDia(type, row) { + this.formDia = true + this.operationType = type + if (type !== 'add') { + this.searchInfo(row) + } + }, + // 鏌ヨ璇︽儏 + searchInfo(row) { + this.diaLoading = true + getInternalPlanOne({ planId: row.planId }).then(res => { + this.diaLoading = false + if (res.code === 201) return + this.form = res.data + this.planDetailList = this.form.planDetailList + }).catch(err => { + console.log(err) + this.diaLoading = false + }) + }, + // 鎻愪氦寮规鏁版嵁 + handleEdit() { + this.$refs['form'].validate((valid) => { + if (valid) { + this.loading = true + const internalPlan = this.HaveJson(this.form) + internalPlan.planDetailList = this.HaveJson(this.planDetailList) + if (this.operationType === 'add') { + addInternalPlan(internalPlan).then(res => { + this.loading = false + if (res.code === 201) return + this.$message.success('鎿嶄綔鎴愬姛') + this.closeYearDia() + }).catch(err => { + console.log('err---', err); + this.loading = false + }) + } else if (this.operationType === 'edit') { + updateInternalPlan(internalPlan).then(res => { + this.loading = false + if (res.code === 201) return + this.$message.success('鎿嶄綔鎴愬姛') + this.closeYearDia() + }).catch(err => { + console.log('err---', err); + this.loading = false + }) + } + } else { + console.log('error submit!!'); + return false; + } + }); + }, + // 瀹℃牳娴佺▼ + examine(examineStatus) { + if (examineStatus === 0) { + this.examineDialog = true + } else { + this.handleExamine(examineStatus) + } + }, + handleExamine(examineStatus) { + this.examineLoading = true + const internalReport = this.HaveJson(this.form) + internalReport.examineStatus = examineStatus + internalReport.examineRemark = this.examineRemark + examineInternalPlan(internalReport).then(res => { + if (res.code === 200) { + this.$message.success('鎻愪氦鎴愬姛锛�'); + this.approvalDialog = false + this.closeYearDia(this.departId); + } + this.examineLoading = false + }).catch(() => { + this.examineLoading = false + }) + }, + // 鎻愪氦鎵瑰噯淇℃伅 + approval(ratifyStatus) { + if (ratifyStatus === 0) { + this.approvalDialog = true + } else { + this.handleApproval(ratifyStatus) + } + }, + handleApproval(ratifyStatus) { + this.approvalLoading = true + const internalReport = this.HaveJson(this.form) + internalReport.ratifyStatus = ratifyStatus + internalReport.ratifyRemark = this.ratifyRemark + ratifyInternalPlan(internalReport).then(res => { + if (res.code === 200) { + this.$message.success('鎻愪氦鎴愬姛锛�'); + this.approvalDialog = false + this.closeYearDia(this.departId); + } + this.approvalLoading = false + }).catch(() => { + this.approvalLoading = false + }) + }, + closeYearDia() { + this.$refs.form.resetFields(); + this.formDia = false + this.$emit('closeYearDia') + }, + } +}; +</script> + +<style scoped> +>>>.el-dialog { + margin: 6vh auto 50px !important; +} + +>>>.el-dialog__body { + max-height: 42em; + overflow-y: auto; +} + +>>>.is-required { + margin-bottom: 6px; +} + +.table { + width: 100%; + margin-top: 20px; +} + +.table th { + width: 70px; +} + +.table td { + width: 70px; + height: 70px; + text-align: center; +} + +.div-with-line { + width: 70px; + height: 70px; + position: relative; + /*overflow: hidden; /* 闅愯棌婧㈠嚭鍐呭 */ +} + +.div-with-line::after { + content: ''; + position: absolute; + bottom: 0; + height: 1px; + background-color: #000000; + left: 50%; + transform: translateX(-50%) rotate(45deg); + transform-origin: center 50%; + top: 50%; + width: 100px; +} +</style> diff --git a/src/views/CNAS/systemManagement/internalAuditManagement/index.vue b/src/views/CNAS/systemManagement/internalAuditManagement/index.vue new file mode 100644 index 0000000..4b61b39 --- /dev/null +++ b/src/views/CNAS/systemManagement/internalAuditManagement/index.vue @@ -0,0 +1,57 @@ +<template> + <div class="main"> + <el-tabs v-model="activeName" class="tab-panel" type="border-card"> + <el-tab-pane label="骞村害璁″垝" name="yearPlan"> + <year-plan></year-plan> + </el-tab-pane> + <el-tab-pane label="鍐呴儴瀹炴柦璁″垝" name="implementationPlan"> + <implementation-plan></implementation-plan> + </el-tab-pane> + <el-tab-pane label="鍐呭浼氳绛惧埌" name="meetingSignIn"> + <audit-meeting-sign></audit-meeting-sign> + </el-tab-pane> + <el-tab-pane label="鍐呭妫�鏌�" name="auditInspection"> + <audit-inspection></audit-inspection> + </el-tab-pane> + <el-tab-pane label="绾犳鎺柦" name="correctiveAction"> + <corrective-action></corrective-action> + </el-tab-pane> + <el-tab-pane label="鍐呭鎶ュ憡" name="auditReport"> + <audit-report></audit-report> + </el-tab-pane> + </el-tabs> + </div> +</template> + +<script> +import YearPlan from './components/yearPlan.vue'; +import implementationPlan from './components/implementationPlan.vue'; +import AuditInspection from './components/auditInspection.vue'; +import AuditReport from './components/auditReport.vue'; +import AuditMeetingSign from './components/auditMeetingSign.vue'; +import CorrectiveAction from './components/correctiveAction.vue'; + +export default { + name: 'InternalAuditManagement', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: { CorrectiveAction, AuditMeetingSign, AuditReport, AuditInspection, YearPlan, implementationPlan }, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + activeName: 'yearPlan', + }; + }, + // 鏂规硶闆嗗悎 + methods: {} +}; +</script> + +<style scoped> +.main { + padding: 15px 0; +} + +.tab-panel { + background: #fff; +} +</style> diff --git a/src/views/business/inspectionReview/index.vue b/src/views/business/inspectionReview/index.vue index 15d685a..fcebf1b 100644 --- a/src/views/business/inspectionReview/index.vue +++ b/src/views/business/inspectionReview/index.vue @@ -24,7 +24,7 @@ </div> <div> <lims-table :tableData="tableData" :column="column" :page="page" :tableLoading="tableLoading" - :rowClassName="rowClassName" :height="'calc(100vh - 250px)'" @pagination="pagination" + :rowClassName="rowClassName" :height="'calc(100vh - 270px)'" @pagination="pagination" key="tableData0"></lims-table> </div> <!-- <div style="width: 100%;height: 100%;" v-if="activeFace >0 && isCopper == null">--> @@ -50,6 +50,10 @@ <onlyoffice ref="onlyoffice" :options="option" style="width: 100%;height: 100%;" /> </div> </el-dialog> + <el-dialog title="鏌ョ湅闄勪欢" :visible.sync="lookDialogVisible" width="800px" top="5vh" fullscreen> + <filePreview v-if="lookDialogVisible" :fileUrl="javaApi + '/word/' + currentInfo.tempUrlPdf" :currentFile="{}" + style="max-height: 90vh;overflow-y: auto;" /> + </el-dialog> </div> </template> @@ -61,9 +65,12 @@ import {selectInsOrderPlanList, selectUserCondition} from "@/api/business/inspectionTask"; import {mapGetters} from "vuex"; import {upReportUrl} from "@/api/business/insReport"; +import {delfile} from "@/api/business/rawMaterialOrder"; +import filePreview from "@/components/Preview/filePreview.vue"; export default { components: { + filePreview, onlyoffice, limsTable, // ShowInfo, @@ -74,6 +81,7 @@ }, data() { return { + lookDialogVisible: false, alone: false, tabList: [], active: 1, @@ -232,6 +240,14 @@ issuedVisible: false, fullscreen: false, option:null, + orderTypeList: [ + {label: '濮旀墭璇曢獙', value: 'Customer-ordered test'}, + {label: '鎶芥', value: '鎶芥'}, + {label: '杩涘巶妫�楠�', value: '杩涘巶妫�楠�'}, + {label: '瀛e害妫�楠�', value: 'Quarterly inspection'}, + ], + urgencyLevel: [], + inspectionTaskState: [], } }, created() { @@ -353,36 +369,46 @@ }, // 杩樺師鎿嶄綔 handleRestore(row) { - upReportUrl({id: row.insReportId}).then(res => { - if (res.code === 200) { - this.$message.success('鎿嶄綔鎴愬姛') - this.refreshTable('page') - } - }) + this.$confirm('鏄惁杩樺師褰撳墠鎶ュ憡?', "璀﹀憡", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "warning" + }).then(() => { + upReportUrl({id: row.insReportId}).then(res => { + if (res.code === 200) { + this.$message.success('杩樺師鎴愬姛') + this.refreshTable() + } + }) + }).catch(() => { }) + }, // 鏌ョ湅鎶ュ憡 handleIssued(row) { - this.currentInfo = row; - let fileName = row.url - let fileType = "docx" - if (row.tempUrlPdf != null || row.tempUrlPdf === '') { - fileName = row.tempUrlPdf - fileType = "pdf" - } - fileName = fileName.replace('/word/','') - const userName = JSON.parse(localStorage.getItem("user")).name; - this.option = { - url: this.javaApi + "/word/" + fileName, - isEdit: false, - fileType: fileType, - title: fileName, - lang: 'zh-CN', - isPrint: false, - user_id: 1, - user_name: userName, - editUrl: this.javaApi + "/insReport/onlyOffice/save?fileName=" + fileName - } - this.issuedVisible = true; + if (!row.tempUrlPdf) return this.$message.warning('鏂囦欢鏈笂浼�') + this.currentInfo = row + this.lookDialogVisible = true + // this.currentInfo = row; + // let fileName = row.url + // let fileType = "docx" + // if (row.tempUrlPdf != null || row.tempUrlPdf === '') { + // fileName = row.tempUrlPdf + // fileType = "pdf" + // } + // fileName = fileName.replace('/word/','') + // const userName = this.nickName + // this.option = { + // url: this.javaApi + "/word/" + fileName, + // isEdit: false, + // fileType: fileType, + // title: fileName, + // lang: 'zh-CN', + // isPrint: false, + // user_id: 1, + // user_name: userName, + // editUrl: this.javaApi + "/insReport/onlyOffice/save?fileName=" + fileName + // } + // this.issuedVisible = true; }, getAuthorizedPerson() { selectUserCondition({ type: 1 }).then((res) => { diff --git a/src/views/business/inspectionTask/inspection.vue b/src/views/business/inspectionTask/inspection.vue index bf4b3d9..58accdd 100644 --- a/src/views/business/inspectionTask/inspection.vue +++ b/src/views/business/inspectionTask/inspection.vue @@ -18,13 +18,9 @@ </el-col> <el-col :span="16" style="text-align: right"> <el-button size="small" type="primary" @click="refreshView">鍒锋柊</el-button> - <el-button v-if="typeSource === 1" size="small" type="primary" @click="openPurchase">杩涜揣楠岃瘉</el-button> - <el-button v-if="state === 1 && typeSource === 1" size="small" type="primary" - @click="openUnPassDialog('add')">涓嶅悎鏍煎鐞�</el-button> - <el-button size="small" type="primary" @click=" - sampleVisible = true; - uploadSample(); - ">鏍峰搧鍒囨崲</el-button> + <el-button v-if="typeSource == 1" size="small" type="primary" @click="openPurchase">杩涜揣楠岃瘉</el-button> + <el-button v-if="state == 1 && typeSource == 1" size="small" type="primary" @click="openUnPassDialog('add')">涓嶅悎鏍煎鐞�</el-button> + <el-button size="small" type="primary" @click="sampleVisible = true;uploadSample();">鏍峰搧鍒囨崲</el-button> <el-button v-if="state == 1" size="small" type="primary" @click="taskVisible = true">浠诲姟鍒囨崲</el-button> <el-button v-if="state == 1" size="small" type="primary" @click="addVerifyDia = true">鎻愪氦</el-button> <!-- 澶嶆牳 --> @@ -73,7 +69,7 @@ </el-form-item> <el-form-item label="澶囨敞:"> <!-- <span style="color:red">{{ insOrder.remark?insOrder.remark:'-' }}</span>--> - <el-input v-model="insOrder.remark" :disabled="state !== 1" clearable placeholder="璇疯緭鍏�" size="small" + <el-input v-model="insOrder.remark" :disabled="state != 1" clearable placeholder="璇疯緭鍏�" size="small" @blur="subOtherForm(insOrder.remark, 'remark')"></el-input> <!-- <el-tag v-if="currentKey">{{ insOrder.remark }}</el-tag> --> </el-form-item> @@ -1065,7 +1061,7 @@ }, // 鎵撳紑杩涜揣楠岃瘉寮规 openPurchase() { - const operationType = this.state === 1 ? "add" : "view"; + const operationType = this.state == 1 ? "add" : "view"; this.purchaseDialog = true; const item = { id: this.currentSample.id, @@ -3112,7 +3108,7 @@ align-items: center; } </style> -<style> +<style scoped> /* .inspection .el-form-item__label { color: #000; } */ diff --git a/src/views/business/reportPreparation/index.vue b/src/views/business/reportPreparation/index.vue new file mode 100644 index 0000000..3d9209a --- /dev/null +++ b/src/views/business/reportPreparation/index.vue @@ -0,0 +1,1221 @@ +<template> + <div class="inspection_order"> + <div v-show="activeFace === 0 && state===0" style="width: 100%;height: 100%;"> + <div> + <el-row class="title"> + <el-col :span="12" style="padding-left: 20px;text-align: left;">鎶ュ憡缂栧埗</el-col> + </el-row> + </div> + <div class="search" style="position: relative;"> + <div class="search_thing"> + <div class="search_label">鎶ュ憡缂栧彿锛�</div> + <div class="search_input"><el-input v-model="componentData.entity.code" clearable placeholder="璇疯緭鍏�" + size="small" @keyup.enter.native="refreshTable()"></el-input></div> + </div> + <div class="search_thing"> + <div class="search_label">鐘舵�侊細</div> + <div class="search_input"> + <el-select v-model="componentData.entity.queryStatus" clearable size="small" style="width: 100%;" @change="refreshTable()"> + <el-option v-for="(a, i) in queryStatusList" :key="i" :label="a.label" :value="a.value"></el-option> + </el-select> + </div> + </div> + <div class="search_thing"> + <div class="search_label">涓嬪崟绫诲埆锛�</div> + <div class="search_input"> + <el-select v-model="componentData.entity.typeSource" clearable size="small" style="width: 100%;" @change="refreshTable()"> + <el-option v-for="(a, i) in typeSourceList" :key="i" :label="a.label" :value="a.value"></el-option> + </el-select> + </div> + </div> + <div class="search_thing"> + <div class="search_label">妫�楠岀被鍒細</div> + <div class="search_input"> + <el-select v-model="componentData.entity.orderType" clearable size="small" style="width: 100%;" @change="refreshTable()"> + <el-option v-for="(a, i) in orderTypeList" :key="i" :label="a.label" :value="a.value"></el-option> + </el-select> + </div> + </div> + <div class="search_thing" style="padding-left: 30px;"> + <el-button size="small" @click="refresh()">閲� 缃�</el-button> + <el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button> + <el-button :loading="outLoading" size="small" style="margin-right: 16px;" type="primary" @click="handleDowns">鎵归噺涓嬭浇</el-button> + </div> + </div> + <!-- <input id="input" type="file" accept=".doc,.docx"></input> --> + <div class="table"> + <el-table @selection-change="handleChange" :data="valueTableData" style="width: 100%" height="calc(100vh - 21em)" v-loading="tableLoading"> + <!-- 琛ㄦ牸鍒� --> + <el-table-column type="selection" width="55"></el-table-column> + <el-table-column header-align="center" align="center" width="70" prop="prop" label="搴忓彿" type="index"></el-table-column> + <el-table-column prop="code" label="鎶ュ憡缂栧彿" min-width="180"> + <template slot-scope="scope"> + <el-button type="text" @click="selectAllByOne(scope.row)">{{scope.row.code}}</el-button> + </template> + </el-table-column> + <el-table-column prop="typeSource" label="涓嬪崟绫诲埆" min-width="120"> + <template slot-scope="scope"> + <el-tag type="info" v-if="scope.row.typeSource === 1" disable-transitions>鍘熸潗鏂欎笅鍗�</el-tag> + <el-tag type="info" v-if="scope.row.typeSource === 0" disable-transitions>鎴愬搧涓嬪崟</el-tag> + </template> + </el-table-column> + <el-table-column prop="orderType" label="妫�楠岀被鍒�" min-width="150"> + <template slot-scope="scope"> + <el-tag type="success" v-if="scope.row.orderType === 'Customer-ordered test'" disable-transitions>濮旀墭璇曢獙</el-tag> + <el-tag v-if="scope.row.orderType === '鎶芥'" disable-transitions>鎶芥</el-tag> + <el-tag type="info" v-if="scope.row.orderType === '杩涘巶妫�楠�'" disable-transitions>杩涘巶妫�楠�</el-tag> + <el-tag type="warning" v-if="scope.row.orderType === 'Quarterly inspection'" disable-transitions>瀛e害妫�楠�</el-tag> + </template> + </el-table-column> + <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" min-width="150"></el-table-column> + <el-table-column prop="writeUserName" label="鎻愪氦浜�" min-width="110"></el-table-column> + <el-table-column prop="writeTime" label="鎻愪氦鏃堕棿" min-width="150"></el-table-column> + <el-table-column prop="state" label="鎻愪氦鐘舵��" min-width="110"> + <template slot-scope="scope"> + <el-tag type="danger" v-if="scope.row.state === 0" disable-transitions>寰呮彁浜�</el-tag> + <el-tag type="success" v-if="scope.row.state === 1" disable-transitions>宸叉彁浜�</el-tag> + </template> + </el-table-column> + <el-table-column prop="examineUser" label="瀹℃牳浜�" width="110"></el-table-column> + <el-table-column prop="examineTime" label="瀹℃牳鏃堕棿" width="180"></el-table-column> + <el-table-column prop="isExamine" label="瀹℃牳鐘舵��" width="110"> + <template slot-scope="scope"> + <el-tag type="danger" v-if="scope.row.isExamine === 0" disable-transitions>涓嶉�氳繃</el-tag> + <el-tag type="success" v-if="scope.row.isExamine === 1" disable-transitions>閫氳繃</el-tag> + </template> + </el-table-column> + <el-table-column prop="examineTell" label="瀹℃牳澶囨敞" width="180"></el-table-column> + <el-table-column prop="ratifyUser" label="鎵瑰噯浜�" width="110"></el-table-column> + <el-table-column prop="ratifyTime" label="鎵瑰噯鏃堕棿" width="180"></el-table-column> + <el-table-column prop="isRatify" label="鎵瑰噯鐘舵��" width="110"> + <template slot-scope="scope"> + <el-tag type="danger" v-if="scope.row.isRatify === 0" disable-transitions>涓嶆壒鍑�</el-tag> + <el-tag type="success" v-if="scope.row.isRatify === 1" disable-transitions>鎵瑰噯</el-tag> + </template> + </el-table-column> + <el-table-column prop="ratifyTell" label="鎵瑰噯澶囨敞" width="180"></el-table-column> + <!-- 鎿嶄綔鎸夐挳 --> + <el-table-column label="鎿嶄綔" fixed="right" min-width="360" align="center"> + <template slot-scope="scope"> + <el-button size="small" type="text" @click="viewIssued(scope.row)">鏌ョ湅鎶ュ憡</el-button> + <el-upload ref='upload1' + style="display: inline" + :action="fileAction1 +'?id='+ scope.row.id" + :auto-upload="true" + :before-upload="fileBeforeUpload1" + :headers="headers" :on-error="onError1" + :on-success="handleSuccessUp1" + :show-file-list="false" + accept='.doc,.docx'> + <el-button size="small" type="text" :disabled="scope.row.state != 0 || userName !== scope.row.writeUserName">涓婁紶</el-button> + <!-- <span>涓婁紶</span>--> + </el-upload> + <el-button type="text" size="small" :disabled="scope.row.state != 0 || userName !== scope.row.writeUserName" @click="handleRestore(scope.row)">杩樺師</el-button> + <el-button type="text" size="small" :disabled="scope.row.state != 0 || userName !== scope.row.writeUserName" @click="sendBackTask(scope.row)">閫�鍥炰换鍔�</el-button> + <el-button type="text" size="small" :disabled="scope.row.state != 0 || userName !== scope.row.writeUserName" @click="handle(scope.row)">鎻愪氦</el-button> + <el-button type="text" size="small" :disabled="scope.row.state == null || scope.row.state == 0 ||scope.row.isExamine == 1 || userName !== scope.row.examineUser" @click="handleIssued(scope.row)">瀹℃牳</el-button> + <el-button type="text" size="small" :disabled="scope.row.state == null || scope.row.state == 0 || scope.row.isExamine == 0 || scope.row.isExamine == null || scope.row.isRatify == 1 || userName !== scope.row.ratifyUser" @click="handleApprove(scope.row)">鎵瑰噯</el-button> + <el-popover placement="bottom" :width="170" trigger="hover"> + <template #reference> + <el-button link type="text" size="small">鏇村</el-button> + </template> + <div> + <el-button style="margin-left: 10px" type="text" size="small" @click="download(scope.row)">涓嬭浇</el-button> + <el-button type="text" size="small" @click="viewInspectInfo(scope.row)">鍘熷璁板綍</el-button> + <el-button type="text" size="small" @click="handleFileLook(scope.row)">闄勪欢涓婁紶</el-button> + </div> + </el-popover> + </template> + </el-table-column> + </el-table> + <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="page.current" + style="margin-right: 5%;" :page-sizes="[10, 20, 30, 50, 100]" :page-size="page.size" + layout="->,total, sizes, prev, pager, next, jumper" :total="total"> + </el-pagination> + </div> + </div> + <el-dialog :fullscreen="fullscreen" :modal-append-to-body="false" :visible.sync="claimVisible" title="鍦ㄧ嚎缂栧埗" + width="22cm"> + <div class="full-screen"> + <i v-if="!fullscreen" class="el-icon-full-screen" style="cursor: pointer;font-size: 18px" + @click="fullscreen=true;"></i> + <img v-else alt="" src="@/assets/images/no-full.svg" style="cursor: pointer;" @click="fullscreen=false;"> + </div> + <Word v-if="claimVisible" ref="Word" :class="{fullscreen:fullscreen}" :value="value" style="height:70vh" /> + <span slot="footer" class="dialog-footer"> + <el-button @click="claimVisible = false">鍙� 娑�</el-button> + <el-button type="primary" @click="confirmClaim">纭� 瀹�</el-button> + </span> + </el-dialog> + <el-dialog :fullscreen="fullscreen" :modal-append-to-body="false" :visible.sync="issuedVisible" title="鎶ュ憡瀹℃牳" + width="80vw"> + <div class="full-screen"> + <i v-if="!fullscreen" class="el-icon-full-screen" style="cursor: pointer;font-size: 18px" @click="fullscreen=true;"></i> + <img v-else alt="" src="@/assets/images/no-full.svg" style="cursor: pointer;" @click="fullscreen=false;" > + </div> + <div v-if="issuedVisible" style="height: 80vh;"> + <onlyoffice ref="onlyoffice" :options="option" style="width: 100%;height: 100%;" /> + </div> + <span slot="footer" class="dialog-footer"> + <el-button :disabled="loadingIssued" @click="issuedReasonVisible=true">涓嶉�氳繃</el-button> + <el-button type="primary" @click="subIssued">閫� 杩�</el-button> + </span> + </el-dialog> + <el-dialog :modal-append-to-body="false" :visible.sync="issuedReasonVisible" title="涓嶉�氳繃鍘熷洜" width="400px"> + <div class="search_thing"> + <div class="search_label">涓嶉�氳繃鍘熷洜锛�</div> + <div class="search_input"><el-input v-model="reason" clearable placeholder="璇疯緭鍏�" size="small"></el-input></div> + </div> + <span slot="footer" class="dialog-footer"> + <el-button :disabled="loadingIssuedReason" @click="issuedReasonVisible=false">鍙栨秷</el-button> + <el-button :loading="loadingIssuedReason" type="primary" @click="handleIssuedReason">纭畾</el-button> + </span> + </el-dialog> + <el-dialog :fullscreen="fullscreen" :modal-append-to-body="false" :visible.sync="approveVisible" title="鎶ュ憡鎵瑰噯" width="80vw"> + <div class="full-screen"> + <i v-if="!fullscreen" class="el-icon-full-screen" style="cursor: pointer;font-size: 18px" @click="fullscreen=true;"></i> + <img v-else alt="" src="@/assets/images/no-full.svg" style="cursor: pointer;" @click="fullscreen=false;" > + </div> + <div v-if="approveVisible" style="height: 80vh;"> + <onlyoffice ref="onlyoffice" :options="option" style="width: 100%;height: 100%;" /> + </div> + <span slot="footer" class="dialog-footer"> + <el-button :disabled="loadingApprove" @click="approveReasonVisible=true">涓嶆壒鍑�</el-button> + <el-button :loading="loadingApprove" type="primary" @click="subApprove">鎵� 鍑�</el-button> + </span> + </el-dialog> + <el-dialog :modal-append-to-body="false" :visible.sync="approveReasonVisible" title="涓嶆壒鍑嗗師鍥�" width="400px"> + <div class="search_thing"> + <div class="search_label">涓嶆壒鍑嗗師鍥狅細</div> + <div class="search_input"><el-input v-model="reason" clearable placeholder="璇疯緭鍏�" size="small"></el-input></div> + </div> + <span slot="footer" class="dialog-footer"> + <el-button :disabled="loadingApproveReason" @click="approveReasonVisible=false">鍙栨秷</el-button> + <el-button :loading="loadingApproveReason" type="primary" @click="handleApproveReason">纭畾</el-button> + </span> + </el-dialog> + <el-dialog :close-on-click-modal="false" :visible.sync="addApproverDia" title="鎸囧畾鎵瑰噯浜哄憳" + width="400px" + @close="closeAddApproverDia"> + <div class="body" style="display: flex;padding: 10px;align-items: center;"> + <div class="search_label" style="width: 150px;"><span class="required-span">*</span>鎵瑰噯浜猴細</div> + <div class="search_input" style="width: 100%;"> + <el-select v-model="approver" clearable filterable placeholder="璇烽�夋嫨" size="small" style="width: 100%;"> + <el-option v-for="(item,i) in approverList" :key="i" :label="item.label" :value="item.value"> + </el-option> + </el-select> + </div> + </div> + <span slot="footer" class="dialog-footer"> + <el-button @click="closeAddApproverDia">鍙� 娑�</el-button> + <el-button :loading="loadingIssued" type="primary" @click="submitAddApprover">纭� 瀹�</el-button> + </span> + </el-dialog> + <el-dialog :close-on-click-modal="false" :visible.sync="addVerifyDia" + title="鎸囧畾瀹℃牳浜哄憳" + width="400px" + @close="closeAddVerifyDia"> + <div class="body" style="display: flex;padding: 10px;align-items: center;"> + <div class="search_label" style="width: 150px;"><span class="required-span">*</span>瀹℃牳浜猴細</div> + <div class="search_input" style="width: 100%;"> + <el-select v-model="verifyUser" clearable filterable placeholder="璇烽�夋嫨" size="small" style="width: 100%;"> + <el-option v-for="(item,i) in approverList" :key="i" :label="item.label" :value="item.value"> + </el-option> + </el-select> + </div> + </div> + <span slot="footer" class="dialog-footer"> + <el-button @click="closeAddVerifyDia">鍙� 娑�</el-button> + <el-button :loading="loadingVerify" type="primary" @click="handleSubmit">纭� 瀹�</el-button> + </span> + </el-dialog> + <div v-if="activeFace >0 && isCopper === null" style="width: 100%;height: 100%;"> + <Add :active="activeFace" :currentId="currentId" :examine="examine"/> + </div> + <div v-if="activeFace >0 && isCopper === 0" style="width: 100%;height: 100%;"> + <CustomsInspection :active="activeFace" :currentId="currentId" :customsInspection="customsInspection" :isReport="isReport"/> + </div> + <div v-if="activeFace >0 && isCopper === 1" style="width: 100%;height: 100%;"> + <CopperOrder :active="activeFace" :currentId="currentId"></CopperOrder> + </div> + <!--浜т笟閾句俊鎭煡鐪�--> + <ShowInfo v-if="showInfoDialog" ref="showInfoDialog" :showInfoDialog="showInfoDialog"></ShowInfo> + <!--鎶ュ憡鏌ョ湅--> + <el-dialog :fullscreen="fullscreen" :modal-append-to-body="false" :visible.sync="viewIssuedVisible" title="鎶ュ憡鏌ョ湅" + width="80vw"> + <div class="full-screen"> + <i v-if="!fullscreen" class="el-icon-full-screen" style="cursor: pointer;font-size: 18px" @click="fullscreen=true;"></i> + <img v-else alt="" src="@/assets/images/no-full.svg" style="cursor: pointer;" @click="fullscreen=false;" > + </div> + <div v-if="viewIssuedVisible" style="height: 80vh;"> + <onlyoffice ref="onlyoffice" :options="option" style="width: 100%;height: 100%;" /> + </div> + </el-dialog> + <!--妫�楠屼换鍔′俊鎭煡鐪�--> + <Inspection v-if="state>0" :key="InspectionKey" :inspectorList="inspectorList" :orderId="orderId" + :sonLaboratory="sonLaboratory" :state="state" + :typeSource="typeSource" + @goback="goback" @refreshView="refreshView"/> + <!--闄勪欢鏌ョ湅--> + <el-dialog :visible.sync="filesDialogVisible" title="闄勪欢鏌ョ湅" width="80%" @closed="closeFilesLook"> + <div style="display: flex;justify-content: space-between;"> + <el-upload ref='upload' + :action="fileAction" + :auto-upload="true" + :before-upload="fileBeforeUpload" :data="{orderId: filesLookInfo.insOrderId}" + :headers="headers" :on-error="onError" + :on-success="handleSuccessUp" + :show-file-list="false" + accept='.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip,.rar' style="width: 80px !important;"> + <el-button size="small" style="height: 38px" type="primary">闄勪欢涓婁紶</el-button> + </el-upload> + </div> +<!-- <div v-if="filesDialogVisible" style="height: 70vh;overflow-y: auto;">--> +<!-- <ValueTable :key="upIndex"--> +<!-- ref="fileList"--> +<!-- :componentData="fileComponentData"--> +<!-- :delUrl="$api.insOrderPlan.delfile"--> +<!-- :url="$api.insOrderPlan.getFileList"--> +<!-- class="value-table"/>--> +<!-- </div>--> + </el-dialog> + </div> +</template> + +<script> +import onlyoffice from "@/components/Onlyoffice/onlyoffice.vue"; +// import ShowInfo from "../do/b1-material-ins-order/showInfo.vue"; +import file from "@/utils/file"; +export default { + components: {onlyoffice}, + data() { + return { + componentData: { + entity: { + queryStatus: null, + code: null, + typeSource: null, + orderBy: { + field: 'id', + order: 'desc' + } + }, + isIndex: true, + showSelect: true, + select: true, + selectMethod: 'handleChange', + do: [ + { + id: '', + font: '鏌ョ湅鎶ュ憡', + type: 'text', + method: 'viewIssued', + }, + { + id: 'download', + font: '涓嬭浇', + type: 'text', + method: 'download' + }, { + id: 'handleUpload', + font: '涓婁紶', + type: 'upload', + uploadConfig: { + url: this.$api.insReport.inReport, + accept: '.docx' + }, + method: 'handleUpload', + disabFun: (row, index) => { + return row.state != 0 || userName != row.writeUserName + } + }, + { + id: 'handleRestore', + font: '杩樺師', + type: 'text', + method: 'handleRestore', + disabFun: (row, index) => { + return row.state != 0 || JSON.parse(localStorage.getItem("user")).name != row.writeUserName + } + }, + { + id: 'sendBackTask', + font: '閫�鍥炰换鍔�', + type: 'text', + method: 'sendBackTask', + disabFun: (row, index) => { + return row.state != 0 || JSON.parse(localStorage.getItem("user")).name != row.writeUserName + } + }, + { + id: 'handle', + font: '鎻愪氦', + type: 'text', + method: 'handle', + disabFun: (row, index) => { + return row.state != 0 || JSON.parse(localStorage.getItem("user")).name != row.writeUserName + } + }, + { + id: 'handleIssued', + font: '瀹℃牳', + type: 'text', + method: 'handleIssued', + disabFun: (row, index) => { + return row.state == null || row.state == 0 || row.isExamine == 1 || JSON.parse(localStorage.getItem("user")).name != row.examineUser + } + }, { + id: 'handleApprove', + font: '鎵瑰噯', + type: 'text', + method: 'handleApprove', + disabFun: (row, index) => { + return row.state == null || row.state == 0 || row.isExamine == 0 || row.isExamine == null || row.isRatify == 1 || JSON.parse(localStorage.getItem("user")).name != row.ratifyUser + } + }, + { + id: '', + font: '鍘熷璁板綍', + type: 'text', + method: 'viewInspectInfo', + }, + { + id: '', + font: '闄勪欢涓婁紶', + type: 'text', + method: 'handleFileLook', + } + ], + linkEvent: { + code: { + method: 'selectAllByOne' + } + }, + tagField: { + isRatify: { + select: [{ + value: 0, + type: 'danger', + label: '涓嶆壒鍑�' + }, { + value: 1, + type: 'success', + label: '鎵瑰噯' + }] + }, + isExamine: { + select: [{ + value: 0, + type: 'danger', + label: '涓嶉�氳繃' + }, { + value: 1, + type: 'success', + label: '閫氳繃' + }] + }, + state: { + select: [{ + value: 0, + type: 'danger', + label: '寰呮彁浜�' + }, { + value: 1, + type: 'success', + label: '宸叉彁浜�' + }] + }, + typeSource: { + select: [{ + value: 0, + label: '鎴愬搧涓嬪崟', + type: 'info' + },{ + value: 1, + label: '鍘熸潗鏂欎笅鍗�', + type: 'info' + }] + }, + queryStatus: { + select: [{ + value: 0, + label: '寰呮彁浜�', + type: 'info' + },{ + value: 1, + label: '寰呭鏍�', + type: 'info' + },{ + value: 2, + label: '寰呮壒鍑�', + type: 'info' + }] + }, + orderType: { + select: [{ + value: 'Customer-ordered test', + label: '濮旀墭璇曢獙', + type: 'success', + effect: 'plain' + },{ + value: '鎶芥', + label: '鎶芥', + type: '', + effect: 'plain' + },{ + value: '杩涘巶妫�楠�', + label: '杩涘巶妫�楠�', + type: 'info', + effect: 'plain' + },{ + value: 'Quarterly inspection', + label: '瀛e害妫�楠�', + type: 'warning', + effect: 'plain' + }] + } + }, + selectField: {}, + requiredAdd: [], + needSort: ['createTime', 'state', 'writeTime', 'isExamine', 'examineTime', 'ratifyTime'], + requiredUp: [] + }, + page: { + current: 1, + size: 20, + }, + total: null, + entityCopy: {}, + upIndex: 0, + statusList: [], + claimVisible: false, + issuedVisible: false, + issuedReasonVisible: false, + approveVisible: false, + approveReasonVisible: false, + fullscreen: false, + loadingApproveReason: false, + loadingApprove: false, + loadingIssuedReason: false, + loadingIssued: false, + value: ``, + reason: '', + currentInfo: null, + option:null, + mutiList:[], + outLoading:false, + inLoading:false, + addApproverDia: false, // 鎸囧畾瀹℃壒浜哄憳寮规 + approver: '', // 瀹℃壒浜哄憳 + approverId: '', // 瀹℃壒浜哄憳 + approverList: [], + addVerifyDia: false, // 鎸囧畾瀹℃牳浜哄憳寮规 + verifyUser: null, // 瀹℃牳浜哄憳 + loadingVerify: false, // 瀹℃牳浜哄憳 + typeSourceList: [ + {label: '鎴愬搧涓嬪崟', value: 0}, + {label: '鍘熸潗鏂欎笅鍗�', value: 1}, + ], + orderTypeList: [ + {label: '濮旀墭璇曢獙', value: 'Customer-ordered test'}, + {label: '鎶芥', value: '鎶芥'}, + {label: '杩涘巶妫�楠�', value: '杩涘巶妫�楠�'}, + {label: '瀛e害妫�楠�', value: 'Quarterly inspection'}, + ], + showInfoDialog: false, // 浜т笟閾句俊鎭煡鐪� + isReport: 1, + activeFace: 0, // 1锛氫笅鍗曪紝2锛氭煡鐪嬶紝3锛氬鏍革紝榛樿涓�0 + customsInspection: {}, + currentId: null, + examine: null, + viewIssuedVisible: false, + queryStatusList: [ + {label: '寰呮彁浜�', value: 0}, + {label: '寰呭鏍�', value: 1}, + {label: '寰呮壒鍑�', value: 2}, + ], + state: 0, + orderId: 0, + inspectorList: [],//妫�楠屼汉鍛樺垪琛� + InspectionKey: 1, + typeSource: null,// 0:鎴愬搧涓嬪崟锛�1锛氬師鏉愭枡涓嬪崟 + sonLaboratory: '', // 璇曢獙瀹� + filesDialogVisible: false, + filesLookInfo: {}, + fileComponentData: { + entity: { + insOrderId:'' + }, + isIndex: true, + showSelect: false, + select: false, + sort: false, + init:false, + do: [ + { + id: 'parent', + font: '涓嬭浇', + type: 'text', + method: 'handleDown' + },{ + id: 'delete', + font: '鍒犻櫎', + type: 'text', + method: 'doDiy', + } + ], + isPage: false, + linkEvent: {}, + tagField: { + type:{ + select:[ + { + value: 1, + label: '鍥剧墖' + }, + { + value: 2, + label: '鏂囦欢' + } + ] + } + }, + currentId: '', + selectField: {}, + requiredAdd: [], + requiredUp: [] + }, + isCopper: null, + tableLoading: false, + valueTableData: [], + userName: '' + } + }, + computed: { + headers() { + return { + 'token': sessionStorage.getItem('token') + } + }, + action() { + return this.javaApi + this.$api.insReport.upAll + }, + fileAction() { + return this.javaApi + this.$api.insOrderPlan.uploadFile + }, + fileAction1() { + return this.javaApi + this.$api.insReport.inReport + } + }, + mounted() { + this.entityCopy = this.HaveJson(this.componentData.entity) + this.userName = JSON.parse(localStorage.getItem("user")).name + this.getPower() + this.refreshTable() + }, + methods: { + handleChange(arr){ + this.mutiList = arr + }, + // 鏌ョ湅妫�楠屾暟鎹� + viewInspectInfo (row) { + //褰撳墠妫�楠屼换鍔$殑妫�楠屼汉鍒楄〃 + let inspectorList = [] + if(row.userName){ + inspectorList = row.userName.split(',') + } + let user = JSON.parse(localStorage.getItem('user')) + if(user){ + inspectorList.push(user.name) + } + this.inspectorList = inspectorList + this.state = 3; + this.typeSource = row.typeSource + this.orderId = row.insOrderId + this.sonLaboratory = row.sonLaboratory + }, + goback() { + this.state = 0 + this.refreshTable('page') + }, + handleFileLook (row) { + this.filesLookInfo = row + this.filesDialogVisible = true + this.fileComponentData.entity.insOrderId = row.insOrderId + this.$nextTick(() => { + this.$refs['fileList'].selectList() + }) + }, + closeFilesLook () { + this.filesDialogVisible = false + }, + handleSuccessUp(response, ) { + this.upLoading = false; + if (response.code == 200) { + this.$message.success('涓婁紶鎴愬姛'); + this.$refs.fileList.selectList() + } + }, + handleSuccessUp1(response, ) { + if (response.code == 200) { + this.$message.success('涓婁紶鎴愬姛'); + } + }, + handleDown(row){ + this.$axios.post(this.$api.insOrderPlan.downFile, { + id: row.id, + }).then(res => { + if (res.code === 200) { + let url = ''; + if(res.data.type==1){ + url = this.javaApi+'/img/'+res.data.fileUrl + file.downloadIamge(url,row.fileName) + }else{ + url = this.javaApi+'/word/'+res.data.fileUrl + const link = document.createElement('a'); + link.href = url; + link.download = row.fileName; + link.click(); + } + } + }).catch(error => { + + }) + }, + // 鍒锋柊椤甸潰 + refreshView () { + this.InspectionKey++ + }, + // 鏌ョ湅浜т笟閾句俊鎭� + openInfoDialog (row) { + this.showInfoDialog = true + this.$nextTick(() => { + this.$refs.showInfoDialog.getInfo(row.ifsInventoryId) + }) + }, + handleDowns(){ + if(this.mutiList.length==0){ + this.$message.error('璇烽�夋嫨鎶ュ憡') + return + } + let str = this.mutiList.map(m=>m.id).join(',') + this.outLoading = true + this.$axios.get(this.$api.insReport.downAll+'?ids='+str).then(res => { + this.outLoading = false + this.$message.success('瀵煎嚭鎴愬姛') + // const blob = new Blob([res],{ type: 'application/octet-stream' }); + // const url = URL.createObjectURL(blob); + // const link = document.createElement('a'); + // link.href = url; + // link.download = '鎶ュ憡.zip'; + // link.click(); + const link = document.createElement('a'); + link.href = this.javaApi + res.message; + link.target = '_blank'; + document.body.appendChild(link); + link.click(); + }) + }, + beforeUpload(file){ + const isZip = file.type === 'application/zip' || file.name.endsWith('.zip'); + if (!isZip) { + this.$message.error('涓婁紶鏂囦欢鍙兘鏄� ZIP 鏍煎紡!'); + } + if(isZip){ + this.inLoading = true; + } + return isZip; + }, + fileBeforeUpload(file) { + let flag = true + if (file.size > 1024 * 1024 * 10) { + this.$message.error('涓婁紶鏂囦欢涓嶈秴杩�10M'); + this.$refs.upload.clearFiles() + flag = false + } + if (!flag) { + return Promise.reject(flag); //姝g‘鐨勭粓姝� + } + }, + fileBeforeUpload1(file) { + let flag = true + if (file.size > 1024 * 1024 * 10) { + this.$message.error('涓婁紶鏂囦欢涓嶈秴杩�10M'); + this.$refs.upload1.clearFiles() + flag = false + } + if (!flag) { + return Promise.reject(flag); //姝g‘鐨勭粓姝� + } + }, + handleSuccess(response,){ + this.inLoading = false; + if (response.code == 200) { + this.$message.success('瀵煎叆鎴愬姛') + this.refreshTable() + }else{ + this.$message.error(response.message) + } + }, + onError(err, file, fileList,type) { + this.$message.error('涓婁紶澶辫触') + this.$refs.upload.clearFiles() + }, + onError1(err, file, fileList,type) { + this.$message.error('涓婁紶澶辫触') + this.$refs.upload1.clearFiles() + }, + refreshTable(e) { + this.tableLoading = false + this.$axios.post(this.$api.insReport.pageInsReport, { + page: this.page, + entity: this.componentData.entity + }, { + headers: { + 'Content-Type': 'application/json' + } + }).then(res => { + this.tableLoading = false + if (res.code === 201) { + return + } + this.total = res.data.body.total + this.valueTableData = res.data.body.records + }) + }, + handleSizeChange(val) { + this.page.size = val + this.refreshTable(); + }, + handleCurrentChange(val) { + this.page.current = val + this.refreshTable(); + }, + refresh() { + this.componentData.entity = this.HaveJson(this.entityCopy) + this.refreshTable(); + }, + async handleWeave(row) { + let fileName = (row.urlS===null||row.urlS==='')?row.url:row.urlS + fileName = fileName.replace('/word/','') + const userName = JSON.parse(localStorage.getItem("user")).name; + //鍙傝�僾abOnlyOffice缁勪欢鍙傛暟閰嶇疆 + const { href } = this.$router.resolve({ + path: `/wordEdit`, + query: { + url: this.javaApi + "/word/" + fileName, + isEdit: true, + fileType: "docx", + title: fileName, + lang: 'zh-CN', + isPrint: true, + user_id: 1, + user_name: userName, + editUrl: this.javaApi + "/insReport/onlyOffice/save?fileName=" + fileName + } + }) + window.open(href, '_blank'); + }, + // 鏉冮檺鍒嗛厤 + getPower(radio) { + let power = JSON.parse(sessionStorage.getItem('power')) + let edit = false + let up = false + let res = false + let sub = false + let issued = true + let approve = true + for (var i = 0; i < power.length; i++) { + if (power[i].menuMethod == 'upReportFile') { + edit = true + } + if (power[i].menuMethod == 'inReport') { + up = true + } + if (power[i].menuMethod == 'upReportUrl') { + res = true + } + if (power[i].menuMethod == 'writeReport') { + sub = true + } + if (power[i].menuMethod == 'ratifyReport') { + approve = true + } + if (power[i].menuMethod == 'examineReport') { + issued = true + } + } + if (!approve) { + this.componentData.do.splice(6, 1) + } + if (!issued) { + this.componentData.do.splice(5, 1) + } + if (!sub) { + this.componentData.do.splice(4, 1) + } + if (!res) { + this.componentData.do.splice(3, 1) + } + if (!up) { + this.componentData.do.splice(2, 1) + } + if (!edit) { + this.componentData.do.splice(0, 1) + } + }, + confirmClaim() { + // console.log(this.$refs.Word.getValue()) + }, + playOrder(num) { + this.activeFace = num + }, + async selectAllByOne(row) { + this.isCopper = row.isCopper + this.customsInspection = row + this.activeFace = 2; + this.examine = 1; + this.isReport = 1 + this.currentId = parseInt(row.insOrderId) + }, + download(row) { + let url = row.urlS ? row.urlS : row.url; + const link = document.createElement('a'); + link.href = this.javaApi + url; + link.target = '_blank'; + document.body.appendChild(link); + link.click(); + }, + // 杩樺師鎿嶄綔 + handleRestore(row) { + this.$axios.post(this.$api.insReport.upReportUrl, { + id: row.id + }).then(res => { + if (res.code === 200) { + this.$message.success('鎿嶄綔鎴愬姛') + this.refreshTable('page') + } + }) + }, + // 瀹℃牳鎸夐挳 + handleIssued(row) { + this.currentInfo = row; + let fileName = (row.urlS===null||row.urlS==='')?row.url:row.urlS + let fileType = "docx" + if (row.tempUrlPdf != null || row.tempUrlPdf === '') { + fileName = row.tempUrlPdf + fileType = "pdf" + } + fileName = fileName.replace('/word/','') + const userName = JSON.parse(localStorage.getItem("user")).name; + this.option = { + url: this.javaApi + "/word/" + fileName, + isEdit: false, + fileType: fileType, + title: fileName, + lang: 'zh-CN', + isPrint: false, + user_id: 1, + user_name: userName, + editUrl: this.javaApi + "/insReport/onlyOffice/save?fileName=" + fileName + } + this.issuedVisible = true; + }, + // 鏌ョ湅pdf鎶ュ憡 + viewIssuedPdf(row) { + this.currentInfo = row; + let url = row.tempUrlPdf + if(url){ + url = url.split('.')[0]+'.pdf' + const link = document.createElement('a'); + link.href = this.javaApi + url; + link.target = '_blank'; + document.body.appendChild(link); + link.click(); + } + }, + // 鏌ョ湅鎶ュ憡 + viewIssued(row) { + this.currentInfo = row; + let fileName = (row.urlS===null||row.urlS==='')?row.url:row.urlS + let fileType = "docx" + if (row.tempUrlPdf != null || row.tempUrlPdf === '') { + fileName = row.tempUrlPdf + fileType = "pdf" + } + fileName = fileName.replace('/word/','') + const userName = JSON.parse(localStorage.getItem("user")).name; + this.option = { + url: this.javaApi + "/word/" + fileName, + isEdit: false, + fileType: fileType, + title: fileName, + lang: 'zh-CN', + isPrint: false, + user_id: 1, + user_name: userName, + editUrl: this.javaApi + "/insReport/onlyOffice/save?fileName=" + fileName + } + this.viewIssuedVisible = true; + }, + // 閫�鍥炲埌浠诲姟 + sendBackTask(row) { + this.$confirm('纭閫�鍥炲埌妫�楠屼换鍔�?閫�鍥炲悗闇�閲嶆柊鎻愪氦澶嶆牳', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + this.upLoad = true + this.$axios.post(this.$api.insReport.sendBackTask+'?id='+row.id).then(res => { + this.upLoad = false + if (res.code === 201) { + return + } + this.$message.success('閫�鍥炴垚鍔燂紒') + this.refreshTable('page') + }).catch(err => { + this.upLoad = false + }) + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堝垹闄�' + }); + }); + }, + // 瀹℃牳閫氳繃 + submitAddApprover () { + if (!this.approver) { + this.$message.error('璇烽�夋嫨瀹℃壒浜�') + return + } + this.loadingIssued = true; + this.$axios.post(this.$api.insReport.examineReport, { + id: this.currentInfo.id, + userId: this.approver, + isExamine: 1 + }).then(res => { + this.loadingIssued = false; + if (res.code === 201) { + return + } + this.$message.success('鎻愪氦鎴愬姛') + this.refreshTable('page') + this.currentInfo = null; + this.addApproverDia = false + this.issuedVisible = false; + }).catch(e => { + this.$message.error('鎻愪氦澶辫触') + this.loadingIssued = false; + }) + }, + closeAddApproverDia () { + this.addApproverDia = false + this.approver = '' + }, + // 鐐瑰嚮閫氳繃锛岄渶瑕侀�夋嫨鎵瑰噯浜哄憳 + subIssued() { + this.getAuthorizedPerson() + this.addApproverDia = true + }, + // 鑾峰彇浜哄憳鍒楄〃 + getAuthorizedPerson() { + this.$axios.get(this.$api.user.selectQualityUserList).then(res => { + let data = [] + let userName = JSON.parse(localStorage.getItem("user")).name; + res.data.forEach(a => { + // if(a.name !== userName) { + data.push({ + label: a.name, + value: a.id + }) + // } + }) + this.approverList = data + }) + }, + // 鎵瑰噯鎸夐挳 + handleApprove(row) { + this.currentInfo = row; + let fileName = (row.urlS===null||row.urlS==='')?row.url:row.urlS + let fileType = "docx" + if (row.tempUrlPdf != null || row.tempUrlPdf === '') { + fileName = row.tempUrlPdf + fileType = "pdf" + } + fileName = fileName.replace('/word/','') + const userName = JSON.parse(localStorage.getItem("user")).name; + this.option = { + url: this.javaApi + "/word/" + fileName, + isEdit: false, + fileType: fileType, + title: fileName, + lang: 'zh-CN', + isPrint: false, + user_id: 1, + user_name: userName, + editUrl: this.javaApi + "/insReport/onlyOffice/save?fileName=" + fileName + } + this.approveVisible = true; + }, + // 鎵瑰噯閫氳繃 + subApprove() { + this.loadingApprove = true; + this.$axios.post(this.$api.insReport.ratifyReport, { + id: this.currentInfo.id, + isRatify: 1 + }).then(res => { + this.loadingApprove = false; + if (res.code == 201) { + this.$message.error('鎵瑰噯澶辫触') + return + } + this.$message.success('宸叉壒鍑�') + this.refreshTable('page') + this.currentInfo = null; + this.approveVisible = false; + }) + }, + handle (row) { + this.getAuthorizedPerson() + this.currentInfo = row; + this.addVerifyDia = true + }, + // 鎻愪氦瀹℃牳浜烘搷浣� + handleSubmit(row) { + this.loadingVerify = true + this.$axios.post(this.$api.insReport.writeReport, { + id: this.currentInfo.id, + userId: this.verifyUser, + }).then(res => { + this.loadingVerify = false + if (res.code === 201) { + return + } + this.addVerifyDia = false + this.$message.success('鎻愪氦鎴愬姛') + this.refreshTable('page') + }).catch(e => { + this.loadingVerify = false + this.$message.error('鎻愪氦澶辫触') + }) + }, + closeAddVerifyDia () { + this.addVerifyDia = false + this.verifyUser = '' + }, + // 瀹℃牳涓嶉�氳繃鍘熷洜鎻愪氦 + handleIssuedReason() { + if (!this.reason) { + return this.$message.error('璇疯緭鍏ュ師鍥�') + } + this.loadingIssuedReason = true; + this.$axios.post(this.$api.insReport.examineReport, { + id: this.currentInfo.id, + isExamine: 0, + examineTell: this.reason + }).then(res => { + this.loadingIssuedReason = false; + if (res.code === 201) { + return + } + this.$message.success('鎿嶄綔鎴愬姛') + this.refreshTable('page') + this.currentInfo = null; + this.reason = ''; + this.issuedVisible = false; + this.issuedReasonVisible = false; + }).catch(e => { + this.$message.error('鎿嶄綔澶辫触') + this.loadingIssuedReason = false; + }) + }, + // 涓嶆壒鍑嗗師鍥犳彁浜� + handleApproveReason() { + if (!this.reason) { + return this.$message.error('璇疯緭鍏ュ師鍥�') + } + this.loadingApproveReason = true + this.$axios.post(this.$api.insReport.ratifyReport, { + id: this.currentInfo.id, + isRatify: 0, + examineTell: this.reason + }).then(res => { + this.loadingApproveReason = false + if (res.code === 201) { + return + } + this.$message.success('鎿嶄綔鎴愬姛') + this.refreshTable('page') + this.currentInfo = null; + this.reason = ''; + this.approveVisible = false; + this.approveReasonVisible = false; + }).catch(e => { + this.$message.error('鎿嶄綔澶辫触') + this.loadingIssuedReason = false; + }) + } + } +} +</script> +<style scoped> +.title { + height: 60px; + line-height: 60px; +} + +.search { + background-color: #fff; + height: 80px; + display: flex; + align-items: center; +} + +.search_thing { + display: flex; + align-items: center; + height: 50px; +} + +.search_label { + width: 120px; + font-size: 14px; + text-align: right; +} + +.search_input { + width: calc(100% - 120px); +} + +.table { + margin-top: 10px; + background-color: #fff; + width: calc(100% - 40px); + height: calc(100% - 60px - 80px - 10px - 40px); + padding: 20px; +} + +.el-form-item { + margin-bottom: 16px; +} + +.full-screen { + position: absolute; + right: 52px; + top: 22px; +} + +.btns { + position: absolute; + right: 40px; + top: 50%; + transform: translate(0, -50%); + display: flex; + align-items: center; +} + +.fullscreen { + height: 82vh +} +</style> diff --git a/src/views/business/unpass/components/PurchaseVerification.vue b/src/views/business/unpass/components/PurchaseVerification.vue index 2e66c74..1071830 100644 --- a/src/views/business/unpass/components/PurchaseVerification.vue +++ b/src/views/business/unpass/components/PurchaseVerification.vue @@ -1,10 +1,10 @@ <template> <div> - <el-dialog title="杩涜揣楠岃瘉鍘熷璁板綍" :visible.sync="isShow" width="1000px" :show-close="false" :close-on-click-modal="false" - style="max-height: 96vh; margin-top: 2vh" :modal-append-to-body="false" :close-on-press-escape="false"> + <el-dialog title="杩涜揣楠岃瘉鍘熷璁板綍" :visible.sync="isShow" width="70%" :show-close="false" :close-on-click-modal="false" + :modal-append-to-body="false" :close-on-press-escape="false"> <div class="search"> <el-form :inline="true" :model="purchaseForm" label-position="right" :rules="purchaseFormRules" - ref="purchaseForm" class="form-inline" label-width="130px"> + ref="purchaseForm" class="form-inline" label-width="120px"> <el-row> <el-col :span="8"> <el-form-item label="妫�楠岀紪鍙�:"> @@ -55,50 +55,49 @@ </h4> <div class="title">涓�銆佷緵鏂逛骇鍝佹娴嬫姤鍛婄殑鍩烘湰淇℃伅纭</div> <el-form-item label="鏉愭枡鍚嶇О:" prop="basicName"> - <el-radio-group v-model="purchaseForm.basicName" :disabled="operationType === 'view'" v-removeAriaHidden> + <el-radio-group v-model="purchaseForm.basicName" :disabled="operationType === 'view'"> <el-radio label="1">绗﹀悎</el-radio> <el-radio label="2">涓嶇鍚�</el-radio> <el-radio label="3">涓嶉�傜敤</el-radio> </el-radio-group> </el-form-item> <el-form-item label="瑙勬牸鍨嬪彿:" prop="basicModel"> - <el-radio-group v-model="purchaseForm.basicModel" :disabled="operationType === 'view'" v-removeAriaHidden> + <el-radio-group v-model="purchaseForm.basicModel" :disabled="operationType === 'view'"> <el-radio label="1">绗﹀悎</el-radio> <el-radio label="2">涓嶇鍚�</el-radio> <el-radio label="3">涓嶉�傜敤</el-radio> </el-radio-group> </el-form-item> <el-form-item label="鏉愭枡鎵瑰彿:" prop="basicBatchNo"> - <el-radio-group v-model="purchaseForm.basicBatchNo" :disabled="operationType === 'view'" v-removeAriaHidden> + <el-radio-group v-model="purchaseForm.basicBatchNo" :disabled="operationType === 'view'"> <el-radio label="1">绗﹀悎</el-radio> <el-radio label="2">涓嶇鍚�</el-radio> <el-radio label="3">涓嶉�傜敤</el-radio> </el-radio-group> </el-form-item> <el-form-item label="鎵ц鏍囧噯:" prop="basicStandard"> - <el-radio-group v-model="purchaseForm.basicStandard" :disabled="operationType === 'view'" - v-removeAriaHidden> + <el-radio-group v-model="purchaseForm.basicStandard" :disabled="operationType === 'view'"> <el-radio label="1">绗﹀悎</el-radio> <el-radio label="2">涓嶇鍚�</el-radio> <el-radio label="3">涓嶉�傜敤</el-radio> </el-radio-group> </el-form-item> <el-form-item label="鐢熶骇鏃ユ湡:" prop="basicDate"> - <el-radio-group v-model="purchaseForm.basicDate" :disabled="operationType === 'view'" v-removeAriaHidden> + <el-radio-group v-model="purchaseForm.basicDate" :disabled="operationType === 'view'"> <el-radio label="1">绗﹀悎</el-radio> <el-radio label="2">涓嶇鍚�</el-radio> <el-radio label="3">涓嶉�傜敤</el-radio> </el-radio-group> </el-form-item> <el-form-item label="渚涜揣鏁伴噺:" prop="basicNumber"> - <el-radio-group v-model="purchaseForm.basicNumber" :disabled="operationType === 'view'" v-removeAriaHidden> + <el-radio-group v-model="purchaseForm.basicNumber" :disabled="operationType === 'view'"> <el-radio label="1">绗﹀悎</el-radio> <el-radio label="2">涓嶇鍚�</el-radio> <el-radio label="3">涓嶉�傜敤</el-radio> </el-radio-group> </el-form-item> <el-form-item label="鏉愭枡棰滆壊:" prop="basicColor"> - <el-radio-group v-model="purchaseForm.basicColor" :disabled="operationType === 'view'" v-removeAriaHidden> + <el-radio-group v-model="purchaseForm.basicColor" :disabled="operationType === 'view'"> <el-radio label="1">绗﹀悎</el-radio> <el-radio label="2">涓嶇鍚�</el-radio> <el-radio label="3">涓嶉�傜敤</el-radio> @@ -130,7 +129,7 @@ <el-table-column prop="inspectionItem" label="楠岃瘉椤圭洰" width="300"></el-table-column> <el-table-column prop="result" label="楠岃瘉缁撴灉"> <template slot-scope="scope"> - <el-radio-group v-model="scope.row.result" v-removeAriaHidden :disabled="operationType === 'view'"> + <el-radio-group v-model="scope.row.result" :disabled="operationType === 'view'"> <el-radio label="1">绗﹀悎</el-radio> <el-radio label="2">涓嶇鍚�</el-radio> <el-radio label="3">涓嶉�傜敤</el-radio> @@ -149,9 +148,7 @@ </div> <span slot="footer" class="dialog-footer"> <el-button @click="$emit('resetPurchaseDialog')">鍙� 娑�</el-button> - <el-button type="primary" @click="handlePurchase" :loading="handlePurchaseLoading" - v-if="operationType === 'add'">纭� - 瀹�</el-button> + <el-button type="primary" @click="handlePurchase" :loading="handlePurchaseLoading" v-if="operationType === 'add'">纭畾</el-button> </span> </el-dialog> <el-dialog title="寰呴獙璇侀」鐩�" :visible.sync="factoryVerifyItemDia" width="1000px" @@ -247,6 +244,7 @@ // 鏂规硶闆嗗悎 methods: { async getInsOrder(operationType, item) { + console.log('operationType----', operationType) this.operationType = operationType this.info = item // 鏌ヨ宸叉彁浜ょ殑鏁版嵁 @@ -346,7 +344,6 @@ .headLine>>>.el-form-item__content { width: 68%; } - >>>.el-form-item__content { display: inline-block; } @@ -370,7 +367,7 @@ } >>>.el-dialog__body { - max-height: 700px; + max-height: 600px; overflow-y: auto; } </style> diff --git a/src/views/standard/standardLibrary/index.vue b/src/views/standard/standardLibrary/index.vue index 21eeeb8..4ead05c 100644 --- a/src/views/standard/standardLibrary/index.vue +++ b/src/views/standard/standardLibrary/index.vue @@ -488,14 +488,10 @@ obtainItemParameterList, selectTestObjectByName, selectStandardMethods, - addStandardMethodList, addStandardTree, updateStandardTree, selectsStandardMethodByFLSSM, upStandardProductList, - delStandardMethodByFLSSM, - delStandardProductByIds, - addStandardProduct, selectStandardProductListByMethodId, updateSection, upStandardProducts, @@ -592,6 +588,7 @@ this.selectTestObjectByName(); this.selectStandardMethods(); this.selectEnumByCategoryForSonLaboratory(); + this.selectEnumByCategoryForsampleType(); this.getStandardTemplate(); this.selectStandardMethodsSec(); this.token = { @@ -845,22 +842,6 @@ this.standardEnum = data; }); }, - addStandardMethodList() { - if (this.standardId == null || this.standardId == "") { - this.$message.error("鏍囧噯鏂规硶鏈�夋嫨"); - return; - } - this.addLoad2 = true; - addStandardMethodList({ - standardId: this.standardId, - tree: this.selectTree, - }).then((res) => { - this.addLoad2 = false; - this.addStandardDia = false; - this.$message.success("娣诲姞鎴愬姛"); - this.selectsStandardMethodByFLSSM(); - }); - }, // 鎻愪氦鍒嗙被娣诲姞 addStandardTree() { if (this.addOb.sampleType == null || this.addOb.sampleType == "") { @@ -1040,81 +1021,13 @@ this.$message.success("宸蹭繚瀛�"); }); }, - delStandardMethodByFLSSM(id) { - this.$confirm("鏄惁鍒犻櫎褰撳墠鏁版嵁?", "璀﹀憡", { - confirmButtonText: "纭畾", - cancelButtonText: "鍙栨秷", - type: "warning", - }) - .then(() => { - this.tableLoad = true; - delStandardMethodByFLSSM({ id: id }).then((res) => { - if (res.code == 201) { - return; - } - this.$message.success("宸插垹闄�"); - this.selectsStandardMethodByFLSSM(); - }); - }) - .catch(() => { }); - }, handleSelectionChange(val) { this.selects = []; val.forEach((a) => { this.selects.push(a.id); }); }, - delStandardProductByIds() { - if (this.selects.length == 0) { - this.$message.error("鏈�変腑鏁版嵁"); - return; - } - this.$confirm( - "鏄惁鍒犻櫎褰撳墠閫変腑 " + this.selects.length + " 鏉℃暟鎹�?", - "璀﹀憡", - { - confirmButtonText: "纭畾", - cancelButtonText: "鍙栨秷", - type: "warning", - } - ) - .then(() => { - this.tableLoad = true; - delStandardProductByIds({ - ids: JSON.stringify(this.selects), - }).then((res) => { - if (res.code == 201) { - return; - } - this.$message.success("宸插垹闄�"); - this.selectsStandardMethodByFLSSM(); - }); - }) - .catch(() => { }); - }, - addStandardProductDo() { - let selects = this.$refs.ValueTable.multipleSelection; - if (selects.length == 0) { - this.$message.error("鏈�夋嫨鏁版嵁"); - return; - } - let select = []; - selects.forEach((a) => { - select.push(a.id); - }); - this.tableLoad = true; - addStandardProduct({ - ids: JSON.stringify(select), - tree: this.selectTree, - }).then((res) => { - if (res.code == 201) { - return; - } - this.$message.success("娣诲姞鎴愬姛"); - this.selectsStandardMethodByFLSSM(); - }); - this.addProductDia = false; - }, + refreshList() { this.batchCopyDia = false; const index = this.standardList.findIndex( -- Gitblit v1.9.3