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