From cf0fb9a6395d78bd808190a0506d1f003cc6fc31 Mon Sep 17 00:00:00 2001 From: 曹睿 <360930172@qq.com> Date: 星期二, 25 二月 2025 14:24:51 +0800 Subject: [PATCH] Merge branch 'dev' of http://114.132.189.42:9002/r/lims-ruoyi-before into dev --- src/api/cnas/systemManagement/documentControl.js | 13 src/components/Table/lims-table.vue | 6 src/views/CNAS/externalService/supplierManage/component/formDia.vue | 188 +++ src/api/cnas/externalService/supplierManage/supplierManage.js | 52 + src/views/CNAS/systemManagement/documentControl/components/DistributionCollectionRecord.vue | 52 src/views/standard/standardLibrary/index.vue | 35 src/views/CNAS/systemManagement/managementReview/components/reviewReport.vue | 291 +++++ src/views/CNAS/systemManagement/documentRecords/approvalRecord.vue | 2 src/views/CNAS/systemManagement/managementReview/components/meetingRecordsDia.vue | 158 +++ src/views/CNAS/systemManagement/managementReview/components/managementReviewPlan.vue | 339 ++++++ src/views/business/finishedProductSampling/components/addQuarterItem.vue | 296 +++++ src/views/CNAS/resourceDemand/standardMaterial/index.vue | 27 src/api/business/finishedProductSampling.js | 35 src/views/CNAS/systemManagement/managementReview/components/meetingRecords.vue | 221 ++++ src/api/cnas/systemManagement/measuresDealRisks.js | 8 src/api/cnas/systemManagement/internalAuditManagement.js | 24 src/utils/request.js | 3 src/views/CNAS/externalService/supplierManage/index.vue | 189 +++ src/views/CNAS/systemManagement/managementReview/components/reviewReportDia.vue | 259 ++++ src/views/CNAS/systemManagement/managementReview/components/managementFormDIa.vue | 246 ++++ src/views/CNAS/systemManagement/managementReview/index.vue | 48 src/views/business/finishedProductSampling/index.vue | 448 ++++++++ src/views/performance/manHour/workTimeConfig.vue | 4 src/api/cnas/systemManagement/managementReview.js | 159 +++ 24 files changed, 2,999 insertions(+), 104 deletions(-) diff --git a/src/api/business/finishedProductSampling.js b/src/api/business/finishedProductSampling.js new file mode 100644 index 0000000..e2de844 --- /dev/null +++ b/src/api/business/finishedProductSampling.js @@ -0,0 +1,35 @@ +// 鎴愬搧鎶芥牱璇︽儏椤甸潰鐩稿叧鎺ュ彛 +import request from '@/utils/request' + +// 鍘熸潗鏂欐牴鎹甶d鎶ユ +export function getIfsStock(query) { + return request({ + url: '/finishProductSpotCheck/getIfsStock', + method: 'post', + data: query + }) +} +// 瀛e害鎶芥鏌ョ湅璇︽儏 +export function getQuarter(query) { + return request({ + url: '/finishProductSpotCheck/getQuarter', + method: 'get', + params: query + }) +} +// 鎻愪氦瀛e害鎶芥牱 +export function addQuarter(query) { + return request({ + url: '/finishProductSpotCheck/addQuarter', + method: 'post', + data: query + }) +} +// 缂栬緫瀛e害妫�楠� +export function updateQuarterOnOrder(query) { + return request({ + url: '/finishProductSpotCheck/updateQuarterOnOrder', + method: 'post', + data: query + }) +} diff --git a/src/api/cnas/externalService/supplierManage/supplierManage.js b/src/api/cnas/externalService/supplierManage/supplierManage.js new file mode 100644 index 0000000..c28b538 --- /dev/null +++ b/src/api/cnas/externalService/supplierManage/supplierManage.js @@ -0,0 +1,52 @@ +import request from '@/utils/request' + +// 鍒嗛〉鏌ヨ +export function selectQualifiedSupplierManagementPage(query) { + return request({ + url: '/supplierManagement/selectQualifiedSupplierManagementPage', + method: 'get', + params: query + }) +} + +// 缂栬緫渚涘簲鍟� +export function updateSupplierManagement(query) { + return request({ + url: '/supplierManagement/updateSupplierManagement', + method: 'post', + data: query + }) +} + +// 鏂板渚涘簲鍟� +export function addSupplierManagement(query) { + return request({ + url: '/supplierManagement/addSupplierManagement', + method: 'post', + data: query + }) +} + +// 瀵煎嚭渚涘簲鍟� +export function exportSupplierManagement(query) { + return request({ + url: "/supplierManagement/exportSupplierManagement", + method: "get", + responseType: "blob", + params: query, + }); +} + +// 鍒犻櫎渚涘簲鍟� +export function delSupplierManagement(query) { + return request({ + url: '/supplierManagement/delSupplierManagement', + method: 'delete', + params: query + }) +} + + + + + diff --git a/src/api/cnas/systemManagement/documentControl.js b/src/api/cnas/systemManagement/documentControl.js index 2d35c9e..3fc97b7 100644 --- a/src/api/cnas/systemManagement/documentControl.js +++ b/src/api/cnas/systemManagement/documentControl.js @@ -63,9 +63,7 @@ return request({ url: "/manageDocumentControlled/checkManageDocumentControlledPdf", method: "get", - headers: { - responseType: "blob", - }, + responseType: "blob", params: query, }); } @@ -112,6 +110,7 @@ return request({ url: "/manageDocumentIssueRecycle/exportManageDocumentIssueRecycle", method: "get", + responseType: "blob", params: query, }); } @@ -121,7 +120,7 @@ return request({ url: "/manageDocumentIssueRecycle/addManageDocumentIssueRecycle", method: "post", - headers: { "Content-Type": "application/x-www-form-urlencoded" }, + responseType: "blob", data: data, }); } @@ -167,7 +166,7 @@ return request({ url: "/manageDocumentAlter/exportManageDocumentAlter", method: "get", - headers: { responseType: "blob" }, + responseType: "blob", params: query, }); } @@ -197,7 +196,7 @@ return request({ url: "/manageDocumentAlter/checkManageDocumentAlterPdf", method: "get", - headers: { responseType: "blob" }, + responseType: "blob", params: query, }); } @@ -262,7 +261,7 @@ return request({ url: "/manageDocumentCancel/exportManageDocumentCancel", method: "get", - headers: { responseType: "blob" }, + responseType: "blob", params: query, }); } diff --git a/src/api/cnas/systemManagement/internalAuditManagement.js b/src/api/cnas/systemManagement/internalAuditManagement.js index e7ae621..4e22f4f 100644 --- a/src/api/cnas/systemManagement/internalAuditManagement.js +++ b/src/api/cnas/systemManagement/internalAuditManagement.js @@ -24,9 +24,7 @@ return request({ url: "/internalPlan/exportInternalPlan", method: "get", - headers: { - responseType: "blob", - }, + responseType: "blob", params: query, }); } @@ -99,9 +97,7 @@ return request({ url: "/internalImplement/exportInternalImplement", method: "get", - headers: { - responseType: "blob", - }, + responseType: "blob", params: query, }); } @@ -165,9 +161,7 @@ return request({ url: "/internalMeeting/exportInternalMeeting", method: "get", - headers: { - responseType: "blob", - }, + responseType: "blob", params: query, }); } @@ -222,9 +216,7 @@ return request({ url: "/internalCheck/exportInternalCheck", method: "get", - headers: { - responseType: "blob", - }, + responseType: "blob", params: query, }); } @@ -279,9 +271,7 @@ return request({ url: "/internalCorrect/exportInternalCorrect", method: "get", - headers: { - responseType: "blob", - }, + responseType: "blob", params: query, }); } @@ -327,9 +317,7 @@ return request({ url: "/internalReport/exportInternalReport", method: "get", - headers: { - responseType: "blob", - }, + responseType: "blob", params: query, }); } diff --git a/src/api/cnas/systemManagement/managementReview.js b/src/api/cnas/systemManagement/managementReview.js new file mode 100644 index 0000000..5d410d3 --- /dev/null +++ b/src/api/cnas/systemManagement/managementReview.js @@ -0,0 +1,159 @@ +// 绠$悊璇勫鐩稿叧鎺ュ彛 +import request from "@/utils/request"; + +// 绠$悊璁″垝-涓婁紶闄勪欢 +export function addReviewProgramFile(data) { + return request({ + url: "/manageReviewProgramFile/addReviewProgramFile", + method: "post", + headers: { "Content-Type": "application/x-www-form-urlencoded" }, + data: data, + }); +} + +//绠$悊璁″垝-闄勪欢鍒楄〃 +export function selectReviewProgramFile(query) { + return request({ + url: "/manageReviewProgramFile/selectReviewProgramFile", + method: "get", + params: query, + }); +} + +//绠$悊璁″垝-鏌ヨ绠$悊璇勫璁″垝 +export function getPageReviewProgram(query) { + return request({ + url: "/manageReviewProgram/getPageReviewProgram", + method: "get", + params: query, + }); +} + +//绠$悊璁″垝-鍒犻櫎绠$悊璇勫璁″垝 +export function deleteReviewProgram(query) { + return request({ + url: "/manageReviewProgram/deleteReviewProgram", + method: "delete", + params: query, + }); +} + +//绠$悊璁″垝 +export function exportReviewProgram(query) { + return request({ + url: "/manageReviewProgram/exportReviewProgram", + method: "get", + responseType: "blob", + params: query, + }); +} + +// 绠$悊璁″垝-缂栬緫绠$悊璇勫璁″垝 +export function modifyReviewProgram(data) { + return request({ + url: "/manageReviewProgram/modifyReviewProgram", + method: "post", + data: data, + }); +} + +//浼氳璁板綍-鏌ヨ绠$悊璇勫浼氳璁板綍 +export function getPageMeeting(query) { + return request({ + url: "/manageMeeting/getPageMeeting", + method: "get", + params: query, + }); +} + +//浼氳璁板綍-鍒犻櫎绠$悊璇勫浼氳璁板綍 +export function deleteMeeting(query) { + return request({ + url: "/manageMeeting/deleteMeeting", + method: "delete", + params: query, + }); +} + +//浼氳璁板綍-涓嬭浇绠$悊璇勫浼氳璁板綍 +export function exportMeeting(query) { + return request({ + url: "/manageMeeting/exportMeeting", + method: "get", + responseType: "blob", + params: query, + }); +} + +// 绠$悊璁″垝-鏂板绠$悊璇勫浼氳璁板綍 +export function addMeeting(data) { + return request({ + url: "/manageMeeting/addMeeting", + method: "post", + data: data, + }); +} + +// 绠$悊璁″垝-淇敼绠$悊璇勫浼氳璁板綍 +export function modifyMeeting(data) { + return request({ + url: "/manageMeeting/modifyMeeting", + method: "post", + data: data, + }); +} + +//璇勫浼氳鎶ュ憡-鏌ヨ绠$悊璇勫浼氳鎶ュ憡 +export function getPageReviewReport(query) { + return request({ + url: "/manageReviewReport/getPageReviewReport", + method: "get", + params: query, + }); +} + +//璇勫浼氳鎶ュ憡-鍒犻櫎绠$悊璇勫浼氳鎶ュ憡 +export function deleteReviewReport(query) { + return request({ + url: "/manageReviewReport/deleteReviewReport", + method: "delete", + params: query, + }); +} + +//璇勫浼氳鎶ュ憡-涓嬭浇 +export function exportReviewReport(query) { + return request({ + url: "/manageReviewReport/exportReviewReport", + method: "get", + responseType: "blob", + params: query, + }); +} + +// 璇勫浼氳鎶ュ憡-缂栬緫绠$悊璇勫浼氳鎶ュ憡 +export function modifyReviewReport(data) { + return request({ + url: "/manageReviewReport/modifyReviewReport", + method: "post", + data: data, + }); +} + +// 璇勫浼氳鎶ュ憡-鏂板绠$悊璇勫浼氳鎶ュ憡 +export function addReviewReport(data) { + return request({ + url: "/manageReviewReport/addReviewReport", + method: "post", + data: data, + }); +} + +// 璇勫浼氳鎶ュ憡-鏂板绠$悊璇勫璁″垝 +export function addReviewProgram(data) { + return request({ + url: "/manageReviewProgram/addReviewProgram", + method: "post", + data: data, + }); +} diff --git a/src/api/cnas/systemManagement/measuresDealRisks.js b/src/api/cnas/systemManagement/measuresDealRisks.js index 2649410..268b1a0 100644 --- a/src/api/cnas/systemManagement/measuresDealRisks.js +++ b/src/api/cnas/systemManagement/measuresDealRisks.js @@ -51,9 +51,7 @@ return request({ url: "/manageRiskAssessmentResults/exportHazardFactorIdentification", method: "get", - headers: { - responseType: "blob", - }, + responseType: "blob", params: query, }); } @@ -108,9 +106,7 @@ return request({ url: "/manageControlPlanList/exportSignificantRiskFactors", method: "get", - headers: { - responseType: "blob", - }, + responseType: "blob", params: query, }); } diff --git a/src/components/Table/lims-table.vue b/src/components/Table/lims-table.vue index 05e1d85..bd77bc9 100644 --- a/src/components/Table/lims-table.vue +++ b/src/components/Table/lims-table.vue @@ -64,7 +64,8 @@ <!-- 鎸夐挳 --> <div v-else-if="item.dataType == 'action'"> <template v-for="(o, key) in item.operation"> - <el-button v-if="o.type != 'upload'" size="mini" v-show="o.showHide ? o.showHide(scope.row) : true" + <el-button v-show="o.type != 'upload'" size="mini" + v-if="o.showHide ? o.showHide(scope.row) : true" :disabled="o.disabled ? o.disabled(scope.row) : false" :icon="iconFn(o)" :plain="o.plain" :style="{ color: o.name === '鍒犻櫎' ? '#f56c6c' : o.color }" :type="o.type | typeFn(scope.row)" @click="o.clickFun(scope.row)" :key="key"> @@ -79,7 +80,8 @@ :disabled="o.disabled ? o.disabled(scope.row) : false" :accept="o.accept ? o.accept : '.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip,.rar' - " v-if="o.type == 'upload'" style="display: inline-block; width: 50px" + " + v-if="o.type == 'upload'" style="display: inline-block; width: 50px" v-show="o.showHide ? o.showHide(scope.row) : true" :headers="uploadHeader" :on-error="onError" diff --git a/src/utils/request.js b/src/utils/request.js index 1a89ee8..dc2024b 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -36,6 +36,9 @@ url = url.slice(0, -1); config.params = {}; config.url = url; + config.headers["responseType"] = config.headers["responseType"] + ? config.headers["responseType"] + : ""; // 璁╂瘡涓姹傛惡甯﹁嚜瀹氫箟token 璇锋牴鎹疄闄呮儏鍐佃嚜琛屼慨鏀� } if ( !isRepeatSubmit && diff --git a/src/views/CNAS/externalService/supplierManage/component/formDia.vue b/src/views/CNAS/externalService/supplierManage/component/formDia.vue new file mode 100644 index 0000000..410ae63 --- /dev/null +++ b/src/views/CNAS/externalService/supplierManage/component/formDia.vue @@ -0,0 +1,188 @@ +<template> + <div> + <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" + :title="operationType === 'edit' ? '缂栬緫' : '鏂板'" + :visible.sync="formDia" + width="90%" @close="closeDia"> + <el-form :model="model" ref="modelForm" label-width="150px" :rules="rules"> + <el-row> + <el-col :span="12"> + <el-form-item label="渚涘簲鍟�" prop="supplierName"> + <el-input v-model="model.supplierName" placeholder="璇疯緭鍏�" /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="缂栧彿" prop="supplierRef"> + <el-input v-model="model.supplierRef" placeholder="璇疯緭鍏�" /> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="24"> + <el-form-item label="渚涘簲鍟嗙墿鍝佹湇鍔″悕绉�" prop="supplierItemServiceName"> + <el-input v-model="model.supplierItemServiceName" placeholder="璇疯緭鍏�" /> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="閭紪"> + <el-input v-model="model.postalCode" placeholder="璇疯緭鍏�" /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="鍦板潃"> + <el-input v-model="model.adress" placeholder="璇疯緭鍏�" /> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="鑱旂郴浜�"> + <el-input v-model="model.contacts" placeholder="璇疯緭鍏�" /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="鑱旂郴鐢佃瘽"> + <el-input v-model="model.phone" placeholder="璇疯緭鍏�" /> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="鎴峰悕"> + <el-input v-model="model.householdName" placeholder="璇疯緭鍏�" /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="浼犵湡"> + <el-input v-model="model.fax" placeholder="璇疯緭鍏�" /> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="寮�鎴疯"> + <el-input v-model="model.openingName" placeholder="璇疯緭鍏�" /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="缃戝潃"> + <el-input v-model="model.website" placeholder="璇疯緭鍏�" /> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="璐﹀彿"> + <el-input v-model="model.accountName" placeholder="璇疯緭鍏�" /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="Email"> + <el-input v-model="model.email" placeholder="璇疯緭鍏�" /> + </el-form-item> + </el-col> + </el-row> + </el-form> + <span slot="footer"> + <el-button @click="closeDia">鍙� 娑�</el-button> + <el-button type="primary" @click="submit" :loading="editLoad">淇� 瀛�</el-button> + </span> + </el-dialog> + </div> +</template> + +<script> +import { + addSupplierManagement, + updateSupplierManagement +} from '@/api/cnas/externalService/supplierManage/supplierManage' + +export default { + name: "formDia", + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: {}, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + operationType: '', + formDia: false, + model: { + supplierName: '', + supplierRef: '', + supplierItemServiceName: '', + postalCode: '', + adress: '', + contacts: '', + phone: '', + householdName: '', + fax: '', + openingName: '', + website: '', + accountName: '', + email: '', + supplierManagementId: '', + }, + rules: { + supplierName: [{ required: true, message: '璇疯緭鍏ヤ緵搴斿晢', trigger: 'blur' }], + supplierRef: [{ required: true, message: '璇疯緭鍏ヤ緵搴斿晢缂栧彿', trigger: 'blur' }], + + }, + editLoad: false, + } + }, + mounted() { + + }, + // 鏂规硶闆嗗悎 + methods: { + openDialog (type, row) { + this.operationType = type + this.formDia = true + if (this.operationType === 'edit') { + this.model = this.HaveJson(row) + } + }, + // 鎻愪氦琛ㄥ崟 + submit () { + this.$refs.modelForm.validate((valid) => { + if (valid) { + this.editLoad = true + if (this.operationType === 'edit') { + updateSupplierManagement(this.model).then(res => { + this.editLoad = false + if (res.code === 200){ + this.$message.success('淇敼鎴愬姛') + this.closeDia() + } + }).catch(err => { + console.log('err---', err); + this.editLoad = false + }) + } else { + addSupplierManagement(this.model).then(res => { + this.editLoad = false + if (res.code === 200){ + this.$message.success('鏂板鎴愬姛') + this.closeDia() + } + }).catch(err => { + console.log('err---', err); + this.editLoad = false + }) + } + } + }) + }, + closeDia () { + this.$refs.modelForm.resetFields() + this.formDia = false + this.$emit('closeDia') + } + }, +} +</script> + +<style scoped> +</style> diff --git a/src/views/CNAS/externalService/supplierManage/index.vue b/src/views/CNAS/externalService/supplierManage/index.vue new file mode 100644 index 0000000..5480937 --- /dev/null +++ b/src/views/CNAS/externalService/supplierManage/index.vue @@ -0,0 +1,189 @@ +<template> + <div class="capacity-scope"> + <div class="search"> + <div> + <el-form :model="searchForm" ref="searchForm" size="small" :inline="true"> + <el-form-item label="鍚嶇О" prop="supplierName"> + <el-input v-model="searchForm.supplierName" clearable size="small"></el-input> + </el-form-item> + <el-form-item> + <el-button type="primary" icon="el-icon-search" size="mini" @click="getTableData">鏌� 璇�</el-button> + <el-button icon="el-icon-refresh" size="mini" @click="resetSearchForm">閲� 缃�</el-button> + </el-form-item> + </el-form> + </div> + <div> + <el-button size="medium" @click="exportExcel">瀵� 鍑�</el-button> + <el-button size="medium" type="primary" @click="showDialog('add')">鏂� 澧�</el-button> + </div> + </div> + <div class="table"> + <lims-table :tableData="tableData" :column="tableColumn" :height="'calc(100vh - 250px)'" @pagination="pagination" + :page="page" :tableLoading="tableLoading"></lims-table> + </div> + <form-dia ref="formDia" v-if="formDia" @closeDia="closeDia"></form-dia> + </div> +</template> + +<script> +// import ZTTable from "../caorui/ZTTable/index.vue"; +// import TableCard from "../caorui/TableCard/index.vue"; +// import axios from "axios"; +import FormDia from "../supplierManage/component/formDia.vue"; +import limsTable from '@/components/Table/lims-table.vue' +import { + selectQualifiedSupplierManagementPage, + exportSupplierManagement, + delSupplierManagement +} from '@/api/cnas/externalService/supplierManage/supplierManage' + +export default { + name: "a6-supplier-manage-new", + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: { + limsTable, + FormDia + }, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + searchForm: { + supplierName: '' + }, + tableLoading: false, + tableColumn: [ + { + label: "渚涘簲鍟嗙紪鍙�", + prop: "supplierRef" + }, + { + label: "渚涘簲鍟�", + prop: "supplierName" + }, + { + label: "渚涘簲鐗╁搧(鏈嶅姟)鍚嶇О", + prop: "supplierItemServiceName" + }, + { + label: "鍦板潃", + prop: "adress" + }, + { + label: "鑱旂郴鐢佃瘽", + prop: "phone" + }, + { + dataType: 'action', + fixed: "right", + minWidth: '60', + label: '鎿嶄綔', + operation: [ + { + name: '缂栬緫', + type: 'text', + clickFun: (row) => { + this.showDialog('edit', row); + }, + }, + { + name: '鍒犻櫎', + type: 'text', + color: '#f56c6c', + clickFun: (row) => { + this.deleteRow(row); + }, + } + + ] + } + ], + tableData: [], + page: { + total: 0, + size: 10, + current: 1 + }, + formDia: false, + } + }, + mounted() { + this.getTableData() + }, + // 鏂规硶闆嗗悎 + methods: { + // 鑾峰彇琛ㄦ牸鏁版嵁 + async getTableData() { + this.tableLoading = true; + selectQualifiedSupplierManagementPage(this.searchForm).then(res => { + this.tableLoading = false; + if(res.code === 200) { + this.tableData = res.data.records; + this.page.total = res.data.total + } + }).catch(err => { + this.tableLoading = false + }) + }, + // 閲嶇疆 + resetSearchForm () { + this.pagination.current = 1 + this.pagination.pageSize = 20 + this.searchForm.supplierName = '' + this.getTableData() + }, + // 鍒嗛〉鍒囨崲 + pagination(page) { + this.page.size = page.limit + this.getTableData(); + }, + // 鎵撳紑鏂板寮规 + showDialog(type, row) { + this.formDia = true + this.$nextTick(() => { + this.$refs.formDia.openDialog(type, row) + }) + }, + // 鍏抽棴寮规 + closeDia () { + this.formDia = false + this.getTableData() + }, + // 鍒犻櫎璁板綍 + deleteRow (row) { + this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ枃浠�, 鏄惁缁х画?', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + delSupplierManagement({supplierManagementId:row.supplierManagementId}).then(res => { + if (res.code === 200) { + this.$message.success('鍒犻櫎鎴愬姛锛�') + this.getTableData() + } + }) + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堝垹闄�' + }); + }); + }, + // 瀵煎嚭excel + async exportExcel() { + exportSupplierManagement({deviceId:this.clickNodeVal.value}).then(res => { + const blob = new Blob([res], { type: 'application/octet-stream' }); + this.$download.saveAs(blob, '鍚堟牸渚涘簲鍟�.xlsx') + this.$message.success('瀵煎嚭鎴愬姛') + }) + } + }, +} +</script> + +<style scoped> +.search { + height: 46px; + display: flex; + justify-content: space-between; +} +</style> diff --git a/src/views/CNAS/resourceDemand/standardMaterial/index.vue b/src/views/CNAS/resourceDemand/standardMaterial/index.vue index 6483368..e75f44f 100644 --- a/src/views/CNAS/resourceDemand/standardMaterial/index.vue +++ b/src/views/CNAS/resourceDemand/standardMaterial/index.vue @@ -191,31 +191,8 @@ exportOfStandardSubstanceList(this.searchForm).then(res =>{ this.outLoading = false const blob = new Blob([res], {type: 'application/octet-stream'},false); - let reader = new FileReader(); - reader.readAsText(blob, 'utf-8'); - reader.onload = () => { - try { - let result = JSON.parse(reader.result); - if (result.message) { - this.$message.error(result.message); - } else { - const url = URL.createObjectURL(blob); - const link = document.createElement('a'); - link.href = url; - link.download = '鏍囧噯鐗╄川娓呭崟.xlsx'; - link.click(); - this.$message.success('瀵煎嚭鎴愬姛') - } - } catch (err) { - console.log(err); - const url = URL.createObjectURL(blob); - const link = document.createElement('a'); - link.href = url; - link.download = '鏍囧噯鐗╄川娓呭崟.xlsx'; - link.click(); - this.$message.success('瀵煎嚭鎴愬姛') - } - } + this.$download.saveAs(blob, '鏍囧噯鐗╄川娓呭崟.xlsx') + this.$message.success('瀵煎嚭鎴愬姛') }) }, // 鏌ヨ鍒楄〃 diff --git a/src/views/CNAS/systemManagement/documentControl/components/DistributionCollectionRecord.vue b/src/views/CNAS/systemManagement/documentControl/components/DistributionCollectionRecord.vue index 1aba02d..0548ea4 100644 --- a/src/views/CNAS/systemManagement/documentControl/components/DistributionCollectionRecord.vue +++ b/src/views/CNAS/systemManagement/documentControl/components/DistributionCollectionRecord.vue @@ -394,33 +394,33 @@ exportManageDocumentIssueRecycle(this.queryParams).then(res => { this.outLoading = false const blob = new Blob([res], { type: 'application/octet-stream' }); - this.$download.saveAs(blob, '鍙戞斁鍥炴敹璁板綍.xlsx') + // this.$download.saveAs(blob, '鍙戞斁鍥炴敹璁板綍.xlsx') //灏咮lob 瀵硅薄杞崲鎴愬瓧绗︿覆 - // let reader = new FileReader(); - // reader.readAsText(blob, 'utf-8'); - // reader.onload = () => { - // try { - // let result = JSON.parse(reader.result); - // if (result.message) { - // this.$message.error(result.message); - // } else { - // const url = URL.createObjectURL(blob); - // const link = document.createElement('a'); - // link.href = url; - // link.download = '鍙戞斁鍥炴敹璁板綍.xlsx'; - // link.click(); - // this.$message.success('瀵煎嚭鎴愬姛') - // } - // } catch (err) { - // console.log(err); - // const url = URL.createObjectURL(blob); - // const link = document.createElement('a'); - // link.href = url; - // link.download = '鍙戞斁鍥炴敹璁板綍.xlsx'; - // link.click(); - // this.$message.success('瀵煎嚭鎴愬姛') - // } - // } + let reader = new FileReader(); + reader.readAsText(blob, 'utf-8'); + reader.onload = () => { + try { + let result = JSON.parse(reader.result); + if (result.message) { + this.$message.error(result.message); + } else { + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = '鍙戞斁鍥炴敹璁板綍.xlsx'; + link.click(); + this.$message.success('瀵煎嚭鎴愬姛') + } + } catch (err) { + console.log(err); + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = '鍙戞斁鍥炴敹璁板綍.xlsx'; + link.click(); + this.$message.success('瀵煎嚭鎴愬姛') + } + } }) }, changeFileList(e) { diff --git a/src/views/CNAS/systemManagement/documentRecords/approvalRecord.vue b/src/views/CNAS/systemManagement/documentRecords/approvalRecord.vue index 7e956bd..8431ad9 100644 --- a/src/views/CNAS/systemManagement/documentRecords/approvalRecord.vue +++ b/src/views/CNAS/systemManagement/documentRecords/approvalRecord.vue @@ -285,7 +285,7 @@ this.outLoading = false if (res.code == 201) return this.$message.error('瀵煎嚭澶辫触') this.$message.success('瀵煎嚭鎴愬姛') - let url = this.javaApi + 'word/' + res.message + let url = this.javaApi + '/word/' + res.message this.$download.saveAs(url, '鏂囦欢瀹℃壒璁板綍') }) }, diff --git a/src/views/CNAS/systemManagement/managementReview/components/managementFormDIa.vue b/src/views/CNAS/systemManagement/managementReview/components/managementFormDIa.vue new file mode 100644 index 0000000..5f1d57a --- /dev/null +++ b/src/views/CNAS/systemManagement/managementReview/components/managementFormDIa.vue @@ -0,0 +1,246 @@ +<template> + <div> + <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false" + :visible.sync="formDia" title="绠$悊璇勫璁″垝" width="80%" @close="closeImplementDia"> + <el-form ref="form" :model="form" :rules="rules" label-position="right" label-width="auto"> + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item label="璇勫鏃堕棿" prop="reviewTime"> + <el-date-picker v-model="form.reviewTime" :disabled="operationType === 'ratify'" clearable + format="yyyy-MM-dd HH:mm:ss" placeholder="閫夋嫨鏃ユ湡" size="small" style="width: 100%" type="datetime" + value-format="yyyy-MM-dd HH:mm:ss"> + </el-date-picker> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="璇勫鍦扮偣" prop="judgingLocation"> + <el-input v-model="form.judgingLocation" :disabled="operationType === 'ratify'" clearable + size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="璇勫鐩殑" prop="judgingPurpose"> + <el-input v-model="form.judgingPurpose" :disabled="operationType === 'ratify'" clearable + size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="璇勫鏂瑰紡" prop="judgingMethod"> + <el-input v-model="form.judgingMethod" :disabled="operationType === 'ratify'" clearable + size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="鍙傚姞浜哄憳" prop="participants"> + <!-- <el-input v-model="form.participants" :disabled="operationType === 'ratify'" clearable size="small"></el-input> --> + <el-select v-model="form.participants" size="small" style="width: 100%;" filterable + :disabled="operationType === 'ratify'" clearable multiple> + <el-option v-for="item in personList" :key="item.value" :label="item.label" :value="item.value"> + </el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="璇勫鑼冨洿" prop="judgingScope"> + <el-input v-model="form.judgingScope" :disabled="operationType === 'ratify'" clearable + size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="璇勫渚濇嵁" prop="judgingBasis"> + <el-input v-model="form.judgingBasis" :disabled="operationType === 'ratify'" :rows="3" clearable + size="small" type="textarea"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="璇勫涓昏鍐呭" prop="mainContext"> + <el-input v-model="form.mainContext" :disabled="operationType === 'ratify'" :rows="3" clearable + size="small" type="textarea"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="鍑嗗宸ヤ綔瑕佹眰" prop="preparationRequirements"> + <el-input v-model="form.preparationRequirements" :disabled="operationType === 'ratify'" :rows="3" + clearable size="small" type="textarea"></el-input> + </el-form-item> + </el-col> + </el-row> + </el-form> + <span slot="footer" class="dialog-footer"> + <el-button @click="closeImplementDia">鍙� 娑�</el-button> + <el-button v-if="operationType === 'ratify'" :loading="loading" type="primary" @click="handleApproval(1)">鎵� + 鍑�</el-button> + <el-button v-if="operationType !== 'ratify'" :loading="loading" type="primary" @click="handleEdit">鎻� + 浜�</el-button> + </span> + </el-dialog> + <el-dialog :visible.sync="approvalDialog" title="鎵瑰噯" width="30%" @close="approvalDialog = false"> + <span> + 鎵瑰噯澶囨敞锛� + <el-input v-model="qualityRemark" type="textarea"></el-input> + </span> + <span slot="footer" class="dialog-footer"> + <el-button :loading="approvalLoading" @click="approvalDialog = false">鍙� 娑�</el-button> + <el-button :loading="approvalLoading" type="primary" @click="handleApproval(0)">纭� 瀹�</el-button> + </span> + </el-dialog> + </div> +</template> + +<script> +import { + addReviewProgram, + modifyReviewProgram, +} from '@/api/cnas/systemManagement/managementReview.js' +import { dateFormat } from '@/utils/date' +import { + selectUserCondition, +} from "@/api/business/inspectionTask.js"; +import { mapGetters } from "vuex"; +export default { + name: 'managementFormDIa', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: {}, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + formDia: false, + diaLoading: false, + loading: false, + form: { + id: '', + reviewTime: '', + judgingLocation: '', + judgingPurpose: '', + judgingMethod: '', + participants: [], + judgingScope: '', + judgingBasis: '', + mainContext: '', + preparationRequirements: '', + }, + rules: { + reviewTime: [{ required: true, message: '璇烽�夋嫨璇勫鏃堕棿', trigger: 'blur' }], + judgingLocation: [{ required: true, message: '璇峰~鍐欒瘎瀹″湴鐐�', trigger: 'blur' }], + judgingPurpose: [{ required: true, message: '璇峰~鍐欒瘎瀹$洰鐨�', trigger: 'blur' }], + judgingMethod: [{ required: true, message: '璇峰~鍐欒瘎瀹℃柟寮�', trigger: 'blur' }], + participants: [{ required: true, message: '璇峰~鍐欏弬鍔犱汉鍛�', trigger: 'change' }], + judgingScope: [{ required: true, message: '璇峰~鍐欒瘎瀹¤寖鍥�', trigger: 'blur' }], + judgingBasis: [{ required: true, message: '璇峰~鍐欒瘎瀹′緷鎹�', trigger: 'blur' }], + mainContext: [{ required: true, message: '璇峰~鍐欒瘎瀹′富瑕佸唴瀹�', trigger: 'blur' }], + preparationRequirements: [{ required: true, message: '璇峰~鍐欏噯澶囧伐浣滆姹�', trigger: 'blur' }], + }, + operationType: '', + approvalDialog: false, + approvalLoading: false, + qualityRemark: '', + personList: [], + }; + }, + computed: { + ...mapGetters(['nickName']) + }, + mounted() { + this.getAuthorizedPerson() + }, + // 鏂规硶闆嗗悎 + methods: { + // 鎵撳紑寮规 + openDia(type, row) { + this.formDia = true + this.operationType = type + if (type !== 'add') { + this.form = row + this.form.participants = row.participants ? row.participants.split(',').map(m => Number(m)) : [] + } + }, + // 鏌ヨ璇︽儏 + // searchInfo (row) { + // this.diaLoading = true + // this.$axios(this.$api.internalReport.getInternalReportOne + '?reportId=' + row.reportId).then(res => { + // this.diaLoading = false + // if (res.code === 201) return + // this.form = res.data + // }).catch(err => { + // console.log(err) + // this.diaLoading = false + // }) + // }, + // 鎻愪氦寮规鏁版嵁 + handleEdit() { + this.$refs['form'].validate((valid) => { + if (valid) { + this.loading = true + const internalReport = this.HaveJson(this.form) + internalReport.participants = internalReport.participants.join(',') + if (this.operationType === 'add') { + addReviewProgram(internalReport).then(res => { + this.loading = false + if (res.code === 201) return + this.$message.success('鎿嶄綔鎴愬姛') + this.closeImplementDia() + }).catch(err => { + console.log('err---', err); + this.loading = false + }) + } else if (this.operationType === 'edit') { + modifyReviewProgram(internalReport).then(res => { + this.loading = false + if (res.code === 201) return + this.$message.success('鎿嶄綔鎴愬姛') + this.closeImplementDia() + }).catch(err => { + console.log('err---', err); + this.loading = false + }) + } + } else { + console.log('error submit!!'); + return false; + } + }); + }, + // 鎻愪氦鎵瑰噯淇℃伅 + handleApproval(qualityStatus) { + this.approvalLoading = true + const internalReport = this.HaveJson(this.form) + internalReport.approve = this.nickName + internalReport.approveDate = dateFormat(new Date()) + internalReport.participants = internalReport.participants.join(',') + modifyReviewProgram(internalReport).then(res => { + if (res.code === 200) { + this.$message.success('鎻愪氦鎴愬姛锛�'); + this.approvalDialog = false + this.closeImplementDia(this.departId); + } + this.approvalLoading = false + }).catch(() => { + this.approvalLoading = false + }) + }, + closeImplementDia() { + this.$refs.form.resetFields(); + this.formDia = false + this.$emit('closeImplementDia') + }, + getAuthorizedPerson() { + selectUserCondition().then(res => { + let data = [] + res.data.forEach(a => { + data.push({ + label: a.name, + value: a.id + }) + }) + this.personList = data + }) + }, + } +}; +</script> + +<style scoped> +>>>.el-dialog { + margin: 6vh auto 50px !important; +} +</style> diff --git a/src/views/CNAS/systemManagement/managementReview/components/managementReviewPlan.vue b/src/views/CNAS/systemManagement/managementReview/components/managementReviewPlan.vue new file mode 100644 index 0000000..db15a30 --- /dev/null +++ b/src/views/CNAS/systemManagement/managementReview/components/managementReviewPlan.vue @@ -0,0 +1,339 @@ +<template> + <div> + <div class="search-background"> + <span class="search-group"> + <span style="width: 160px">璇勫鍦扮偣锛�</span> + <el-input v-model="searchForm.judgingLocation" clearable size="small"></el-input> + <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">閲� 缃�</el-button> + <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button> + </span> + <span class="search-group"> + <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button> + </span> + </div> + <div class="table"> + <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData" + :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" :page="page" @pagination="pagination"> + </limsTable> + </div> + <management-form-d-ia v-if="managementFormDIa" ref="managementFormDIa" + @closeImplementDia="closeImplementDia"></management-form-d-ia> + <el-dialog :visible.sync="listDialogVisible" title="鏂囦欢鏌ョ湅" top="15vh" width="400px"> + <div style="max-height:60vh;overflow-y: auto;"> + <p v-for="(item, index) in fileList" :key="index"> + <span>{{ item.fileName }}</span> + <el-button icon="el-icon-view" size="small" style="margin-left: 20px;" type="text" + @click="lookFile(item.url, item.fileName)">棰勮</el-button> + <el-button icon="el-icon-bottom" size="small" style="margin-left: 20px;" type="text" + @click="handleDown0(item.url, item.fileName)">涓嬭浇</el-button> + </p> + </div> + </el-dialog> + <el-dialog :visible.sync="lookDialogVisible" fullscreen title="鏌ョ湅闄勪欢" top="5vh" width="800px"> + <filePreview v-if="lookDialogVisible" :currentFile="{}" :fileUrl="javaApi + '/word/' + currentInfo.url" + style="height: 90vh;overflow-y: auto;" /> + </el-dialog> + </div> +</template> + +<script> +import limsTable from "@/components/Table/lims-table.vue"; +import ManagementFormDIa from './managementFormDIa.vue'; +import filePreview from "@/components/Preview/filePreview.vue"; +import { + addReviewProgramFile, + selectReviewProgramFile, + getPageReviewProgram, + deleteReviewProgram, + exportReviewProgram, +} from '@/api/cnas/systemManagement/managementReview.js' + +export default { + name: 'managementReviewPlan', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: { ManagementFormDIa, limsTable, filePreview }, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + searchForm: { + judgingLocation: '', + }, + listDialogVisible: false, + lookDialogVisible: false, + fileList: [], + currentInfo: {}, + tableColumn: [ + { + label: '璇勫鏃堕棿', + prop: 'reviewTime', + }, + { + label: '璇勫鍦扮偣', + prop: 'judgingLocation', + }, + { + label: '璇勫鐩殑', + prop: 'judgingPurpose', + }, + { + label: '璇勫鏂瑰紡', + prop: 'judgingMethod', + }, + { + label: '璇勫鑼冨洿', + prop: 'judgingScope', + }, + // { + // dataType: 'tag', + // label: '鎵瑰噯鐘舵��', + // prop: 'approve', + // minWidth: '100', + // formatData: (params) => { + // if (params === 0) { + // return '涓嶉�氳繃'; + // } else if (params === 1) { + // return '閫氳繃'; + // } else { + // return null; + // } + // }, + // formatType: (params) => { + // if (params === 0) { + // return 'danger'; + // } else if (params === 1) { + // return 'success'; + // } else { + // return null; + // } + // } + // }, + { + dataType: 'action', + minWidth: '110', + label: '鎿嶄綔', + operation: [ + { + name: '缂栬緫', + type: 'text', + clickFun: (row) => { + this.openFormDia('edit', row); + }, + disabled: (row) => { + return !!row.approve + }, + }, + { + name: '涓婁紶', + type: 'upload', + multiple: true, + limit: 20, + accept: '.doc,.docx,.xls,.xlsx,.jpg,.jpeg,.png,.pdf', + clickFun: async (row, file, fileList) => { + const formData = new FormData(); + formData.append('file', file.raw); // 鏂囦欢瀛楁 + formData.append('id', row.id); // 鏂囦欢鍚嶅瓧娈� + let res = await addReviewProgramFile(formData) + if (res.code == 200) { + this.$message({ message: '涓婁紶鎴愬姛', type: 'success' }); + // this.searchList() + return + } else { + this.$message({ message: '涓婁紶澶辫触', type: 'error' }); + return + } + }, + disabled: (row) => { + return !!row.approve + }, + }, + { + name: '鏌ョ湅闄勪欢', + type: 'text', + clickFun: (row) => { + selectReviewProgramFile({ id: row.id }).then(res => { + this.listDialogVisible = true; + this.fileList = res.data.fileList + }); + }, + }, + { + name: '鎵瑰噯', + type: 'text', + clickFun: (row) => { + this.openFormDia('ratify', row); + }, + disabled: (row) => { + return !!row.approve + }, + }, + { + name: '鍒犻櫎', + type: 'text', + color: '#f56c6c', + clickFun: (row) => { + this.delPlan(row) + }, + disabled: (row) => { + if (row.qualityStatus === 1) { + return true + } else { + return false + } + }, + }, + { + name: '涓嬭浇', + type: 'text', + clickFun: (row) => { + this.handleDown(row) + } + }, + ] + } + ], + tableData: [], + tableLoading: false, + page: { + size: 20, + current: 1, + total: 0, + }, + managementFormDIa: false, + }; + }, + mounted() { + this.searchList() + }, + // 鏂规硶闆嗗悎 + methods: { + // 鏌ヨ鍒楄〃 + searchList() { + this.tableLoading = true + getPageReviewProgram({ + judgingLocation: this.searchForm.judgingLocation, + pages: this.page.current, + size: this.page.size + }).then(res => { + this.tableLoading = false + if (res.code === 201) return + this.tableData = res.data.records + this.page.total = res.data.total + }).catch(err => { + console.log('err---', err); + this.tableLoading = false + }) + }, + // 鏂板锛岀紪杈戯紝鎵瑰噯寮规 + openFormDia(type, row) { + this.managementFormDIa = true + this.$nextTick(() => { + this.$refs.managementFormDIa.openDia(type, row) + }) + }, + closeImplementDia() { + this.managementFormDIa = false + this.searchList() + }, + // 閲嶇疆鏌ヨ鏉′欢 + resetSearchForm() { + this.searchForm.judgingLocation = ''; + this.searchList() + }, + // 鍒犻櫎 + delPlan(row) { + this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + this.tableLoading = true + deleteReviewProgram({ id: row.id }).then(res => { + this.tableLoading = false + if (res.code === 201) return + this.$message.success('鍒犻櫎鎴愬姛') + this.searchList() + }).catch(err => { + this.tableLoading = false + console.log('err---', err); + }) + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堝垹闄�' + }); + }); + }, + // 鍒嗛〉 + pagination({ page, limit }) { + this.page.current = page; + this.page.size = limit; + this.searchList(); + }, + handleDown(row) { + exportReviewProgram({ id: row.id }).then(res => { + if (res.code == 201) { + this.$message.error(res.message) + return + } + const blob = new Blob([res], { type: 'application/octet-stream' }); + //灏咮lob 瀵硅薄杞崲鎴愬瓧绗︿覆 + let reader = new FileReader(); + reader.readAsText(blob, 'utf-8'); + reader.onload = () => { + try { + let result = JSON.parse(reader.result); + if (result.message) { + this.$message.error(result.message); + } else { + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = '璇勫璁″垝.docx'; + link.click(); + this.$download.saveAs(blob, name) + this.$message.success('瀵煎嚭鎴愬姛') + } + } catch (err) { + console.log(err); + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = '璇勫璁″垝.docx'; + link.click(); + this.$message.success('瀵煎嚭鎴愬姛') + } + } + }) + }, + lookFile(url, name) { + this.currentInfo.url = url + this.currentInfo.name = name + this.lookDialogVisible = true + }, + handleDown0(url, name) { + if (!url) return this.$message.warning('鏂囦欢鏈笂浼�') + let url0 = this.javaApi + '/word/' + url + const link = document.createElement('a'); + link.href = url0; + link.target = '_blank'; + link.click(); + } + } +}; +</script> + +<style scoped> +.search-background { + width: 100%; + height: 60px; + line-height: 60px; + display: flex; + justify-content: space-between; +} + +.search-group { + display: flex; + align-items: center; + margin: 0 20px; +} +</style> diff --git a/src/views/CNAS/systemManagement/managementReview/components/meetingRecords.vue b/src/views/CNAS/systemManagement/managementReview/components/meetingRecords.vue new file mode 100644 index 0000000..819fa92 --- /dev/null +++ b/src/views/CNAS/systemManagement/managementReview/components/meetingRecords.vue @@ -0,0 +1,221 @@ +<template> + <div> + <div class="search-background"> + <span class="search-group"> + <span style="width: 160px">浼氳鍦扮偣锛�</span> + <el-input v-model="searchForm.place" clearable size="small"></el-input> + <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">閲� 缃�</el-button> + <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button> + </span> + <span class="search-group"> + <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button> + </span> + </div> + <div class="table"> + <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData" + :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" :page="page" @pagination="pagination"> + </limsTable> + </div> + <meeting-records-dia v-if="meetingRecordsDia" ref="meetingRecordsDia" + @closeYearDia="closeYearDia"></meeting-records-dia> + </div> +</template> + +<script> +import limsTable from "@/components/Table/lims-table.vue"; +import MeetingRecordsDia from './meetingRecordsDia.vue'; +import ManagementFormDIa from './managementFormDIa.vue'; +import { + getPageMeeting, + deleteMeeting, + exportMeeting, +} from '@/api/cnas/systemManagement/managementReview.js' + +export default { + name: 'meetingRecords', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: { ManagementFormDIa, MeetingRecordsDia, limsTable }, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + searchForm: { + place: '', + }, + tableColumn: [ + { + label: '鏃堕棿', + prop: 'meetingTime', + minWidth: '100' + }, + { + label: '涓绘寔浜�', + prop: 'compere', + minWidth: '100' + }, + { + label: '浼氳鍦扮偣', + prop: 'place', + minWidth: '100' + }, + { + label: '浼氳鍐呭鎽樿', + prop: 'content', + minWidth: '100' + }, + { + dataType: 'action', + minWidth: '120', + label: '鎿嶄綔', + operation: [ + { + name: '缂栬緫', + type: 'text', + clickFun: (row) => { + this.openFormDia('edit', row); + }, + }, + { + name: '鍒犻櫎', + type: 'text', + color: '#f56c6c', + clickFun: (row) => { + this.delPlan(row) + } + }, + { + name: '涓嬭浇', + type: 'text', + clickFun: (row) => { + this.handleDown(row) + } + }, + ] + } + ], + tableData: [], + tableLoading: false, + page: { + size: 20, + current: 1, + total: 0, + }, + meetingRecordsDia: false + }; + }, + mounted() { + this.searchList() + }, + // 鏂规硶闆嗗悎 + methods: { + // 鏌ヨ鍒楄〃 + searchList() { + this.tableLoading = true + getPageMeeting({ place: this.searchForm.place, pages: this.page.current, size: this.page.size }).then(res => { + this.tableLoading = false + if (res.code === 201) return + this.tableData = res.data.records + this.page.total = res.data.total + }).catch(err => { + console.log('err---', err); + this.tableLoading = false + }) + }, + // 鏂板锛岀紪杈戝脊妗� + openFormDia(type, row) { + this.meetingRecordsDia = true + this.$nextTick(() => { + this.$refs.meetingRecordsDia.openDia(type, row) + }) + }, + closeYearDia() { + this.meetingRecordsDia = false + this.searchList() + }, + // 閲嶇疆鏌ヨ鏉′欢 + resetSearchForm() { + this.searchForm.place = ''; + this.searchList() + }, + // 鍒犻櫎 + delPlan(row) { + this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + this.tableLoading = true + deleteMeeting({ id: row.id }).then(res => { + this.tableLoading = false + if (res.code === 201) return + this.$message.success('鍒犻櫎鎴愬姛') + this.searchList() + }).catch(err => { + this.tableLoading = false + console.log('err---', err); + }) + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堝垹闄�' + }); + }); + }, + pagination({ page, limit }) { + this.page.current = page; + this.page.size = limit; + this.searchList(); + }, + handleDown(row) { + exportMeeting({ id: row.id }).then(res => { + if (res.code == 201) { + this.$message.error(res.message) + return + } + const blob = new Blob([res], { type: 'application/octet-stream' }); + //灏咮lob 瀵硅薄杞崲鎴愬瓧绗︿覆 + let reader = new FileReader(); + reader.readAsText(blob, 'utf-8'); + reader.onload = () => { + try { + let result = JSON.parse(reader.result); + if (result.message) { + this.$message.error(result.message); + } else { + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = '浼氳璁板綍.docx'; + link.click(); + this.$message.success('瀵煎嚭鎴愬姛') + } + } catch (err) { + console.log(err); + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = '浼氳璁板綍.docx'; + link.click(); + this.$message.success('瀵煎嚭鎴愬姛') + } + } + }) + }, + } +}; +</script> + +<style scoped> +.search-background { + width: 100%; + height: 60px; + line-height: 60px; + display: flex; + justify-content: space-between; +} + +.search-group { + display: flex; + align-items: center; + margin: 0 20px; +} +</style> diff --git a/src/views/CNAS/systemManagement/managementReview/components/meetingRecordsDia.vue b/src/views/CNAS/systemManagement/managementReview/components/meetingRecordsDia.vue new file mode 100644 index 0000000..835e5e4 --- /dev/null +++ b/src/views/CNAS/systemManagement/managementReview/components/meetingRecordsDia.vue @@ -0,0 +1,158 @@ +<template> + <div> + <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false" + :visible.sync="formDia" title="绠$悊璇勫浼氳璁板綍" width="1000px" @close="closeYearDia"> + <el-form ref="form" :model="form" :rules="rules" label-position="top" label-width="auto"> + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item label="鏃堕棿" prop="meetingTime"> + <el-date-picker v-model="form.meetingTime" clearable format="yyyy-MM-dd HH:mm:ss" placeholder="閫夋嫨鏃ユ湡" + size="small" style="width: 100%" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"> + </el-date-picker> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="鍦扮偣" prop="place"> + <el-input v-model="form.place" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="涓绘寔浜�" prop="compere"> + <el-input v-model="form.compere" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="浼氳鍐呭鎽樿" prop="content"> + <el-input v-model="form.content" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="鍙備細浜哄憳" prop="participant"> + <el-select v-model="form.participant" clearable filterable multiple placeholder="璇烽�夋嫨" size="small" + style="width: 100%;"> + <el-option v-for="(item, i) in personList" :key="i" :label="item.label" :value="item.value"> + </el-option> + </el-select> + </el-form-item> + </el-col> + </el-row> + </el-form> + <span slot="footer" class="dialog-footer"> + <el-button @click="closeYearDia">鍙� 娑�</el-button> + <el-button :loading="loading" type="primary" @click="handleEdit">鎻� 浜�</el-button> + </span> + </el-dialog> + </div> +</template> + +<script> +import { + addMeeting, + modifyMeeting, +} from '@/api/cnas/systemManagement/managementReview.js' +import { + selectUserCondition, +} from "@/api/business/inspectionTask.js"; +export default { + name: 'meetingRecordsDia', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: {}, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + formDia: false, + diaLoading: false, + loading: false, + form: { + id: '', + meetingTime: '', + compere: '', + place: '', + content: '', + participant: [], + }, + rules: { + meetingTime: [{ required: true, message: '璇峰~鍐欎細璁椂闂�', trigger: 'blur' }], + compere: [{ required: true, message: '璇峰~鍐欎富鎸佷汉', trigger: 'blur' }], + place: [{ required: true, message: '璇峰~鍐欏湴鐐�', trigger: 'blur' }], + content: [{ required: true, message: '璇峰~鍐欎細璁唴瀹规憳瑕�', trigger: 'blur' }], + participant: [{ required: true, message: '璇烽�夋嫨鍙傚姞浜哄憳', trigger: 'change' }], + }, + operationType: '', + personList: [] + }; + }, + mounted() { + + }, + // 鏂规硶闆嗗悎 + methods: { + // 鎵撳紑寮规 + openDia(type, row) { + this.operationType = type + this.getAuthorizedPerson() + if (type !== 'add') { + this.form = row + this.form.participant = row.participant.split(',').map(a => { + a = Number(a) + return a + }) + } + this.formDia = true + }, + // 鎻愪氦寮规鏁版嵁 + handleEdit() { + this.$refs['form'].validate((valid) => { + if (valid) { + this.loading = true + const internalMeeting = this.HaveJson(this.form) + internalMeeting.participant = internalMeeting.participant.join(',') + if (this.operationType === 'add') { + addMeeting(internalMeeting).then(res => { + this.loading = false + if (res.code === 201) return + this.$message.success('鎿嶄綔鎴愬姛') + this.closeYearDia() + }).catch(err => { + console.log('err---', err); + this.loading = false + }) + } else if (this.operationType === 'edit') { + modifyMeeting(internalMeeting).then(res => { + this.loading = false + if (res.code === 201) return + this.$message.success('鎿嶄綔鎴愬姛') + this.closeYearDia() + }).catch(err => { + console.log('err---', err); + this.loading = false + }) + } + } else { + console.log('error submit!!'); + return false; + } + }); + }, + closeYearDia() { + this.$refs.form.resetFields(); + this.formDia = false + this.$emit('closeYearDia') + }, + getAuthorizedPerson() { + selectUserCondition().then(res => { + let data = [] + res.data.forEach(a => { + data.push({ + label: a.name, + value: a.id + }) + }) + this.personList = data + }) + }, + } +}; +</script> + +<style scoped></style> diff --git a/src/views/CNAS/systemManagement/managementReview/components/reviewReport.vue b/src/views/CNAS/systemManagement/managementReview/components/reviewReport.vue new file mode 100644 index 0000000..72a90bc --- /dev/null +++ b/src/views/CNAS/systemManagement/managementReview/components/reviewReport.vue @@ -0,0 +1,291 @@ +<template> + <div> + <div class="search-background"> + <span class="search-group"> + <span style="width: 160px">鍦扮偣锛�</span> + <el-input v-model="searchForm.place" clearable size="small"></el-input> + <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">閲� 缃�</el-button> + <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button> + </span> + <span class="search-group"> + <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button> + </span> + </div> + <div class="table"> + <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData" + :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" :page="page" @pagination="pagination"> + </limsTable> + </div> + <review-report-dia v-if="reviewReportDia" ref="reviewReportDia" @closeYearDia="closeYearDia"></review-report-dia> + </div> +</template> + +<script> +import limsTable from "@/components/Table/lims-table.vue"; +import ReviewReportDia from './reviewReportDia.vue'; +import { + getPageReviewReport, + deleteReviewReport, + exportReviewReport, + modifyReviewReport, +} from '@/api/cnas/systemManagement/managementReview.js' +import { mapGetters } from "vuex"; +export default { + name: 'reviewReport', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: { ReviewReportDia, limsTable }, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + searchForm: { + place: '', + }, + tableColumn: [ + { + label: '鐩殑', + prop: 'objective', + minWidth: '100' + }, + { + label: '鍦扮偣', + prop: 'place', + minWidth: '100' + }, + { + label: '涓绘寔浜�', + prop: 'compere', + minWidth: '100' + }, + { + label: '璁板綍浜�', + prop: 'recordPeople', + minWidth: '100' + }, + { + label: '鏃ユ湡', + prop: 'date', + minWidth: '100' + }, + { + label: '椤垫', + prop: 'page', + minWidth: '100' + }, + { + label: '璇勫鏂瑰紡', + prop: 'judgingMethod', + minWidth: '100' + }, + { + label: '璇勫渚濇嵁', + prop: 'reviewBasis', + minWidth: '100' + }, + { + dataType: 'action', + minWidth: '160', + label: '鎿嶄綔', + operation: [ + { + name: '缂栬緫', + type: 'text', + clickFun: (row) => { + this.openFormDia('edit', row); + }, + disabled: (row) => { + return !!row.audit || !!row.approval + } + }, + { + name: '瀹℃牳', + type: 'text', + clickFun: (row) => { + this.$confirm('纭畾瀹℃牳閫氳繃?', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + this.submit('audit', row) + }).catch(() => { + }); + }, + disabled: (row) => { + return !!row.audit + } + }, + { + name: '鎵瑰噯', + type: 'text', + clickFun: (row) => { + this.$confirm('纭畾鎵瑰噯閫氳繃?', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + this.submit('approval', row) + }).catch(() => { + }); + }, + disabled: (row) => { + return !row.audit || !!row.approval + } + }, + { + name: '鍒犻櫎', + type: 'text', + color: '#f56c6c', + clickFun: (row) => { + this.delPlan(row) + } + }, + { + name: '涓嬭浇', + type: 'text', + clickFun: (row) => { + this.handleDown(row) + } + }, + ] + } + ], + tableData: [], + tableLoading: false, + page: { + size: 20, + current: 1, + total: 0, + }, + reviewReportDia: false, + }; + }, + computed: { + ...mapGetters(['nickName']) + }, + mounted() { + this.searchList() + }, + // 鏂规硶闆嗗悎 + methods: { + // 鏌ヨ鍒楄〃 + searchList() { + this.tableLoading = true + getPageReviewReport({ place: this.searchForm.place, pages: this.page.current, size: this.page.size }).then(res => { + this.tableLoading = false + if (res.code === 201) return + this.tableData = res.data.records + this.page.total = res.data.total + }).catch(err => { + console.log('err---', err); + this.tableLoading = false + }) + }, + // 鏂板锛岀紪杈戝脊妗� + openFormDia(type, row) { + this.reviewReportDia = true + this.$nextTick(() => { + this.$refs.reviewReportDia.openDia(type, row) + }) + }, + closeYearDia() { + this.reviewReportDia = false + this.searchList() + }, + // 閲嶇疆鏌ヨ鏉′欢 + resetSearchForm() { + this.searchForm.place = ''; + this.searchList() + }, + // 鍒犻櫎 + delPlan(row) { + this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + this.tableLoading = true + deleteReviewReport({ id: row.id }).then(res => { + this.tableLoading = false + if (res.code === 201) return + this.$message.success('鍒犻櫎鎴愬姛') + this.searchList() + }).catch(err => { + this.tableLoading = false + console.log('err---', err); + }) + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堝垹闄�' + }); + }); + }, + pagination({ page, limit }) { + this.page.current = page; + this.page.size = limit; + this.searchList(); + }, + handleDown(row) { + exportReviewReport({ id: row.id }).then(res => { + if (res.code == 201) { + this.$message.error(res.message) + return + } + const blob = new Blob([res], { type: 'application/octet-stream' }); + //灏咮lob 瀵硅薄杞崲鎴愬瓧绗︿覆 + let reader = new FileReader(); + reader.readAsText(blob, 'utf-8'); + reader.onload = () => { + try { + let result = JSON.parse(reader.result); + if (result.message) { + this.$message.error(result.message); + } else { + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = '璇勫鎶ュ憡.docx'; + link.click(); + this.$message.success('瀵煎嚭鎴愬姛') + } + } catch (err) { + console.log(err); + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = '璇勫鎶ュ憡.docx'; + link.click(); + this.$message.success('瀵煎嚭鎴愬姛') + } + } + }) + }, + submit(type, row) { + let obj = row + obj[type] = this.nickNamee; + modifyReviewReport(obj).then(res => { + if (res.code === 201) return + this.$message.success('鎿嶄綔鎴愬姛') + this.searchList() + }).catch(err => { + console.log('err---', err); + }) + } + } +}; +</script> + +<style scoped> +.search-background { + width: 100%; + height: 60px; + line-height: 60px; + display: flex; + justify-content: space-between; +} + +.search-group { + display: flex; + align-items: center; + margin: 0 20px; +} +</style> diff --git a/src/views/CNAS/systemManagement/managementReview/components/reviewReportDia.vue b/src/views/CNAS/systemManagement/managementReview/components/reviewReportDia.vue new file mode 100644 index 0000000..b8afafc --- /dev/null +++ b/src/views/CNAS/systemManagement/managementReview/components/reviewReportDia.vue @@ -0,0 +1,259 @@ +<template> + <div> + <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false" + :visible.sync="formDia" title="绠$悊璇勫浼氳璁板綍" width="1000px" @close="closeYearDia"> + <el-form ref="form" :model="form" :rules="rules" label-position="top" label-width="auto"> + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item label="鐩殑" prop="objective"> + <el-input v-model="form.objective" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="鍦扮偣" prop="place"> + <el-input v-model="form.place" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="涓绘寔浜�" prop="compere"> + <el-input v-model="form.compere" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="璁板綍浜�" prop="recordPeople"> + <el-input v-model="form.recordPeople" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="鏃ユ湡" prop="date"> + <el-date-picker v-model="form.date" clearable format="yyyy-MM-dd HH:mm:ss" placeholder="閫夋嫨鏃ユ湡" size="small" + style="width: 100%" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"> + </el-date-picker> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="椤垫" prop="page"> + <el-input v-model="form.page" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="璇勫鏂瑰紡" prop="judgingMethod"> + <el-input v-model="form.judgingMethod" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="璇勫渚濇嵁" prop="reviewBasis"> + <el-input v-model="form.reviewBasis" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="鍑哄腑浜哄憳" prop="attendess"> + <!-- <el-input v-model="form.attendess " clearable size="small"></el-input> --> + <el-select v-model="form.attendess" size="small" style="width: 100%;" filterable clearable multiple> + <el-option v-for="item in personList" :key="item.value" :label="item.label" :value="item.value"> + </el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="璇勫杈撳叆鎯呭喌" prop="reviewInputs"> + <el-input v-model="form.reviewInputs" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="璇勫杩囩▼姒傚喌" prop="reviewProcess"> + <el-input v-model="form.reviewProcess" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="涓昏璁姒傝堪" prop="mainTopic"> + <el-input v-model="form.mainTopic" :rows="5" clearable placeholder="璇疯緭鍏ュ唴瀹癸紝鍙緭鍏ュ嚑鍗冨瓧" size="small" + type="textarea"> + </el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="浜嬮」" prop="matters"> + <el-input v-model="form.matters" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="璐熻矗浜�" prop="head"> + <el-input v-model="form.head" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="瀹屾垚鏃ユ湡" prop="completionDate"> + <el-date-picker v-model="form.completionDate" clearable format="yyyy-MM-dd HH:mm:ss" placeholder="閫夋嫨鏃ユ湡" + size="small" style="width: 100%" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"> + </el-date-picker> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="璺熻釜纭浜�" prop="trackingConfirmed"> + <el-input v-model="form.trackingConfirmed" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="璺熻釜鎯呭喌纭璁板綍" prop="follerUp"> + <el-input v-model="form.follerUp" clearable size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="浣撶郴璇勪环" prop="overallEvaluation"> + <el-input v-model="form.overallEvaluation" clearable size="small"></el-input> + </el-form-item> + </el-col> + </el-row> + </el-form> + <span slot="footer" class="dialog-footer"> + <el-button @click="closeYearDia">鍙� 娑�</el-button> + <el-button :loading="loading" type="primary" @click="handleEdit">鎻� 浜�</el-button> + </span> + </el-dialog> + </div> +</template> + +<script> +import { + addReviewReport, + modifyReviewReport, +} from '@/api/cnas/systemManagement/managementReview.js' +import { + selectUserCondition, +} from "@/api/business/inspectionTask.js"; +export default { + name: 'reviewReportDia', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: {}, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + formDia: false, + diaLoading: false, + loading: false, + form: { + id: '', + objective: '', + place: '', + compere: '', + recordPeople: '', + date: '', + page: '', + judgingMethod: '', + reviewBasis: '', + attendess: [], + reviewInputs: '', + reviewProcess: '', + mainTopic: '', + matters: '', + head: '', + completionDate: '', + trackingConfirmed: '', + follerUp: '', + overallEvaluation: '', + }, + rules: { + objective: [{ required: true, message: '璇峰~鍐欑洰鐨�', trigger: 'blur' }], + place: [{ required: true, message: '璇峰~鍐欏湴鐐�', trigger: 'blur' }], + compere: [{ required: true, message: '璇峰~鍐欎富鎸佷汉', trigger: 'blur' }], + recordPeople: [{ required: true, message: '璇峰~鍐欒褰曚汉', trigger: 'blur' }], + date: [{ required: true, message: '璇烽�夋嫨鏃ユ湡', trigger: 'change' }], + completionDate: [{ required: true, message: '璇烽�夋嫨瀹屾垚鏃ユ湡', trigger: 'change' }], + page: [{ required: true, message: '璇峰~鍐欓〉娆�', trigger: 'blur' }], + judgingMethod: [{ required: true, message: '璇峰~鍐欒瘎瀹℃柟寮�', trigger: 'blur' }], + reviewBasis: [{ required: true, message: '璇峰~鍐欒瘎瀹′緷鎹�', trigger: 'blur' }], + attendess: [{ required: true, message: '璇峰~鍐欏嚭甯汉鍛�', trigger: 'change' }], + reviewInputs: [{ required: true, message: '璇峰~鍐欒瘎瀹¤緭鍏ユ儏鍐�', trigger: 'blur' }], + reviewProcess: [{ required: true, message: '璇峰~鍐欒瘎瀹¤緭鍏ユ儏鍐�', trigger: 'blur' }], + mainTopic: [{ required: true, message: '璇峰~鍐欎富瑕佽棰樻杩�', trigger: 'blur' }], + matters: [{ required: true, message: '璇峰~鍐欎富瑕佽棰樻杩�', trigger: 'blur' }], + head: [{ required: true, message: '璇峰~鍐欒礋璐d汉', trigger: 'blur' }], + trackingConfirmed: [{ required: true, message: '璇峰~鍐欒窡韪‘璁や汉', trigger: 'blur' }], + follerUp: [{ required: true, message: '璇峰~鍐欒窡韪‘璁や汉', trigger: 'blur' }], + overallEvaluation: [{ required: true, message: '璇峰~鍐欎綋绯昏瘎浠�', trigger: 'blur' }], + }, + operationType: '', + personList: [] + }; + }, + mounted() { + + }, + // 鏂规硶闆嗗悎 + methods: { + // 鎵撳紑寮规 + openDia(type, row) { + this.formDia = true + this.operationType = type + this.getAuthorizedPerson() + if (type !== 'add') { + this.form = row + this.form.attendess = this.form.attendess ? this.form.attendess.split(',').map(m => Number(m)) : [] + } + }, + // 鎻愪氦寮规鏁版嵁 + handleEdit() { + this.$refs['form'].validate((valid) => { + if (valid) { + this.loading = true + const internalMeeting = this.HaveJson(this.form) + internalMeeting.attendess = internalMeeting.attendess ? internalMeeting.attendess.join(',') : '' + if (this.operationType === 'add') { + addReviewReport(internalMeeting).then(res => { + this.loading = false + if (res.code === 201) return + this.$message.success('鎿嶄綔鎴愬姛') + this.closeYearDia() + }).catch(err => { + console.log('err---', err); + this.loading = false + }) + } else if (this.operationType === 'edit') { + modifyReviewReport(internalMeeting).then(res => { + this.loading = false + if (res.code === 201) return + this.$message.success('鎿嶄綔鎴愬姛') + this.closeYearDia() + }).catch(err => { + console.log('err---', err); + this.loading = false + }) + } + } else { + console.log('error submit!!'); + return false; + } + }); + }, + closeYearDia() { + this.$refs.form.resetFields(); + this.formDia = false + this.$emit('closeYearDia') + }, + getAuthorizedPerson() { + selectUserCondition().then(res => { + let data = [] + res.data.forEach(a => { + data.push({ + label: a.name, + value: a.id + }) + }) + this.personList = data + }) + }, + } +}; +</script> + +<style scoped> +>>>.el-dialog { + margin: 4vh auto 50px !important; +} + +>>>.el-dialog__body { + max-height: 600px; + overflow-y: auto; +} +</style> diff --git a/src/views/CNAS/systemManagement/managementReview/index.vue b/src/views/CNAS/systemManagement/managementReview/index.vue new file mode 100644 index 0000000..9111484 --- /dev/null +++ b/src/views/CNAS/systemManagement/managementReview/index.vue @@ -0,0 +1,48 @@ +<template> + <div class="main"> + <el-tabs v-model="activeName" class="tab-panel" type="border-card"> + <el-tab-pane label="绠$悊璇勫璁″垝" name="yearPlan"> + <management-review-plan></management-review-plan> + </el-tab-pane> + <el-tab-pane label="浼氳璁板綍" name="implementationPlan"> + <meeting-records></meeting-records> + </el-tab-pane> + <el-tab-pane label="璇勫鎶ュ憡" name="meetingSignIn"> + <review-report></review-report> + </el-tab-pane> + </el-tabs> + </div> +</template> + +<script> +import ManagementReviewPlan from './components/managementReviewPlan.vue'; +import MeetingRecords from './components/meetingRecords.vue'; +import ReviewReport from './components/reviewReport.vue'; + +export default { + name: 'a9-management-review', + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: { ReviewReport, MeetingRecords, ManagementReviewPlan }, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + activeName: 'yearPlan', + }; + }, + mounted() { + + }, + // 鏂规硶闆嗗悎 + methods: {} +}; +</script> + +<style scoped> +.main { + padding: 15px 0; +} + +.tab-panel { + background: #fff; +} +</style> diff --git a/src/views/business/finishedProductSampling/components/addQuarterItem.vue b/src/views/business/finishedProductSampling/components/addQuarterItem.vue new file mode 100644 index 0000000..63e6888 --- /dev/null +++ b/src/views/business/finishedProductSampling/components/addQuarterItem.vue @@ -0,0 +1,296 @@ +<template> + <div> + <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="quarterSampleDia" title="瀛e害鎶芥牱" width="90%" @close="quarterSampleDia = false"> + <div style="display: flex;align-items: center;justify-content: space-between;margin-bottom: 10px"> + <div style="width: 30%;display: flex;align-items: center;" > + <span style="width: 50px">缂栧彿锛�</span> + <el-input v-model="quarterSampleForm.quarterNo" :disabled="operationType !== 'add'" size="small"></el-input> + </div> + <div v-if="operationType === 'add'"> + <el-button size="small" type="primary" @click="addQuarter">娣诲姞</el-button> + <el-button size="small" type="danger" @click="clearTable">娓呯┖</el-button> + </div> + </div> + <div> + <el-table v-loading="tableLoading" :data="quarterItems" border height="420" style="width: 100%"> + <el-table-column label="浜у搧绫诲瀷" prop="productType" width="200"> + <template slot-scope="{row}"> + <template> + <el-input v-model="row.productType" size="small"/> + </template> + </template> + </el-table-column> + <el-table-column label="璐d换浜�" prop="dutyUser" width="100"></el-table-column> + <el-table-column label="鍨嬪彿" prop="productModel" width="120"> + <template slot-scope="{row}"> + <template> + <el-input v-model="row.productModel" size="small" :disabled="operationType === 'view'"/> + </template> + </template> + </el-table-column> + <el-table-column label="鎶芥牱鏁伴噺" min-width="340" prop="spotCheckNumber"> + <template slot-scope="{row}"> + <template> + <el-input v-model="row.spotCheckNumber" size="small" :disabled="operationType === 'view'"/> + </template> + </template> + </el-table-column> + <el-table-column v-if="operationType === 'add'" label="鏁伴噺" min-width="120" prop="number"> + <template slot-scope="{row}"> + <template> + <el-input v-model="row.number" size="small" :disabled="operationType === 'view'"/> + </template> + </template> + </el-table-column> + <el-table-column v-if="operationType !== 'add'" label="鎶芥牱鏃堕棿" prop="spotCheckTime" width="160"> + <template slot-scope="{row}"> + <template> + <el-date-picker v-model="row.spotCheckTime" + format="yyyy-MM-dd" + :disabled="operationType === 'view'" + placeholder="閫夋嫨鏃ユ湡" + size="small" + clearable + style="width:100%" + type="date" + value-format="yyyy-MM-dd"> + </el-date-picker> + </template> + </template> + </el-table-column> + <el-table-column v-if="operationType !== 'add'" label="璇曟牱缁撹" prop="result" width="130"> + <template v-slot="scope"> + <el-select v-model="scope.row.result" placeholder="璇烽�夋嫨" size="small" clearable :disabled="operationType === 'view'"> + <el-option label="鍚堟牸" value="鍚堟牸"></el-option> + <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�"></el-option> + </el-select> + </template> + </el-table-column> + <el-table-column v-if="operationType !== 'add'" label="鍙栨牱浜哄憳" prop="samplingUser" width="120"> + <template slot-scope="{row}"> + <template> + <el-input v-model="row.samplingUser" size="small" :disabled="operationType === 'view'"/> + </template> + </template> + </el-table-column> + <el-table-column label="澶囨敞" prop="itemRemark" width="200"> + <template slot-scope="{row}"> + <template> + <el-input v-model="row.itemRemark" size="small" :disabled="operationType === 'view'"/> + </template> + </template> + </el-table-column> + <el-table-column v-if="operationType !== 'view'" fixed="right" label="鎿嶄綔" width="100"> + <template slot-scope="scope"> + <el-button size="small" style="color: #f56c6c" type="text" @click="deleteScope(scope.$index)">鍒犻櫎</el-button> + </template> + </el-table-column> + </el-table> + </div> + <div style="display: flex;align-items: center;margin: 10px 0"> + <span style="width: 70px">澶囨敞锛�</span> + <el-input v-model="quarterSampleForm.remark" :disabled="operationType === 'view'" size="small" style="width: 43%" type="textarea"></el-input> + </div> + <div v-if="operationType !== 'add'"> + <el-form ref="form" :model="editForm" label-width="70px"> + <el-col :span="12"> + <el-form-item label="缂栧埗浜猴細"> + <el-select v-model="editForm.writeUser" :disabled="operationType !=='edit'" placeholder="璇烽�夋嫨" size="small" style="width: 100%"> + <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="浼氱浜猴細"> + <el-select v-model="editForm.countersignUser" :disabled="operationType !=='edit'" multiple placeholder="璇烽�夋嫨" size="small" style="width: 100%"> + <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="瀹℃牳浜猴細"> + <el-select v-model="editForm.examineUser" :disabled="operationType !=='edit'" placeholder="璇烽�夋嫨" size="small" style="width: 100%"> + <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="鎵瑰噯浜猴細"> + <el-select v-model="editForm.ratifyUser" :disabled="operationType !=='edit'" placeholder="璇烽�夋嫨" size="small" style="width: 100%"> + <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option> + </el-select> + </el-form-item> + </el-col> + </el-form> + </div> + <span v-if="operationType !== 'view'" slot="footer" class="dialog-footer"> + <el-button v-if="operationType !== 'add'" @click="quarterSampleDia = false">鍙� 娑�</el-button> + <el-button v-if="operationType === 'add'" @click="quarterSampleDia = false">淇� 瀛�</el-button> + <el-button type="primary" @click="handleSample">纭� 瀹�</el-button> + </span> + </el-dialog> + </div> +</template> + +<script> +import {addQuarter, getQuarter, updateQuarterOnOrder} from "@/api/business/finishedProductSampling"; +import {selectUserCondition} from "@/api/business/inspectionTask"; +import {mapGetters} from "vuex"; + +export default { + name: "addQuarterItem", + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: {}, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + tableLoading: false, + quarterSampleDia: false, // 瀛e害鎶芥牱寮规 + quarterSampleForm: { + quarterNo: '', // 缂栧彿 + }, + quarterItems: [], + quarterTemItems: [], + operationType: '', + editForm: { + quarterId: '', + writeUser: '', // 缂栧埗浜� + countersignUser: [], // 浼氱浜� + examineUser: '', // 瀹℃牳浜� + ratifyUser: '', // 鎵瑰噯浜� + }, + userList: [], + quarterRow: {}, + } + }, + computed: { + ...mapGetters(["nickName"]), + }, + mounted() { + this.getUserList() + }, + // 鏂规硶闆嗗悎 + methods: { + openDia (quarterTemItems, type) { + this.quarterSampleDia = true + this.operationType = type + if (type === 'add') { + if (quarterTemItems.length > 0) { + this.quarterItems = quarterTemItems + } + this.quarterSampleForm.quarterNo = getCurrentMonthTwoDigits() + } else { + this.tableLoading = true + this.quarterRow = quarterTemItems + getQuarter({quarterId: quarterTemItems.quarterId}).then(res => { + this.tableLoading = false + if (res.code === 200) { + this.quarterItems = res.data.quarterItems + this.quarterSampleForm.quarterNo = res.data.quarterNo + this.quarterSampleForm.remark = res.data.remark + this.editForm.quarterId = res.data.quarterId + this.editForm.writeUser = res.data.writeUser + this.editForm.examineUser = res.data.examineUser + this.editForm.ratifyUser = res.data.ratifyUser + if (res.data.countersignUser) { + this.editForm.countersignUser = res.data.countersignUser.split(",").map(Number) + } + } + }).catch(err => { + this.tableLoading = false + }) + } + }, + // 鎵嬪姩娣诲姞 + addQuarter () { + this.quarterItems.push({ + productType: '', + dutyUser: this.nickName, + productModel: '', + spotCheckNumber: '', + number: '', + spotCheckTime: '', + result: '', + samplingUser: '', + itemRemark: '', + }) + }, + // 鎻愪氦瀛e害鎶芥牱 + handleSample () { + this.$confirm('鏄惁鎻愪氦璇ユ暟鎹�', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + if (this.operationType === 'add') { + this.quarterSampleForm.quarterItems = JSON.parse(JSON.stringify(this.quarterItems)) + this.quarterSampleForm.quarterItems.forEach(item => { + item.spotCheckNumber = item.spotCheckNumber + ' ' + (item.number == null ? "" : item.number) + }) + addQuarter(this.quarterSampleForm).then(res => { + if (res.code == 200) { + this.$message.success('鎻愪氦鎴愬姛') + this.quarterItems = [] + this.$parent.quarterTemItems = [] + this.closeQuarterSampleDia() + } + }) + } else { + const params = {...this.editForm} + if (params.countersignUser.length > 0) { + params.countersignUser = params.countersignUser.join(',') + } else { + params.countersignUser = '' + } + params.quarterItems = JSON.parse(JSON.stringify(this.quarterItems)) + updateQuarterOnOrder(params).then(res => { + if (res.code == 200) { + this.$message.success('鎻愪氦鎴愬姛') + this.quarterItems = [] + this.closeQuarterSampleDia() + } + }) + } + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑�' + }); + }); + + }, + // 娓呯┖鎶芥牱璁″垝 + clearTable () { + this.quarterItems = [] + this.$parent.quarterTemItems = [] + }, + // 鎵嬪姩鍒犻櫎 + deleteScope (index) { + this.quarterItems.splice(index, 1) + }, + // 鍏抽棴瀛e害鎶芥牱寮规 + closeQuarterSampleDia () { + this.quarterSampleDia = false + if (this.operationType === 'add') { + this.$parent.handleStockList() + } else { + this.$parent.refreshTable('page') + } + }, + getUserList(){ + selectUserCondition({ type: 0 }).then((res) => { + this.userList = res.data; + }) + }, + }, +} +function getCurrentMonthTwoDigits() { + const currentDate = new Date(); + const year = currentDate.getFullYear(); + const currentMonth = currentDate.getMonth() + 1; + return year + currentMonth.toString().padStart(2, '0'); +} +</script> + +<style scoped> +</style> diff --git a/src/views/business/finishedProductSampling/index.vue b/src/views/business/finishedProductSampling/index.vue new file mode 100644 index 0000000..b4f9986 --- /dev/null +++ b/src/views/business/finishedProductSampling/index.vue @@ -0,0 +1,448 @@ +<!--鎴愬搧鎶芥牱椤甸潰--> +<template> + <div style="padding: 10px 0"> + <div class="card"> + <div class="title"> + <el-button size="small" type="primary" @click="addTemQuarter">鏂板</el-button> + <el-button size="small" type="primary" @click="quarterSample">瀛e害鎶芥牱</el-button> + <el-button size="small" type="primary" @click="handleStockList">鍒锋柊</el-button> + </div> + <el-table + ref="finishedproducttransferTable" + v-loading="tableLoading" + :data="stockList" + :header-cell-style="lineSideWarehouseTableHeaderCellStyle" + :row-class-name="lineSideWarehouseTableRowClassName" + class="finishedproducttransfer-table" + height="calc(100vh - 240px)" + @selection-change="handleSelectionChange" + > + <el-table-column type="selection" width="45"></el-table-column> + <el-table-column + :show-overflow-tooltip="true" + align="center" + label="瀹㈡埛璁㈠崟缂栧彿" + prop="customerOrderNo" + width="140" + > + <template slot="header" slot-scope="scope"> + <div style="line-height: 14px;margin-bottom: 6px">瀹㈡埛璁㈠崟缂栧彿</div> + <div class="th" @click.stop> + <el-input + v-model="queryParamOne.customerOrderNo" + clearable + size="mini" + type="text" + @clear="handleStockList" + @keyup.enter.native="handleStockList" + ></el-input> + </div> + </template> + <template slot-scope="scope"> + <span>{{ scope.row.customerOrderNo }}</span> + </template> + </el-table-column> + <el-table-column + align="center" + label="鎴愬搧闆朵欢鍙�" + prop="partNo" + width="140" + > + <template slot="header" slot-scope="scope"> + <div style="line-height: 14px;margin-bottom: 6px">鎴愬搧闆朵欢鍙�</div> + <div class="th" @click.stop> + <el-input + v-model="queryParamOne.partNo" + clearable + size="mini" + type="text" + @clear="handleStockList" + @keyup.enter.native="handleStockList" + ></el-input> + </div> + </template> + <template slot-scope="scope"> + <span>{{ scope.row.partNo }}</span> + </template> + </el-table-column> + <el-table-column + align="center" + label="闆朵欢鍚嶇О" + prop="partName" + width="140" + > + <template slot="header" slot-scope="scope"> + <div style="line-height: 14px;margin-bottom: 6px">闆朵欢鍚嶇О</div> + <div class="th" @click.stop> + <el-input + v-model="queryParamOne.partName" + clearable + size="mini" + type="text" + @clear="handleStockList" + @keyup.enter.native="handleStockList" + ></el-input> + </div> + </template> + <template slot-scope="scope"> + <span>{{ scope.row.partName }}</span> + </template> + </el-table-column> + <el-table-column + :show-overflow-tooltip="true" + align="center" + label="浠撳簱" + prop="warehouseName" + width="140" + > + <template slot="header" slot-scope="scope"> + <div style="line-height: 14px;margin-bottom: 6px">浠撳簱</div> + <div class="th" @click.stop> + <el-input + v-model="queryParamOne.warehouseName" + clearable + size="mini" + type="text" + @clear="handleStockList" + @keyup.enter.native="handleStockList" + ></el-input> + </div> + </template> + <template slot-scope="scope"> + <span>{{ scope.row.warehouseName }}</span> + </template> + </el-table-column> + <el-table-column + :show-overflow-tooltip="true" + align="center" + label="搴撲綅鍙�" + prop="locationNo" + width="140" + > + <template slot="header" slot-scope="scope"> + <div style="line-height: 14px;margin-bottom: 6px">搴撲綅鍙�</div> + <div class="th" @click.stop> + <el-input + v-model="queryParamOne.locationNo" + clearable + size="mini" + type="text" + @clear="handleStockList" + @keyup.enter.native="handleStockList" + ></el-input> + </div> + </template> + <template slot-scope="scope"> + <span>{{ scope.row.locationNo }}</span> + </template> + </el-table-column> + <el-table-column + :show-overflow-tooltip="true" + align="center" + label="搴撲綅鍚嶇О" + prop="locationName" + width="140" + > + <template slot="header" slot-scope="scope"> + <div style="line-height: 14px;margin-bottom: 6px">搴撲綅鍚嶇О</div> + <div class="th" @click.stop> + <el-input + v-model="queryParamOne.locationName" + clearable + size="mini" + type="text" + @clear="handleStockList" + @keyup.enter.native="handleStockList" + ></el-input> + </div> + </template> + <template slot-scope="scope"> + <span>{{ scope.row.locationName }}</span> + </template> + </el-table-column> + <el-table-column + align="center" + label="鎵规鍙�" + prop="partBatchNo" + width="140" + > + <template slot="header" slot-scope="scope"> + <div style="line-height: 14px;margin-bottom: 6px">鎵规鍙�</div> + <div class="th" @click.stop> + <el-input + v-model="queryParamOne.partBatchNo" + clearable + size="mini" + type="text" + @clear="handleStockList" + @keyup.enter.native="handleStockList" + ></el-input> + </div> + </template> + <template slot-scope="scope"> + <span>{{ scope.row.partBatchNo }}</span> + </template> + </el-table-column> + <el-table-column + align="center" + label="鍏ュ簱鏉ユ簮" + prop="inSource" + width="140" + > + <template slot="header" slot-scope="scope"> + <div style="line-height: 14px;margin-bottom: 6px">鍏ュ簱鏉ユ簮</div> + <div class="th" @click.stop> + <el-input + v-model="queryParamOne.inSource" + clearable + size="mini" + type="text" + @clear="handleStockList" + @keyup.enter.native="handleStockList" + ></el-input> + </div> + </template> + <template slot-scope="scope"> + <span>{{ scope.row.inSource }}</span> + </template> + </el-table-column> + <el-table-column + align="center" + label="澶栨姢棰滆壊" + prop="outerColor" + width="140" + > + <template slot="header" slot-scope="scope"> + <div style="line-height: 14px;margin-bottom: 6px">澶栨姢棰滆壊</div> + <div class="th" @click.stop> + <el-input + v-model="queryParamOne.outerColor" + clearable + size="mini" + type="text" + @clear="handleStockList" + @keyup.enter.native="handleStockList" + ></el-input> + </div> + </template> + <template slot-scope="scope"> + <span>{{ scope.row.outerColor }}</span> + </template> + </el-table-column> + <el-table-column + align="center" + label="搴撳瓨鏁伴噺" + prop="stockQuantity" + width="140" + > + </el-table-column> + <el-table-column + align="center" + label="鍙敤搴撳瓨鏁伴噺" + prop="availableStockQuantity" + width="140" + > + <template slot-scope="scope"> + <span>{{ scope.row.availableStockQuantity }}</span> + </template> + </el-table-column> + </el-table> + <div class="pagin-page" style="margin-top: 0;margin-bottom: 0;"> + <el-pagination + background + :current-page="queryReport.current" + :page-size="queryReport.size" + :page-sizes="[10, 15, 20, 50, 100]" + :total="queryReport.total" + layout="total, sizes, prev, pager, next, jumper" + style="text-align:right;padding: 20px 16px;" + @size-change="handleSizeChangeReport" + @current-change="handleCurrentChangeReport" + > + </el-pagination> + </div> + </div> + <add-quarter-item ref="addQuarterItem"></add-quarter-item> + </div> +</template> + +<script> + +import AddQuarterItem from "./components/addQuarterItem.vue"; +import {getIfsStock} from "@/api/business/finishedProductSampling"; +import {mapGetters} from "vuex"; + +export default { + data() { + return { + stockList: [], + queryParamOne: { + partNo: null, + partName: null, + warehouseName: null, + locationName: null, + locationNo: null, + partBatchNo: null, + stockQuantity: null, + availableStockQuantity: null, + outerColor: null, + customerOrderNo: null, + inSource: null, + }, + queryReport: { + current: 1, + size: 20, + total: 0 + }, + tableLoading: false, + multipleSelection: [], // table鎵�閫変腑鐨勫璞� + showEditForm: false, + showMoveForm: false, + showMoveAllForm: false, + erpfinishstock: {}, + isAvaliable: false, + isPackage: false, + quarterTemItems: [], + operationType: '' + } + }, + components: {AddQuarterItem}, + mounted() { + this.getIfsStock() + }, + updated() { + this.$nextTick(() => { + this.$refs.finishedproducttransferTable.doLayout() + }) + }, + computed: { + ...mapGetters(["nickName"]), + }, + methods: { + // 瀛e害鎶芥牱 + quarterSample () { + this.$refs.addQuarterItem.openDia(this.quarterTemItems, 'add') + }, + addTemQuarter () { + if (this.multipleSelection.length > 0) { + const multipleSelection = JSON.parse(JSON.stringify(this.multipleSelection)) + if (multipleSelection.length > 0) { + multipleSelection.forEach(item => { + if (item.partName.includes(' ')) { + const list = item.partName.match(/^(\S+)\s(.*)/).slice(1) + console.log('list', list) + item.productType = list[0] + item.spotCheckNumber = list[1] + } + item.dutyUser = this.nickName + item.itemRemark = item.partBatchNo; + this.quarterTemItems.push(item) + }) + } + this.$message.success('鏆傚瓨鎴愬姛') + this.$refs.finishedproducttransferTable.clearSelection() + } else { + this.$message.warning('璇烽�夋嫨鏁版嵁') + } + }, + // 鑾峰彇鏁版嵁鍒楄〃 + getIfsStock() { + this.tableLoading = true + this.stockList = [] + const newReqParam = this.getFinalParam() + getIfsStock(newReqParam) + .then((response) => { + const resData = response.data + this.queryReport.total = resData.total + const resStockList = resData.data + resStockList.forEach((item) => { + this.stockList.push({ + partNo: item.PART_NO, + partName: item.PART_DESC, + warehouseName: item.WAREHOUSE_ID, + locationName: item.LOCATION_DESC, + locationNo: item.LOCATION_NO, + partBatchNo: item.LOT_BATCH_NO, + stockQuantity: item.QTY_ONHAND, + availableStockQuantity: item.QTY_AVAILABLE, + outerColor: item.ATTR4, + customerOrderNo: item.ATTR6, + inSource: item.ATTR23, + }) + }) + this.tableLoading = false + }) + .catch(() => { + this.tableLoading = false + }) + }, + getFinalParam() { + const newReqParam = { + partNo: this.queryParamOne.partNo, + partDescription: this.queryParamOne.partName, + warehouse: this.queryParamOne.warehouseName + ? this.queryParamOne.warehouseName + '%' + : null, + locDesc: this.queryParamOne.locationName, + locNo: this.queryParamOne.locationNo, + lotBatchNo: this.queryParamOne.partBatchNo, + quantityFlag: this.queryParamOne.stockQuantity, + outerColor: this.queryParamOne.outerColor, + otcOrderNo: this.queryParamOne.customerOrderNo, + availableStockQuantity: this.queryParamOne.availableStockQuantity, + inSource: this.queryParamOne.inSource, + page: this.queryReport.current, + limit: this.queryReport.size + } + return newReqParam + }, + lineSideWarehouseTableHeaderCellStyle({row, column, rowIndex, columnIndex}) { + let headerStyle = 'background:#FAFAFA;color:#666;' + if (columnIndex === 0) { + headerStyle += 'border-radius: 6px 0px 0px 0px;' + } else if (columnIndex === 13) { + headerStyle += 'border-radius: 0px 6px 0px 0px;' + } + return headerStyle + }, + lineSideWarehouseTableRowClassName({ row, rowIndex }) { + if (rowIndex % 2 === 1) { + return 'stripe-row' + } else { + return '' + } + }, + handleSizeChangeReport(val) { + this.queryReport.size = val + this.queryReport.current = 1 + this.getIfsStock() + }, + handleCurrentChangeReport(val) { + this.queryReport.current = val + this.getIfsStock() + }, + handleStockList() { + this.queryReport.current = 1 + this.getIfsStock() + }, + handleSelectionChange(val) { + this.multipleSelection = val + } + } +} +</script> + +<style scoped> +>>>.el-table__header { + height: 70px; +} +.card { + height: calc(100% - 40px); + background: #ffffff; + padding: 10px; +} +.title { + text-align: right; + margin-bottom: 10px; +} +</style> diff --git a/src/views/performance/manHour/workTimeConfig.vue b/src/views/performance/manHour/workTimeConfig.vue index 5364c89..4fcad16 100644 --- a/src/views/performance/manHour/workTimeConfig.vue +++ b/src/views/performance/manHour/workTimeConfig.vue @@ -30,8 +30,8 @@ v-if="checkPermi(['performance:manHour:workTimeConfig:add'])">鏂� 澧�</el-button> </div> <div class="table"> - <lims-table :tableData="tableData" :column="column" :page="page" :tableLoading="tableLoading" - :height="'calc(100vh - 290px)'" @pagination="pagination"></lims-table> + <lims-table :tableData="tableData" :column="column" :tableLoading="tableLoading" :height="'calc(100vh - 290px)'" + :page="page" @pagination="pagination"></lims-table> </div> <!-- 鏂板/缂栬緫 --> <el-dialog :title="title" :visible.sync="timeDia" width="500px"> diff --git a/src/views/standard/standardLibrary/index.vue b/src/views/standard/standardLibrary/index.vue index 4ead05c..180ad2c 100644 --- a/src/views/standard/standardLibrary/index.vue +++ b/src/views/standard/standardLibrary/index.vue @@ -212,10 +212,10 @@ <el-col :class="{ sort: node.level > 3 }" :span="19" :title="data.label" style="text-align: left"> <span> <i :class="`node_i ${data.children != undefined - ? data.code === '[1]' - ? 'el-icon-folder-opened' - : 'el-icon-folder' - : 'el-icon-tickets' + ? data.code === '[1]' + ? 'el-icon-folder-opened' + : 'el-icon-folder' + : 'el-icon-tickets' }`"></i> {{ data.label }} </span> @@ -225,7 +225,7 @@ (node.data.children === null || node.data.children === undefined) " :span="2" style="text-align: right"> - <el-button size="mini" type="text" @click="editTreeName(node.data)"> + <el-button size="mini" type="text" @click.stop="editTreeName(node.data)"> <i class="el-icon-edit"></i> </el-button> </el-col> @@ -286,8 +286,8 @@ <template slot-scope="scope"> <el-input v-if=" checkPermi(['standard:standardLibrary:upStandardProduct']) - " v-model="scope.row.ask" :autosize="{ minRows: 1, maxRows: 3 }" clearable placeholder="瑕佹眰鍊�" - size="small" type="textarea" @change="(value) => upStandardProductList(value, scope.row.id)"></el-input> + " v-model="scope.row.ask" :autosize="{ minRows: 1, maxRows: 3 }" clearable placeholder="瑕佹眰鍊�" size="small" + type="textarea" @change="(value) => upStandardProductList(value, scope.row.id)"></el-input> <span v-else>{{ scope.row.ask }}</span> </template> </el-table-column> @@ -306,7 +306,7 @@ <el-select v-if=" checkPermi(['standard:standardLibrary:upStandardProduct']) " v-model="scope.row.methodS" clearable placeholder="璇曢獙鏂规硶" size="small" @change="(value) => upStandardProductListOfMethodS(value, scope.row.id) - "> + "> <el-option v-for="(a, i) in scope.row.method && JSON.parse(scope.row.method)" :key="i" :label="a" :value="a"></el-option> </el-select> @@ -318,7 +318,7 @@ <el-select v-if=" checkPermi(['standard:standardLibrary:upStandardProduct']) " v-model="scope.row.radius" clearable placeholder="鏉′欢" size="small" @change="(value) => upStandardProductListOfRadius(value, scope.row.id) - "> + "> <el-option v-for="(a, i) in scope.row.radiusList && JSON.parse(scope.row.radiusList)" :key="i" :label="a" :value="a"></el-option> </el-select> @@ -331,7 +331,7 @@ <el-input v-if=" checkPermi(['standard:standardLibrary:upStandardProduct']) " v-model="scope.row.price" placeholder="鍗曚环(鍏�)" size="small" @change="(value) => upStandardProductListOfPrice(value, scope.row.id) - "> + "> </el-input> <span v-else>{{ scope.row.price }}</span> </template> @@ -341,7 +341,7 @@ <el-input v-if=" checkPermi(['standard:standardLibrary:upStandardProduct']) " v-model="scope.row.manHour" placeholder="鍗曚环(鍏�)" size="small" @change="(value) => upStandardProductListOfManHour(value, scope.row.id) - "> + "> </el-input> <span v-else>{{ scope.row.manHour }}</span> </template> @@ -351,7 +351,7 @@ <template slot-scope="scope"> <el-select v-model="scope.row.templateId" :disabled="!checkPermi(['standard:standardLibrary:upStandardProduct']) " filterable size="small" @change="(value) => - upStandardProductListOfTemplate(value, scope.row.id) + upStandardProductListOfTemplate(value, scope.row.id) "> <el-option v-for="(a, ai) in templateList" :key="ai" :label="a.name" :value="a.id"></el-option> </el-select> @@ -367,10 +367,10 @@ </template> </el-table-column> </el-table> - <el-pagination :current-page="currentPage" :page-size="300" :total="total" - layout="total, prev, pager, next, jumper" style="position: absolute; right: 16px; bottom: 1px" - @current-change="handleCurrentChange"> - </el-pagination> + <!-- <el-pagination :current-page="currentPage" :page-size="300" :total="total" layout="total" + style="position: absolute; right: 16px; bottom: 1px" @current-change="handleCurrentChange"> + </el-pagination> --> + <p style="text-align: right;margin-right: 20px;color: #333;">鍏眥{ total }}鏉�</p> </el-row> </div> @@ -897,7 +897,8 @@ return; } this.$message.success("娣诲姞鎴愬姛"); - this.selectStandardTreeList(); + this.$tab.refreshPage(); + // this.selectStandardTreeList(); this.updateDia = false; this.updateLoad = false; }) -- Gitblit v1.9.3