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/list.vue | 411 ++++++++++++++++++++++++++++++++++++---------------------- 1 files changed, 252 insertions(+), 159 deletions(-) diff --git a/laboratory/src/views/dataManagement/testResultReport/list.vue b/laboratory/src/views/dataManagement/testResultReport/list.vue index b4486dc..27ebf63 100644 --- a/laboratory/src/views/dataManagement/testResultReport/list.vue +++ b/laboratory/src/views/dataManagement/testResultReport/list.vue @@ -1,31 +1,35 @@ <template> <div class="list"> - <TableCustom :queryForm="form" :tableData="tableData" :total="total" :height="null"> + <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.projectPlan" placeholder="请输入"></el-input> + <el-input v-model="form.projectName" placeholder="请输入"></el-input> </el-form-item> <el-form-item label="实验编号:"> - <el-input v-model="form.experimentNo" 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-form-item> <el-form-item label="创建日期:"> <el-date-picker - v-model="form.createTime" + v-model="dateRange" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd" + @change="handleDateChange" ></el-date-picker> </el-form-item> <el-form-item label="状态:"> <el-select v-model="form.status" placeholder="请选择"> - <el-option label="待提交" value="pending"></el-option> - <el-option label="已提交" value="submitted"></el-option> + <el-option label="全部" value=""></el-option> + <el-option label="待提交" :value="1"></el-option> + <el-option label="待评定" :value="2"></el-option> + <el-option label="已评定" :value="3"></el-option> + <el-option label="已封存" :value="4"></el-option> </el-select> </el-form-item> <el-form-item label=""> @@ -45,6 +49,7 @@ 实验结果汇报列表 </div> <div + v-if="isProcessEngineer" class="drafts" :class="{ active: currentType === 'draft' }" @click="handleTypeChange('draft')" @@ -52,160 +57,137 @@ 草稿箱 </div> </div> - <el-button @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="projectPlan" label="所属项目课题方案"></el-table-column> - <el-table-column prop="experimentNo" 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="engineer" label="工艺工程师"></el-table-column> - <el-table-column prop="chemist" label="化验师"></el-table-column> - <el-table-column prop="engineerApproved" label="是否评定"> + <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.engineerApproved === '是' ? 'success' : 'danger'"> - {{ scope.row.engineerApproved }} + <el-tag :type="scope.row.laboratoryChemistEvaluate === 1 ? 'success' : 'danger'"> + {{ scope.row.laboratoryChemistEvaluate === 1 ? '是' : '否' }} </el-tag> </template> </el-table-column> - <el-table-column prop="experimenter" label="实验员"></el-table-column> - <el-table-column prop="experimenterApproved" label="是否评定"> + <el-table-column prop="experimenterName" label="实验员"></el-table-column> + <el-table-column prop="experimenterEvaluate" label="是否评定"> <template slot-scope="scope"> - <el-tag :type="scope.row.experimenterApproved === '是' ? 'success' : 'danger'"> - {{ scope.row.experimenterApproved }} + <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="创建日期"></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="scope.row.status === '已提交' ? 'success' : 'warning'"> - {{ scope.row.status }} + <el-tag :type="getStatusType(scope.row.status)"> + {{ getStatusText(scope.row.status) }} </el-tag> </template> </el-table-column> - <el-table-column label="操作" width="280"> + <el-table-column label="操作" width="180"> <template slot-scope="scope"> <template v-if="currentType === 'list'"> - <!-- 待提交状态 --> - <template v-if="scope.row.status === '待提交'"> - <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 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> + </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> + </template> </template> - <!-- 待评定状态 --> - <template v-else-if="scope.row.status === '待评定'"> - <el-button type="text" @click="handleEvaluate(scope.row)">评定</el-button> + <template v-else> <el-button type="text" @click="handleDetail(scope.row.id)">详情</el-button> - </template> - <!-- 已提交状态 --> - <template v-else-if="scope.row.status === '已提交'"> - <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> </template> </template> - <!-- 草稿箱 --> <template v-else> <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> </el-table-column> </template> </TableCustom> + <ShowDelConfirm + :title="changeStatusTitle" + :tip="changeStatusTip" + :show="changeStatus" + @close="changeStatus = false" + @confirm="handleChangeStatusConfirm" + /> + <!-- 评价弹窗 --> + <evaluation-dialog + :modelValue="evaluationDialogVisible" + :type="'processEngineer'" + :viewJson="currentEvaluationData" + @update:modelValue="updateEvaluationDialogVisible" + @submit="handleEvaluationSubmit" + /> </div> </template> <script> +import { getList,deleteById,commit,evaluateProcess } from './service'; +import ShowDelConfirm from "@/components/showDelConfirm/index.vue"; +import EvaluationDialog from "./components/evaluation-dialog.vue"; +import moment from "moment"; + export default { name: "TestResultReport", + components: { + ShowDelConfirm, + EvaluationDialog + }, data() { return { currentType: "list", // 当前显示类型:list-列表,draft-草稿箱 + dateRange: [], // 日期范围 form: { - projectPlan: "", - experimentNo: "", + projectName: "", + experimentCode: "", experimentName: "", - createTime: [], - status: "" + startTime: "", + endTime: "", + status: "", + pageNum: 1, + pageSize: 10 }, tableData: [], total: 0, - // 正式列表数据 - mockListData: [ - { - id: '1', - projectPlan: '名称名称名称', - experimentNo: '31423764', - experimentName: '名称名称名称', - engineer: '李治悦', - chemist: '刘大大', - engineerApproved: '否', - experimenter: '周乐心; 张瑞瑞', - experimenterApproved: '否', - createTime: '2025-1-2 16:27:17', - status: '待提交' - }, - { - id: '2', - projectPlan: '高性能材料研究', - experimentNo: '31423765', - experimentName: '材料强度测试', - engineer: '赵雨', - chemist: '王泽', - engineerApproved: '是', - experimenter: '李明; 张华', - experimenterApproved: '是', - createTime: '2025-1-2 16:30:17', - status: '已提交' - }, - { - id: '3', - projectPlan: '新型合金开发', - experimentNo: '31423766', - experimentName: '合金性能分析', - engineer: '杨静', - chemist: '陈亮', - engineerApproved: '是', - experimenter: '王刚', - experimenterApproved: '否', - createTime: '2025-1-2 16:35:17', - status: '待评定' - } - ], - // 草稿箱数据 - mockDraftData: [ - { - id: '4', - projectPlan: '环保材料研究', - experimentNo: '31423767', - experimentName: '材料降解测试', - engineer: '张伟', - chemist: '李强', - engineerApproved: '否', - experimenter: '王芳', - experimenterApproved: '否', - createTime: '2025-1-2 16:40:17', - status: '草稿' - }, - { - id: '5', - projectPlan: '纳米材料开发', - experimentNo: '31423768', - experimentName: '纳米结构分析', - engineer: '刘洋', - chemist: '周杰', - engineerApproved: '否', - experimenter: '孙明', - experimenterApproved: '否', - createTime: '2025-1-2 16:45:17', - status: '草稿' - } - ] + // 确认弹窗相关数据 + changeStatus: false, + changeStatusTitle: "", + changeStatusTip: "", + currentOperationRow: null, + currentOperationType: '', + // 评价弹窗相关数据 + evaluationDialogVisible: false, + currentEvaluationData: null, }; + }, + computed: { + isProcessEngineer() { + const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}'); + return userInfo.roleType === 3; // 3是工艺工程师 + } }, created() { this.getTableData(); @@ -213,12 +195,16 @@ methods: { resetForm() { this.form = { - projectPlan: "", - experimentNo: "", + projectName: "", + experimentCode: "", experimentName: "", - createTime: [], - status: "" + startTime: "", + endTime: "", + status: "", + pageNum: 1, + pageSize: 10 }; + this.dateRange = []; }, handleSearch() { this.getTableData(); @@ -227,7 +213,6 @@ this.$router.push({ path: "/dataManagement/testResultReport/detail", query: { - id: 'new', type: 'add' } }); @@ -251,49 +236,161 @@ }); }, handleSubmit(row) { - this.$confirm('确认提交该实验结果?', '提示', { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning' - }).then(() => { - // TODO: 调用提交接口 - this.$message.success('提交成功'); - this.getTableData(); - }).catch(() => {}); + this.currentOperationRow = row; + this.currentOperationType = 'submit'; + this.changeStatusTitle = "确认提交?"; + this.changeStatusTip = "提交之后无法再次编辑"; + this.changeStatus = true; }, handleDelete(row) { - this.$confirm('确认删除该实验结果?', '提示', { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning' - }).then(() => { - // TODO: 调用删除接口 - this.$message.success('删除成功'); - this.getTableData(); - }).catch(() => {}); + this.currentOperationRow = row; + this.currentOperationType = 'delete'; + this.changeStatusTitle = "确认要删除这条信息吗?"; + this.changeStatusTip = "删除后信息无法找回"; + this.changeStatus = true; }, handleEvaluate(row) { - this.$router.push({ - path: "/dataManagement/testResultReport/detail", - query: { - id: row.id, - type: 'evaluate' - } - }); + this.currentOperationRow = row; + this.evaluationDialogVisible = true; }, handleTypeChange(type) { this.currentType = type; this.getTableData(); }, getTableData() { - // 根据currentType获取不同的数据 - if (this.currentType === 'list') { - this.tableData = this.mockListData; - this.total = this.mockListData.length; + const params = { + ...this.form, + 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('获取数据失败'); + }); + }, + handleDateChange(val) { + if (val) { + this.form.startTime = val[0]; + this.form.endTime = val[1]; } else { - this.tableData = this.mockDraftData; - this.total = this.mockDraftData.length; + this.form.startTime = ''; + this.form.endTime = ''; } + }, + getStatusType(status) { + const statusMap = { + '-1': 'info', + '1': 'warning', + '2': 'warning', + '3': 'success', + '4': 'info', + '5': 'warning' + }; + return statusMap[status] || 'info'; + }, + getStatusText(status) { + const statusMap = { + '-1': '草稿箱', + '1': '待提交', + '2': '待评定', + '3': '已评定', + '4': '已封存', + '5': '已解封' + }; + return statusMap[status] || '未知'; + }, + handlePageChange(pageNum) { + this.form.pageNum = pageNum; + this.getTableData(); + }, + handleSizeChange(pageSize) { + this.form.pageSize = pageSize; + this.getTableData(); + }, + 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('删除失败'); + }); + } + }, + // 更新弹窗显示状态 + updateEvaluationDialogVisible(value) { + this.evaluationDialogVisible = value; + if (!value) { + this.currentEvaluationData = null; + } + }, + // 处理评价提交 + handleEvaluationSubmit(evaluationData) { + const { activeIndex } = evaluationData; + + // 将评分数据转换为后端需要的格式 + const evaluateData = { + evaluateType: 1, // 1=工艺工程师 + 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), + resultReportId: this.currentOperationRow.id, + dispatchId: this.currentOperationRow.dispatchId, + status: 1 + }; + console.log('evaluateData',evaluateData) + + 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) { + // 2分 = 良好(1), 1分 = 正确(2), 0分 = 失误(3) + const scoreMap = { + 2: 1, // 良好 + 1: 2, // 正确 + 0: 3 // 失误 + }; + return scoreMap[score] || 3; // 默认返回失误 } } }; @@ -312,33 +409,29 @@ padding-bottom: 20px; justify-content: space-between; align-items: center; - .title { + .title, .drafts { background: #fafafc; border-radius: 8px 8px 0px 0px; border: 1px solid #dcdfe6; padding: 16px 29px; - font-weight: bold; font-size: 18px; color: #606266; - width: unset; cursor: pointer; + font-weight: 400; + } + .title { + padding: 16px 29px; } .drafts { padding: 16px 65px; - background: #fafafc; - border-radius: 8px 8px 0px 0px; - border: 1px solid #dcdfe6; - font-weight: 400; - font-size: 18px; - color: #606266; margin-left: 16px; - cursor: pointer; } .active { color: #049c9a; background: #ffffff; border-radius: 8px 8px 0px 0px; border: 1px solid #049c9a; + font-weight: bold; } } </style> \ No newline at end of file -- Gitblit v1.7.1