From 4d4e8cd36377fa24cdda7a560dfc42fd2c9334b4 Mon Sep 17 00:00:00 2001 From: 董国庆 <364620639@qq.com> Date: 星期五, 23 五月 2025 15:33:49 +0800 Subject: [PATCH] 实验结果汇报 --- laboratory/src/views/dataManagement/testResultReport/detail.vue | 1005 +++++++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 697 insertions(+), 308 deletions(-) diff --git a/laboratory/src/views/dataManagement/testResultReport/detail.vue b/laboratory/src/views/dataManagement/testResultReport/detail.vue index 7b26a93..8487138 100644 --- a/laboratory/src/views/dataManagement/testResultReport/detail.vue +++ b/laboratory/src/views/dataManagement/testResultReport/detail.vue @@ -1,71 +1,29 @@ <template> <Card> - <el-form - ref="form" - :model="form" - :rules="rules" - inline - label-position="top" - > - <div class="header-title"> + <el-form ref="form" :model="form" :rules="rules" inline label-position="top"> + <div class="header-title" style="margin-bottom: 38px"> <div class="header-title-left"> <img src="@/assets/public/headercard.png" /> - <div>一 、所属实验调度</div> + <div>所属实验调度</div> </div> - <el-button - type="primary" - class="el-icon-plus" - @click="handleSelectScheduling" - >选择实验调度</el-button - > + <el-button type="primary" class="el-icon-plus" @click="handleAddTask" v-if="!isView">选择实验调度</el-button> </div> - <Table - :data="[selectedScheduling].filter(Boolean)" - :total="0" - :height="null" - class="rwuTable" - > - <el-table-column - prop="planName" - label="所属项目课题方案" - min-width="180" - ></el-table-column> - <el-table-column - prop="planCode" - label="实验编号" - min-width="120" - ></el-table-column> - <el-table-column - prop="experimentName" - label="实验名称" - min-width="120" - ></el-table-column> - <el-table-column - prop="noticeTime" - label="通知时间" - min-width="150" - ></el-table-column> - <el-table-column - prop="startTime" - label="实验开始时间" - min-width="150" - ></el-table-column> - <el-table-column - prop="endTime" - label="实验结束时间" - min-width="150" - ></el-table-column> - <el-table-column - prop="participants" - label="参加人员" - min-width="180" - ></el-table-column> - <el-table-column - prop="status" - label="状态" - min-width="100" - ></el-table-column> + <Table :data="taskTableData" :total="0" :height="null" class="rwuTable"> + <el-table-column prop="projectName" label="所属项目课题方案" width="200"></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="experimentDate" label="通知时间"></el-table-column> + <el-table-column prop="experimentStartTime" label="实验开始时间"></el-table-column> + <el-table-column prop="experimentEndTime" label="实验结束时间"></el-table-column> + <el-table-column prop="participantsName" label="参加人员"></el-table-column> + <el-table-column prop="status" label="状态"> + <template slot-scope="scope"> + <el-tag :type="getStatusType(scope.row.status)"> + {{ getStatusText(scope.row.status) }} + </el-tag> + </template> + </el-table-column> </Table> <div class="header-title"> @@ -74,57 +32,24 @@ <div>一 、实验结果</div> </div> </div> - <Table - :data="experimentResultData" - :total="0" - :height="null" - class="rwuTable" - > - <el-table-column - prop="planName" - label="所属项目课题方案" - min-width="180" - ></el-table-column> - <el-table-column - prop="experimentCode" - label="实验编号" - min-width="120" - ></el-table-column> - <el-table-column - prop="experimentName" - label="实验名称" - min-width="120" - ></el-table-column> - <el-table-column - prop="experimentDate" - label="实验日期" - min-width="120" - ></el-table-column> - <el-table-column - prop="experimenter" - label="实验员" - min-width="100" - ></el-table-column> - <el-table-column - prop="createTime" - label="创建日期" - min-width="150" - ></el-table-column> - <el-table-column - prop="creator" - label="创建人" - min-width="100" - ></el-table-column> - <el-table-column - prop="status" - label="当前状态" - min-width="120" - ></el-table-column> + <Table :data="experimentResultData" :total="0" :height="null" class="rwuTable"> + <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="experimentDate" label="实验日期"></el-table-column> + <el-table-column prop="schemePersonName" 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="status" label="当前状态"> + <template slot-scope="scope"> + <el-tag :type="getResultStatusType(scope.row.status)"> + {{ getResultStatusText(scope.row.status) }} + </el-tag> + </template> + </el-table-column> <el-table-column label="操作" min-width="100" fixed="right"> <template slot-scope="scope"> - <el-button type="text" @click="handleViewDetail(scope.row)" - >详情</el-button - > + <el-button type="text" @click="handleViewDetail(scope.row)">详情</el-button> </template> </el-table-column> </Table> @@ -135,44 +60,22 @@ <div>二 、检验结果</div> </div> </div> - <Table - :data="inspectionResultData" - :total="0" - :height="null" - class="rwuTable" - > - <el-table-column - prop="planName" - label="所属项目课题方案" - min-width="180" - ></el-table-column> - <el-table-column - prop="experimentCode" - label="所属实验编号" - min-width="120" - ></el-table-column> - <el-table-column - prop="createTime" - label="创建时间" - min-width="150" - ></el-table-column> - <el-table-column - prop="creator" - label="创建人" - min-width="100" - ></el-table-column> - <el-table-column - prop="status" - label="状态" - min-width="100" - ></el-table-column> + <Table :data="inspectionResultData" :total="0" :height="null" class="rwuTable"> + <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="createTime" label="创建时间"></el-table-column> + <el-table-column prop="createBy" label="创建人"></el-table-column> + <el-table-column prop="status" label="状态"> + <template slot-scope="scope"> + <el-tag :type="getCheckoutStatusType(scope.row.status)"> + {{ getCheckoutStatusText(scope.row.status) }} + </el-tag> + </template> + </el-table-column> <el-table-column label="操作" min-width="100" fixed="right"> <template slot-scope="scope"> - <el-button - type="text" - @click="handleViewInspectionDetail(scope.row)" - >详情</el-button - > + <el-button type="text" @click="handleViewInspectionDetail(scope.row)">详情</el-button> </template> </el-table-column> </Table> @@ -184,6 +87,11 @@ </div> </div> + <div class="content-box"> + <AiEditor ref="analysisEditor" :readOnly="isView" :value="form.experimentResult" height="200px" + placeholder="暂无实验数据分析及结论..." /> + </div> + <div class="header-title"> <div class="header-title-left"> <img src="@/assets/public/headercard.png" /> @@ -193,25 +101,19 @@ <div class="evaluate-card"> <div class="evaluate-card-people"> - <div - v-for="technician in labTechnicians" - :key="technician.id" - class="evaluate-card-people-item" - :class="{ 'active-people': selectedLabTechnician?.id === technician.id }" - @click="handleSelectLabTechnician(technician)" - > - {{ technician.name }} + <div v-for="technician in labTechnicians" :key="technician.id" class="evaluate-card-people-item" + :class="{ 'active-people': selectedLabTechnician?.id == technician.id }" + @click="handleSelectLabTechnician(technician)"> + {{ technician.nickName }} </div> </div> <div class="evaluate-card-cotent"> <template v-if="selectedLabTechnician"> <template v-if="selectedLabTechnician.data"> - <EvaluateTable - class="evaluate-table" - :isReadonly="true" - :type="1" - :viewJson="JSON.stringify(selectedLabTechnician.data)" - /> + <div class="evaluate-table-wrapper" @click="handleEvaluate('labTechnician')"> + <EvaluateTable class="evaluate-table" :isReadonly="true" :type="1" + :viewJson="selectedLabTechnician.data.resultEvaluateJson" /> + </div> </template> <template v-else> <div class="no-data">暂未评定</div> @@ -230,25 +132,19 @@ <div class="evaluate-card"> <div class="evaluate-card-people"> - <div - v-for="experimenter in experimenters" - :key="experimenter.id" - class="evaluate-card-people-item" - :class="{ 'active-people': selectedExperimenter?.id === experimenter.id }" - @click="handleSelectExperimenter(experimenter)" - > - {{ experimenter.name }} + <div v-for="experimenter in experimenters" :key="experimenter.id" class="evaluate-card-people-item" + :class="{ 'active-people': selectedExperimenter?.id == experimenter.id }" + @click="handleSelectExperimenter(experimenter)"> + {{ experimenter.nickName }} </div> </div> <div class="evaluate-card-cotent"> <template v-if="selectedExperimenter"> <template v-if="selectedExperimenter.data"> - <EvaluateTable - ref="experimenterEvaluateTable" - class="evaluate-table" - :isReadonly="true" - :viewJson="JSON.stringify(selectedExperimenter.data)" - /> + <div class="evaluate-table-wrapper" @click="handleEvaluate('experimenter')"> + <EvaluateTable ref="experimenterEvaluateTable" class="evaluate-table" :isReadonly="true" + :viewJson="selectedExperimenter.data.resultEvaluateJson" /> + </div> </template> <template v-else> <div class="no-data">暂未评定</div> @@ -257,44 +153,76 @@ </template> </div> </div> + <div class="header-title" v-if="isView"> + <div class="header-title-left"> + <img src="@/assets/public/headercard.png" /> + <div>六 、工艺工程师工作评定</div> + </div> + </div> - <div class="add-project-footer"> - <el-button type="primary" class="save-btn">发送</el-button> - <el-button>存草稿</el-button> + <div class="evaluate-card" v-if="isView"> + <div class="evaluate-card-people"> + <div v-for="engineer in processEngineers" :key="engineer.id" class="evaluate-card-people-item" + :class="{ 'active-people': selectedProcessEngineer?.id == engineer.id }" + @click="handleSelectProcessEngineer(engineer)"> + {{ engineer.nickName }} + </div> + </div> + <div class="evaluate-card-cotent"> + <template v-if="selectedProcessEngineer"> + <template v-if="selectedProcessEngineer.data"> + <div class="evaluate-table-wrapper" @click="handleEvaluate('processEngineer')"> + <EvaluateTable class="evaluate-table" :isReadonly="true" :type="1" + :viewJson="selectedProcessEngineer.data.resultEvaluateJson" /> + </div> + </template> + <template v-else> + <div class="no-data">暂未评定</div> + <!-- <div v-if="canEvaluate" class="to-evaluate" >去评价</div> --> + </template> + </template> + </div> + </div> + <div class="add-project-footer" v-if="!isView"> + <el-button type="primary" class="save-btn" @click="handleSubmit(1)">提交</el-button> + <el-button @click="handleSubmit(-1)">存草稿</el-button> + </div> + <div class="add-project-footer" v-if="isView && form.status == 2"> + <el-button type="primary" class="save-btn" @click="handleEvaluate('processEngineer')">工艺工程师评定</el-button> + <!-- <el-button @click="handleSubmit(-1)">存草稿</el-button> --> </div> </el-form> <!-- 选择实验调度弹窗 --> - <experimental-scheduling - :show.sync="schedulingDialogVisible" - @select="handleSchedulingSelect" - /> + <experimental-scheduling :show="schedulingDialogVisible" @close="handleSchedulingClose" + @submit="handleSchedulingSelect" /> <!-- 评价弹窗 --> - <evaluation-dialog - :modelValue="evaluationDialogVisible" - :type="currentEvaluationType" - @update:modelValue="updateEvaluationDialogVisible" - @submit="handleEvaluationSubmit" - /> + <evaluation-dialog :modelValue="evaluationDialogVisible" :type="currentEvaluationType" + :viewJson="currentEvaluationData ? currentEvaluationData : ''" @update:modelValue="updateEvaluationDialogVisible" + @submit="handleEvaluationSubmit" /> <!-- 检验结果详情弹窗 --> - <checkout-result - :visible.sync="checkoutResultVisible" - :data="currentCheckoutResult" - /> + <checkout-result :visible="checkoutResultVisible" :data="currentCheckoutResult" + @close="handleCheckoutResultClose" /> <!-- 新增组件弹窗 --> - <add-component-dialog + <!-- <add-component-dialog v-if="showNewDialog" :visible.sync="showNewDialog" @confirm="handleAddComponent" - /> + /> --> + <!-- 实验结果详情 --> + <ExperimentResultDialog :visible.sync="experimentResultDialogVisible" :type="'view'" + :data="currentExperimentResult" /> </Card> </template> <script> -import ExperimentalScheduling from "./components/experimental-scheduling.vue"; +import ExperimentResultDialog from "./components/experimentResultDialog.vue"; +import ExperimentalScheduling from "../sampleManage/components/experimental-scheduling.vue"; import moment from "moment"; import EvaluationDialog from "./components/evaluation-dialog.vue"; import CheckoutResult from "./components/checkout-result.vue"; -import AddComponentDialog from "@/components/AddComponentDialog"; +import AiEditor from "@/components/AiEditor"; +// import AddComponentDialog from "@/components/AddComponentDialog"; +import { getOtherInfoByDispatchId, add, update, getDetail,evaluateProcess } from './service' export default { name: "AddProject", @@ -302,118 +230,70 @@ ExperimentalScheduling, EvaluationDialog, CheckoutResult, - AddComponentDialog + ExperimentResultDialog, + AiEditor + // AddComponentDialog }, data() { return { showNewDialog: true, dialogVisible: false, schedulingDialogVisible: false, + experimentResultDialogVisible: false, + currentExperimentResult: null, isEdit: false, currentEditIndex: -1, selectedScheduling: null, form: { - recordNo: "", - testItemName: "", - testItemNo: "", - testMethodName: "", - testMethodNo: "", + dispatchId: "", + experimentResult: "", + id: "", + resultWorkEvaluates: [], + status: -1 }, rules: { - recordNo: [ - { - required: true, - message: "请输入原始检验记录编号", - trigger: "blur", - }, - ], - testItemName: [ - { required: true, message: "请输入检测项名字", trigger: "blur" }, - ], - testItemNo: [ - { required: true, message: "请输入检测项编号", trigger: "blur" }, - ], - testMethodName: [ - { required: true, message: "请输入检测方法名字", trigger: "blur" }, - ], - testMethodNo: [ - { required: true, message: "请输入检测方法编号", trigger: "blur" }, + dispatchId: [ + { required: true, message: "请选择所属实验调度", trigger: "change" } ], }, taskTableData: [], - experimentResultData: [ - { - planName: "名称名称名称", - experimentCode: "3814763", - experimentName: "名称名称22", - experimentDate: "2024-05-28", - experimenter: "刘大大", - createTime: "2025-1-2 16:27:17", - creator: "周乐心", - status: "实验员已提交", - }, - ], - inspectionResultData: [ - { - planName: "名称名称名称", - experimentCode: "31423764", - createTime: "", - creator: "", - status: "已提交", - }, - { - planName: "名称名称名称", - experimentCode: "31423764", - createTime: "", - creator: "", - status: "已提交", - }, - ], + experimentResultData: [], + inspectionResultData: [], // 化验师数据 - labTechnicians: [ - { - id: 1, - name: '张三', - role: '化验师', - data: null // 评定数据,null 表示未评定 - }, - { - id: 2, - name: '李四', - role: '化验师', - data: null - } - ], + labTechnicians: [], selectedLabTechnician: null, // 实验员数据 - experimenters: [ - { - id: 1, - name: '王五', - role: '实验员', - data: null - }, - { - id: 2, - name: '赵六', - role: '实验员', - data: null - } - ], + experimenters: [], selectedExperimenter: null, + + // 工艺工程师数据 + processEngineers: [], + selectedProcessEngineer: null, // 弹窗控制 evaluationDialogVisible: false, currentEvaluationType: '', checkoutResultVisible: false, - currentCheckoutResult: null + currentCheckoutResult: null, + statusTypeMap: { + "-1": "info", + "1": "warning", + "2": "success", + "3": "info" + }, + statusTextMap: { + "-1": "草稿箱", + "1": "待确认", + "2": "已确认", + "3": "已封存" + }, + currentEvaluationData: null, // 添加当前评价数据 }; }, watch: { selectedLabTechnician: { handler(newVal) { - console.log("selectedLabTechnician", newVal); }, }, }, @@ -421,26 +301,24 @@ // 默认选中第一个人员 this.selectedLabTechnician = this.labTechnicians[0]; this.selectedExperimenter = this.experimenters[0]; + this.selectedProcessEngineer = this.processEngineers[0]; + + // 如果是编辑模式,获取详情数据 + const id = this.$route.query.id; + if (id) { + this.getDetailData(id); + } }, methods: { - handleSelectScheduling() { - this.schedulingDialogVisible = true; - }, - handleSchedulingSelect(selectedData) { - if (selectedData && selectedData.length > 0) { - this.selectedScheduling = selectedData[0]; - this.$message.success("选择成功"); - } - }, handleAddTask() { this.isEdit = false; this.currentEditIndex = -1; - this.dialogVisible = true; + this.schedulingDialogVisible = true; }, handleEditTask(row) { this.isEdit = true; this.currentEditIndex = this.taskTableData.findIndex( - (item) => item === row + (item) => item == row ); const editData = { @@ -480,7 +358,7 @@ type: "warning", }) .then(() => { - const index = this.taskTableData.findIndex((item) => item === row); + const index = this.taskTableData.findIndex((item) => item == row); if (index > -1) { const item = this.taskTableData[index]; if (item.photos) { @@ -502,7 +380,7 @@ this.$message.success("删除成功"); } }) - .catch(() => {}); + .catch(() => { }); }, handleTaskSubmit(formData) { const photos = formData.photos.map((file) => ({ @@ -532,7 +410,7 @@ oldData.photos.forEach((photo) => { if ( photo.url.startsWith("blob:") && - !photos.find((p) => p.url === photo.url) + !photos.find((p) => p.url == photo.url) ) { URL.revokeObjectURL(photo.url); } @@ -542,7 +420,7 @@ oldData.spectrums.forEach((spectrum) => { if ( spectrum.url.startsWith("blob:") && - !spectrums.find((s) => s.url === spectrum.url) + !spectrums.find((s) => s.url == spectrum.url) ) { URL.revokeObjectURL(spectrum.url); } @@ -564,11 +442,18 @@ return photos.map((photo) => photo.url); }, handleViewDetail(row) { - console.log("查看详情", row); + // 获取实验结果详情 + this.currentExperimentResult = row; + this.experimentResultDialogVisible = true; }, handleViewInspectionDetail(row) { + // 获取检验结果详情 this.currentCheckoutResult = row; this.checkoutResultVisible = true; + }, + handleCheckoutResultClose() { + this.currentCheckoutResult = null + this.checkoutResultVisible = false; }, // 选择化验师 handleSelectLabTechnician(technician) { @@ -578,43 +463,528 @@ handleSelectExperimenter(experimenter) { this.selectedExperimenter = experimenter; }, + // 选择工艺工程师 + handleSelectProcessEngineer(engineer) { + this.selectedProcessEngineer = engineer; + }, // 去评价 handleEvaluate(type) { + if(this.$route.query.type == 'view' && type !='processEngineer'){ + this.$message.warning('当前为查看模式,无法进行评价'); + return; + } this.currentEvaluationType = type; + // 根据类型获取当前选中人员的评定数据 + if (type == 'labTechnician' && this.selectedLabTechnician) { + this.currentEvaluationData = this.selectedLabTechnician.data?.resultEvaluateJson; + } else if (type == 'experimenter' && this.selectedExperimenter) { + this.currentEvaluationData = this.selectedExperimenter.data?.resultEvaluateJson; + } else if (type == 'processEngineer' && this.selectedProcessEngineer) { + this.currentEvaluationData = this.selectedProcessEngineer.data?.resultEvaluateJson; + } this.evaluationDialogVisible = true; }, // 处理评价提交 handleEvaluationSubmit(evaluationData) { const { type, activeIndex } = evaluationData; - - if (type === 'labTechnician') { + + // 将评分数据转换为后端需要的格式 + const evaluateData = { + evaluateType: type == 'labTechnician' ? 2 : type == 'experimenter' ? 3 : 1, // 1=工艺工程师 2=化验师 3=实验员 + evaluateOne: this.getEvaluateValue(activeIndex[0].score), + evaluateTwo: this.getEvaluateValue(activeIndex[1].score), + evaluateThree: this.getEvaluateValue(activeIndex[2].score), + 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'), + resultEvaluateJson: JSON.stringify(activeIndex), + dispatchId: this.selectedScheduling?.id, + userId: type == 'labTechnician' ? this.selectedLabTechnician.id : + type == 'experimenter' ? this.selectedExperimenter.id : + this.selectedProcessEngineer.id, + // teamId: this.selectedScheduling?.teamId, + status: 1 + }; + + if (type == 'labTechnician') { // 更新化验师列表中的数据 - const labTechnician = this.labTechnicians.find(item => item.id === this.selectedLabTechnician.id); + const labTechnician = this.labTechnicians.find(item => item.id == this.selectedLabTechnician.id); if (labTechnician) { - labTechnician.data = activeIndex; - // 更新当前选中的化验师数据 + labTechnician.data = { ...labTechnician.data, ...evaluateData }; this.selectedLabTechnician = { ...labTechnician }; } - } else if (type === 'experimenter') { + } else if (type == 'experimenter') { // 更新实验员列表中的数据 - const experimenter = this.experimenters.find(item => item.id === this.selectedExperimenter.id); + const experimenter = this.experimenters.find(item => item.id == this.selectedExperimenter.id); if (experimenter) { - experimenter.data = activeIndex; - // 更新当前选中的实验员数据 + experimenter.data = { ...experimenter.data, ...evaluateData }; this.selectedExperimenter = { ...experimenter }; } + } else if (type == 'processEngineer') { + // 工艺工程师评定直接调用接口 + console.log('11111111111111111111',{ + ...evaluateData, + resultReportId: this.form.id // 添加实验报告ID + }) + evaluateProcess({ + ...evaluateData, + resultReportId: this.form.id // 添加实验报告ID + }).then(res => { + if (res.code == 200) { + this.$message.success('评定成功'); + // 重新获取详情数据 + this.getDetailData(this.form.id); + } else { + this.$message.error(res.msg || '评定失败'); + } + }).catch(err => { + this.$message.error('评定失败'); + }); } - - // 这里可以添加数据持久化的逻辑,比如调用API保存到后端 - // this.saveEvaluationData(type, activeIndex); - - this.$message.success('评价提交成功'); this.evaluationDialogVisible = false; + this.currentEvaluationData = null; + }, + // 将分数转换为评定值 + getEvaluateValue(score) { + // 2分 = 良好(1), 1分 = 正确(2), 0分 = 失误(3) + const scoreMap = { + 2: 1, // 良好 + 1: 2, // 正确 + 0: 3 // 失误 + }; + return scoreMap[score] || 3; // 默认返回失误 + }, + // 收集评分数据 + collectEvaluateData() { + const evaluates = []; + + // 收集化验师评分 + this.labTechnicians.forEach(tech => { + if (tech.data) { + evaluates.push({ + ...tech.data, + dispatchId: this.selectedScheduling?.id, + userId: tech.id, + teamId: this.selectedScheduling?.teamId, + status: -1, + id: tech.data.id || undefined + }); + } + }); + + // 收集实验员评分 + this.experimenters.forEach(exp => { + if (exp.data) { + evaluates.push({ + ...exp.data, + dispatchId: this.selectedScheduling?.id, + userId: exp.id, + teamId: this.selectedScheduling?.teamId, + status: -1, + id: exp.data.id || undefined + }); + } + }); + + // 收集工艺工程师评分 + this.processEngineers.forEach(eng => { + if (eng.data) { + evaluates.push({ + ...eng.data, + dispatchId: this.selectedScheduling?.id, + userId: eng.id, + teamId: this.selectedScheduling?.teamId, + status: -1, + id: eng.data.id || undefined + }); + } + }); + + return evaluates; }, // 更新弹窗显示状态 updateEvaluationDialogVisible(value) { this.evaluationDialogVisible = value; + if (!value) { + this.currentEvaluationData = null; // 关闭弹窗时清空数据 + } + }, + handleSchedulingClose() { + this.schedulingDialogVisible = false; + }, + handleSchedulingSelect(selectedData) { + if (selectedData && selectedData.length > 0) { + this.selectedScheduling = selectedData[0]; + this.taskTableData = [selectedData[0]]; // 更新表格数据 + + // 调用getOtherInfoByDispatchId接口 + this.getInfomationByDispatchId(selectedData[0]); + + this.$message.success("选择成功"); + } + }, + getInfomationByDispatchId(selectedData) { + getOtherInfoByDispatchId({ dispatchId: selectedData.id }).then(res => { + // 直接使用接口返回的字段,因为字段名完全一致 + let list = res.inspectionReports.map(item => ({ + ...item, + experimentName: selectedData.experimentName, + projectName: selectedData.projectName, + experimentCode: selectedData.experimentCode + })) || [] + this.experimentResultData = res.experimentSchemeVOS || []; + this.inspectionResultData = list; + + if (!this.$route.query.id) { + // 处理实验人员数据 + const participants = res.experimentDispatchParticipants || []; + // 获取工艺工程师列表 + this.processEngineers = participants + .filter(p => p.roleType == 3) // 3=工艺工程师 + .map(p => ({ + id: p.userId, + nickName: p.nickName || '工艺工程师', + role: '工艺工程师', + data: null + })); + + // 获取化验师列表 + this.labTechnicians = participants + .filter(p => p.roleType == 4) // 4=化验师 + .map(p => ({ + id: p.userId, + nickName: p.nickName || '化验师', + role: '化验师', + data: null + })); + + // 获取实验员列表 + this.experimenters = participants + .filter(p => p.roleType == 5) // 5=实验员 + .map(p => ({ + id: p.userId, + nickName: p.nickName || '实验员', + role: '实验员', + data: null + })); + + // 处理评定数据 + const evaluates = res.resultWorkEvaluates || []; + evaluates.forEach(evaluate => { + // 根据评定类型和用户ID匹配对应的评定数据 + if (evaluate.evaluateType == 1) { // 1=工艺工程师 + const engineer = this.processEngineers.find(e => e.id == evaluate.userId); + if (engineer) { + engineer.data = { + id: evaluate.id, // 保存id + evaluateOne: evaluate.evaluateOne, + evaluateTwo: evaluate.evaluateTwo, + evaluateThree: evaluate.evaluateThree, + evaluateFour: evaluate.evaluateFour, + evaluateFive: evaluate.evaluateFive, + evaluateSix: evaluate.evaluateSix, + evaluateTime: evaluate.evaluateTime, + resultEvaluateJson: evaluate.resultEvaluateJson + }; + } + } else if (evaluate.evaluateType == 2) { // 2=化验师 + const technician = this.labTechnicians.find(t => t.id == evaluate.userId); + if (technician) { + technician.data = { + id: evaluate.id, // 保存id + evaluateOne: evaluate.evaluateOne, + evaluateTwo: evaluate.evaluateTwo, + evaluateThree: evaluate.evaluateThree, + evaluateFour: evaluate.evaluateFour, + evaluateFive: evaluate.evaluateFive, + evaluateSix: evaluate.evaluateSix, + evaluateTime: evaluate.evaluateTime, + resultEvaluateJson: evaluate.resultEvaluateJson + }; + } + } else if (evaluate.evaluateType == 3) { // 3=实验员 + const experimenter = this.experimenters.find(e => e.id == evaluate.userId); + if (experimenter) { + experimenter.data = { + id: evaluate.id, // 保存id + evaluateOne: evaluate.evaluateOne, + evaluateTwo: evaluate.evaluateTwo, + evaluateThree: evaluate.evaluateThree, + evaluateFour: evaluate.evaluateFour, + evaluateFive: evaluate.evaluateFive, + evaluateSix: evaluate.evaluateSix, + evaluateTime: evaluate.evaluateTime, + resultEvaluateJson: evaluate.resultEvaluateJson + }; + } + } + }); + + // 默认选中第一个人员 + if (this.processEngineers.length > 0) { + this.selectedProcessEngineer = this.processEngineers[0]; + } + if (this.labTechnicians.length > 0) { + this.selectedLabTechnician = this.labTechnicians[0]; + } + if (this.experimenters.length > 0) { + this.selectedExperimenter = this.experimenters[0]; + } + } + + }).catch(err => { + this.$message.error('获取其他信息失败'); + }); + }, + getStatusType(status) { + return this.statusTypeMap[status] || 'info'; + }, + getStatusText(status) { + return this.statusTextMap[status] || '未知状态'; + }, + getResultStatusType(status) { + const statusMap = { + '-1': "info", + '1': "warning", + '2': "warning", + '3': "success", + '4': "danger", + '5': "info", + '6': 'success' + }; + return statusMap[status] || "info"; + }, + getResultStatusText(status) { + const statusMap = { + '-1': "草稿", + '1': "已发送", + '2': "申请中止待审核", + '3': "申请中止已通过", + '4': "申请中止已驳回", + '5': "已封存", + '6': '实验员已提交' + }; + return statusMap[status] || "未知"; + }, + getCheckoutStatusType(status) { + const statusMap = { + '-1': 'info', + '1': 'warning', + '2': 'success' + }; + return statusMap[status] || 'info'; + }, + getCheckoutStatusText(status) { + const statusMap = { + '-1': '草稿箱', + '1': '待提交', + '2': '已提交' + }; + return statusMap[status] || '未知'; + }, + // 验证评分数据 + validateEvaluates() { + // 检查是否所有实验员和化验师都有评分 + const allTechnicians = this.labTechnicians.every(tech => tech.data); + const allExperimenters = this.experimenters.every(exp => exp.data); + + if (!allTechnicians || !allExperimenters) { + this.$message.error('请完成所有实验员和化验师的评分'); + return false; + } + return true; + }, + + // 提交表单 + async handleSubmit(status) { + try { + // 如果是提交状态,进行必填校验 + if (status == 1) { + // 校验表单 + await this.$refs.form.validate(); + + // 获取富文本编辑器内容 + const experimentResult = this.$refs.analysisEditor.getContent(); + + // 校验实验数据分析及结论 + if (!experimentResult || experimentResult == '<p></p>' || experimentResult.trim() == '<p></p>') { + this.$message.error('请输入实验数据分析及结论'); + return; + } + + // 校验评分数据 + if (!this.validateEvaluates()) { + return; + } + } + + // 收集评分数据 + const evaluates = this.collectEvaluateData(); + + // 更新评分数据的状态 + evaluates.forEach(evaluate => { + evaluate.status = status; + }); + + // 构建提交数据 + const submitData = { + dispatchId: this.selectedScheduling?.id, + experimentResult: this.$refs.analysisEditor.getContent(), + status: status, + resultWorkEvaluates: evaluates + }; + console.log('111111111111',submitData) + + // 如果有ID,则是编辑 + if (this.form.id) { + submitData.id = this.form.id; + await update(submitData); + } else { + await add(submitData); + } + + this.$message.success(status == 1 ? '提交成功' : '保存草稿成功'); + this.$router.go(-1); + } catch (error) { + this.$message.error('提交失败,请重试'); + } + }, + + // 获取详情数据 + async getDetailData(id) { + try { + const res = await getDetail({ id }); + if (res) { + this.form = { + ...res, + experimentResult: res.experimentResult || '' + }; + + // 设置选中的实验调度 + if (res.experimentDispatchVO) { + this.selectedScheduling = { + ...res.experimentDispatchVO + }; + this.taskTableData = [res.experimentDispatchVO] + // 获取其他信息 + await this.getInfomationByDispatchId(res.experimentDispatchVO); + } + if (res.experimentDispatchParticipants) { + // 处理实验人员数据 + const participants = res.experimentDispatchParticipants || []; + + // 获取工艺工程师列表 + this.processEngineers = participants + .filter(p => p.roleType == 3) // 3=工艺工程师 + .map(p => ({ + id: p.userId, + nickName: p.nickName || '工艺工程师', + role: '工艺工程师', + data: null + })); + + // 获取化验师列表 + this.labTechnicians = participants + .filter(p => p.roleType == 4) + .map(p => ({ + id: p.userId, + nickName: p.nickName || '化验师', + role: '化验师', + data: null + })); + + // 获取实验员列表 + this.experimenters = participants + .filter(p => p.roleType == 5) + .map(p => ({ + id: p.userId, + nickName: p.nickName || '实验员', + role: '实验员', + data: null + })); + + // 处理评分数据 + if (res.resultWorkEvaluates) { + res.resultWorkEvaluates.forEach(evaluate => { + if (evaluate.evaluateType == 1) { // 工艺工程师 + const engineer = this.processEngineers.find(e => e.id == evaluate.userId); + if (engineer) { + engineer.data = { + id: evaluate.id, + evaluateOne: evaluate.evaluateOne, + evaluateTwo: evaluate.evaluateTwo, + evaluateThree: evaluate.evaluateThree, + evaluateFour: evaluate.evaluateFour, + evaluateFive: evaluate.evaluateFive, + evaluateSix: evaluate.evaluateSix, + evaluateTime: evaluate.evaluateTime, + resultEvaluateJson: evaluate.resultEvaluateJson + }; + } + } else if (evaluate.evaluateType == 2) { // 化验师 + const technician = this.labTechnicians.find(t => t.id == evaluate.userId); + if (technician) { + technician.data = { + id: evaluate.id, + evaluateOne: evaluate.evaluateOne, + evaluateTwo: evaluate.evaluateTwo, + evaluateThree: evaluate.evaluateThree, + evaluateFour: evaluate.evaluateFour, + evaluateFive: evaluate.evaluateFive, + evaluateSix: evaluate.evaluateSix, + evaluateTime: evaluate.evaluateTime, + resultEvaluateJson: evaluate.resultEvaluateJson + }; + } + } else if (evaluate.evaluateType == 3) { // 实验员 + const experimenter = this.experimenters.find(e => e.id == evaluate.userId); + if (experimenter) { + experimenter.data = { + id: evaluate.id, + evaluateOne: evaluate.evaluateOne, + evaluateTwo: evaluate.evaluateTwo, + evaluateThree: evaluate.evaluateThree, + evaluateFour: evaluate.evaluateFour, + evaluateFive: evaluate.evaluateFive, + evaluateSix: evaluate.evaluateSix, + evaluateTime: evaluate.evaluateTime, + resultEvaluateJson: evaluate.resultEvaluateJson + }; + } + } + }); + } + + // 默认选中第一个人员 + if (this.processEngineers.length > 0) { + this.selectedProcessEngineer = this.processEngineers[0]; + } + if (this.labTechnicians.length > 0) { + this.selectedLabTechnician = this.labTechnicians[0]; + } + if (this.experimenters.length > 0) { + this.selectedExperimenter = this.experimenters[0]; + } + } + } + } catch (error) { + this.$message.error('获取详情失败'); + } + }, + // 判断是否可以评定 + canEvaluate() { + const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}'); + const isAdmin = userInfo.roleType == 1; // 1是超级管理员 + const isApprover = userInfo.roleType == 2; // 2是审批人 + return (isAdmin || isApprover) && this.form.status == 2; // 2是待评定状态 } + }, + computed: { + isView() { + return this.$route.query.type == 'view'; + }, + }, }; </script> @@ -748,11 +1118,13 @@ color: rgba(4, 156, 154, 1); } } + .evaluate-card-cotent { display: flex; flex-direction: column; align-items: center; justify-content: center; + .no-data { font-family: PingFangSC, PingFang SC; font-weight: 500; @@ -762,6 +1134,7 @@ margin-top: 58px; margin-bottom: 30px; } + .to-evaluate { width: 65px; background: #049c9a; @@ -774,10 +1147,26 @@ text-align: center; margin-bottom: 12px; } - .evaluate-table{ + + .evaluate-table { width: 100%; margin-top: 29px; } } } + +.content-box { + padding: 0 20px; + margin: 20px 0; +} + +.evaluate-table-wrapper { + width: 100%; + cursor: pointer; + transition: all 0.3s; + + &:hover { + opacity: 0.8; + } +} </style> \ No newline at end of file -- Gitblit v1.7.1