From 653a7a72f7d6a816b4b5e24a07b7d2f450cfb287 Mon Sep 17 00:00:00 2001 From: 董国庆 <364620639@qq.com> Date: 星期五, 16 五月 2025 14:41:04 +0800 Subject: [PATCH] 实验中止审批 --- laboratory/src/views/dataManagement/schemeManagement/components/approvalDialog.vue | 38 +-- laboratory/src/views/dataManagement/schemeManagement/list.vue | 5 laboratory/src/views/dataManagement/suspendExperiment/components/approvalDialog.vue | 199 +++++++++++++++---- laboratory/src/views/dataManagement/suspendExperiment/list.vue | 296 ++++++++++++++--------------- laboratory/src/views/dataManagement/suspendExperiment/service.js | 16 + 5 files changed, 333 insertions(+), 221 deletions(-) diff --git a/laboratory/src/views/dataManagement/schemeManagement/components/approvalDialog.vue b/laboratory/src/views/dataManagement/schemeManagement/components/approvalDialog.vue index d3a3873..68edb82 100644 --- a/laboratory/src/views/dataManagement/schemeManagement/components/approvalDialog.vue +++ b/laboratory/src/views/dataManagement/schemeManagement/components/approvalDialog.vue @@ -2,7 +2,7 @@ <div> <el-dialog title="实验方案详情" - :visible.sync="visible" + :visible="dialogVisible" width="80%" :close-on-click-modal="false" @close="handleClose" @@ -26,7 +26,7 @@ <img src="@/assets/public/headercard.png" /> <div>所属实验调度</div> </div> - <el-button @click="handleStopExperiment" type="danger"> + <el-button @click="handleStopExperiment" type="danger" v-if='form.status != 2 && form.status != 3 && form.status != 4'> 申请终止实验</el-button> </div> </div> @@ -216,6 +216,7 @@ }, data() { return { + dialogVisible: false, form: { projectName: "", // 项目课题方案名称 projectCode: "", // 项目课题方案编号 @@ -249,6 +250,16 @@ }; }, watch: { + visible: { + handler(val) { + this.dialogVisible = val; + if (val && this.data && this.data.id) { + // 弹窗打开时,确保数据已获取 + this.getPlanDetail(this.data.id); + } + }, + immediate: true, + }, data: { handler(val) { if (val && val.id) { @@ -258,15 +269,6 @@ }, immediate: true, deep: true, - }, - visible: { - handler(val) { - if (val && this.data && this.data.id) { - // 弹窗打开时,确保数据已获取 - this.getPlanDetail(this.data.id); - } - }, - immediate: true, }, }, methods: { @@ -292,8 +294,7 @@ return statusMap[status] || "未知"; }, handleClose() { - this.$emit("update:visible", false); - this.form.approvalComment = ""; + this.$emit('update:visible', false); }, handleApprove() { if (!this.form.approvalComment) { @@ -346,20 +347,15 @@ }); if(res.status==4||res.status==3){ processData.push({ - type: - res.auditStatus === 2 - ? "primary" - : res.auditStatus === 3 - ? "danger" - : "warning", + type:'primary', mode: "list", fields: [ { label: "审核结果:", value: - res.auditStatus === 2 + res.status ==3 ? "通过" - : res.auditStatus === 3 + : res.status ==4 ? "驳回" : "待审批", }, diff --git a/laboratory/src/views/dataManagement/schemeManagement/list.vue b/laboratory/src/views/dataManagement/schemeManagement/list.vue index 4597a9e..54c6de5 100644 --- a/laboratory/src/views/dataManagement/schemeManagement/list.vue +++ b/laboratory/src/views/dataManagement/schemeManagement/list.vue @@ -71,7 +71,7 @@ ></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="experimentSchemePersons" 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="当前状态"> @@ -107,8 +107,6 @@ :visible.sync="approvalDialogVisible" :type="approvalDialogType" :data="currentApprovalData" - @approve="handleApproveSubmit" - @reject="handleRejectSubmit" /> </div> </template> @@ -271,7 +269,6 @@ }, handleApproveSubmit(data) { this.approvalDialogVisible = false; - this.$message.success('审批通过成功'); this.getTableData(); }, handleRejectSubmit(data) { diff --git a/laboratory/src/views/dataManagement/suspendExperiment/components/approvalDialog.vue b/laboratory/src/views/dataManagement/suspendExperiment/components/approvalDialog.vue index f413ae2..5c9e839 100644 --- a/laboratory/src/views/dataManagement/suspendExperiment/components/approvalDialog.vue +++ b/laboratory/src/views/dataManagement/suspendExperiment/components/approvalDialog.vue @@ -1,5 +1,5 @@ <template> - <el-dialog :title="dialogTitle" :visible.sync="visible" width="80%" :close-on-click-modal="false" + <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="80%" :close-on-click-modal="false" @close="handleClose"> <div class="approval-dialog"> <!-- 左侧审批内容 --> @@ -13,15 +13,21 @@ </div> </div> <Table :data="groupTableData" :total="0" :height="null" class="groupTable"> - <el-table-column type="index" label="所属项目课题方案" width="80"></el-table-column> - <el-table-column prop="groupName" label="实验编号"></el-table-column> - <el-table-column prop="stage" label="实验名称"></el-table-column> - <el-table-column prop="creator" label="通知时间"></el-table-column> - <el-table-column prop="createTime" label="实验开始时间"></el-table-column> - <el-table-column prop="approver" label="实验结束时间"></el-table-column> - <el-table-column prop="approveTime" label="参加人员"></el-table-column> - <el-table-column prop="status" label="状态"> - </el-table-column> + <el-table-column type="index" label="序号" width="80"></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="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"> @@ -30,7 +36,7 @@ <div>中止原因说明</div> </div> </div> - <AiEditor ref="purposeEditor" v-model="form.purpose" height="200px" placeholder="请输入文字" /> + <AiEditor ref="purposeEditor" :readOnly="true" :value="form.stopReason" height="200px" placeholder="请输入文字" /> </template> </Card> @@ -38,12 +44,11 @@ <!-- 右侧审批流程 --> <div class="approval-flow"> <div class="flow-content"> - <approval-process :status="form.status" :submit-time="form.createTime" :approver="form.approver" - :approve-time="form.approveTime" /> + <approval-process :processData="approvalProcessData" /> </div> </div> </div> - <div class="approval-dialog-approve"> + <div class="approval-dialog-approve" v-if="type === 'approve'"> <div class="status"> <div class="status-title">审批结果</div> <div class="status-content"> @@ -55,7 +60,7 @@ </div> </div> </div> - <div class="remark"> + <div class="remark" style="flex:1"> <div class="remark-title">审批意见</div> <el-input type="textarea" v-model="remark" placeholder="请输入审批意见" /> </div> @@ -71,6 +76,7 @@ <script> import ApprovalProcess from '@/components/approvalProcess' import AiEditor from '@/components/AiEditor' +import { audit, getDetail } from '../service' export default { name: "ApprovalDialog", components: { @@ -90,6 +96,30 @@ default: () => ({}), }, }, + computed: { + dialogVisible: { + get() { + return this.visible; + }, + set(val) { + this.$emit('update:visible', val); + } + }, + dialogTitle() { + return this.type === "approve" ? "审批实验中止申请" : "实验中止申请审批详情"; + }, + }, + watch: { + visible: { + handler(val) { + if (val && this.data && this.data.id) { + // this.form = { ...val }; + this.getDialogDetail(this.data.id) + } + }, + immediate: true, + }, + }, data() { return { form: { @@ -103,51 +133,130 @@ approver: "", approveTime: "" }, + groupTableData: [], + approvalProcessData: [], radio1: 1, rules: {}, status: "1", remark: "", }; }, - computed: { - dialogTitle() { - return this.type === "approve" ? "审批实验中止申请" : "实验中止申请审批详情"; - }, - }, - watch: { - data: { - handler(val) { - if (val) { - this.form = { ...val }; - } - }, - immediate: true, - }, - }, methods: { + async getDialogDetail(id) { + try { + const res = await getDetail({ id }); + if (!res) { + this.$message.error('获取方案详情失败'); + this.handleClose(); + return; + } + if(res.stopReason){ + this.showApprovalFlow = true; + //中止实验申请 + let processData = []; + processData.push({ + type: "primary", + mode: "list", + fields: [ + { label: "提交人:", value: res.updateBy || "" }, + { label: "提交时间:", value: res.createTime || "" }, + ], + }); + if(res.status==4||res.status==3){ + processData.push({ + type:'primary', + mode: "list", + fields: [ + { + label: "审核结果:", + value: + res.status ==3 + ? "通过" + : res.status ==4 + ? "驳回" + : "待审批", + }, + { label: "审批意见:", value: res.auditRemark || "" }, + { label: "审核人:", value: res.auditPersonName || "" }, + { label: "审核时间:", value: res.auditTime || "" }, + ], + }); + }else{ + processData.push({ + type: "warning", + mode: "list", + fields: [ + { label: "等待审核"}, + ], + }); + } + this.approvalProcessData = processData; + } + + // 填充基本表单数据 + this.form = { + ...this.form, + stopReason: res.stopReason, + }; + + // 构建实验调度数据 + if (res.experimentDispatch) { + this.groupTableData = [res.experimentDispatch]; + } + + } catch (error) { + console.error("获取方案详情失败:", error); + this.$message.error("获取方案详情失败"); + this.handleClose(); + } + }, + getStatusType(status) { + const statusMap = { + "-1": "info", + "1": "warning", + "2": "success", + "3": "info" + }; + return statusMap[status] || "info"; + }, + getStatusText(status) { + const statusMap = { + "-1": "草稿箱", + "1": "待确认", + "2": "已确认", + "3": "已封存" + }; + return statusMap[status] || "未知"; + }, handleClose() { - this.$emit("update:visible", false); - this.form.approvalComment = ""; + this.$emit('update:visible', false); + this.remark = ""; }, handleApprove() { - if (!this.form.approvalComment) { + if (!this.remark) { this.$message.warning("请输入审批意见"); return; } - this.$emit("approve", { - ...this.form, - status: "approved", - }); + this.handleSubmit(); }, - handleReject() { - if (!this.form.approvalComment) { - this.$message.warning("请输入审批意见"); - return; + async handleSubmit() { + try { + const params = { + id: this.data.id, + auditRemark: this.remark, + status: this.status === '1' ? 3 : 4 // 1表示通过(status=3),2表示拒绝(status=4) + }; + console.log('params params',params) + const res = await audit(params); + console.log('res res',res) + if (res) { + this.$message.success('审批成功'); + this.handleClose(); + } + } catch (error) { + console.error('审批失败:', error); + this.$message.error('审批失败'); } - this.$emit("reject", { - ...this.form, - status: "rejected", - }); }, }, }; diff --git a/laboratory/src/views/dataManagement/suspendExperiment/list.vue b/laboratory/src/views/dataManagement/suspendExperiment/list.vue index d643cb0..830dce5 100644 --- a/laboratory/src/views/dataManagement/suspendExperiment/list.vue +++ b/laboratory/src/views/dataManagement/suspendExperiment/list.vue @@ -1,43 +1,64 @@ <template> <div class="list"> - <TableCustom :queryForm="form" :tableData="tableData" :total="total"> + <TableCustom :queryForm="form" :tableData="tableData" :total="total" @handlePageChange="handlePageChange" @handleSizeChange="handleSizeChange"> <template #search> <el-form :model="form" labelWidth="auto" inline> - <el-form-item label="所属项目课题方案:"> - <el-input v-model="form.planName" placeholder="请输入"></el-input> + <el-form-item label="项目课题方案名称:"> + <el-input v-model="form.projectName" placeholder="请输入"></el-input> </el-form-item> <el-form-item label="实验编号:"> - <el-input v-model="form.planCode" placeholder="请输入"></el-input> + <el-input v-model="form.experimentCode" placeholder="请输入"></el-input> </el-form-item> <el-form-item label="创建时间:"> - <el-date-picker v-model="form.createTime" type="daterange" range-separator="至" start-placeholder="开始日期" - end-placeholder="结束日期" value-format="yyyy-MM-dd"></el-date-picker> + <el-date-picker + v-model="form.createTime" + 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-input v-model="form.approver" placeholder="请输入"></el-input> + <el-form-item label="状态:"> + <el-select v-model="form.status" placeholder="请选择"> + <el-option label="全部" value=""></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=""> <el-button type="default" @click="resetForm">重置</el-button> - <el-button type="primary" @click="handleSearch" style="margin-left: 20px;">查询</el-button> + <el-button type="primary" @click="handleSearch" style="margin-left: 10px;">查询</el-button> </el-form-item> </el-form> </template> <template #setting> <div class="tableTitle"> - <div class="flex a-center"> - <div class="title" :class="{ active: currentType === 'list' }" @click="handleTypeChange('list')">申请中止试验方案列表 - </div> + <div class="flex a-center flex-wrap"> + <div + class="title" + :class="{active:currentType == 'list'}" + @click="handleTypeChange('list')" + >申请中止试验方案列表</div> </div> </div> </template> <template #table> - <el-table-column prop="planCode" label="所属项目课题方案"></el-table-column> - <el-table-column prop="planName" label="实验编号"></el-table-column> - <el-table-column prop="stage" label="实验名称"></el-table-column> - <el-table-column prop="creator" label="试验日期"></el-table-column> - <el-table-column prop="createTime" label="实验员"></el-table-column> - <el-table-column prop="approver" label="提交时间"></el-table-column> - <el-table-column prop="approveTime" 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="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="getStatusType(scope.row.status)"> @@ -45,25 +66,39 @@ </el-tag> </template> </el-table-column> - <el-table-column label="操作" width="250"> <template slot-scope="scope"> - <el-button v-if="scope.row.status === 'pending'" type="text" - @click="handleApprove(scope.row)">审批</el-button> - - <el-button type="text" @click="handleDetail(scope.row)">详情</el-button> + <!-- 超级管理员(1) --> + <template v-if="userRole == '1'"> + <el-button type="text" @click="handleDetail(scope.row)">详情</el-button> + </template> + + <!-- 审批人(2) --> + <template v-if="userRole == '2'"> + <el-button + v-if="scope.row.status == 2" + type="text" + @click="handleApprove(scope.row)" + >审批</el-button> + <el-button v-else type="text" @click="handleDetail(scope.row)">详情</el-button> + </template> </template> </el-table-column> </template> </TableCustom> <!-- 审批弹窗 --> - <approval-dialog :visible.sync="approvalDialogVisible" :type="approvalDialogType" :data="currentApprovalData" - @approve="handleApproveSubmit" @reject="handleRejectSubmit" /> + <approval-dialog + :visible.sync="approvalDialogVisible" + :type="approvalDialogType" + :data="currentApprovalData" + @close="handleClose" + /> </div> </template> <script> import ApprovalDialog from './components/approvalDialog.vue' +import {getList} from './service' export default { name: "ProjectList", @@ -72,170 +107,128 @@ }, data() { return { - currentType: 'list', // 当前显示类型:list-列表,draft-草稿箱 + currentType: 'list', form: { - planName: "", - planCode: "", - creator: "", + projectName: "", + experimentCode: "", createTime: [], - approver: "", status: "", + startTime: "", + endTime: "", + pageNum: 1, + pageSize: 10 }, tableData: [], total: 0, - // 模拟数据 - mockListData: [ - { - planCode: 'PLAN-2024-001', - planName: '2024年度实验室设备升级方案', - stage: '规划阶段', - creator: '张三', - createTime: '2024-03-15', - status: 'pending', - approver: '李四', - approveTime: '2024-03-16' - }, - { - planCode: 'PLAN-2024-002', - planName: '实验室安全管理制度更新方案', - stage: '实施阶段', - creator: '王五', - createTime: '2024-03-14', - status: 'approved', - approver: '赵六', - approveTime: '2024-03-15' - }, - { - planCode: 'PLAN-2024-003', - planName: '实验室人员培训计划', - stage: '准备阶段', - creator: '孙七', - createTime: '2024-03-13', - status: 'rejected', - approver: '周八', - approveTime: '2024-03-14' - } - ], - mockDraftData: [ - { - planCode: 'DRAFT-2024-001', - planName: '实验室设备采购计划(草稿)', - stage: '规划阶段', - creator: '张三', - createTime: '2024-03-16', - status: 'draft', - approver: '', - approveTime: '' - }, - { - planCode: 'DRAFT-2024-002', - planName: '实验室改造方案(草稿)', - stage: '准备阶段', - creator: '李四', - createTime: '2024-03-15', - status: 'draft', - approver: '', - approveTime: '' - } - ], approvalDialogVisible: false, - approvalDialogType: 'approve', + approvalDialogType: 'view', currentApprovalData: null, + userRole: '', }; }, created() { + const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}'); + this.userRole = userInfo.roleType || ''; this.getTableData(); }, methods: { + handlePageChange(page) { + this.form.pageNum = page; + this.getTableData(); + }, + handleSizeChange(size) { + this.form.pageSize = size; + this.form.pageNum = 1; + this.getTableData(); + }, resetForm() { this.form = { - planName: "", - planCode: "", - creator: "", + projectName: "", + experimentCode: "", createTime: [], - approver: "", status: "", + startTime: "", + endTime: "", + pageNum: 1, + pageSize: 10 }; + this.getTableData(); }, handleSearch() { - // 实现查询逻辑 - console.log("查询条件:", this.form); + this.form.pageNum = 1; + this.getTableData(); }, getStatusType(status) { const statusMap = { - pending: "warning", - rejected: "danger", - approved: "success", - archived: "info", - draft: "info" + '-1': "info", + '1': "warning", + '2': "warning", + '3': "success", + '4': "danger", + '5': "info", + '6':'success' }; return statusMap[status] || "info"; }, getStatusText(status) { const statusMap = { - pending: "待审批", - rejected: "已驳回", - approved: "已通过", - archived: "已封存", - draft: "草稿" + '-1': "草稿", + '1': "已发送", + '2': "待审核", + '3': "已通过", + '4': "已驳回", + '5': "已封存", + '6':'实验员已提交' }; return statusMap[status] || "未知"; }, - handleAddPlan() { - this.$router.push({ - path: "/dataManagement/addPlan", - }); - }, - handleApprove(row) { - this.currentApprovalData = row; - this.approvalDialogType = 'approve'; - this.approvalDialogVisible = true; - }, - handleApproveSubmit(data) { - // 处理审批通过 - console.log('审批通过:', data); - this.approvalDialogVisible = false; - this.$message.success('审批通过成功'); - this.getTableData(); - }, - handleRejectSubmit(data) { - // 处理审批驳回 - console.log('审批驳回:', data); - this.approvalDialogVisible = false; - this.$message.success('审批驳回成功'); - this.getTableData(); - }, - handleRevokeApprove(row) { - // 实现撤销审批逻辑 - console.log("撤销审批数据:", row); - }, - handleEdit(row) { - // 实现编辑逻辑 - console.log("编辑数据:", row); - }, - handleDelete(row) { - // 实现删除逻辑 - console.log("删除数据:", row); - }, - handleDetail(row) { - this.currentApprovalData = row; - this.approvalDialogType = 'view'; - this.approvalDialogVisible = true; + handleDateChange(val) { + if (val) { + this.form.startTime = val[0]; + this.form.endTime = val[1]; + } else { + this.form.startTime = ''; + this.form.endTime = ''; + } }, handleTypeChange(type) { this.currentType = type; + this.form.pageNum = 1; this.getTableData(); }, - getTableData() { - // 根据currentType请求不同的数据 - if (this.currentType === 'list') { - this.tableData = this.mockListData; - this.total = this.mockListData.length; - } else { - this.tableData = this.mockDraftData; - this.total = this.mockDraftData.length; + async getTableData() { + try { + const { data } = await getList(this.form); + this.tableData = data.records || []; + this.total = data.total || 0; + } catch (error) { + console.error('获取列表数据失败:', error); + this.$message.error('获取列表数据失败'); } }, + handleApprove(row) { + this.approvalDialogType = 'approve'; + this.approvalDialogVisible = true; + this.currentApprovalData = { + id: row.id + }; + }, + handleDetail(row) { + this.approvalDialogType = 'view'; + this.approvalDialogVisible = true; + this.currentApprovalData = { + id: row.id + }; + }, + handleClose(data) { + this.approvalDialogVisible = false; + this.getTableData(); + }, + handleRejectSubmit(data) { + this.approvalDialogVisible = false; + this.$message.success('审批驳回成功'); + this.getTableData(); + } }, }; </script> @@ -287,4 +280,5 @@ border: 1px solid #049c9a; } } +</style> </style> \ No newline at end of file diff --git a/laboratory/src/views/dataManagement/suspendExperiment/service.js b/laboratory/src/views/dataManagement/suspendExperiment/service.js new file mode 100644 index 0000000..3f27d54 --- /dev/null +++ b/laboratory/src/views/dataManagement/suspendExperiment/service.js @@ -0,0 +1,16 @@ +import axios from '@/utils/request'; + +// 列表 +export const getList = (data) => { + return axios.post('/api/t-experiment-scheme/auditPageList', { ...data }) +} +// 详情 +export const getDetail = (data) => { + return axios.get('/open/t-experiment-scheme/getDetailById', { params:data }) +} + + +// 审批 +export const audit = (data) => { + return axios.post('/api/t-experiment-scheme/audit', { ...data }) +} -- Gitblit v1.7.1