From 332e2e6cd982c2d71028798f535a94d7b9c55b91 Mon Sep 17 00:00:00 2001
From: 董国庆 <364620639@qq.com>
Date: 星期二, 09 十二月 2025 16:59:26 +0800
Subject: [PATCH] 12.07 更新
---
laboratory/src/views/dataManagement/testResultReport/detail.vue | 170 +++++
laboratory/src/views/dataManagement/testResultReport/list.vue | 385 +++++++---
laboratory/src/views/dataManagement/testResultReport/components/record-detail.vue | 756 ++++++++++++++++++++++
laboratory/src/views/chemistQa/productApproval/index.vue | 8
laboratory/src/views/dataManagement/originalRecordTest/service.js | 1
laboratory/src/views/chemistQa/rawMaterials/index.vue | 8
laboratory/src/views/dataManagement/originalRecordTest/components/addDialog.vue | 29
laboratory/src/views/dataManagement/sampleSubmissionList/submission.vue | 303 ++++++--
laboratory/src/components/DynamicComponent/addTableData.vue | 96 ++
laboratory/src/views/dataManagement/sampleSubmissionList/components/receiveConfirmDialog.vue | 130 +++
laboratory/src/App.vue | 2
laboratory/src/components/AiEditor/index.vue | 2
laboratory/src/views/dataManagement/testResultReport/service.js | 12
laboratory/src/views/dataManagement/schemeManagement/addPlan.vue | 102 ++
laboratory/src/views/chemistQa/projectTesting/index.vue | 4
laboratory/src/views/chemistQa/pilotAndProduction/index.vue | 7
laboratory/src/views/dataManagement/originalRecordTest/list.vue | 1
17 files changed, 1,739 insertions(+), 277 deletions(-)
diff --git a/laboratory/src/App.vue b/laboratory/src/App.vue
index 4a0f830..47db138 100644
--- a/laboratory/src/App.vue
+++ b/laboratory/src/App.vue
@@ -148,7 +148,7 @@
.el-pagination__sizes {
.el-input__inner {
- width: 100px;
+ width: 100px !important;
}
}
diff --git a/laboratory/src/components/AiEditor/index.vue b/laboratory/src/components/AiEditor/index.vue
index ba6f6ea..576c52f 100644
--- a/laboratory/src/components/AiEditor/index.vue
+++ b/laboratory/src/components/AiEditor/index.vue
@@ -278,8 +278,6 @@
},
}
-
- console.log('this.addIpToContent(this.value)',this.addIpToContent(this.value))
try {
this.editor = new AiEditor(options)
} catch (error) {
diff --git a/laboratory/src/components/DynamicComponent/addTableData.vue b/laboratory/src/components/DynamicComponent/addTableData.vue
index de40882..3ed8113 100644
--- a/laboratory/src/components/DynamicComponent/addTableData.vue
+++ b/laboratory/src/components/DynamicComponent/addTableData.vue
@@ -30,20 +30,28 @@
:prop="header.name"
:rules="[
{
- required: header.required === true || header.required === 'true',
+ required:
+ (header.required === true ||
+ header.required === 'true') &&
+ isApprovaler,
message: header.message || `请输入${header.name}`,
trigger: ['blur', 'change'],
},
{
validator: (rule, value, callback) => {
- if ((header.required === true || header.required === 'true') && (!value || value.trim() === '')) {
+ if (
+ (header.required === true ||
+ header.required === 'true') &&
+ (!value || value.trim() === '') &&
+ isApprovaler
+ ) {
callback(header.message || `请输入${header.name}`);
} else {
callback();
}
},
trigger: ['blur', 'change'],
- }
+ },
]"
v-if="header.type == 'text'"
>
@@ -58,7 +66,9 @@
:prop="header.name"
:rules="{
required:
- header.required === true || header.required === 'true',
+ (header.required === true ||
+ header.required === 'true') &&
+ isApprovaler,
trigger: ['blur', 'change'],
}"
class="image-form-item"
@@ -72,9 +82,18 @@
:auto-upload="true"
list-type="picture-card"
:before-upload="beforeImageUpload"
- :on-change="(file, fileList) => handleImageChange(file, fileList, header.name)"
- :on-remove="(file, fileList) => handleImageRemove(file, fileList, header.name)"
- :on-success="(res, file, fileList) => handleImageSuccess(res, file, fileList, header.name)"
+ :on-change="
+ (file, fileList) =>
+ handleImageChange(file, fileList, header.name)
+ "
+ :on-remove="
+ (file, fileList) =>
+ handleImageRemove(file, fileList, header.name)
+ "
+ :on-success="
+ (res, file, fileList) =>
+ handleImageSuccess(res, file, fileList, header.name)
+ "
:on-preview="handlePreview"
:disabled="!checkEditPermission(header)"
multiple
@@ -96,7 +115,9 @@
:prop="header.name"
:rules="{
required:
- header.required === true || header.required === 'true',
+ (header.required === true ||
+ header.required === 'true') &&
+ isApprovaler,
message: header.message || `请输入${header.name}`,
trigger: ['blur', 'change'],
}"
@@ -141,7 +162,9 @@
:prop="header.name"
:rules="{
required:
- header.required === true || header.required === 'true',
+ (header.required === true ||
+ header.required === 'true') &&
+ isApprovaler,
message: header.message || `请输入${header.name}`,
trigger: ['blur', 'change'],
}"
@@ -244,6 +267,10 @@
const userInfo = JSON.parse(sessionStorage.getItem("userInfo") || "{}");
return userInfo.userId;
},
+ isApprovaler() {
+ const userInfo = JSON.parse(sessionStorage.getItem("userInfo") || "{}");
+ return userInfo.roleType != 3; // 不是工艺工程师
+ },
},
watch: {
visible: {
@@ -297,7 +324,8 @@
if (!header.role || !Array.isArray(header.role)) {
return true;
}
- return header.role.includes(this.currentUserId);
+ const userInfo = JSON.parse(sessionStorage.getItem("userInfo") || "{}");
+ return header.role.includes(this.currentUserId) || (userInfo.roleType == 3);
},
initRules() {
// 初始化校验规则
@@ -305,12 +333,24 @@
if (this.headerList && this.headerList.length) {
this.headerList.forEach((header) => {
// 处理required可能是字符串的情况
+ const userInfo = JSON.parse(
+ sessionStorage.getItem("userInfo") || "{}"
+ );
const isRequired =
- header.required === true || header.required === "true";
+ (header.required === true || header.required === "true") &&
+ userInfo.roleType != 3;
if (isRequired) {
rules[header.name] = [
{
required: true,
+ message: header.message || `请输入${header.name}`,
+ trigger: ["blur", "change"],
+ },
+ ];
+ }else{
+ rules[header.name] = [
+ {
+ required: false,
message: header.message || `请输入${header.name}`,
trigger: ["blur", "change"],
},
@@ -357,8 +397,20 @@
if (header.type === "user") {
formData[header.name] = data[header.name] || [];
} else if (header.type === "image") {
- formData[header.name] = Array.isArray(data[header.name]) ? data[header.name] : (data[header.name] ? [data[header.name]] : []);
- this.$set(this.imageListMap, header.name, (formData[header.name] || []).map(url => ({ name: "image", url: getFullUrl(url), status: "success" })));
+ formData[header.name] = Array.isArray(data[header.name])
+ ? data[header.name]
+ : data[header.name]
+ ? [data[header.name]]
+ : [];
+ this.$set(
+ this.imageListMap,
+ header.name,
+ (formData[header.name] || []).map((url) => ({
+ name: "image",
+ url: getFullUrl(url),
+ status: "success",
+ }))
+ );
} else {
formData[header.name] = data[header.name] || "";
}
@@ -415,7 +467,7 @@
this.initFormData();
},
handleSubmit() {
- console.log('4444444444444')
+ console.log("4444444444444");
this.$refs.form.validate((valid) => {
if (valid) {
const submitData = {
@@ -472,12 +524,24 @@
this.$set(this.form, fieldName, []);
}
// 只保留 fileList 中的 url
- this.$set(this.form, fieldName, fileList.map(f => f.url ? (f.url.startsWith('http') ? f.url : getFullUrl(f.url)) : ''));
+ this.$set(
+ this.form,
+ fieldName,
+ fileList.map((f) =>
+ f.url ? (f.url.startsWith("http") ? f.url : getFullUrl(f.url)) : ""
+ )
+ );
this.$set(this.imageListMap, fieldName, fileList);
this.$refs.form && this.$refs.form.validateField(fieldName);
},
handleImageRemove(file, fileList, fieldName) {
- this.$set(this.form, fieldName, fileList.map(f => f.url ? (f.url.startsWith('http') ? f.url : getFullUrl(f.url)) : ''));
+ this.$set(
+ this.form,
+ fieldName,
+ fileList.map((f) =>
+ f.url ? (f.url.startsWith("http") ? f.url : getFullUrl(f.url)) : ""
+ )
+ );
this.$set(this.imageListMap, fieldName, fileList);
},
handlePreview(file) {
diff --git a/laboratory/src/views/chemistQa/pilotAndProduction/index.vue b/laboratory/src/views/chemistQa/pilotAndProduction/index.vue
index eb48357..e24b860 100644
--- a/laboratory/src/views/chemistQa/pilotAndProduction/index.vue
+++ b/laboratory/src/views/chemistQa/pilotAndProduction/index.vue
@@ -67,7 +67,7 @@
<el-button v-else type="text" @click="handleDetail(row)">详情</el-button>
</template>
<!-- 工艺工程师的按钮 -->
- <template v-else-if="isProcessEngineer">
+ <template v-else-if="isApprovaler">
<el-button v-if="row.status == 1" type="text" @click="handleApprove(row)">审批</el-button>
<el-button v-else type="text" @click="handleDetail(row)">详情</el-button>
</template>
@@ -139,6 +139,11 @@
isProcessEngineer() {
const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}');
return userInfo.roleType == 3; // 3是工艺工程师
+ },
+
+ isApprovaler() {
+ const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}');
+ return userInfo.roleType == 2; // 2是审批人
}
},
created() {
diff --git a/laboratory/src/views/chemistQa/productApproval/index.vue b/laboratory/src/views/chemistQa/productApproval/index.vue
index d7594e2..5ef4fad 100644
--- a/laboratory/src/views/chemistQa/productApproval/index.vue
+++ b/laboratory/src/views/chemistQa/productApproval/index.vue
@@ -66,8 +66,8 @@
</template>
<el-button v-else type="text" @click="handleDetail(row)">详情</el-button>
</template>
- <!-- 工艺工程师的按钮 -->
- <template v-else-if="isProcessEngineer">
+ <!-- 工艺工程师的按钮 --修改为审批人-->
+ <template v-else-if="isApprovaler">
<el-button v-if="row.status == 1" type="text" @click="handleApprove(row)">审批</el-button>
<el-button v-else type="text" @click="handleDetail(row)">详情</el-button>
</template>
@@ -139,6 +139,10 @@
isProcessEngineer() {
const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}');
return userInfo.roleType == 3; // 3是工艺工程师
+ },
+ isApprovaler() {
+ const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}');
+ return userInfo.roleType == 2; // 2是审批人
}
},
created() {
diff --git a/laboratory/src/views/chemistQa/projectTesting/index.vue b/laboratory/src/views/chemistQa/projectTesting/index.vue
index 8a21ab7..3582a70 100644
--- a/laboratory/src/views/chemistQa/projectTesting/index.vue
+++ b/laboratory/src/views/chemistQa/projectTesting/index.vue
@@ -159,8 +159,8 @@
<el-button v-if="currentType == 'list'" type="text"
@click="handleDetail(row)">详情</el-button>
</template>
- <!-- 工艺工程师的操作按钮 -->
- <template v-else-if="isProcessEngineer">
+ <!-- 工艺工程师的操作按钮 更改为审批人-->
+ <template v-else-if="isApprovaler">
<el-button v-if="row.status == 1" type="text" @click="handleApprove(row)">审核</el-button>
<el-button v-else type="text" @click="handleDetail(row)">详情</el-button>
</template>
diff --git a/laboratory/src/views/chemistQa/rawMaterials/index.vue b/laboratory/src/views/chemistQa/rawMaterials/index.vue
index 616902d..6eb0a73 100644
--- a/laboratory/src/views/chemistQa/rawMaterials/index.vue
+++ b/laboratory/src/views/chemistQa/rawMaterials/index.vue
@@ -66,8 +66,8 @@
</template>
<el-button v-else type="text" @click="handleDetail(row)">详情</el-button>
</template>
- <!-- 工艺工程师的按钮 -->
- <template v-else-if="isProcessEngineer">
+ <!-- 工艺工程师的按钮 -修改为审批人-->
+ <template v-else-if="isApprovaler">
<el-button v-if="row.status == 1" type="text" @click="handleApprove(row)">审批</el-button>
<el-button v-else type="text" @click="handleDetail(row)">详情</el-button>
</template>
@@ -139,6 +139,10 @@
isProcessEngineer() {
const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}');
return userInfo.roleType == 3; // 3是工艺工程师
+ },
+ isApprovaler() {
+ const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}');
+ return userInfo.roleType == 2; // 2是审批人
}
},
created() {
diff --git a/laboratory/src/views/dataManagement/originalRecordTest/components/addDialog.vue b/laboratory/src/views/dataManagement/originalRecordTest/components/addDialog.vue
index bac62ef..df5f698 100644
--- a/laboratory/src/views/dataManagement/originalRecordTest/components/addDialog.vue
+++ b/laboratory/src/views/dataManagement/originalRecordTest/components/addDialog.vue
@@ -269,21 +269,20 @@
handleSubmit() {
this.$refs.form.validate((valid) => {
if (valid) {
- console.log('this.form.dataType',this.form.dataType,'this.photoList',this.photoList,'this.spectrumList',this.spectrumList)
- if (
- this.form.dataType.includes("1") &&
- (!this.photoList || !this.photoList.length)
- ) {
- this.$message.error("请上传检测照片");
- return;
- }
- if (
- this.form.dataType.includes("2") &&
- (!this.spectrumList || !this.spectrumList.length)
- ) {
- this.$message.error("请上传检测图谱");
- return;
- }
+ // if (
+ // this.form.dataType.includes("1") &&
+ // (!this.photoList || !this.photoList.length)
+ // ) {
+ // this.$message.error("请上传检测照片");
+ // return;
+ // }
+ // if (
+ // this.form.dataType.includes("2") &&
+ // (!this.spectrumList || !this.spectrumList.length)
+ // ) {
+ // this.$message.error("请上传检测图谱");
+ // return;
+ // }
const submitData = {
...this.form,
// 确保 dataType 在提交时转换为字符串
diff --git a/laboratory/src/views/dataManagement/originalRecordTest/list.vue b/laboratory/src/views/dataManagement/originalRecordTest/list.vue
index c708cd7..f174ded 100644
--- a/laboratory/src/views/dataManagement/originalRecordTest/list.vue
+++ b/laboratory/src/views/dataManagement/originalRecordTest/list.vue
@@ -56,7 +56,6 @@
<template #table>
<el-table-column prop="projectName" label="所属项目课题方案"></el-table-column>
<el-table-column prop="originalCode" label="原始检验记录编号"></el-table-column>
-
<el-table-column prop="experimentCode" label="所属实验编号"></el-table-column>
<el-table-column prop="experimentName" label="实验名称"></el-table-column>
<el-table-column prop="termCode" label="检测项编号"></el-table-column>
diff --git a/laboratory/src/views/dataManagement/originalRecordTest/service.js b/laboratory/src/views/dataManagement/originalRecordTest/service.js
index 4fc53e7..ea1b8ff 100644
--- a/laboratory/src/views/dataManagement/originalRecordTest/service.js
+++ b/laboratory/src/views/dataManagement/originalRecordTest/service.js
@@ -13,3 +13,4 @@
export const update = (data) => {
return axios.post('/api/t-test-method-confirm-sheet-original/update', { ...data })
}
+// 1947497725527871489
\ No newline at end of file
diff --git a/laboratory/src/views/dataManagement/sampleSubmissionList/components/receiveConfirmDialog.vue b/laboratory/src/views/dataManagement/sampleSubmissionList/components/receiveConfirmDialog.vue
index 2f84106..6056c3b 100644
--- a/laboratory/src/views/dataManagement/sampleSubmissionList/components/receiveConfirmDialog.vue
+++ b/laboratory/src/views/dataManagement/sampleSubmissionList/components/receiveConfirmDialog.vue
@@ -8,10 +8,44 @@
@close="handleClose"
>
<div class="receive-dialog">
+ <!-- 人员选择区域 -->
+ <div class="personnel-selection" v-if="personnelList.length > 0">
+ <div class="personnel-table">
+ <el-table
+ ref="personnelTable"
+ :data="personnelList"
+ style="width: 100%"
+ border
+ size="small"
+ @row-click="handlePersonnelRowClick"
+ :row-class-name="getPersonnelRowClassName"
+ @selection-change="handleSelectionChange"
+ >
+ <el-table-column type="index" width="55" align="center" label="编号"></el-table-column>
+ <el-table-column prop="nickName" label="化验师姓名" min-width="120" align="center">
+ <template slot-scope="scope">
+ <span>{{ scope.row.nickName }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column prop="id" label="操作" min-width="120" align="center">
+ <template slot-scope="scope">
+ <!-- <el-radio v-model="selectedPersonnelId" :label="scope.row.nickName"></el-radio> -->
+ <el-checkbox :value="selectedPersonnelId ==scope.row.id"></el-checkbox>
+ </template>
+ </el-table-column>
+ <!-- <el-table-column prop="id" label="人员ID" min-width="120" align="center">
+ <template slot-scope="scope">
+ <span>{{ scope.row.id }}</span>
+ </template>
+ </el-table-column> -->
+ </el-table>
+ </div>
+ </div>
+
<div class="receive-tip">
您已选中 <span class="sample-count">{{ sampleCount }}</span> 条样品发送,请签字确认
</div>
-
+
<div class="approval-dialog-approve">
<div class="add-group">
<div>*</div>
@@ -29,7 +63,7 @@
<div slot="footer" class="dialog-footer select-member-footer">
<el-button @click="handleClose">取 消</el-button>
- <el-button type="primary" @click="handleConfirm" :disabled="!imgSrc">
+ <el-button type="primary" @click="handleConfirm" :disabled="!selectedPersonnelId || !imgSrc">
确认发送
</el-button>
</div>
@@ -61,11 +95,19 @@
type: Number,
default: 1,
},
+ personnelList: {
+ type: Array,
+ default: () => [],
+ validator: (value) => {
+ return value.every(item => item.id && item.nickName)
+ }
+ },
},
data() {
return {
signatureDialogVisible: false,
imgSrc: "",
+ selectedPersonnelId: null,
};
},
methods: {
@@ -91,13 +133,45 @@
this.imgSrc = imageData;
});
},
+ handlePersonnelRowClick(row, column, event) {
+ // 当点击表格行时,设置为选中状态
+ this.$refs.personnelTable.clearSelection();
+ this.$refs.personnelTable.toggleRowSelection(row);
+ this.selectedPersonnelId = row.id;
+ },
+ getPersonnelRowClassName({ row }) {
+ // 根据是否选中来设置行样式
+ return row.id === this.selectedPersonnelId ? 'selected-personnel' : '';
+ },
+ handleSelectionChange(selection) {
+ // 当radio选择改变时,更新选中的人员
+ if (selection && selection.id) {
+ this.selectedPersonnelId = selection.id;
+ } else {
+ this.selectedPersonnelId = null;
+ }
+ },
handleConfirm() {
+ if (!this.selectedPersonnelId) {
+ this.$message.warning("请先选择接收人员");
+ return;
+ }
if (!this.imgSrc) {
this.$message.warning("请先完成签名确认");
return;
}
- this.$emit("confirm", this.imgSrc);
+
+ this.$emit("confirm", {
+ personnelId: this.selectedPersonnelId,
+ personnelName: this.personnelList.find(p => p.id === this.selectedPersonnelId)?.name || '',
+ imgSrc: this.imgSrc
+ });
this.handleClose();
+ },
+ handleClose() {
+ this.$emit("update:visible", false);
+ this.imgSrc = "";
+ this.selectedPersonnelId = null; // 清空选中的人员
},
},
};
@@ -151,6 +225,56 @@
}
}
+.personnel-selection {
+ margin-bottom: 20px;
+}
+
+.personnel-table {
+ padding-left: 25px;
+ margin-bottom: 19px;
+
+ ::v-deep .el-table {
+ border-radius: 4px;
+
+ .el-table__header-wrapper {
+ thead {
+ th {
+ background-color: #f5f7fa;
+ color: #606266;
+ font-weight: 500;
+ font-size: 13px;
+ border-color: #ebeef5;
+ }
+ }
+ }
+
+ .el-table__body-wrapper {
+ tbody {
+ td {
+ border-color: #ebeef5;
+ font-size: 13px;
+
+ &.cell {
+ padding: 8px 0;
+ }
+ }
+
+ .selected-personnel {
+ background-color: #ecf5ff;
+ }
+
+ tr:hover {
+ background-color: #f5f7fa;
+ }
+
+ tr.selected-personnel:hover {
+ background-color: #ecf5ff;
+ }
+ }
+ }
+ }
+}
+
.dialog-footer {
align-items: center;
display: flex;
diff --git a/laboratory/src/views/dataManagement/sampleSubmissionList/submission.vue b/laboratory/src/views/dataManagement/sampleSubmissionList/submission.vue
index 9ebb062..cf6a8da 100644
--- a/laboratory/src/views/dataManagement/sampleSubmissionList/submission.vue
+++ b/laboratory/src/views/dataManagement/sampleSubmissionList/submission.vue
@@ -4,15 +4,43 @@
<img src="@/assets/public/headercard.png" />
<div>所属实验调度</div>
</div>
- <Table :data="schedulingData" :total="0" :height="null" >
+ <Table :data="schedulingData" :total="0" :height="null">
<template>
- <el-table-column prop="projectName" label="所属项目课题方案" width="200"></el-table-column>
- <el-table-column prop="experimentCode" label="实验编号" width="200"></el-table-column>
- <el-table-column prop="experimentName" label="实验名称" width="200"></el-table-column>
- <el-table-column prop="experimentDate" label="通知时间" width="200"></el-table-column>
- <el-table-column prop="experimentStartTime" label="实验开始时间" width="200"></el-table-column>
- <el-table-column prop="experimentEndTime" label="实验结束时间" width="200"></el-table-column>
- <el-table-column prop="participantsName" label="参加人员" width="200"></el-table-column>
+ <el-table-column
+ prop="projectName"
+ label="所属项目课题方案"
+ width="200"
+ ></el-table-column>
+ <el-table-column
+ prop="experimentCode"
+ label="实验编号"
+ width="200"
+ ></el-table-column>
+ <el-table-column
+ prop="experimentName"
+ label="实验名称"
+ width="200"
+ ></el-table-column>
+ <el-table-column
+ prop="experimentDate"
+ label="通知时间"
+ width="200"
+ ></el-table-column>
+ <el-table-column
+ prop="experimentStartTime"
+ label="实验开始时间"
+ width="200"
+ ></el-table-column>
+ <el-table-column
+ prop="experimentEndTime"
+ label="实验结束时间"
+ width="200"
+ ></el-table-column>
+ <el-table-column
+ prop="participantsName"
+ label="参加人员"
+ width="200"
+ ></el-table-column>
<el-table-column prop="status" label="状态" width="150">
<template slot-scope="scope">
<el-tag :type="getStatusType(scope.row.status)">
@@ -36,49 +64,142 @@
{{ showAdditives ? "收起辅料详情" : "展开辅料详情" }}
</el-button>
</div>
- <div class="sample-code">取样单编号:{{ form.sampleCode || 'DD-25010BS01' }}</div>
-
+ <div class="sample-code">
+ 取样单编号:{{ form.sampleCode || "DD-25010BS01" }}
+ </div>
+
<div class="sample-table">
<div class="table-header">
- <el-button type="primary" class="batch-send" @click="handleBatchSend">批量发送</el-button>
+ <el-button type="primary" class="batch-send" @click="handleBatchSend"
+ >批量发送</el-button
+ >
</div>
- <Table :data="sampleList" :total="sampleTotal" :height="null"
- @selection-change="handleSelectionChange">
+ <Table
+ :data="sampleList"
+ :total="sampleTotal"
+ :height="null"
+ @selection-change="handleSelectionChange"
+ >
<template>
- <el-table-column type="selection" width="55" :selectable="isSelectable"></el-table-column>
- <el-table-column type="index" label="序号" width="80"></el-table-column>
- <el-table-column prop="processTime" label="工艺时间" width="120"></el-table-column>
- <el-table-column prop="samplingName" label="取样名称" width="150"></el-table-column>
- <el-table-column prop="sampleCode" label="取样样品编号" width="150"></el-table-column>
- <el-table-column prop="temperature" label="温度" width="100"></el-table-column>
- <el-table-column prop="samplePh" label="PH" width="100"></el-table-column>
- <el-table-column prop="waterAddition" label="加水量" width="100"></el-table-column>
+ <el-table-column
+ type="selection"
+ width="55"
+ :selectable="isSelectable"
+ ></el-table-column>
+ <el-table-column
+ type="index"
+ label="序号"
+ width="80"
+ ></el-table-column>
+ <el-table-column
+ prop="processTime"
+ label="工艺时间"
+ width="120"
+ ></el-table-column>
+ <el-table-column
+ prop="samplingName"
+ label="取样名称"
+ width="150"
+ ></el-table-column>
+ <el-table-column
+ prop="sampleCode"
+ label="取样样品编号"
+ width="150"
+ ></el-table-column>
+ <el-table-column
+ prop="temperature"
+ label="温度"
+ width="100"
+ ></el-table-column>
+ <el-table-column
+ prop="samplePh"
+ label="PH"
+ width="100"
+ ></el-table-column>
+ <el-table-column
+ prop="waterAddition"
+ label="加水量"
+ width="100"
+ ></el-table-column>
<template v-if="showAdditives">
- <el-table-column prop="addAuxiliaryOne" label="加辅1" width="150"></el-table-column>
- <el-table-column prop="addAuxiliaryTwo" label="加辅2" width="150"></el-table-column>
- <el-table-column prop="addAuxiliaryThree" label="加辅3" width="150"></el-table-column>
- <el-table-column prop="addAuxiliaryFour" label="加辅4" width="150"></el-table-column>
- <el-table-column prop="addAuxiliaryFive" label="加辅5" width="150"></el-table-column>
- <el-table-column prop="addAuxiliarySix" label="加辅6" width="150"></el-table-column>
- <el-table-column prop="addAuxiliarySeven" label="加辅7" width="150"></el-table-column>
- <el-table-column prop="addAuxiliaryEight" label="加辅8" width="150"></el-table-column>
- <el-table-column prop="addAuxiliaryNine" label="加辅9" width="150"></el-table-column>
- <el-table-column prop="addAuxiliaryTen" label="加辅10" width="150"></el-table-column>
+ <el-table-column
+ prop="addAuxiliaryOne"
+ label="加辅1"
+ width="150"
+ ></el-table-column>
+ <el-table-column
+ prop="addAuxiliaryTwo"
+ label="加辅2"
+ width="150"
+ ></el-table-column>
+ <el-table-column
+ prop="addAuxiliaryThree"
+ label="加辅3"
+ width="150"
+ ></el-table-column>
+ <el-table-column
+ prop="addAuxiliaryFour"
+ label="加辅4"
+ width="150"
+ ></el-table-column>
+ <el-table-column
+ prop="addAuxiliaryFive"
+ label="加辅5"
+ width="150"
+ ></el-table-column>
+ <el-table-column
+ prop="addAuxiliarySix"
+ label="加辅6"
+ width="150"
+ ></el-table-column>
+ <el-table-column
+ prop="addAuxiliarySeven"
+ label="加辅7"
+ width="150"
+ ></el-table-column>
+ <el-table-column
+ prop="addAuxiliaryEight"
+ label="加辅8"
+ width="150"
+ ></el-table-column>
+ <el-table-column
+ prop="addAuxiliaryNine"
+ label="加辅9"
+ width="150"
+ ></el-table-column>
+ <el-table-column
+ prop="addAuxiliaryTen"
+ label="加辅10"
+ width="150"
+ ></el-table-column>
</template>
- <el-table-column prop="sampleAmount" label="取样量" width="100"></el-table-column>
+ <el-table-column
+ prop="sampleAmount"
+ label="取样量"
+ width="100"
+ ></el-table-column>
<el-table-column prop="pictures" label="拍照" width="100">
<template slot-scope="scope">
<el-image
- v-for="(url, index) in scope.row.pictures.split(',')"
+ v-for="(url, index) in scope.row.pictures.split(',')"
:key="index"
:src="getFullUrl(url)"
:preview-src-list="[getFullUrl(url)]"
- style="width: 50px; height: 50px;"
+ style="width: 50px; height: 50px"
/>
</template>
</el-table-column>
- <el-table-column prop="handlePersonName" label="操作人员" width="100"></el-table-column>
- <el-table-column prop="status" label="状态" width="100" fixed="right">
+ <el-table-column
+ prop="handlePersonName"
+ label="操作人员"
+ width="100"
+ ></el-table-column>
+ <el-table-column
+ prop="status"
+ label="状态"
+ width="100"
+ fixed="right"
+ >
<template slot-scope="scope">
<el-tag :type="getSampleStatusType(scope.row.status)">
{{ getSampleStatusText(scope.row.status) }}
@@ -87,7 +208,12 @@
</el-table-column>
<el-table-column label="操作" width="100" fixed="right">
<template slot-scope="scope">
- <el-button type="text" @click="handleSend(scope.row)" v-if="scope.row.status == '1'">发送</el-button>
+ <el-button
+ type="text"
+ @click="handleSend(scope.row)"
+ v-if="scope.row.status == '1'"
+ >发送</el-button
+ >
</template>
</el-table-column>
</template>
@@ -98,20 +224,26 @@
<receive-confirm-dialog
:visible.sync="showReceiveConfirm"
:sample-count="selectedSamples.length"
+ :personnelList="peopleList"
@confirm="confirmSend"
/>
</Card>
</template>
<script>
-import ReceiveConfirmDialog from './components/receiveConfirmDialog.vue'
-import { getDetail, commitRecord, batchSendSamples, sendSample } from './service'
-import {getFullUrl} from '@/utils/utils'
+import ReceiveConfirmDialog from "./components/receiveConfirmDialog.vue";
+import {
+ getDetail,
+ commitRecord,
+ batchSendSamples,
+ sendSample,
+} from "./service";
+import { getFullUrl } from "@/utils/utils";
export default {
name: "SampleSubmission",
components: {
- ReceiveConfirmDialog
+ ReceiveConfirmDialog,
},
data() {
return {
@@ -127,27 +259,28 @@
sampleTotal: 0,
selectedSamples: [],
statusTypeMap: {
- '-1': 'info',
- '1': 'warning',
- '2': 'success',
- '3': 'info'
+ "-1": "info",
+ 1: "warning",
+ 2: "success",
+ 3: "info",
},
statusTextMap: {
- '-1': '草稿箱',
- '1': '待提交',
- '2': '已提交',
- '3': '已封存'
+ "-1": "草稿箱",
+ 1: "待提交",
+ 2: "已提交",
+ 3: "已封存",
},
sampleStatusTypeMap: {
- '1': 'warning',
- '2': 'info',
- '3': 'success'
+ 1: "warning",
+ 2: "info",
+ 3: "success",
},
sampleStatusTextMap: {
- '1': '待发送',
- '2': '待接收',
- '3': '已接收'
- }
+ 1: "待发送",
+ 2: "待接收",
+ 3: "已接收",
+ },
+ peopleList: [],
};
},
created() {
@@ -156,20 +289,25 @@
this.getDetailData();
}
},
- methods: {getFullUrl,
+ methods: {
+ getFullUrl,
async getDetailData() {
try {
const res = await getDetail({ id: this.id });
if (res) {
this.schedulingData = [res.experimentDispatch] || [];
+ this.peopleList =
+ (res.experimentDispatch &&
+ res.experimentDispatch.experimentDispatchParticipantChemists) ||
+ [];
this.schedulingTotal = this.schedulingData.length;
- this.form.sampleCode = res.samplingCode || '';
+ this.form.sampleCode = res.samplingCode || "";
this.sampleList = res.samplingRecordOperations || [];
this.sampleTotal = this.sampleList.length;
}
} catch (error) {
- console.error('获取详情失败:', error);
- this.$message.error('获取详情失败');
+ console.error("获取详情失败:", error);
+ this.$message.error("获取详情失败");
}
},
handleSelectionChange(selection) {
@@ -181,49 +319,57 @@
},
async handleBatchSend() {
if (this.selectedSamples.length == 0) {
- this.$message.warning('请先选择要发送的样品');
+ this.$message.warning("请先选择要发送的样品");
return;
}
this.showReceiveConfirm = true;
},
- async confirmSend(signature) {
+ async confirmSend(params) {
try {
- const recordOperationIds = this.selectedSamples.map(item => item.id);
- const res = await batchSendSamples({
- recordOperationId: recordOperationIds,
- sendSign: signature
+ let recordOperationIds = [];
+ this.selectedSamples.forEach((item) => {
+ recordOperationIds.push({
+ id: item.id,
+ sendSign: params.imgSrc,
+ receiptsPersonId: params.personnelId,
+ });
+ });
+ const res = await batchSendSamples({
+ recordOperationList:recordOperationIds
});
if (res.code == 200) {
- this.$message.success(`成功发送 ${this.selectedSamples.length} 个样品`);
+ this.$message.success(
+ `成功发送 ${this.selectedSamples.length} 个样品`
+ );
this.selectedSamples = [];
this.showReceiveConfirm = false;
// 刷新数据
this.getDetailData();
} else {
- this.$message.error(res.msg || '发送失败');
+ this.$message.error(res.msg || "发送失败");
}
} catch (error) {
- console.error('发送失败:', error);
- this.$message.error('发送失败');
+ console.error("发送失败:", error);
+ this.$message.error("发送失败");
}
},
getStatusType(status) {
- return this.statusTypeMap[status] || 'info';
+ return this.statusTypeMap[status] || "info";
},
getStatusText(status) {
- return this.statusTextMap[status] || '未知状态';
+ return this.statusTextMap[status] || "未知状态";
},
isSelectable(row) {
- return row.status == '1';
+ return row.status == "1";
},
getSampleStatusType(status) {
- return this.sampleStatusTypeMap[status] || 'info';
+ return this.sampleStatusTypeMap[status] || "info";
},
getSampleStatusText(status) {
- return this.sampleStatusTextMap[status] || '未知状态';
+ return this.sampleStatusTextMap[status] || "未知状态";
},
- }
+ },
};
</script>
@@ -239,7 +385,8 @@
height: 19px;
}
- div, span {
+ div,
+ span {
flex-shrink: 0;
font-weight: bold;
font-size: 18px;
@@ -264,7 +411,7 @@
font-family: PingFangSC, PingFang SC;
font-weight: 400;
font-size: 14px;
- color: rgba(0,0,0,0.88);
+ color: rgba(0, 0, 0, 0.88);
margin: 20px 0;
}
diff --git a/laboratory/src/views/dataManagement/schemeManagement/addPlan.vue b/laboratory/src/views/dataManagement/schemeManagement/addPlan.vue
index ab8bbfa..2f41653 100644
--- a/laboratory/src/views/dataManagement/schemeManagement/addPlan.vue
+++ b/laboratory/src/views/dataManagement/schemeManagement/addPlan.vue
@@ -569,18 +569,18 @@
formData.experimentMaterial = JSON.stringify(
this.form.experimentMaterial
);
-
// 编辑模式下添加id参数
if (this.editId) {
formData.id = this.editId;
}
// 根据是否为编辑模式调用不同接口
- const apiCall = (this.editId && !this.isEdit)
- ? update(formData)
- : this.isEdit
- ? updateTester(formData)
- : add(formData);
+ const apiCall =
+ this.editId && !this.isEdit
+ ? update(formData)
+ : this.isEdit
+ ? updateTester(formData)
+ : add(formData);
apiCall
.then((res) => {
@@ -589,10 +589,10 @@
status === 1 ? "保存成功" : "草稿保存成功"
);
this.$router.back();
- this.$store.commit(
- "SET_TAGLIST",
- this.tagList.filter((item) => item.path !== this.$route.path)
- );
+ this.$store.commit(
+ "SET_TAGLIST",
+ this.tagList.filter((item) => item.path !== this.$route.path)
+ );
} else {
this.$message.error(
res.msg || (status === 1 ? "保存失败" : "草稿保存失败")
@@ -660,14 +660,40 @@
function checkDynamicComponentTables(list, label) {
if (!Array.isArray(list)) return true;
for (const comp of list) {
- if (comp.type === 'customTable') {
- if (!comp.data || !Array.isArray(comp.data.headers) || comp.data.headers.length === 0) {
+ console.log(
+ "校验 DynamicComponent 里的表格 校验 DynamicComponent 里的表格",
+ comp
+ );
+ if (comp.type === "customTable") {
+ if (
+ !comp.data ||
+ !Array.isArray(comp.data.headers) ||
+ comp.data.headers.length === 0
+ ) {
this.$message.error(`${label}中有表格未添加表头`);
return false;
}
if (!Array.isArray(comp.data.rows) || comp.data.rows.length === 0) {
this.$message.error(`${label}中有表格未添加数据`);
return false;
+ }
+ if (this.userRole != 3) {
+ let status = true;
+ let errText=[]
+ comp.data.headers.forEach((header, index) => {
+ if ( header.required==true || header.required=="true" ) {
+ comp.data.rows.forEach((row, rowIndex) => {
+ if(!row[header.name]){
+ status = false;
+ errText.push(`${label}的第${rowIndex + 1}条数据的${header.name}未填写`)
+ }
+ });
+ }
+ });
+ if(!status){
+ this.$message.error( errText.join(';') );
+ }
+ return status;
}
}
}
@@ -678,7 +704,13 @@
this.$message.error("请添加实验材料");
return false;
}
- if (!checkDynamicComponentTables.call(this, this.form.experimentMaterial, '实验材料')) {
+ if (
+ !checkDynamicComponentTables.call(
+ this,
+ this.form.experimentMaterial,
+ "实验材料"
+ )
+ ) {
return false;
}
// 校验实验设备
@@ -686,7 +718,13 @@
this.$message.error("请添加实验设备");
return false;
}
- if (!checkDynamicComponentTables.call(this, this.form.experimentDevice, '实验设备')) {
+ if (
+ !checkDynamicComponentTables.call(
+ this,
+ this.form.experimentDevice,
+ "实验设备"
+ )
+ ) {
return false;
}
// 校验实验步骤记录
@@ -701,7 +739,13 @@
this.$message.error(`请完善第${i + 1}个步骤的内容`);
return false;
}
- if (!checkDynamicComponentTables.call(this, step.content, `第${i + 1}个步骤`)) {
+ if (
+ !checkDynamicComponentTables.call(
+ this,
+ step.content,
+ `第${i + 1}个步骤`
+ )
+ ) {
return false;
}
}
@@ -776,18 +820,20 @@
} catch (err) {
console.error("获取组别列表失败:", err);
}
- getParticipantsByDispatchId({ dispatchId: data.experimentDispatch.id })
- .then((res) => {
- if (res) {
- this.participantsData = res || [];
- } else {
- this.$message.error(res.msg || "获取参加人员列表失败");
- }
+ getParticipantsByDispatchId({
+ dispatchId: data.experimentDispatch.id,
})
- .catch((err) => {
- this.$message.error("获取参加人员列表失败");
- console.error("获取参加人员列表失败:", err);
- });
+ .then((res) => {
+ if (res) {
+ this.participantsData = res || [];
+ } else {
+ this.$message.error(res.msg || "获取参加人员列表失败");
+ }
+ })
+ .catch((err) => {
+ this.$message.error("获取参加人员列表失败");
+ console.error("获取参加人员列表失败:", err);
+ });
}
// 填充参与人员
@@ -1202,14 +1248,18 @@
margin-bottom: 20px;
width: 95%;
display: flex;
+
.content-box-left {
flex: 1;
+
div {
padding: 10px 0;
}
}
+
.content-box-right {
flex: 1;
+
div {
padding: 10px 0;
}
diff --git a/laboratory/src/views/dataManagement/testResultReport/components/record-detail.vue b/laboratory/src/views/dataManagement/testResultReport/components/record-detail.vue
new file mode 100644
index 0000000..8773af7
--- /dev/null
+++ b/laboratory/src/views/dataManagement/testResultReport/components/record-detail.vue
@@ -0,0 +1,756 @@
+<template>
+ <div>
+ <el-dialog
+ title="原始检验记录详情"
+ :visible="dialogVisible"
+ width="90%"
+ top="5vh"
+ :close-on-click-modal="false"
+ @close="handleClose"
+ >
+ <div class="approval-content">
+ <el-form
+ ref="form"
+ :model="form"
+ :rules="rules"
+ inline
+ label-position="top"
+ >
+ <div style="padding-left: 25px">
+ <el-form-item prop="originalCode" label="原始检验记录编号">
+ <el-input
+ v-model="form.originalCode"
+ placeholder="请输入"
+ disabled
+ />
+ </el-form-item>
+ </div>
+
+ <div class="header-title" style="margin-bottom: 38px">
+ <div class="header-title-left">
+ <img src="@/assets/public/headercard.png" />
+ <span>检测项信息</span>
+ </div>
+ </div>
+ <div style="padding-left: 25px">
+ <el-form-item prop="termName" label="检测项名字">
+ <el-input v-model="form.termName" placeholder="请输入" disabled />
+ </el-form-item>
+ <el-form-item prop="termCode" label="检测项编号">
+ <el-input v-model="form.termCode" placeholder="请输入" disabled />
+ </el-form-item>
+ <el-form-item prop="termMethod" label="检测方法名字">
+ <el-input
+ v-model="form.termMethod"
+ placeholder="请输入"
+ disabled
+ />
+ </el-form-item>
+ <el-form-item prop="termMethodCode" label="检测方法编号">
+ <el-input
+ v-model="form.termMethodCode"
+ placeholder="请输入"
+ disabled
+ />
+ </el-form-item>
+ </div>
+
+ <div class="header-title" style="margin-bottom: 38px">
+ <div class="header-title-left">
+ <img src="@/assets/public/headercard.png" />
+ <div>一 、检测标准</div>
+ </div>
+ </div>
+ <AiEditor
+ ref="standardEditor"
+ :value="editorContents.termStandard"
+ height="400px"
+ style="margin: 20px 0"
+ placeholder="请输入检测标准..."
+ :readOnly="isDetail"
+ />
+
+ <div class="header-title" style="margin-bottom: 38px">
+ <div class="header-title-left">
+ <img src="@/assets/public/headercard.png" />
+ <div>二 、检测仪器</div>
+ </div>
+ </div>
+ <AiEditor
+ ref="instrumentEditor"
+ :value="editorContents.termInstrument"
+ height="400px"
+ style="margin: 20px 0"
+ placeholder="请输入检测仪器..."
+ :readOnly="isDetail"
+ />
+
+ <div class="header-title" style="margin-bottom: 38px">
+ <div class="header-title-left">
+ <img src="@/assets/public/headercard.png" />
+ <div>三 、检测试剂</div>
+ </div>
+ </div>
+ <AiEditor
+ ref="reagentEditor"
+ :value="editorContents.termReagent"
+ height="400px"
+ style="margin: 20px 0"
+ placeholder="请输入检测试剂..."
+ :readOnly="isDetail"
+ />
+
+ <div class="header-title" style="margin-bottom: 38px">
+ <div class="header-title-left">
+ <img src="@/assets/public/headercard.png" />
+ <div>四 、检测步骤</div>
+ </div>
+ </div>
+ <AiEditor
+ ref="stepsEditor"
+ :value="editorContents.termStep"
+ height="400px"
+ style="margin: 20px 0"
+ placeholder="请输入检测步骤..."
+ :readOnly="isDetail"
+ />
+
+ <div class="header-title" style="margin-bottom: 38px">
+ <div class="header-title-left">
+ <img src="@/assets/public/headercard.png" />
+ <div>五 、检测数据及参照</div>
+ </div>
+ <el-button
+ v-if="!isDetail"
+ type="primary"
+ class="el-icon-plus"
+ @click="handleAddTask"
+ >添加检测数据</el-button
+ >
+ </div>
+
+ <Table
+ :data="taskTableData"
+ :total="allTaskTableData.length"
+ :height="null"
+ :queryForm="{ pageNum: currentPage, pageSize: pageSize }"
+ :disAblePagination="true"
+ @handleCurrentChange="handleCurrentChange"
+ class="rwuTable"
+ >
+ <el-table-column
+ type="index"
+ label="序号"
+ width="80"
+ ></el-table-column>
+ <el-table-column
+ prop="sampleCode"
+ label="检测样编号"
+ ></el-table-column>
+ <el-table-column prop="testData" label="检测数据"></el-table-column>
+ <el-table-column
+ prop="createTime"
+ label="检测时间"
+ width="180"
+ ></el-table-column>
+ <el-table-column label="检测图片" width="200">
+ <template slot-scope="scope">
+ <div
+ class="image-preview"
+ v-if="scope.row.photos && scope.row.photos.length"
+ >
+ <el-image
+ v-for="(photo, index) in scope.row.photos"
+ :key="index"
+ :src="photo.url"
+ :preview-src-list="getPhotoUrls(scope.row.photos)"
+ fit="cover"
+ class="preview-image"
+ >
+ <div slot="error" class="image-slot">
+ <i class="el-icon-picture-outline"></i>
+ </div>
+ </el-image>
+ </div>
+ <span v-else>无图片</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="检测图谱" width="200">
+ <template slot-scope="scope">
+ <div v-if="scope.row.spectrums && scope.row.spectrums.length">
+ <el-link
+ v-for="(spectrum, index) in scope.row.spectrums"
+ :key="index"
+ type="primary"
+ :href="spectrum.url"
+ target="_blank"
+ class="spectrum-link"
+ >
+ {{ spectrum.name }}
+ </el-link>
+ </div>
+ <span v-else>无图谱</span>
+ </template>
+ </el-table-column>
+
+ <!-- <el-table-column v-if="!isDetail" label="操作" width="150">
+ <template slot-scope="scope">
+ <el-button type="text" @click="handleEditTask(scope.row)"
+ >编辑</el-button
+ >
+ <el-button type="text" @click="handleDeleteTask(scope.row)"
+ >删除</el-button
+ >
+ </template>
+ </el-table-column> -->
+ </Table>
+
+ <div class="header-title">
+ <div class="header-title-left">
+ <img src="@/assets/public/headercard.png" />
+ <div>六 、检测结果运算</div>
+ </div>
+ </div>
+ <AiEditor
+ ref="resultCalculationEditor"
+ :value="editorContents.termResult"
+ height="400px"
+ style="margin: 20px 0"
+ placeholder="请输入检测结果运算..."
+ :readOnly="isDetail"
+ />
+ <Table
+ :data="taskTableData"
+ :total="allTaskTableData.length"
+ :height="null"
+ class="rwuTable"
+ :queryForm="{ pageNum: currentPage, pageSize: pageSize }"
+ :disAblePagination="true"
+ @handleCurrentChange="handleCurrentChange"
+ >
+ <el-table-column
+ type="index"
+ label="序号"
+ width="80"
+ ></el-table-column>
+ <el-table-column
+ prop="sampleCode"
+ label="检测样编号"
+ ></el-table-column>
+ <el-table-column prop="testData" label="检测数据"></el-table-column>
+ <el-table-column label="检测结果">
+ <template slot-scope="scope">
+ <el-input
+ v-model="scope.row.resultText"
+ placeholder="请输入检测结果"
+ :disabled="isDetail"
+ ></el-input>
+ </template>
+ </el-table-column>
+ </Table>
+ </el-form>
+ </div>
+ </el-dialog>
+ </div>
+</template>
+
+<script>
+import AiEditor from "@/components/AiEditor";
+import { getExperimentDetail, getRecordDetail } from "../service";
+import moment from 'moment'
+import { mapState } from "vuex";
+
+export default {
+ name: "ApprovalDialog",
+ components: {
+ AiEditor,
+ },
+ props: {
+ visible: {
+ type: Boolean,
+ default: false,
+ },
+ type: {
+ type: String,
+ default: "approve", // approve-审批,view-查看
+ },
+ data: {
+ type: Object,
+ default: () => ({}),
+ },
+ },
+ data() {
+ return {
+
+ isDetail: true,
+ dialogVisible: false,
+ form: {
+ id: '',
+ originalCode: '',
+ termName: '',
+ termCode: '',
+ termMethod: '',
+ termMethodCode: '',
+ status: 1,
+ termStandard: '',
+ termInstrument: '',
+ termReagent: '',
+ termStep: '',
+ termResult: ''
+ },
+ editorContents: {
+ termStandard: '',
+ termInstrument: '',
+ termReagent: '',
+ termStep: '',
+ termResult: ''
+ },
+ rules: {
+ termName: [{ required: true, message: "请输入检测项名字", trigger: "blur" }],
+ termCode: [{ required: true, message: "请输入检测项编号", trigger: "blur" }],
+ experimentName: [{ required: true, message: "请输入检测方法名字", trigger: "blur" }],
+ experimentCode: [{ required: true, message: "请输入检测方法编号", trigger: "blur" }]
+ },
+ currentPage: 1,
+ pageSize: 15,
+ allTaskTableData: [],
+ taskTableData: [],
+ };
+ },
+ watch: {
+ visible: {
+ handler(val) {
+ this.dialogVisible = val;
+ if (val && this.data && this.data.id) {
+ console.log('111111111111111111',this.data.id)
+ // 弹窗打开时,确保数据已获取
+ this.getDetail(this.data.id);
+ }
+ },
+ immediate: true,
+ },
+ },
+ methods: {
+ getPhotoUrls(photos) {
+ return photos.map(photo => photo.url);
+ },
+ updateTableData() {
+ const start = (this.currentPage - 1) * this.pageSize;
+ const end = this.currentPage * this.pageSize;
+ this.taskTableData = this.allTaskTableData.slice(start, end);
+ },
+ handleCurrentChange(page) {
+ this.currentPage = page;
+ this.updateTableData();
+ },
+ handleClose() {
+ this.$emit('update:visible', false);
+ },
+ // 获取详情
+ getDetail(id) {
+ if (id) {
+ getRecordDetail({ id }).then(res => {
+ if (res) {
+ const data = res;
+ // 设置表单数据
+ this.form = {
+ ...data,
+ termCode: data.testMethodConfirmSheetTerm.termCode || '',
+ termName: data.testMethodConfirmSheetTerm.termName || '',
+ termMethod: data.testMethodConfirmSheetTerm.termMethod || '',
+ termMethodCode: data.testMethodConfirmSheetTerm.termMethodCode || '',
+ termStandard: data.termStandard || '',
+ termInstrument: data.termInstrument || '',
+ termReagent: data.termReagent || '',
+ termStep: data.termStep || '',
+ termResult: data.termResult || ''
+ };
+ // 设置编辑器内容
+ this.editorContents = {
+ termStandard: data.termStandard || '',
+ termInstrument: data.termInstrument || '',
+ termReagent: data.termReagent || '',
+ termStep: data.termStep || '',
+ termResult: data.termResult || ''
+ };
+ // 设置检测数据表格
+ if (data.testMethodConfirmSheetOriginalDataList && data.testMethodConfirmSheetOriginalDataList.length > 0) {
+ this.allTaskTableData = data.testMethodConfirmSheetOriginalDataList.map(item => ({
+ sampleCode: item.dataCode || '',
+ testData: item.dataTitle || '',
+ resultText: item.resultText || '',
+ photos: item.dataPictures ? item.dataPictures.split(',').map(url => ({ url })) : [],
+ spectrums: item.dataFiles ? JSON.parse(item.dataFiles) : [],
+ createTime: item.createTime || moment().format('YYYY-MM-DD HH:mm:ss')
+ }));
+ } else {
+ this.allTaskTableData = [];
+ }
+ this.currentPage = 1;
+ this.updateTableData();
+ }
+ }).catch(err => {
+ console.error('获取详情失败:', err);
+ this.$message.error('获取详情失败');
+ });
+ }
+ },
+ },
+};
+</script>
+
+<style scoped lang="less">
+::v-deep .el-dialog__header {
+ border-bottom: 1px solid #e4e7ed;
+}
+
+::v-deep .el-dialog__body {
+ // padding: 20px;
+ max-height: 80vh;
+ overflow: auto;
+}
+
+@media screen and (max-width: 1200px) {
+ ::v-deep .el-dialog__body {
+ max-height: none;
+ overflow: auto;
+ }
+}
+
+.approval-dialog {
+ display: flex;
+ min-height: 60vh;
+ max-height: 80vh;
+ padding: 20px;
+ overflow: auto;
+
+ @media screen and (max-width: 1200px) {
+ flex-direction: column;
+ height: auto;
+
+ .approval-content,
+ .approval-flow {
+ width: 100%;
+ margin-right: 0;
+ margin-bottom: 20px;
+ height: 50vh;
+ }
+ }
+
+ .approval-content {
+ flex: 7;
+ margin-right: 20px;
+ background: #ffffff;
+ box-shadow: 0px 4px 12px 4px rgba(0, 0, 0, 0.08);
+ border-radius: 10px;
+ overflow-y: auto;
+ }
+
+ .approval-flow {
+ flex: 3;
+ max-width: 305px;
+ padding: 20px 0px;
+ background: #ffffff;
+ box-shadow: 0px 4px 12px 4px rgba(0, 0, 0, 0.08);
+ border-radius: 10px;
+ overflow-y: auto;
+
+ .flow-title {
+ font-size: 16px;
+ font-weight: bold;
+ margin-bottom: 20px;
+ color: #303133;
+ }
+
+ .flow-content {
+ height: calc(100% - 40px);
+ overflow-y: auto;
+
+ .el-form--inline .el-form-item {
+ margin-right: 83px;
+ }
+ }
+ }
+}
+
+.approval-dialog-approve {
+ margin-top: 18px;
+}
+
+.approval-content-card {
+ height: calc(100% - 10px) !important;
+ box-shadow: none !important;
+}
+
+.header-title {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 13px;
+ margin-top: 38px;
+
+ .header-title-left {
+ display: flex;
+ align-items: center;
+ gap: 13px;
+
+ img {
+ width: 12px;
+ height: 19px;
+ }
+
+ div {
+ flex-shrink: 0;
+ font-weight: bold;
+ font-size: 18px;
+ color: #222222;
+ line-height: 27px;
+ font-family: "Source Han Sans CN Bold Bold";
+
+ &:before {
+ content: "*";
+ color: #f56c6c;
+ margin-right: 4px;
+ }
+ }
+
+ span {
+ flex-shrink: 0;
+ font-weight: bold;
+ font-size: 18px;
+ color: #222222;
+ line-height: 27px;
+ font-family: "Source Han Sans CN Bold Bold";
+ }
+ }
+
+ .header-title-left :first-child {
+ margin-top: 0;
+ }
+}
+
+.header-title:first-child {
+ margin-top: 0 !important;
+
+ .header-title-left {
+ margin-top: 0;
+ }
+}
+
+.item-title {
+ padding-left: 25px;
+
+ span {
+ flex-shrink: 0;
+ font-weight: bold;
+ font-size: 14px;
+ color: #222222;
+ line-height: 27px;
+ font-family: "Source Han Sans CN Bold Bold";
+ margin: 18px 0;
+
+ &:before {
+ content: "*";
+ color: #f56c6c;
+ margin-right: 4px;
+ }
+ }
+}
+
+.approval-dialog-approve {
+ img {
+ border: 2px dashed #049c9a;
+ }
+}
+
+.add-group {
+ padding-left: 25px;
+ margin-top: 14px;
+ display: flex;
+ align-items: center;
+ margin-bottom: 19px;
+
+ div {
+ color: #f56c6c;
+ }
+
+ span {
+ font-weight: 500;
+ font-size: 14px;
+ color: #222222;
+ line-height: 21px;
+ margin: 0 32px 0 8px;
+ }
+}
+
+.groupTable {
+ width: 85%;
+ padding-left: 40px;
+}
+
+.rwuTable {
+ width: 85%;
+ padding-left: 40px;
+}
+
+.member-list {
+ margin-top: 18px;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 28px;
+ margin-left: 38px;
+
+ .member-list-card {
+ width: 340px;
+ height: 400px;
+ border-radius: 8px;
+ border: 1px solid #dcdfe6;
+
+ &:nth-child(1) {
+ background: linear-gradient(
+ to bottom,
+ rgba(4, 156, 154, 0.2) 0%,
+ rgba(5, 242, 194, 0) 70%
+ );
+ }
+
+ &:nth-child(2) {
+ background: linear-gradient(
+ to bottom,
+ rgba(5, 160, 193, 0.2) 0%,
+ rgba(5, 242, 194, 0) 70%
+ );
+ }
+
+ &:nth-child(3) {
+ background: linear-gradient(
+ to bottom,
+ rgba(255, 77, 79, 0.2) 0%,
+ rgba(255, 242, 194, 0) 70%
+ );
+ }
+
+ &:nth-child(4) {
+ background: linear-gradient(
+ to bottom,
+ rgba(250, 199, 20, 0.21) 0%,
+ rgba(255, 242, 194, 0) 70%
+ );
+ }
+
+ .member-item {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+
+ .member-title {
+ margin-top: 20px;
+ width: 100%;
+ font-family: "Source Han Sans CN Bold Bold";
+ font-weight: bold;
+ font-size: 16px;
+ color: rgba(0, 0, 0, 0.8);
+ line-height: 16px;
+ text-align: center;
+ }
+
+ .flex1 {
+ flex: 1;
+ }
+
+ .member-name-box {
+ flex: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ .member-name-box-2 {
+ flex: 1;
+ padding: 0 20px;
+ padding-top: 40px;
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 20px;
+ justify-items: center;
+ align-items: start;
+ }
+
+ .member-name {
+ width: 60px;
+ height: 60px;
+ background: #7d8b79;
+ border-radius: 50%;
+ text-align: center;
+ line-height: 60px;
+ font-weight: 500;
+ font-size: 16px;
+ color: #ffffff;
+ margin: 0;
+ }
+
+ .member-change {
+ display: flex;
+ justify-content: center;
+ padding: 10px 0;
+ margin-top: auto;
+ cursor: pointer;
+
+ .member-change-btn {
+ background: #fff1f0;
+ border-radius: 4px;
+ border: 1px solid #ffccc7;
+ padding: 1px 8px;
+ font-weight: 400;
+ font-size: 12px;
+ color: #ff4d4f;
+ }
+ }
+ }
+ }
+}
+
+.step-list {
+ background: #eff8fa;
+ padding: 20px;
+
+ .step-list-item {
+ display: flex;
+ justify-content: space-between;
+ padding: 25px;
+ background: #ffffff;
+
+ .step-list-item-title {
+ font-weight: 500;
+ font-size: 14px;
+ color: rgba(0, 0, 0, 0.8);
+ line-height: 20px;
+ flex-wrap: wrap;
+ flex: 1;
+ }
+ }
+}
+
+.content-box {
+ padding: 0 25px;
+ margin-bottom: 20px;
+ width: 65%;
+ display: flex;
+
+ .content-box-left {
+ flex: 1;
+
+ div {
+ padding: 10px 0;
+ }
+ }
+
+ .content-box-right {
+ flex: 1;
+
+ div {
+ padding: 10px 0;
+ }
+ }
+}
+</style>
\ No newline at end of file
diff --git a/laboratory/src/views/dataManagement/testResultReport/detail.vue b/laboratory/src/views/dataManagement/testResultReport/detail.vue
index 91aa783..63ab526 100644
--- a/laboratory/src/views/dataManagement/testResultReport/detail.vue
+++ b/laboratory/src/views/dataManagement/testResultReport/detail.vue
@@ -153,7 +153,90 @@
</template>
</el-table-column>
</Table>
+ <!-- 新增 -->
+ <div class="header-title flex">
+ <div class="header-title-left flex">
+ <span>原始检验记录列表</span>
+ </div>
+ <el-form :model="formMore" labelWidth="auto">
+ <el-form-item label="" style="margin-bottom: 0">
+ <el-input
+ v-model="formMore.createBy"
+ placeholder="请输入创建人"
+ ></el-input>
+ </el-form-item>
+ <el-form-item label="" style="margin-bottom: 0">
+ <el-input
+ v-model="formMore.termName"
+ placeholder="请输入检测项名称"
+ ></el-input>
+ </el-form-item>
+ <el-form-item label="" style="margin-bottom: 0">
+ <el-button type="default" @click="resetForm">重置</el-button>
+ <el-button
+ type="primary"
+ style="margin-left: 10px"
+ @click="handleSearch"
+ >查询</el-button
+ >
+ </el-form-item>
+ </el-form>
+ </div>
+
+ <TableCustom
+ :tableData="tableDataMore"
+ :total="totalMore"
+ :height="null"
+ @handlePageChange="handlePageChange"
+ @handleSizeChange="handleSizeChange"
+ >
+ <template #table>
+ <el-table-column
+ prop="projectName"
+ label="所属项目课题方案"
+ ></el-table-column>
+ <el-table-column
+ prop="originalCode"
+ label="原始检验记录编号"
+ ></el-table-column>
+ <el-table-column
+ prop="experimentCode"
+ label="所属实验编号"
+ ></el-table-column>
+ <el-table-column
+ prop="experimentName"
+ label="实验名称"
+ ></el-table-column>
+ <el-table-column prop="termCode" label="检测项编号"></el-table-column>
+ <el-table-column prop="termName" label="检测项名称"></el-table-column>
+ <el-table-column prop="createTime" label="创建时间"></el-table-column>
+ <el-table-column prop="createBy" label="创建人"></el-table-column>
+
+ <!-- <el-table-column prop="termInstrument" label="检测仪器"></el-table-column> -->
+ <!-- <el-table-column prop="termReagent" label="检测试剂"></el-table-column> -->
+ <!-- <el-table-column prop="termStandard" label="检测标准"></el-table-column> -->
+ <!-- <el-table-column prop="termStep" label="检测步骤"></el-table-column> -->
+ <!-- <el-table-column prop="termResult" label="检测结果"></el-table-column> -->
+ <el-table-column prop="status" label="状态">
+ <template slot-scope="scope">
+ <el-tag :type="getStatusTypeMore(scope.row.status)">
+ {{ getStatusTextMore(scope.row.status) }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="操作" width="180">
+ <template slot-scope="scope">
+ <template>
+ <el-button type="text" @click="handleDetail(scope.row.id)"
+ >详情</el-button
+ >
+ </template>
+ </template>
+ </el-table-column>
+ </template>
+ </TableCustom>
+ <!-- 新增 -->
<div class="header-title">
<div class="header-title-left">
<img src="@/assets/public/headercard.png" />
@@ -364,6 +447,10 @@
:type="'view'"
:data="currentExperimentResult"
/>
+ <RecordDetail
+ :visible.sync="recordDetailVisible"
+ :data="currentRecordDetail"
+ />
</Card>
</template>
@@ -373,6 +460,7 @@
import moment from "moment";
import EvaluationDialog from "./components/evaluation-dialog.vue";
import CheckoutResult from "./components/checkout-result.vue";
+import RecordDetail from "./components/record-detail.vue";
import AiEditor from "@/components/AiEditor";
// import AddComponentDialog from "@/components/AddComponentDialog";
import {
@@ -381,6 +469,7 @@
update,
getDetail,
evaluateProcess,
+ getOriginalPageListByDispatchId,
} from "./service";
import { mapState } from "vuex";
export default {
@@ -391,6 +480,7 @@
CheckoutResult,
ExperimentResultDialog,
AiEditor,
+ RecordDetail,
// AddComponentDialog
},
data() {
@@ -449,6 +539,18 @@
},
currentEvaluationData: null, // 添加当前评价数据
userRole: "",
+ // 原始检测项列表--新增
+ formMore: {
+ createBy: "",
+ termName: "",
+ dispatchId: "",
+ pageNum: 1,
+ pageSize: 10,
+ },
+ tableDataMore: [],
+ totalMore: 0,
+ currentRecordDetail: { id: "" },
+ recordDetailVisible: false,
};
},
watch: {
@@ -798,10 +900,12 @@
// 调用getOtherInfoByDispatchId接口
this.getInfomationByDispatchId(selectedData[0]);
+ this.getOriginalPageList(selectedData[0]);
this.$message.success("选择成功");
}
},
+
getInfomationByDispatchId(selectedData) {
getOtherInfoByDispatchId({ dispatchId: selectedData.id })
.then((res) => {
@@ -1184,6 +1288,72 @@
const isApprover = userInfo.roleType == 2; // 2是审批人
return (isAdmin || isApprover) && this.form.status == 2; // 2是待评定状态
},
+
+ //
+ getStatusTypeMore(status) {
+ const statusMap = {
+ "-1": "info",
+ 1: "warning",
+ 2: "success",
+ };
+ return statusMap[status] || "info";
+ },
+ getStatusTextMore(status) {
+ const statusMap = {
+ "-1": "草稿箱",
+ 1: "未填写",
+ 2: "已填写",
+ };
+ return statusMap[status] || "未知";
+ },
+ handleDetail(id) {
+ //打开详情弹窗
+ this.recordDetailVisible = true;
+ this.currentRecordDetail = {
+ id: id,
+ };
+ },
+ resetForm() {
+ this.formMore = {
+ createBy: "",
+ trueName: "",
+ dispatchId: this.formMore.dispatchId,
+ pageNum: 1,
+ pageSize: 10,
+ };
+ },
+ handleSearch() {
+ this.formMore.pageNum = 1;
+ this.getOriginalPageList();
+ },
+ handlePageChange(page) {
+ this.formMore.pageNum = page;
+ this.getOriginalPageList();
+ },
+ handleSizeChange(size) {
+ this.formMore.pageSize = size;
+ this.formMore.pageNum = 1;
+ this.getOriginalPageList();
+ },
+ getOriginalPageList(selectedData) {
+ if (selectedData || this.taskTableData.length > 0) {
+ this.formMore.dispatchId = selectedData.id || this.taskTableData[0].id;
+ } else {
+ return ;
+ }
+
+ getOriginalPageListByDispatchId({
+ ...this.formMore,
+ })
+ .then((res) => {
+ console.log("1111111111111", res);
+ this.tableDataMore = res.data.records;
+ this.totalMore = res.data.total;
+ })
+ .catch((err) => {
+ this.$message.error("获取原始记录列表失败");
+ });
+ },
},
computed: {
isView() {
diff --git a/laboratory/src/views/dataManagement/testResultReport/list.vue b/laboratory/src/views/dataManagement/testResultReport/list.vue
index 53beeee..906b8d8 100644
--- a/laboratory/src/views/dataManagement/testResultReport/list.vue
+++ b/laboratory/src/views/dataManagement/testResultReport/list.vue
@@ -1,16 +1,32 @@
<template>
<div class="list">
- <TableCustom :queryForm="form" :tableData="tableData" :total="total" :height="null" @handlePageChange="handlePageChange" @handleSizeChange="handleSizeChange">
+ <TableCustom
+ :queryForm="form"
+ :tableData="tableData"
+ :total="total"
+ :height="null"
+ @handlePageChange="handlePageChange"
+ @handleSizeChange="handleSizeChange"
+ >
<template #search>
<el-form :model="form" labelWidth="auto" inline>
<el-form-item label="所属项目课题方案:">
- <el-input v-model="form.projectName" placeholder="请输入"></el-input>
+ <el-input
+ v-model="form.projectName"
+ placeholder="请输入"
+ ></el-input>
</el-form-item>
<el-form-item label="实验编号:">
- <el-input v-model="form.experimentCode" placeholder="请输入"></el-input>
+ <el-input
+ v-model="form.experimentCode"
+ placeholder="请输入"
+ ></el-input>
</el-form-item>
<el-form-item label="实验名称:">
- <el-input v-model="form.experimentName" placeholder="请输入"></el-input>
+ <el-input
+ v-model="form.experimentName"
+ placeholder="请输入"
+ ></el-input>
</el-form-item>
<el-form-item label="创建日期:">
<el-date-picker
@@ -34,7 +50,12 @@
</el-form-item>
<el-form-item label="">
<el-button type="default" @click="resetForm">重置</el-button>
- <el-button type="primary" style="margin-left: 10px;" @click="handleSearch">查询</el-button>
+ <el-button
+ type="primary"
+ style="margin-left: 10px"
+ @click="handleSearch"
+ >查询</el-button
+ >
</el-form-item>
</el-form>
</template>
@@ -57,34 +78,69 @@
草稿箱
</div>
</div>
- <el-button v-if="isProcessEngineer" @click="handleAddResult" class="el-icon-plus" type="primary">
+ <el-button
+ v-if="isProcessEngineer"
+ @click="handleAddResult"
+ class="el-icon-plus"
+ type="primary"
+ >
新增实验结果汇报
</el-button>
</div>
</template>
<template #table>
- <el-table-column prop="projectName" label="所属项目课题方案"></el-table-column>
- <el-table-column prop="experimentCode" label="实验编号"></el-table-column>
- <el-table-column prop="experimentName" label="实验名称"></el-table-column>
- <el-table-column prop="processEngineerName" label="工艺工程师"></el-table-column>
-
- <el-table-column prop="laboratoryChemistName" label="化验师"></el-table-column>
+ <el-table-column
+ prop="projectName"
+ label="所属项目课题方案"
+ ></el-table-column>
+ <el-table-column
+ prop="experimentCode"
+ label="实验编号"
+ ></el-table-column>
+ <el-table-column
+ prop="experimentName"
+ label="实验名称"
+ ></el-table-column>
+ <el-table-column
+ prop="processEngineerName"
+ label="工艺工程师"
+ ></el-table-column>
+
+ <el-table-column
+ prop="laboratoryChemistName"
+ label="化验师"
+ ></el-table-column>
<el-table-column prop="laboratoryChemistEvaluate" label="是否评定">
<template slot-scope="scope">
- <el-tag :type="scope.row.laboratoryChemistEvaluate === 1 ? 'success' : 'danger'">
- {{ scope.row.laboratoryChemistEvaluate === 1 ? '是' : '否' }}
+ <el-tag
+ :type="
+ scope.row.laboratoryChemistEvaluate === 1 ? 'success' : 'danger'
+ "
+ >
+ {{ scope.row.laboratoryChemistEvaluate === 1 ? "是" : "否" }}
</el-tag>
</template>
</el-table-column>
- <el-table-column prop="experimenterName" label="实验员"></el-table-column>
+ <el-table-column
+ prop="experimenterName"
+ label="实验员"
+ ></el-table-column>
<el-table-column prop="experimenterEvaluate" label="是否评定">
<template slot-scope="scope">
- <el-tag :type="scope.row.experimenterEvaluate === 1 ? 'success' : 'danger'">
- {{ scope.row.experimenterEvaluate === 1 ? '是' : '否' }}
+ <el-tag
+ :type="
+ scope.row.experimenterEvaluate === 1 ? 'success' : 'danger'
+ "
+ >
+ {{ scope.row.experimenterEvaluate === 1 ? "是" : "否" }}
</el-tag>
</template>
</el-table-column>
- <el-table-column prop="createTime" label="创建日期" width="180"></el-table-column>
+ <el-table-column
+ prop="createTime"
+ label="创建日期"
+ width="180"
+ ></el-table-column>
<el-table-column prop="status" label="状态">
<template slot-scope="scope">
<el-tag :type="getStatusType(scope.row.status)">
@@ -97,55 +153,92 @@
<template v-if="currentType === 'list'">
<template v-if="isProcessEngineer">
<template v-if="scope.row.status === 1">
- <el-button type="text" @click="handleSubmit(scope.row)">提交</el-button>
- <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
- <el-button type="text" @click="handleDetail(scope.row.id)">详情</el-button>
- <el-button type="text" @click="handleDelete(scope.row)">删除</el-button>
+ <el-button type="text" @click="handleSubmit(scope.row)"
+ >提交</el-button
+ >
+ <el-button type="text" @click="handleEdit(scope.row)"
+ >编辑</el-button
+ >
+ <el-button type="text" @click="handleDetail(scope.row.id)"
+ >详情</el-button
+ >
+ <el-button type="text" @click="handleDelete(scope.row)"
+ >删除</el-button
+ >
</template>
<!-- <template v-else-if="scope.row.status === 2">
<el-button type="text" @click="handleDetail(scope.row.id)">详情</el-button>
</template> -->
<template v-else>
- <el-button type="text" @click="handleDetail(scope.row.id)">详情</el-button>
+ <el-button type="text" @click="handleDetail(scope.row.id)"
+ >详情</el-button
+ >
</template>
</template>
<template v-else>
- <el-button type="text" @click="handleDetail(scope.row.id)">详情</el-button>
- <el-button
- v-if="scope.row.status === 2"
- type="text"
+ <el-button type="text" @click="handleDetail(scope.row.id)"
+ >详情</el-button
+ >
+ <el-button
+ v-if="scope.row.status === 2"
+ type="text"
@click="handleEvaluate(scope.row)"
- >评定</el-button>
+ >评定</el-button
+ >
+ <el-button
+ slot="reference"
+ v-if="scope.row.status === 2"
+ type="text"
+ @click="handleReturn(scope.row)"
+ >驳回</el-button
+ >
</template>
</template>
<template v-else>
- <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
- <el-button type="text" @click="handleDelete(scope.row)">删除</el-button>
+ <el-button type="text" @click="handleEdit(scope.row)"
+ >编辑</el-button
+ >
+ <el-button type="text" @click="handleDelete(scope.row)"
+ >删除</el-button
+ >
</template>
</template>
</el-table-column>
</template>
</TableCustom>
- <ShowDelConfirm
- :title="changeStatusTitle"
- :tip="changeStatusTip"
+ <ShowDelConfirm
+ :title="changeStatusTitle"
+ :tip="changeStatusTip"
:show="changeStatus"
- @close="changeStatus = false"
- @confirm="handleChangeStatusConfirm"
+ @close="changeStatus = false"
+ @confirm="handleChangeStatusConfirm"
/>
<!-- 评价弹窗 -->
- <evaluation-dialog
- :modelValue="evaluationDialogVisible"
+ <evaluation-dialog
+ :modelValue="evaluationDialogVisible"
:type="'processEngineer'"
- :viewJson="currentEvaluationData"
+ :viewJson="currentEvaluationData"
@update:modelValue="updateEvaluationDialogVisible"
- @submit="handleEvaluationSubmit"
+ @submit="handleEvaluationSubmit"
/>
+ <el-dialog top="40vh" :visible.sync="returnDialogVisible" :show-close="false" :append-to-body="true"
+ :close-on-click-modal="false" width="433px">
+ <div class="dialog-title" slot="title">驳回</div>
+ <el-form ref="form" :model="formReturn" label-width="80px">
+ <el-form-item label="驳回原因" :rules="[{required: true, message: '请输入驳回原因', trigger: 'blur'}]">
+ <el-input type="textarea" v-model="formReturn.reason" placeholder="请输入驳回原因" />
+ </el-form-item>
+ </el-form>
+ <span slot="footer" class="dialog-footer">
+ <el-button @click="returnDialogVisible=false">取消</el-button>
+ <el-button type="primary" @click="handleChangeStatusConfirm" style="margin-left: 20px;">确定</el-button>
+ </span>
+ </el-dialog>
</div>
</template>
<script>
-import { getList,deleteById,commit,evaluateProcess } from './service';
+import { getList, deleteById, commit, evaluateProcess ,rejectResult} from "./service";
import ShowDelConfirm from "@/components/showDelConfirm/index.vue";
import EvaluationDialog from "./components/evaluation-dialog.vue";
import moment from "moment";
@@ -154,7 +247,7 @@
name: "TestResultReport",
components: {
ShowDelConfirm,
- EvaluationDialog
+ EvaluationDialog,
},
data() {
return {
@@ -168,7 +261,7 @@
endTime: "",
status: "",
pageNum: 1,
- pageSize: 10
+ pageSize: 10,
},
tableData: [],
total: 0,
@@ -177,17 +270,23 @@
changeStatusTitle: "",
changeStatusTip: "",
currentOperationRow: null,
- currentOperationType: '',
+ currentOperationType: "",
// 评价弹窗相关数据
evaluationDialogVisible: false,
currentEvaluationData: null,
+
+ // 驳回
+ returnDialogVisible: false,
+ formReturn:{
+ reason: ""
+ }
};
},
computed: {
isProcessEngineer() {
- const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}');
+ const userInfo = JSON.parse(sessionStorage.getItem("userInfo") || "{}");
return userInfo.roleType === 3; // 3是工艺工程师
- }
+ },
},
created() {
this.getTableData();
@@ -202,7 +301,7 @@
endTime: "",
status: "",
pageNum: 1,
- pageSize: 10
+ pageSize: 10,
};
this.dateRange = [];
this.getTableData();
@@ -213,42 +312,47 @@
handleAddResult() {
this.$router.push({
path: "/dataManagement/testResultReport/detail",
- query: {
- type: 'add'
- }
+ query: {
+ type: "add",
+ },
});
},
handleEdit(row) {
this.$router.push({
path: "/dataManagement/testResultReport/detail",
- query: {
+ query: {
id: row.id,
- type: 'edit'
- }
+ type: "edit",
+ },
});
},
handleDetail(id) {
this.$router.push({
path: "/dataManagement/testResultReport/detail",
- query: {
+ query: {
id: id,
- type: 'view'
- }
+ type: "view",
+ },
});
},
handleSubmit(row) {
this.currentOperationRow = row;
- this.currentOperationType = 'submit';
+ this.currentOperationType = "submit";
this.changeStatusTitle = "确认提交?";
this.changeStatusTip = "提交之后无法再次编辑";
this.changeStatus = true;
},
handleDelete(row) {
this.currentOperationRow = row;
- this.currentOperationType = 'delete';
+ this.currentOperationType = "delete";
this.changeStatusTitle = "确认要删除这条信息吗?";
this.changeStatusTip = "删除后信息无法找回";
this.changeStatus = true;
+ },
+ handleReturn(row) {
+ this.currentOperationRow = row;
+ this.currentOperationType = "return";
+ this.returnDialogVisible = true;
},
handleEvaluate(row) {
this.currentOperationRow = row;
@@ -261,50 +365,52 @@
getTableData() {
const params = {
...this.form,
- status: this.currentType === 'draft' ? -1 : this.form.status
+ status: this.currentType === "draft" ? -1 : this.form.status,
};
-
- getList(params).then(res => {
- if (res.code === 200) {
- this.tableData = res.data.records || [];
- this.total = res.data.total || 0;
- } else {
- // this.$message.error(res.msg || '获取数据失败');
- }
- }).catch(err => {
- // this.$message.error('获取数据失败');
- });
+
+ getList(params)
+ .then((res) => {
+ if (res.code === 200) {
+ this.tableData = res.data.records || [];
+ this.total = res.data.total || 0;
+ } else {
+ // this.$message.error(res.msg || '获取数据失败');
+ }
+ })
+ .catch((err) => {
+ // this.$message.error('获取数据失败');
+ });
},
handleDateChange(val) {
if (val) {
this.form.startTime = val[0];
this.form.endTime = val[1];
} else {
- this.form.startTime = '';
- this.form.endTime = '';
+ this.form.startTime = "";
+ this.form.endTime = "";
}
},
getStatusType(status) {
const statusMap = {
- '-1': 'info',
- '1': 'warning',
- '2': 'warning',
- '3': 'success',
- '4': 'info',
- '5': 'warning'
+ "-1": "info",
+ 1: "warning",
+ 2: "warning",
+ 3: "success",
+ 4: "info",
+ 5: "warning",
};
- return statusMap[status] || 'info';
+ return statusMap[status] || "info";
},
getStatusText(status) {
const statusMap = {
- '-1': '草稿箱',
- '1': '待提交',
- '2': '待评定',
- '3': '已评定',
- '4': '已封存',
- '5': '已解封'
+ "-1": "草稿箱",
+ 1: "待提交",
+ 2: "待评定",
+ 3: "已评定",
+ 4: "已封存",
+ 5: "已解封",
};
- return statusMap[status] || '未知';
+ return statusMap[status] || "未知";
},
handlePageChange(pageNum) {
this.form.pageNum = pageNum;
@@ -316,31 +422,53 @@
},
handleChangeStatusConfirm() {
if (!this.currentOperationRow) return;
-
- if (this.currentOperationType === 'submit') {
- commit({ id: this.currentOperationRow.id }).then(res => {
- if (res) {
- this.$message.success('提交成功');
- this.changeStatus = false;
- this.getTableData();
- } else {
- this.$message.error(res.msg || '提交失败');
- }
- }).catch(err => {
- this.$message.error('提交失败');
- });
- } else if (this.currentOperationType === 'delete') {
- deleteById({ id: this.currentOperationRow.id }).then(res => {
- if (res) {
- this.$message.success('删除成功');
- this.changeStatus = false;
- this.getTableData();
- } else {
- this.$message.error(res.msg || '删除失败');
- }
- }).catch(err => {
- this.$message.error('删除失败');
- });
+ if(this.currentOperationType === "return" && !this.formReturn.reason){
+ this.$message.error("请填写驳回理由");
+ return;
+ }
+
+ if (this.currentOperationType === "submit") {
+ commit({ id: this.currentOperationRow.id })
+ .then((res) => {
+ if (res) {
+ this.$message.success("提交成功");
+ this.changeStatus = false;
+ this.getTableData();
+ } else {
+ this.$message.error(res.msg || "提交失败");
+ }
+ })
+ .catch((err) => {
+ this.$message.error("提交失败");
+ });
+ } else if (this.currentOperationType === "delete") {
+ deleteById({ id: this.currentOperationRow.id })
+ .then((res) => {
+ if (res) {
+ this.$message.success("删除成功");
+ this.changeStatus = false;
+ this.getTableData();
+ } else {
+ this.$message.error(res.msg || "删除失败");
+ }
+ })
+ .catch((err) => {
+ this.$message.error("删除失败");
+ });
+ }else if (this.currentOperationType === "return") {
+ rejectResult({ resultReportId: this.currentOperationRow.id,rejectRemark:this.formReturn.reason })
+ .then((res) => {
+ if (res) {
+ this.$message.success("驳回成功");
+ this.returnDialogVisible = false;
+ this.getTableData();
+ } else {
+ this.$message.error(res.msg || "驳回失败");
+ }
+ })
+ .catch((err) => {
+ this.$message.error("驳回失败");
+ });
}
},
// 更新弹窗显示状态
@@ -362,23 +490,25 @@
evaluateFour: this.getEvaluateValue(activeIndex[3].score),
evaluateFive: this.getEvaluateValue(activeIndex[4].score),
evaluateSix: this.getEvaluateValue(activeIndex[5].score),
- evaluateTime: moment().format('YYYY-MM-DD HH:mm:ss'),
+ evaluateTime: moment().format("YYYY-MM-DD HH:mm:ss"),
resultEvaluateJson: JSON.stringify(activeIndex),
resultReportId: this.currentOperationRow.id,
dispatchId: this.currentOperationRow.dispatchId,
- status: 1
+ status: 1,
};
- evaluateProcess(evaluateData).then(res => {
- if (res.code == 200) {
- this.$message.success('评定成功');
- this.evaluationDialogVisible = false;
- this.getTableData(); // 重新获取列表数据
- } else {
- this.$message.error(res.msg || '评定失败');
- }
- }).catch(err => {
- this.$message.error('评定失败');
- });
+ evaluateProcess(evaluateData)
+ .then((res) => {
+ if (res.code == 200) {
+ this.$message.success("评定成功");
+ this.evaluationDialogVisible = false;
+ this.getTableData(); // 重新获取列表数据
+ } else {
+ this.$message.error(res.msg || "评定失败");
+ }
+ })
+ .catch((err) => {
+ this.$message.error("评定失败");
+ });
},
// 将分数转换为评定值
getEvaluateValue(score) {
@@ -386,11 +516,11 @@
const scoreMap = {
2: 1, // 良好
1: 2, // 正确
- 0: 3 // 失误
+ 0: 3, // 失误
};
return scoreMap[score] || 3; // 默认返回失误
- }
- }
+ },
+ },
};
</script>
@@ -407,7 +537,8 @@
padding-bottom: 20px;
justify-content: space-between;
align-items: center;
- .title, .drafts {
+ .title,
+ .drafts {
background: #fafafc;
border-radius: 8px 8px 0px 0px;
border: 1px solid #dcdfe6;
diff --git a/laboratory/src/views/dataManagement/testResultReport/service.js b/laboratory/src/views/dataManagement/testResultReport/service.js
index 5a2cbe3..58e8f06 100644
--- a/laboratory/src/views/dataManagement/testResultReport/service.js
+++ b/laboratory/src/views/dataManagement/testResultReport/service.js
@@ -27,7 +27,9 @@
export const deleteByIds = (data) => {
return axios.delete('/open/t-experiment-result-report/deleteByIds', { params:data })
}
-
+export const rejectResult = (data) => {
+ return axios.post('/api/t-experiment-result-report/rejectResult', { ...data })
+}
// 获取实验结果汇报评定列表-审批人使用
export const evaluatePageList = (data) => {
return axios.post('/api/t-experiment-result-report/evaluatePageList', { ...data })
@@ -49,4 +51,12 @@
// 通过实验调度查询查询组别列表
export const getGroupByDispatchId = (data) => {
return axios.get('/open/t-experiment-scheme/getGroupByDispatchId', { params:data })
+}
+
+// 详情
+export const getRecordDetail = (data) => {
+ return axios.get('/open/t-test-method-confirm-sheet-original/getDetailById', { params:data })
+}// 详情
+export const getOriginalPageListByDispatchId = (data) => {
+ return axios.post('/api/t-experiment-result-report/getOriginalPageListByDispatchId', { ...data })
}
\ No newline at end of file
--
Gitblit v1.7.1