Merge branch 'main' of http://120.76.84.145:10101/gitblit/r/H5/leshan-laboratory
| | |
| | | </script> |
| | | |
| | | <style lang="less"> |
| | | |
| | | ::-webkit-scrollbar { |
| | | display: none; |
| | | } |
| | | |
| | | .table-container { |
| | | ::-webkit-scrollbar { |
| | | display: block !important; |
| | | width: 6px; |
| | | height: 6px; |
| | | } |
| | | |
| | | |
| | | ::-webkit-scrollbar-track { |
| | | background: #f1f1f1; |
| | | border-radius: 3px; |
| | | } |
| | | |
| | | |
| | | ::-webkit-scrollbar-thumb { |
| | | background: #009688; |
| | | border-radius: 3px; |
| | | } |
| | | |
| | | |
| | | ::-webkit-scrollbar-thumb:hover { |
| | | background: #00796b; |
| | | } |
| | | } |
| | | |
| | | html, |
| | | body, |
| | | #app { |
| | |
| | | } |
| | | } |
| | | |
| | | .is-disabled .el-input__inner { |
| | | color: rgba(0, 0, 0, 0.6) !important; |
| | | } |
| | | |
| | | .el-dialog { |
| | | border-radius: 16px 16px 6px 6px; |
| | | |
| | |
| | | background-color: #009688; |
| | | } |
| | | |
| | | .el-button + .el-button, |
| | | .el-checkbox.is-bordered + .el-checkbox.is-bordered { |
| | | .el-button+.el-button, |
| | | .el-checkbox.is-bordered+.el-checkbox.is-bordered { |
| | | margin-left: 0; |
| | | } |
| | | |
| | |
| | | <template> |
| | | <el-dialog @open="openDialog" class="select-member" :z-index="1000" :visible.sync="visible" width="53.33%" |
| | | <el-dialog @open="openDialog" class="select-member" :z-index="1000" :visible.sync="visible" width="53.33%" |
| | | :close-on-click-modal="false" :show-close="false"> |
| | | <template #title> |
| | | <div>{{title}}</div> |
| | | <div>{{ title }}</div> |
| | | </template> |
| | | <div class="select-member-content"> |
| | | <el-row :gutter="16"> |
| | |
| | | <div class="select-member-content-left-list"> |
| | | <div class="select-member-content-left-list-title">角色列表</div> |
| | | <div class="select-member-content-left-list-itemBox"> |
| | | <div @click="searchUserList(item.roleId)" v-for="item in filteredRoleList" :key="item.roleId" |
| | | class="select-member-content-left-list-itemBox-item" |
| | | <div @click="searchUserList(item.roleId)" v-for="item in filteredRoleList" |
| | | :key="item.roleId" class="select-member-content-left-list-itemBox-item" |
| | | :class="roleId == item.roleId && 'active'"> |
| | | {{ item.roleName }} |
| | | </div> |
| | |
| | | <div class="select-member-content-right-header"> |
| | | <div class="select-member-content-right-header-text">人员列表</div> |
| | | <div class="select-member-content-right-header-search"> |
| | | <el-input clearable v-model="nickNameOrPhone" placeholder="请输入姓名/手机号" @keyup.enter.native="searchUserList(roleId)" /> |
| | | <el-input clearable v-model="nickNameOrPhone" placeholder="请输入姓名/手机号" |
| | | @keyup.enter.native="searchUserList(roleId)" /> |
| | | <el-button type="primary" @click="searchUserList(roleId)">搜索</el-button> |
| | | </div> |
| | | </div> |
| | | <Table ref="memberTable" :row-key="row => row.userId" :data="tableData" :total="0" |
| | | <Table ref="memberTable" :row-key="row => row.userId" height="300" :data="tableData" :total="0" |
| | | @selection-change="handleSelectionChange" :row-class-name="tableRowClassName" |
| | | @row-click="handleRowClick"> |
| | | <el-table-column type="selection" width="55" v-if="!singleSelect" /> |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | import { getRoleList, getUserList } from './service' |
| | | import { getRoleList, getUserList,getUsersList } from './service' |
| | | export default { |
| | | props: { |
| | | projectId: { |
| | |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | title:{ |
| | | type:String, |
| | | default:'选择参与人员' |
| | | title: { |
| | | type: String, |
| | | default: '选择参与人员' |
| | | }, |
| | | }, |
| | | data() { |
| | |
| | | // 获取角色列表并根据项目组ID进行过滤 |
| | | getRoleList().then(res => { |
| | | let roles = []; |
| | | if (this.projectId) { |
| | | // 过滤出实验员和化验师角色 |
| | | roles = res.filter(item => item.roleId == 4 || item.roleId == 5); |
| | | if (this.title == '选择菌种实验员') { |
| | | if (this.title == '选择菌种实验员') { |
| | | roles = res.filter(item => item.roleId == 48) |
| | | } |
| | | } else { |
| | | roles = res.filter(item => item.roleId !== 1); // 排除 roleId 为 1 的角色 |
| | | if (this.projectId) { |
| | | // 过滤出实验员和化验师角色 |
| | | roles = res.filter(item => item.roleId == 4 || item.roleId == 5); |
| | | } else { |
| | | roles = res.filter(item => item.roleId !== 1); // 排除 roleId 为 1 的角色 |
| | | } |
| | | } |
| | | |
| | | if(this.title=='选择菌种实验员'){ |
| | | roles = res.filter(item => item.roleId == 5) |
| | | } |
| | | |
| | | |
| | | |
| | | this.roleList = roles; |
| | | this.filterRoleList(); // 获取后先进行一次过滤 |
| | | }); |
| | |
| | | // 获取当前表格中未被选中的用户ID |
| | | const unselectedInCurrentTable = this.tableData.filter(row => !val.some(selected => selected.userId === row.userId)).map(row => row.userId); |
| | | // 从总的selectData中移除这些未选中的用户,保留其他角色已选中的用户 |
| | | const otherSelected = this.selectData.filter(item => !unselectedInCurrentTable.includes(item.userId)); |
| | | const otherSelected = this.selectData.filter(item => !unselectedInCurrentTable.includes(item.userId)); |
| | | // 合并当前表格的选中项和其他角色已选中的项 |
| | | this.selectData = [...otherSelected.filter(item => !val.some(v => v.userId === item.userId)), ...val]; |
| | | } |
| | |
| | | async searchUserList(roleId) { |
| | | this.roleId = roleId |
| | | // 根据是否有项目组ID来决定调用不同的接口 |
| | | const params = { |
| | | let params = { |
| | | roleIds: roleId ? [roleId] : [], |
| | | nickNameOrPhone: this.nickNameOrPhone, // 使用 nickNameOrPhone 进行搜索 |
| | | pageSize: 9999, |
| | | pageNum: 1 |
| | | pageNum: 1, |
| | | }; |
| | | |
| | | if (this.projectId) { |
| | | params.projectId = this.projectId; |
| | | } |
| | | |
| | | const res = await getUserList(params); |
| | | this.tableData = res.records; |
| | | let res = '' |
| | | if(this.title == '选择菌种实验员'){ |
| | | params.roleType = 2 |
| | | params.projectId = this.projectId; |
| | | res = await getUsersList(params); |
| | | this.tableData = res.data.records; |
| | | }else{ |
| | | res = await getUserList(params); |
| | | this.tableData = res.records; |
| | | } |
| | | |
| | | |
| | | // 数据加载完成后重新应用选中状态 |
| | | this.$nextTick(() => { |
| | |
| | | </script> |
| | | |
| | | <style scoped lang="less"> |
| | | |
| | | // to fix el-message弹框被el-dialog覆盖的问题。 |
| | | .select-member-content { |
| | | .select-member-content-left { |
| | |
| | | return axios.post('/api/t-project-team/pageList', { ...data }) |
| | | } |
| | | |
| | | //选择菌种实验员 |
| | | export const getUsersList = (data) => { |
| | | console.log('getUsersList',data); |
| | | return axios.post('/api/t-train-library/choiceUserList', { ...data }) |
| | | } |
| | | |
| | | // 用户列表 |
| | | export const getUserList = (data) => { |
| | | return axios.post('/system/user/list', { ...data }) |
| | |
| | | <slot></slot> |
| | | </el-table> |
| | | <div v-if="total > 0"> |
| | | <el-pagination layout="slot, prev, pager, next, sizes, jumper" :page-size="queryForm.pageSize" |
| | | <el-pagination :layout="type==1?'slot, prev, pager, next, sizes, jumper':'slot, prev, pager, next'" :page-size="queryForm.pageSize" |
| | | :current-page="queryForm.pageNum" :total="total" @current-change="handleCurrentChange" |
| | | @size-change="handleSizeChange" class="pagination"> |
| | | <div class="pagination-info">第 {{ (queryForm.pageNum == 1) ? 1 : (queryForm.pageNum - 1) * |
| | |
| | | height: { |
| | | type: Number, |
| | | default: () => Vue.prototype.$baseTableHeight() |
| | | } |
| | | }, |
| | | type: { |
| | | type: Number, |
| | | default: 1 |
| | | }, |
| | | }, |
| | | methods: { |
| | | toggleRowSelection(row, selected) { |
| | |
| | | name: "StrainLibraryManage", |
| | | meta: { |
| | | title: "原始细胞库", |
| | | keepAlive: true, |
| | | }, |
| | | component: () => |
| | | import("../views/strain-library/strain-library-manage"), |
| | |
| | | name: "StrainLibraryManageAdd", |
| | | meta: { |
| | | title: "新增原始细胞库", |
| | | keepAlive: true, |
| | | |
| | | hide: true, |
| | | }, |
| | | component: () => |
| | | import("../views/strain-library/strain-library-manage/add.vue"), |
| | | }, |
| | | { |
| | | path: "strain-library-manage/detail", |
| | | name: "StrainLibraryManageAdd", |
| | | meta: { |
| | | title: "编辑原始细胞库", |
| | | hide: true, |
| | | }, |
| | | component: () => |
| | |
| | | name: "MainCellLibrary", |
| | | meta: { |
| | | title: "主细胞库", |
| | | keepAlive: true, |
| | | }, |
| | | component: () => |
| | | import("../views/strain-library/main-cell-library"), |
| | |
| | | name: "MainCellLibraryAdd", |
| | | meta: { |
| | | title: "新增主细胞", |
| | | keepAlive: true, |
| | | hide: true, |
| | | }, |
| | | component: () => |
| | | import("../views/strain-library/main-cell-library/add.vue"), |
| | | }, |
| | | { |
| | | path: "main-cell-library/edit", |
| | | name: "MainCellLibraryAdd", |
| | | meta: { |
| | | title: "编辑主细胞", |
| | | hide: true, |
| | | }, |
| | | component: () => |
| | |
| | | name: "ProductionCellLibrary", |
| | | meta: { |
| | | title: "生产细胞库", |
| | | keepAlive: true, |
| | | }, |
| | | component: () => |
| | | import("../views/strain-library/production-cell-library"), |
| | |
| | | name: "ProductionCellLibraryAdd", |
| | | meta: { |
| | | title: "新增生产细胞", |
| | | keepAlive: true, |
| | | hide: true, |
| | | }, |
| | | component: () => |
| | | import("../views/strain-library/production-cell-library/add.vue"), |
| | | }, |
| | | { |
| | | path: "production-cell-library/edit", |
| | | name: "ProductionCellLibraryAdd", |
| | | meta: { |
| | | title: "编辑生产细胞", |
| | | hide: true, |
| | | }, |
| | | component: () => |
| | |
| | | import("../views/strainReportLibrary/reportLibraryOneTWO/index.vue"), |
| | | }, |
| | | { |
| | | path: "detailTwo", |
| | | meta: { |
| | | title: "报告详情", |
| | | hide: true, |
| | | keepAlive: true, |
| | | }, |
| | | component: () => |
| | | import("../views/strainReportLibrary/reportLibraryOneTWO/add.vue"), |
| | | }, |
| | | { |
| | | path: "addTwo", |
| | | meta: { |
| | | title: "新增报告", |
| | |
| | | ), |
| | | }, |
| | | { |
| | | path: "detailThree", |
| | | meta: { |
| | | title: "报告详情", |
| | | hide: true, |
| | | keepAlive: true, |
| | | }, |
| | | component: () => |
| | | import("../views/strainReportLibrary/reportLibraryOneThree/add.vue"), |
| | | }, |
| | | { |
| | | path: "addThree", |
| | | meta: { |
| | | title: "新增报告", |
| | |
| | | import("../views/strainReportLibrary/reportLibraryOneFour/index.vue"), |
| | | }, |
| | | { |
| | | path: "detailFour", |
| | | meta: { |
| | | title: "报告详情", |
| | | hide: true, |
| | | keepAlive: true, |
| | | }, |
| | | component: () => |
| | | import("../views/strainReportLibrary/reportLibraryOneFour/add.vue"), |
| | | }, |
| | | { |
| | | path: "addFour", |
| | | meta: { |
| | | title: "新增报告", |
| | |
| | | } |
| | | } |
| | | |
| | | console.log('rewdsada',res); |
| | | |
| | | console.log('rewdsada', res); |
| | | |
| | | if (res.data.code == 500) { |
| | | Message({ |
| | | message: res.data.msg || '服务器错误', |
| | | type: 'error', |
| | | duration: 2000 |
| | | }) |
| | | return |
| | | } |
| | | |
| | | |
| | | if (res.data.code == 200) { |
| | | if (!res.data) { |
| | | return Promise.resolve({}) |
| | | } |
| | | |
| | | if (res.data&&res.data.data&&res.data.data.code == 200) { |
| | | if (res.data && res.data.data && res.data.data.code == 200) { |
| | | return Promise.resolve(res.data.data || res.data) |
| | | } else if ((res.data&&res.data.data&&(res.data.data.code == 103 || res.data.data.code == 401))) { |
| | | } else if ((res.data && res.data.data && (res.data.data.code == 103 || res.data.data.code == 401))) { |
| | | Message({ |
| | | message: res.data.data.msg || '登录已过期,请重新登录', |
| | | type: 'warning', |
| | | duration: 2000 |
| | | }) |
| | | } else if ((res.data&&res.data.data&&(res.data.data.code == 500))) { |
| | | } else if ((res.data && res.data.data && (res.data.data.code == 500)) || res.data.code == 500) { |
| | | Message({ |
| | | message: res.data.data.msg || '服务器错误', |
| | | type: 'error', |
| | |
| | | <template> |
| | | <div class="list"> |
| | | <TableCustom :queryForm="queryForm" :tableData="tableData" :total="total" @currentChange="handleCurrentChange" |
| | | <TableCustom :tableData="tableData" :total="total" @currentChange="handleCurrentChange" |
| | | @sizeChange="handleSizeChange"> |
| | | <template #search> |
| | | <el-form :model="form" label-width="140px" inline> |
| | | <el-form-item label="项目组名称:"> |
| | | <el-form-item label="项目组名称:" v-if="roleType!=4"> |
| | | <el-input v-model="form.teamName" placeholder="请输入"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="创建日期:"> |
| | | <el-form-item label="所属项目组:" v-if="roleType==4"> |
| | | <el-input v-model="form.teamName" placeholder="请输入"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="评定开始时间:" v-if="roleType==4"> |
| | | <el-date-picker v-model="form.date" type="daterange" range-separator="至" |
| | | start-placeholder="开始日期" end-placeholder="结束日期"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="状态:"> |
| | | <el-form-item label="创建日期:" v-if="roleType!=4"> |
| | | <el-date-picker v-model="form.date" type="daterange" range-separator="至" |
| | | start-placeholder="开始日期" end-placeholder="结束日期"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="状态:" v-if="roleType!=4"> |
| | | <el-select placeholder="请选择" v-model="form.status"> |
| | | <el-option label="待审核" :value="1"></el-option> |
| | | <el-option label="待评定" :value="2"></el-option> |
| | |
| | | |
| | | <script> |
| | | import { getListData } from './service' |
| | | import moment from 'moment' |
| | | export default { |
| | | name: 'ProjectTeamIntegral', |
| | | data() { |
| | | return { |
| | | form: {}, |
| | | tableData: [], |
| | | queryForm: { |
| | | form: { |
| | | pageSize: 10, |
| | | pageNum: 1 |
| | | pageNum: 1, |
| | | teamName: '', |
| | | date:[], |
| | | status:'' |
| | | }, |
| | | roleType: JSON.parse(sessionStorage.getItem('userInfo')).roleType * 1, |
| | | total: 0 |
| | | } |
| | | }, |
| | | created() { |
| | | this.reset() |
| | | this.getList() |
| | | }, |
| | | methods: { |
| | |
| | | }, |
| | | getList() { |
| | | let obj = { |
| | | ...this.queryForm |
| | | ...this.form |
| | | } |
| | | if (obj.date) { |
| | | obj.startTime = moment(obj.date[0]).format('YYYY-MM-DD') |
| | | obj.endTime = moment(obj.date[1]).format('YYYY-MM-DD') |
| | | if (obj.date.length) { |
| | | obj.time = moment(obj.date[0]).format('YYYY-MM-DD 00:00:00') + ' - ' + moment(obj.date[1]).format('YYYY-MM-DD 23:59:59') |
| | | delete obj.date |
| | | } |
| | | |
| | | getListData(obj).then(res => { |
| | | this.tableData = res.data.records |
| | | this.total = res.data.total |
| | | }) |
| | | }, |
| | | reset() { |
| | | this.queryForm = { |
| | | this.form = { |
| | | pageSize: 10, |
| | | pageNum: 1 |
| | | pageNum: 1, |
| | | teamName: '', |
| | | date:[], |
| | | status:'' |
| | | } |
| | | this.getList() |
| | | }, |
| | |
| | | |
| | | // 列表 |
| | | export const getListData = (data) => { |
| | | console.log('qweqweqweqwe',data); |
| | | |
| | | return axios.post('/api/t-strain-report/pageListProject', { ...data }) |
| | | } |
| | | |
| | |
| | | }); |
| | | }, |
| | | addNodeSign(value, type) { |
| | | console.log('/////8415454545'); |
| | | console.log('/////8415454545',value); |
| | | this.nodeData = value; |
| | | this.nodeType = type; |
| | | this.$refs.addAncestor.closeDialog() |
| | | this.$refs.addSublevelForm.closeDialog() |
| | | // this.$refs.addAncestor.closeDialog() |
| | | // this.$refs.addSublevelForm.close() |
| | | this.confirmStorageDialogVisible = true; |
| | | }, |
| | | handleSubmit() { |
| | |
| | | })), |
| | | }; |
| | | |
| | | console.log('//////////////',processedData); |
| | | |
| | | |
| | | // 更新图表数据 |
| | | this.graph.changeData(processedData); |
| | | |
| | |
| | | addNodeSign(value, type) { |
| | | this.nodeData = value; |
| | | this.nodeType = type; |
| | | this.$refs.addAncestor.closeDialog() |
| | | // this.$refs.addAncestor.closeDialog() |
| | | this.$refs.addSublevelForm.closeDialog() |
| | | this.confirmStorageDialogVisible = true; |
| | | }, |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | import moment from 'moment'; |
| | | export default { |
| | | data() { |
| | | return { |
| | |
| | | thisTime: value.form.vaccinateTime |
| | | ? value.form.vaccinateTime |
| | | : formatTime, |
| | | confirmTime: value.confirmTime ? moment(value.confirmTime).format('YYYY-MM-DD HH:mm:ss') : moment().format('YYYY-MM-DD HH:mm:ss') |
| | | }; |
| | | this.dialogVisible = true; |
| | | }, |
| | | close(){ |
| | | this.dialogVisible = false; |
| | | }, |
| | | closeDialog() { |
| | | console.log(41515151541561541564156); |
| | | |
| | | this.dialogVisible = false; |
| | | // 重置表单数据 |
| | | this.form = { |
| | | thisName: "", |
| | | thisTime: "", |
| | | strainCode: "", |
| | | strainName: "", |
| | | strainCode1: "", |
| | | strainName1: "", |
| | | status: 1, |
| | | confirmTime: "", |
| | | discardReason: "", |
| | | }; |
| | | // this.form = { |
| | | // thisName: "", |
| | | // thisTime: "", |
| | | // strainCode: "", |
| | | // strainName: "", |
| | | // strainCode1: "", |
| | | // strainName1: "", |
| | | // status: 1, |
| | | // confirmTime: "", |
| | | // discardReason: "", |
| | | // }; |
| | | // 重置表单验证 |
| | | this.$refs.form && this.$refs.form.resetFields(); |
| | | }, |
| | |
| | | this.planForm = { |
| | | ...this.planForm, |
| | | ...value, |
| | | confirmTime: moment().format('YYYY-MM-DD HH:mm:ss') |
| | | confirmTime: value.confirmTime ? moment(value.confirmTime).format('YYYY-MM-DD HH:mm:ss') : moment().format('YYYY-MM-DD HH:mm:ss') |
| | | } |
| | | this.openDialog() |
| | | }, |
| | |
| | | <el-dialog |
| | | :title="planForm.formStatus == 'add' ? '新增菌种传代项' : planForm.formStatus == 'edit' ? '编辑菌种传代项' : '菌种传代项详情'" |
| | | :visible.sync="planDialogVisible" |
| | | width="40%" |
| | | width="60%" |
| | | :close-on-click-modal="false" |
| | | > |
| | | <el-form |
| | |
| | | openInitData(value) { |
| | | console.log('45646545645',value) |
| | | // 赋值当前时间 |
| | | // const now = new Date(); |
| | | // const pad = (n) => n.toString().padStart(2, "0"); |
| | | // this.planForm.storageTime = `${now.getFullYear()}-${pad( |
| | | // now.getMonth() + 1 |
| | | // )}-${pad(now.getDate())} ${pad(now.getHours())}:${pad( |
| | | // now.getMinutes() |
| | | // )}:${pad(now.getSeconds())}`; |
| | | const now = new Date(); |
| | | const pad = (n) => n.toString().padStart(2, "0"); |
| | | this.planForm.storageTime = `${now.getFullYear()}-${pad( |
| | | now.getMonth() + 1 |
| | | )}-${pad(now.getDate())} ${pad(now.getHours())}:${pad( |
| | | now.getMinutes() |
| | | )}:${pad(now.getSeconds())}`; |
| | | this.planForm = value; |
| | | if(value.confirmTime){ |
| | | this.planForm.confirmTime = moment(value.confirmTime).format('YYYY-MM-DD HH:mm:ss') |
| | |
| | | <template> |
| | | <el-dialog |
| | | :title="dialogTitle" |
| | | :visible.sync="dialogVisible" |
| | | width="40%" |
| | | @close="closeDialog" |
| | | :close-on-click-modal="false" |
| | | > |
| | | <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="40%" @close="closeDialog" |
| | | :close-on-click-modal="false"> |
| | | <el-form :model="form" :rules="rules" ref="form" label-position="top"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="10"> |
| | |
| | | </el-col> |
| | | <el-col :span="10"> |
| | | <el-form-item label="接种菌种编号" prop="strainCode"> |
| | | <el-input |
| | | :disabled="dialogTitle.includes('详情')" |
| | | v-model="form.strainCode" |
| | | placeholder="请输入" |
| | | ></el-input> |
| | | <el-input :disabled="dialogTitle.includes('详情')" v-model="form.strainCode" placeholder="请输入"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="10"> |
| | | <el-form-item label="接种菌种名称" prop="strainName"> |
| | | <el-input |
| | | :disabled="dialogTitle.includes('详情')" |
| | | v-model="form.strainName" |
| | | placeholder="请输入" |
| | | ></el-input> |
| | | <el-input :disabled="dialogTitle.includes('详情')" v-model="form.strainName" placeholder="请输入"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | </el-form-item> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="10"> |
| | | <el-form-item |
| | | v-if="form.status === 2" |
| | | label="废弃原因说明" |
| | | prop="remark" |
| | | > |
| | | <el-input |
| | | :disabled="dialogTitle.includes('详情')" |
| | | v-model="form.remark" |
| | | placeholder="请输入" |
| | | ></el-input> |
| | | <el-form-item v-if="form.status === 2" label="废弃原因说明" prop="remark"> |
| | | <el-input :disabled="dialogTitle.includes('详情')" v-model="form.remark" placeholder="请输入"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | dialogTitle: "", |
| | | form: { |
| | | status: 1, |
| | | thisName: '', |
| | | thisTime: '', |
| | | strainCode: '', |
| | | strainName: '', |
| | | strainCode1: '', |
| | | strainName1: '', |
| | | remark: '', |
| | | vaccinateSignature: '', |
| | | preserveSignature: '', |
| | | confirmTime: '', |
| | | type: 1, |
| | | }, |
| | | rules: { |
| | | status: [ |
| | |
| | | methods: { |
| | | openInitData(value) { |
| | | console.log(value); |
| | | |
| | | this.dialogTitle = value.title; |
| | | // 获取用户信息 |
| | | console.log('qweqwwqr4qw4rqw854',sessionStorage.getItem("userInfo")); |
| | | const userInfo = JSON.parse(sessionStorage.getItem("userInfo") || "{}"); |
| | | |
| | | |
| | | // 获取当前时间并格式化 |
| | | const now = new Date(); |
| | | const formatTime = `${now.getFullYear()}-${String( |
| | |
| | | ).padStart(2, "0")}:${String(now.getMinutes()).padStart(2, "0")}:${String( |
| | | now.getSeconds() |
| | | ).padStart(2, "0")}`; |
| | | |
| | | console.log('qweqweqwe///////', value) |
| | | this.form = { |
| | | ...this.form, |
| | | ...value.form, |
| | | formStatus:value.formStatus, |
| | | formStatus: value.formStatus || '', |
| | | thisName: userInfo.nickName || "", |
| | | thisTime: value.form.vaccinateTime |
| | | ? value.form.vaccinateTime |
| | | thisTime: value.form && value.form.vaccinateTime |
| | | ? value.form && value.form.vaccinateTime |
| | | : formatTime, |
| | | type: 1, |
| | | confirmTime:value.confirmTime?moment(value.confirmTime).format('YYYY-MM-DD HH:mm:ss'):moment().format('YYYY-MM-DD HH:mm:ss') |
| | | confirmTime: value.confirmTime ? moment(value.confirmTime).format('YYYY-MM-DD HH:mm:ss') : moment().format('YYYY-MM-DD HH:mm:ss') |
| | | }; |
| | | |
| | | console.log('485484848', this.form); |
| | | this.$forceUpdate() |
| | | |
| | | this.dialogVisible = true; |
| | | }, |
| | | closeDialog() { |
| | |
| | | :on-remove="(file, fileList) => handleRemove(row, file, fileList)" |
| | | :on-success="(res, file, fileList) => handleUpload(row, file, fileList)" |
| | | :before-upload="file => beforeUpload(file, row)" |
| | | action="#" :limit="5" class="mini-upload"> |
| | | action="#" class="mini-upload"> |
| | | <template v-if="row.uploading"> |
| | | <i class="el-icon-loading"></i> |
| | | </template> |
| | |
| | | <el-row v-if="activeTab === 'strain'" :gutter="10"> |
| | | <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8"> |
| | | <el-form-item label="菌株编号" prop="strainCode"> |
| | | <el-input :disabled="$route.query.isDetail" v-model="form.strainCode" class="w-380" |
| | | <el-input :disabled="!!$route.query.isDetail" v-model="form.strainCode" class="w-380" |
| | | placeholder="请输入菌株编号" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8"> |
| | | <el-form-item label="菌株名称" prop="strainName"> |
| | | <el-input :disabled="$route.query.isDetail" v-model="form.strainName" class="w-380" |
| | | <el-input :disabled="!!$route.query.isDetail" v-model="form.strainName" class="w-380" |
| | | placeholder="请输入菌株名称" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8"> |
| | | <el-form-item label="培养基配方" prop="formula"> |
| | | <el-input :disabled="$route.query.isDetail" v-model="form.formula" class="w-380" placeholder="请输入培养基配方" /> |
| | | <el-input :disabled="!!$route.query.isDetail" v-model="form.formula" class="w-380" |
| | | placeholder="请输入培养基配方" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | <el-row v-if="activeTab === 'material'" :gutter="10"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="来源物资、时间及批号" prop="sourceMaterialTimeBatchNumber"> |
| | | <el-input :disabled="$route.query.isDetail" v-model="form.sourceMaterialTimeBatchNumber" |
| | | <el-input :disabled="!!$route.query.isDetail" v-model="form.sourceMaterialTimeBatchNumber" |
| | | placeholder="请输入物资编号" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="24"> |
| | | <el-form-item label="培养基配方" prop="formula"> |
| | | <el-input :disabled="$route.query.isDetail" v-model="form.formula" placeholder="请输入培养基配方" /> |
| | | <el-input :disabled="!!$route.query.isDetail" v-model="form.formula" placeholder="请输入培养基配方" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="24"> |
| | | <el-form-item label="分离菌落编号" prop="separateColonyNumber"> |
| | | <el-input :disabled="$route.query.isDetail" v-model="form.separateColonyNumber" placeholder="请输入分离菌落编号" /> |
| | | <el-input :disabled="!!$route.query.isDetail" v-model="form.separateColonyNumber" |
| | | placeholder="请输入分离菌落编号" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | <el-row :gutter="10"> |
| | | <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6"> |
| | | <el-form-item label="培养基" prop="cultureMedium"> |
| | | <el-input :disabled="$route.query.isDetail" v-model="form.cultureMedium" class="w-380" |
| | | <el-input :disabled="!!$route.query.isDetail" v-model="form.cultureMedium" class="w-380" |
| | | placeholder="请输入培养基" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6"> |
| | | <el-form-item label="培养温度" prop="temperature"> |
| | | <el-input :disabled="$route.query.isDetail" v-model="form.temperature" class="w-380" |
| | | <el-input :disabled="!!$route.query.isDetail" v-model="form.temperature" class="w-380" |
| | | placeholder="请输入培养温度" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6"> |
| | | <el-form-item label="需氧类型" prop="aerobicType"> |
| | | <el-select :disabled="$route.query.isDetail" v-model="form.aerobicType" class="w-380" |
| | | <el-select :disabled="!!$route.query.isDetail" v-model="form.aerobicType" class="w-380" |
| | | placeholder="请选择需氧类型"> |
| | | <el-option label="专性需氧" value="1"></el-option> |
| | | <el-option label="专性厌氧" value="2"></el-option> |
| | |
| | | </el-col> |
| | | <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6"> |
| | | <el-form-item label="培养时间" prop="cultureTime"> |
| | | <el-input :disabled="$route.query.isDetail" v-model="form.cultureTime" class="w-380" |
| | | <el-input :disabled="!!$route.query.isDetail" v-model="form.cultureTime" class="w-380" |
| | | placeholder="请输入培养时间" /> |
| | | <!-- <el-date-picker v-model="form.cultureTime" class="w-380" placeholder="请选择培养时间" type="date" value-format="yyyy-MM-dd" /> --> |
| | | </el-form-item> |
| | |
| | | 新增培养皿分离记录</el-button> |
| | | </div> |
| | | </div> |
| | | <Table :data="form.separationOfCultureDishesList" :height="300" :queryForm="queryForm" :total="0"> |
| | | <Table ref="separationTable" :data="separationTableData" :height="null" |
| | | :total="form.separationOfCultureDishesList.length" :queryForm="separationPagination" :type="2" |
| | | @handleCurrentChange="handleSeparationPageChange" @handleSizeChange="handleSeparationSizeChange"> |
| | | <el-table-column width="100" type="index" label="培养皿序号" /> |
| | | <el-table-column prop="separateBacterialColoniesCode" label="分离菌落编号" /> |
| | | <el-table-column prop="handleSignature" label="接种操作人签字"> |
| | |
| | | 新增观察记录</el-button> |
| | | </div> |
| | | </div> |
| | | <Table :data="form.observationOfPetriDishes" :height="300" :queryForm="queryForm" :total="0"> |
| | | <Table :data="observationTableData" :total="form.observationOfPetriDishes.length" |
| | | :queryForm="observationPagination" :height="null" :type="2" @handleCurrentChange="handleObservationPageChange" |
| | | @handleSizeChange="handleObservationSizeChange"> |
| | | <el-table-column prop="separateColonyCode" label="分离菌落编号" /> |
| | | <el-table-column prop="strength" label="形状强壮度排名" /> |
| | | <el-table-column prop="address" label="操作"> |
| | |
| | | 新增斜面记录</el-button> |
| | | </div> |
| | | </div> |
| | | <Table :data="form.vaccinationSlopes" border style="width: 100%; margin-bottom: 16px;" :height="300" |
| | | <Table :data="inoculationTableData" :total="form.vaccinationSlopes.length" :queryForm="inoculationPagination" |
| | | :height="null" :type="2" @handleCurrentChange="handleInoculationPageChange" |
| | | @handleSizeChange="handleInoculationSizeChange" border style="width: 100%; margin-bottom: 16px;" |
| | | :span-method="inoculationRowSpan"> |
| | | <el-table-column prop="separateColonyCode" label="分离菌落编号" /> |
| | | <el-table-column prop="vaccinationSlopeCode" label="接种斜面编号" /> |
| | |
| | | </el-table-column> |
| | | <el-table-column prop="preserveTime" label="入库保藏/废弃时间" /> |
| | | <el-table-column label="操作" |
| | | v-if="[1, 3].includes(roleType) && $route.query.isDetail || (!$route.query.isDetail && [4].includes(roleType))"> |
| | | v-if="[1, 3].includes(roleType) && $route.query.isDetail || ([4].includes(roleType))"> |
| | | <template slot-scope="scope"> |
| | | <el-button type="text" @click="handleEditInoculation(scope.row, scope.$index)" |
| | | v-if="!$route.query.isDetail && [1, 4].includes(roleType)">编辑</el-button> |
| | |
| | | 新增菌种保藏记录</el-button> |
| | | </div> |
| | | </div> |
| | | <Table :data="form.culturePreservations" :height="300" :queryForm="queryForm" :total="0" > |
| | | <Table :data="preserveTableData" :total="form.culturePreservations.length" :queryForm="preservePagination" |
| | | :height="null" :type="2" @handleCurrentChange="handlePreservePageChange" |
| | | @handleSizeChange="handlePreserveSizeChange"> |
| | | <el-table-column prop="forPreserveCode" label="用于保藏的菌种编号" /> |
| | | <el-table-column prop="verificationConclusion" label="实验验证结论" /> |
| | | <el-table-column prop="preserveMethod" label="保藏方法" /> |
| | |
| | | </el-table-column> |
| | | <el-table-column prop="preserveTime" label="保藏时间" /> |
| | | <el-table-column label="操作" |
| | | v-if="[1, 3].includes(roleType) && $route.query.isDetail || (!$route.query.isDetail && [4].includes(roleType))"> |
| | | v-if="[1, 3].includes(roleType) && $route.query.isDetail || ([4].includes(roleType))"> |
| | | <template slot-scope="scope"> |
| | | <el-button type="text" @click="handleEditPreserve(scope.row, scope.$index)" |
| | | v-if="!$route.query.isDetail && [1, 4].includes(roleType)">编辑</el-button> |
| | |
| | | <ConfirmPreserveDialog :visible.sync="showConfirmPreserveDialog" :editData="editPreserveData" |
| | | @confirm="handleConfirmPreserveSubmit" /> |
| | | <div class="end-btn" style="margin-top: 20px;" |
| | | v-if="($route.query.isDetail && [3].includes(roleType)) || !$route.query.isDetail && [3, 4].includes(roleType)"> |
| | | <el-button type="primary" v-if="[1,4].includes(roleType)" @click="handleSubmit(1)">提交</el-button> |
| | | v-if="($route.query.isDetail && [3].includes(roleType)) || !$route.query.isDetail && [1, 3, 4].includes(roleType)"> |
| | | <el-button type="primary" v-if="[1, 4].includes(roleType)" @click="handleSubmit(1)">提交</el-button> |
| | | <el-button v-if="!$route.query.isDetail" type="primary" @click="handleSubmit(3)">同步给保藏人</el-button> |
| | | <el-button v-if="!$route.query.isDetail" type="default" @click="handleSubmit(2)">存草稿</el-button> |
| | | </div> |
| | |
| | | editPreserveIndex: null, |
| | | editPreserveData: null, |
| | | roleType: Number(JSON.parse(sessionStorage.getItem('userInfo')).roleType || 1), // 1.超级管理员 2.审批人 3.工程师 4.实验员 |
| | | separationPagination: { pageNum: 1, pageSize: 5 }, |
| | | observationPagination: { pageNum: 1, pageSize: 5 }, |
| | | inoculationPagination: { pageNum: 1, pageSize: 5 }, |
| | | preservePagination: { pageNum: 1, pageSize: 5 }, |
| | | }; |
| | | }, |
| | | computed: { |
| | |
| | | firstInoculationOrDiscardIndex() { |
| | | // 第一个入库或废弃行 |
| | | return this.form.vaccinationSlopes.findIndex(item => item.handleType === '保存' || item.handleType === '废弃'); |
| | | }, |
| | | separationTableData() { |
| | | const { pageNum, pageSize } = this.separationPagination; |
| | | const start = (pageNum - 1) * pageSize; |
| | | return this.form.separationOfCultureDishesList.slice(start, start + pageSize); |
| | | }, |
| | | observationTableData() { |
| | | const { pageNum, pageSize } = this.observationPagination; |
| | | const start = (pageNum - 1) * pageSize; |
| | | return this.form.observationOfPetriDishes.slice(start, start + pageSize); |
| | | }, |
| | | inoculationTableData() { |
| | | const { pageNum, pageSize } = this.inoculationPagination; |
| | | const start = (pageNum - 1) * pageSize; |
| | | return this.form.vaccinationSlopes.slice(start, start + pageSize); |
| | | }, |
| | | preserveTableData() { |
| | | const { pageNum, pageSize } = this.preservePagination; |
| | | const start = (pageNum - 1) * pageSize; |
| | | return this.form.culturePreservations.slice(start, start + pageSize); |
| | | } |
| | | }, |
| | | mounted() { |
| | |
| | | this.form = res |
| | | }, |
| | | handleSeparationConfirm(data) { |
| | | console.log('分离', data) |
| | | if (this.editSeparationIndex !== null) { |
| | | // 编辑 |
| | | this.$set(this.form.separationOfCultureDishesList, this.editSeparationIndex, data); |
| | |
| | | }, |
| | | handleDeleteSeparation(index) { |
| | | this.form.separationOfCultureDishesList.splice(index, 1); |
| | | // 如果当前页数据被删空,自动回到上一页 |
| | | const total = this.form.separationOfCultureDishesList.length; |
| | | const { pageNum, pageSize } = this.separationPagination; |
| | | if (total && (pageNum - 1) * pageSize >= total) { |
| | | this.separationPagination.pageNum = Math.max(1, pageNum - 1); |
| | | } |
| | | }, |
| | | resetSeparationEdit() { |
| | | this.editSeparationIndex = null; |
| | |
| | | }, |
| | | handleDeleteObservation(index) { |
| | | this.form.observationOfPetriDishes.splice(index, 1); |
| | | const total = this.form.observationOfPetriDishes.length; |
| | | const { pageNum, pageSize } = this.observationPagination; |
| | | if (total && (pageNum - 1) * pageSize >= total) { |
| | | this.observationPagination.pageNum = Math.max(1, pageNum - 1); |
| | | } |
| | | }, |
| | | handleAddInoculation() { |
| | | this.editInoculationIndex = null; |
| | |
| | | }, |
| | | handleDeleteInoculation(index) { |
| | | this.form.vaccinationSlopes.splice(index, 1); |
| | | const total = this.form.vaccinationSlopes.length; |
| | | const { pageNum, pageSize } = this.inoculationPagination; |
| | | if (total && (pageNum - 1) * pageSize >= total) { |
| | | this.inoculationPagination.pageNum = Math.max(1, pageNum - 1); |
| | | } |
| | | }, |
| | | inoculationRowSpan({ row, rowIndex, columnIndex }) { |
| | | // 入库总数(只)列合并 |
| | |
| | | }, |
| | | handleDeletePreserve(index) { |
| | | this.form.culturePreservations.splice(index, 1); |
| | | const total = this.form.culturePreservations.length; |
| | | const { pageNum, pageSize } = this.preservePagination; |
| | | if (total && (pageNum - 1) * pageSize >= total) { |
| | | this.preservePagination.pageNum = Math.max(1, pageNum - 1); |
| | | } |
| | | }, |
| | | handleConfirmPreserve(row, index) { |
| | | this.editPreserveIndex = index; |
| | |
| | | } |
| | | |
| | | }, |
| | | handleSeparationPageChange(val) { |
| | | this.separationPagination.pageNum = val; |
| | | }, |
| | | handleSeparationSizeChange(val) { |
| | | this.separationPagination.pageSize = val; |
| | | this.separationPagination.pageNum = 1; |
| | | }, |
| | | handleObservationPageChange(val) { |
| | | this.observationPagination.pageNum = val; |
| | | }, |
| | | handleObservationSizeChange(val) { |
| | | this.observationPagination.pageSize = val; |
| | | this.observationPagination.pageNum = 1; |
| | | }, |
| | | handleInoculationPageChange(val) { |
| | | this.inoculationPagination.pageNum = val; |
| | | }, |
| | | handleInoculationSizeChange(val) { |
| | | this.inoculationPagination.pageSize = val; |
| | | this.inoculationPagination.pageNum = 1; |
| | | }, |
| | | handlePreservePageChange(val) { |
| | | this.preservePagination.pageNum = val; |
| | | }, |
| | | handlePreserveSizeChange(val) { |
| | | this.preservePagination.pageSize = val; |
| | | this.preservePagination.pageNum = 1; |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | |
| | | <template> |
| | | <el-dialog |
| | | :visible.sync="visible" |
| | | title="新增菌种保藏记录" |
| | | width="900px" |
| | | :close-on-click-modal="false" |
| | | @close="handleClose" |
| | | > |
| | | <el-form |
| | | :model="form" |
| | | :rules="rules" |
| | | ref="form" |
| | | label-width="120px" |
| | | label-position="top" |
| | | > |
| | | <el-dialog :visible.sync="visible" title="新增菌种保藏记录" width="900px" :close-on-click-modal="false" @close="handleClose"> |
| | | <el-form :model="form" :rules="rules" ref="form" label-width="120px" label-position="top"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="用于保藏的菌种编号" prop="forPreserveCode"> |
| | |
| | | import moment from 'moment'; |
| | | export default { |
| | | components: { SignatureCanvas }, |
| | | props: { |
| | | props: { |
| | | visible: Boolean, |
| | | editData: { |
| | | type: Object, |
| | |
| | | methods: { |
| | | handleSave() { |
| | | this.form.handleTime = moment().format('YYYY-MM-DD HH:mm:ss'); |
| | | |
| | | this.$refs.form.validate((valid) => { |
| | | if (valid) { |
| | | if (!this.form.handleSignature) { |
| | | return this.$message.error('请操作人签名'); |
| | | } |
| | | this.$emit('save', { ...this.form }); |
| | | this.handleClose(); |
| | | } |
| | |
| | | overflow: hidden; |
| | | padding: 0; |
| | | } |
| | | |
| | | .signature-area.waiting { |
| | | border-style: dashed; |
| | | background: #FAFAFA; |
| | | } |
| | | |
| | | .signature-area img { |
| | | width: 100%; |
| | | height: 100%; |
| | | object-fit: cover; |
| | | display: block; |
| | | } |
| | | |
| | | .waiting-text { |
| | | color: #909399; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .sign-btn { |
| | | height: 32px; |
| | | border-radius: 4px; |
| | |
| | | font-weight: 400; |
| | | margin-left: 12px; |
| | | } |
| | | </style> |
| | | </style> |
| | |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.form = { |
| | | strainCode: '', |
| | | strainName: '', |
| | | source: '', |
| | | appraisalMethod: '', |
| | | characteristics: '', |
| | | storageLocation: '', |
| | | preservationMethod: '', |
| | | remark: '' |
| | | } |
| | | if (this.$route.query.id) { |
| | | getDetail({ id: this.$route.query.id }).then(res => { |
| | | this.form = res |
| | |
| | | await add(requestData); |
| | | } |
| | | this.signatureVisible = false; |
| | | this.$router.back(); |
| | | this.$router.push({ path: '/strain-library/main-cell-library' }); |
| | | this.$message.success('操作成功'); |
| | | } catch (error) { |
| | | this.$message.error('操作失败'); |
| | |
| | | </el-table-column> |
| | | <el-table-column label="操作" width="200"> |
| | | <template #default="{ row }"> |
| | | <el-button type="text" @click="handleDetail(row)">详情</el-button> |
| | | <el-button v-if="row.status == 2 || row.status == 4" type="text" @click="handleEdit(row)">编辑</el-button> |
| | | <el-button v-if="currentType === 'list'" type="text" @click="handleRecord(row)">出入库记录</el-button> |
| | | <el-button style="margin-right: 10px;" type="text" @click="handleDetail(row)">详情</el-button> |
| | | <el-button style="margin-right: 10px;" v-if="row.status == 2 || row.status == 4" type="text" @click="handleEdit(row)">编辑</el-button> |
| | | <el-button style="margin-right: 10px;" v-if="currentType === 'list'" type="text" @click="handleRecord(row)">出入库记录</el-button> |
| | | <el-button v-if="roleType == 1" type="text" @click="handleDelete(row)">删除</el-button> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | roleType: JSON.parse(sessionStorage.getItem("userInfo")).roleType, |
| | | }; |
| | | }, |
| | | mounted() { |
| | | created() { |
| | | this.searchData(); |
| | | this.roleType = JSON.parse(sessionStorage.getItem("userInfo")).roleType; |
| | | }, |
| | | activated() { |
| | | this.searchData(); |
| | | // 角色类型 1=超级管理员 2=审批人 3=工程师 4=实验员 |
| | | this.roleType = JSON.parse(sessionStorage.getItem("userInfo")).roleType; |
| | |
| | | }, |
| | | handleEdit(row) { |
| | | this.$router.push({ |
| | | path: `/strain-library/main-cell-library/add?id=${row.id}`, |
| | | path: `/strain-library/main-cell-library/edit?id=${row.id}`, |
| | | }); |
| | | }, |
| | | handleDetail(row) { |
| | |
| | | }, |
| | | getStatusType(status) { |
| | | const types = { |
| | | 1: "warning", |
| | | 2: "warning", |
| | | 3: "success", |
| | | 4: "success", |
| | | 1: "info", |
| | | 2: "success", |
| | | 3: "info", |
| | | 4: "warning", |
| | | }; |
| | | return types[status] || "info"; |
| | | }, |
| | |
| | | overflow: hidden; |
| | | |
| | | &.collapsed { |
| | | max-height: 48px; |
| | | max-height: 130px; |
| | | overflow: hidden; |
| | | } |
| | | |
| | |
| | | word-break: break-all; |
| | | } |
| | | </style> |
| | | |
| | | <style lang="less"> |
| | | .custom-tooltip { |
| | | width: 200px !important; |
| | | max-width: 200px !important; |
| | | white-space: normal; |
| | | word-break: break-all; |
| | | } |
| | | </style> |
| | |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.form = { |
| | | strainCode: '', |
| | | strainName: '', |
| | | source: '', |
| | | appraisalMethod: '', |
| | | characteristics: '', |
| | | storageLocation: '', |
| | | preservationMethod: '', |
| | | remark: '' |
| | | } |
| | | if (this.$route.query.id) { |
| | | getDetail({ id: this.$route.query.id }).then(res => { |
| | | this.form = res |
| | |
| | | await add(requestData); |
| | | } |
| | | this.signatureVisible = false; |
| | | this.$router.back(); |
| | | this.$router.push({ path: '/strain-library/production-cell-library' }); |
| | | this.$message.success('操作成功'); |
| | | } catch (error) { |
| | | this.$message.error('操作失败'); |
| | |
| | | </el-table-column> |
| | | <el-table-column label="操作" width="200"> |
| | | <template #default="{ row }"> |
| | | <el-button type="text" @click="handleDetail(row)">详情</el-button> |
| | | <el-button v-if="row.status == 2 || row.status == 4" type="text" @click="handleEdit(row)">编辑</el-button> |
| | | <el-button style="margin-right: 10px;" type="text" @click="handleDetail(row)">详情</el-button> |
| | | <el-button style="margin-right: 10px;" v-if="row.status == 2 || row.status == 4" type="text" @click="handleEdit(row)">编辑</el-button> |
| | | <el-button |
| | | style="margin-right: 10px;" |
| | | v-if="currentType === 'list'" |
| | | type="text" |
| | | @click="handleRecord(row)" |
| | |
| | | roleType: "", |
| | | }; |
| | | }, |
| | | mounted() { |
| | | created() { |
| | | this.searchData(); |
| | | // 角色类型 1=超级管理员 2=审批人 3=工程师 4=实验员 |
| | | this.roleType = JSON.parse(sessionStorage.getItem("userInfo")).roleType; |
| | | }, |
| | | activated() { |
| | | this.searchData(); |
| | | // 角色类型 1=超级管理员 2=审批人 3=工程师 4=实验员 |
| | | this.roleType = JSON.parse(sessionStorage.getItem("userInfo")).roleType; |
| | |
| | | }, |
| | | handleEdit(row) { |
| | | this.$router.push({ |
| | | path: `/strain-library/production-cell-library/add?id=${row.id}`, |
| | | path: `/strain-library/production-cell-library/edit?id=${row.id}`, |
| | | }); |
| | | }, |
| | | handleDetail(row) { |
| | |
| | | }, |
| | | getStatusType(status) { |
| | | const types = { |
| | | 1: "warning", |
| | | 2: "warning", |
| | | 3: "success", |
| | | 4: "success", |
| | | 1: "info", |
| | | 2: "success", |
| | | 3: "info", |
| | | 4: "warning", |
| | | }; |
| | | return types[status] || "info"; |
| | | }, |
| | |
| | | overflow: hidden; |
| | | |
| | | &.collapsed { |
| | | max-height: 48px; |
| | | max-height: 130px; |
| | | overflow: hidden; |
| | | } |
| | | |
| | |
| | | word-break: break-all; |
| | | } |
| | | </style> |
| | | |
| | | <style lang="less"> |
| | | .custom-tooltip { |
| | | width: 200px !important; |
| | | max-width: 200px !important; |
| | | white-space: normal; |
| | | word-break: break-all; |
| | | } |
| | | </style> |
| | |
| | | } |
| | | } |
| | | }, |
| | | activated() { |
| | | mounted() { |
| | | this.form = { |
| | | strainCode: '', |
| | | strainName: '', |
| | | source: '', |
| | | appraisalMethod: '', |
| | | characteristics: '', |
| | | storageLocation: '', |
| | | preservationMethod: '', |
| | | remark: '' |
| | | } |
| | | if (this.$route.query.id) { |
| | | getDetail({ id: this.$route.query.id }).then(res => { |
| | | this.form = res |
| | |
| | | await add(requestData); |
| | | } |
| | | this.signatureVisible = false; |
| | | this.$router.back(); |
| | | this.$router.push({ path: '/strain-library/strain-library-manage' }); |
| | | this.$message.success('操作成功'); |
| | | } catch (error) { |
| | | this.$message.error('操作失败'); |
| | |
| | | padding: 0; |
| | | background: #f5f7fa; |
| | | display: flex; |
| | | min-width: 270px; |
| | | min-width: 290px; |
| | | /* 减小最小宽度 */ |
| | | max-width: 330px; |
| | | max-width: 300px; |
| | | /* 设置最大宽度 */ |
| | | width: 100%; |
| | | /* 使用百分比宽度 */ |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="boundTime" label="操作时间" /> |
| | | <el-table-column prop="handleName" label="操作人姓名" /> |
| | | <el-table-column prop="handleName" label="操作人签字" > |
| | | <template #default="{row}"> |
| | | <img :src="row.handleSignature" v-if="row.handleSignature" alt="签字图片" style="max-width: 100px; max-height: 50px;"> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="preserveSignature" label="菌种保藏人签字" > |
| | | <template #default="{row}"> |
| | | <img :src="row.preserveSignature" alt="签字图片" style="max-width: 100px; max-height: 50px;"> |
| | | <img :src="row.preserveSignature" v-if="row.preserveSignature" alt="签字图片" style="max-width: 100px; max-height: 50px;"> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="状态"> |
| | |
| | | <div class="box-title"> |
| | | <img src="@/assets/public/notice.png" class="header-icon" /> |
| | | <span>菌种源保藏出/入细胞库登记表说明</span> |
| | | <el-button type="text" class="view-more" @click="handleViewMore" |
| | | >查看全部 >></el-button |
| | | > |
| | | <el-button type="text" class="view-more" @click="handleViewMore">查看全部 >></el-button> |
| | | </div> |
| | | <div class="header-content" :class="{ collapsed: true }"> |
| | | <p> 1. 菌种全部集中登记在【菌种源保藏出/入细胞库登记表】,菌种来源有 3条路径。</p> |
| | |
| | | <p> 2.3 生产细胞库(子代-S)、(孙代-G)</p> |
| | | <p> 3. 细胞库编码规则 </p> |
| | | <p>3.1 |
| | | 细胞库编码规则:DD-M-240919-01-(O-0109-01)DD:代表项目组。M:“O”代表祖代原始细胞库,”M“代表母代主细胞库,”S“代表子代生产细胞库,“G”代表孙代生产细胞库。240919:代表在24 年 |
| | | 细胞库编码规则:DD-M-240919-01-(O-0109-01)DD:代表项目组。M:"O"代表祖代原始细胞库,"M"代表母代主细胞库,"S"代表子代生产细胞库,"G"代表孙代生产细胞库。240919:代表在24 年 |
| | | 9 月 19 |
| | | 接种批次的菌种;或收到外来菌种时间的入库批次。01:代表两位序列号。(O-0109-01):代表传代菌种的编号</p> |
| | | <p>3.1.1 |
| | | 传代编码方式演例:祖代:DD-O-240919-01传母代:DD-M-241017-01-(O-091901)DD-M-241017-02-(O-091901)DD-M-241017-03-(O-091901)子代:DD-S-241019-01-(M-1017-02)版权归奥利元生物所有,禁止外传。DD-S-241019-02-(M-1017-03)孙代:DD-G-241109-01-(S-1019-02)3.1.2编码规则实现了编码唯一,编码可溯源,编码直观、方便。</p> |
| | | <p> 3.2 细胞库说明:</p> |
| | | <p> 3.2.1 直接购买、自行从(土壤、相关物料、商品)等分离出来菌株进入原始细胞库。</p> |
| | | <p> 3.2.2 从原始细胞库中选取出来再次纯化、改造、提高性能的菌株进入主细胞库。</p> |
| | | <p> 3.2.3 主细胞库中选取出稳定,生产性能良好的菌株扩培后保种进入生产细胞库。</p> |
| | | <p> 4.菌种选育-保藏过程编号说明4.1 菌种选育时,培养皿的编号可使用 a-01、a-02等用于清晰形态观察记录;菌落编号使用序号 1/2/3等。</p> |
| | | <p> 4.2 接种斜面菌种编码(-O)使用原始细胞库编码;斜面转菌种保藏使用与斜面一致的编码(-O);斜面传代入主细胞库的传代菌种,按编码器规则编码(-M)。</p> |
| | | 传代编码方式演例:祖代:DD-O-240919-01传母代:DD-M-241017-01-(O-091901)DD-M-241017-02-(O-091901)DD-M-241017-03-(O-091901)子代:DD-S-241019-01-(M-1017-02)版权归奥利元生物所有,禁止外传。DD-S-241019-02-(M-1017-03)孙代:DD-G-241109-01-(S-1019-02)3.1.2编码规则实现了编码唯一,编码可溯源,编码直观、方便。 |
| | | </p> |
| | | <p> 3.2 细胞库说明:</p> |
| | | <p> 3.2.1 直接购买、自行从(土壤、相关物料、商品)等分离出来菌株进入原始细胞库。</p> |
| | | <p> 3.2.2 从原始细胞库中选取出来再次纯化、改造、提高性能的菌株进入主细胞库。</p> |
| | | <p> 3.2.3 主细胞库中选取出稳定,生产性能良好的菌株扩培后保种进入生产细胞库。</p> |
| | | <p> 4.菌种选育-保藏过程编号说明4.1 菌种选育时,培养皿的编号可使用 a-01、a-02等用于清晰形态观察记录;菌落编号使用序号 1/2/3等。</p> |
| | | <p> 4.2 接种斜面菌种编码(-O)使用原始细胞库编码;斜面转菌种保藏使用与斜面一致的编码(-O);斜面传代入主细胞库的传代菌种,按编码器规则编码(-M)。</p> |
| | | </div> |
| | | |
| | | <!-- 查看全部弹窗 --> |
| | | <el-dialog |
| | | title="菌种源保藏出/入细胞库登记表说明" |
| | | :visible.sync="dialogVisible" |
| | | width="50%" |
| | | class="view-all-dialog" |
| | | > |
| | | <el-dialog title="菌种源保藏出/入细胞库登记表说明" :visible.sync="dialogVisible" width="50%" class="view-all-dialog"> |
| | | <div class="dialog-content"> |
| | | <p> 1. 菌种全部集中登记在【菌种源保藏出/入细胞库登记表】,菌种来源有 3条路径。</p> |
| | | <p> 1.1 是沙土管或甘油管的源头菌种;入原始细胞库(祖代-O)。</p> |
| | | <p> 1.2 是斜面的源头菌种;接种入主细胞库(祖代-O)。经过育种、验证后,菌种保藏为甘油管或沙土管的,入原始细胞库(祖代-0)</p> |
| | | <p> 1.3 是含菌物质自己分离后获得的斜面源头菌种,接种入主细胞库;经生产验证后,保藏为沙土管或甘油管,入原始细胞库(祖代-O)。</p> |
| | | <p> 2.菌种细胞库,分类入三库,进行传代运行管理。三类库存空间进行区分,保藏菌种。</p> |
| | | <p> 2.1 原始细胞库(祖代-O)、2.2 主细胞库(母代-M)、 </p> |
| | | <p> 2.3 生产细胞库(子代-S)、(孙代-G)</p> |
| | | <p> 3. 细胞库编码规则 </p> |
| | | <p>3.1 |
| | | 细胞库编码规则:DD-M-240919-01-(O-0109-01)DD:代表项目组。M:“O”代表祖代原始细胞库,”M“代表母代主细胞库,”S“代表子代生产细胞库,“G”代表孙代生产细胞库。240919:代表在24 年 |
| | | 9 月 19 |
| | | 接种批次的菌种;或收到外来菌种时间的入库批次。01:代表两位序列号。(O-0109-01):代表传代菌种的编号</p> |
| | | <p>3.1.1 |
| | | 传代编码方式演例:祖代:DD-O-240919-01传母代:DD-M-241017-01-(O-091901)DD-M-241017-02-(O-091901)DD-M-241017-03-(O-091901)子代:DD-S-241019-01-(M-1017-02)版权归奥利元生物所有,禁止外传。DD-S-241019-02-(M-1017-03)孙代:DD-G-241109-01-(S-1019-02)3.1.2编码规则实现了编码唯一,编码可溯源,编码直观、方便。</p> |
| | | <p> 3.2 细胞库说明:</p> |
| | | <p> 3.2.1 直接购买、自行从(土壤、相关物料、商品)等分离出来菌株进入原始细胞库。</p> |
| | | <p> 3.2.2 从原始细胞库中选取出来再次纯化、改造、提高性能的菌株进入主细胞库。</p> |
| | | <p> 3.2.3 主细胞库中选取出稳定,生产性能良好的菌株扩培后保种进入生产细胞库。</p> |
| | | <p> 4.菌种选育-保藏过程编号说明4.1 菌种选育时,培养皿的编号可使用 a-01、a-02等用于清晰形态观察记录;菌落编号使用序号 1/2/3等。</p> |
| | | <p> 4.2 接种斜面菌种编码(-O)使用原始细胞库编码;斜面转菌种保藏使用与斜面一致的编码(-O);斜面传代入主细胞库的传代菌种,按编码器规则编码(-M)。</p> |
| | | <p> 1.1 是沙土管或甘油管的源头菌种;入原始细胞库(祖代-O)。</p> |
| | | <p> 1.2 是斜面的源头菌种;接种入主细胞库(祖代-O)。经过育种、验证后,菌种保藏为甘油管或沙土管的,入原始细胞库(祖代-0)</p> |
| | | <p> 1.3 是含菌物质自己分离后获得的斜面源头菌种,接种入主细胞库;经生产验证后,保藏为沙土管或甘油管,入原始细胞库(祖代-O)。</p> |
| | | <p> 2.菌种细胞库,分类入三库,进行传代运行管理。三类库存空间进行区分,保藏菌种。</p> |
| | | <p> 2.1 原始细胞库(祖代-O)、2.2 主细胞库(母代-M)、 </p> |
| | | <p> 2.3 生产细胞库(子代-S)、(孙代-G)</p> |
| | | <p> 3. 细胞库编码规则 </p> |
| | | <p>3.1 |
| | | 细胞库编码规则:DD-M-240919-01-(O-0109-01)DD:代表项目组。M:"O"代表祖代原始细胞库,"M"代表母代主细胞库,"S"代表子代生产细胞库,"G"代表孙代生产细胞库。240919:代表在24 |
| | | 年 |
| | | 9 月 19 |
| | | 接种批次的菌种;或收到外来菌种时间的入库批次。01:代表两位序列号。(O-0109-01):代表传代菌种的编号</p> |
| | | <p>3.1.1 |
| | | 传代编码方式演例:祖代:DD-O-240919-01传母代:DD-M-241017-01-(O-091901)DD-M-241017-02-(O-091901)DD-M-241017-03-(O-091901)子代:DD-S-241019-01-(M-1017-02)版权归奥利元生物所有,禁止外传。DD-S-241019-02-(M-1017-03)孙代:DD-G-241109-01-(S-1019-02)3.1.2编码规则实现了编码唯一,编码可溯源,编码直观、方便。 |
| | | </p> |
| | | <p> 3.2 细胞库说明:</p> |
| | | <p> 3.2.1 直接购买、自行从(土壤、相关物料、商品)等分离出来菌株进入原始细胞库。</p> |
| | | <p> 3.2.2 从原始细胞库中选取出来再次纯化、改造、提高性能的菌株进入主细胞库。</p> |
| | | <p> 3.2.3 主细胞库中选取出稳定,生产性能良好的菌株扩培后保种进入生产细胞库。</p> |
| | | <p> 4.菌种选育-保藏过程编号说明4.1 菌种选育时,培养皿的编号可使用 a-01、a-02等用于清晰形态观察记录;菌落编号使用序号 1/2/3等。</p> |
| | | <p> 4.2 接种斜面菌种编码(-O)使用原始细胞库编码;斜面转菌种保藏使用与斜面一致的编码(-O);斜面传代入主细胞库的传代菌种,按编码器规则编码(-M)。</p> |
| | | </div> |
| | | </el-dialog> |
| | | </el-card> |
| | | |
| | | <!-- Table --> |
| | | <TableCustom |
| | | :queryForm="queryForm" |
| | | :tableData="tableData" |
| | | :total="total" |
| | | @handleCurrentChange="handleCurrentChange" |
| | | @handleSizeChange="handleSizeChange" |
| | | > |
| | | <TableCustom :queryForm="queryForm" :tableData="tableData" :total="total" @handleCurrentChange="handleCurrentChange" |
| | | @handleSizeChange="handleSizeChange"> |
| | | <template #search> |
| | | <el-form :model="form" label-width="auto" inline> |
| | | <el-form-item label="菌种编号:"> |
| | |
| | | <template #setting> |
| | | <div class="tableTitle"> |
| | | <div class="flex a-center"> |
| | | <div |
| | | class="title" |
| | | :class="{ active: currentType === 'list' }" |
| | | @click="handleTypeChange('list')" |
| | | > |
| | | <div class="title" :class="{ active: currentType === 'list' }" @click="handleTypeChange('list')"> |
| | | 原始细胞列表 |
| | | </div> |
| | | <div |
| | | class="drafts" |
| | | :class="{ active: currentType === 'draft' }" |
| | | @click="handleTypeChange('draft')" |
| | | > |
| | | <div class="drafts" :class="{ active: currentType === 'draft' }" @click="handleTypeChange('draft')"> |
| | | 草稿箱 |
| | | </div> |
| | | </div> |
| | | <div v-if="roleType == 4" class="flex a-center"> |
| | | <el-button |
| | | @click="handleNewStrain" |
| | | class="el-icon-plus" |
| | | type="primary" |
| | | style="margin-right: 12px" |
| | | >新增原始细胞</el-button |
| | | > |
| | | <el-button |
| | | @click="handleNewStrain" |
| | | class="el-icon-plus" |
| | | type="primary" |
| | | >批量新增</el-button |
| | | > |
| | | <el-button @click="handleNewStrain" class="el-icon-plus" type="primary" |
| | | style="margin-right: 12px">新增原始细胞</el-button> |
| | | <el-button @click="handleNewStrain" class="el-icon-plus" type="primary">批量新增</el-button> |
| | | </div> |
| | | </div> |
| | | </template> |
| | |
| | | <el-table-column prop="strainName" label="菌种名称" /> |
| | | <el-table-column prop="strainSource" label="菌种来源" /> |
| | | <el-table-column prop="appraisalMethod" label="鉴定方法" /> |
| | | <el-table-column prop="features" label="特征描述" > |
| | | <el-table-column prop="features" label="特征描述"> |
| | | <template #default="{ row }"> |
| | | <el-tooltip :content="row.features" placement="top" effect="dark"> |
| | | <el-tooltip popper-class="custom-tooltip" :content="row.features" style="width: 200px;" placement="top" effect="dark"> |
| | | <div class="ellipsis-text">{{ row.features }}</div> |
| | | </el-tooltip> |
| | | </template> |
| | |
| | | <el-table-column prop="saveLocation" label="保藏位置" /> |
| | | <el-table-column prop="stock" label="库存余量" /> |
| | | <el-table-column prop="remark" label="备注" /> |
| | | <el-table-column |
| | | v-if="currentType === 'list'" |
| | | prop="status" |
| | | label="当前状态" |
| | | > |
| | | <el-table-column v-if="currentType === 'list'" prop="status" label="当前状态"> |
| | | <template #default="{ row }"> |
| | | <el-tag :type="getStatusType(row.status)">{{ |
| | | getStatusText(row.status) |
| | | }}</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" width="200"> |
| | | <el-table-column label="操作" width="250"> |
| | | <template #default="{ row }"> |
| | | <el-button type="text" style="margin-right: 10rpx;" @click="handleDetail(row)">详情</el-button> |
| | | <el-button style="margin-right: 10rpx;" v-if="row.status == 2 || row.status == 4" type="text" @click="handleEdit(row)">编辑</el-button> |
| | | <el-button |
| | | v-if="currentType === 'list'" |
| | | type="text" |
| | | style="margin-right: 10rpx;" |
| | | @click="handleRecord(row)" |
| | | >出入库记录</el-button |
| | | > |
| | | <el-button type="text" style="margin-right: 10px;" @click="handleDetail(row)">详情</el-button> |
| | | <el-button style="margin-right: 10px;" v-if="row.status == 2 || row.status == 4" type="text" |
| | | @click="handleEdit(row)">编辑</el-button> |
| | | <el-button v-if="currentType === 'list'" type="text" style="margin-right: 10px;" |
| | | @click="handleRecord(row)">出入库记录</el-button> |
| | | <el-button v-if="roleType == 1" type="text" @click="handleDelete(row)">删除</el-button> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | roleType: "", |
| | | }; |
| | | }, |
| | | mounted() { |
| | | this.searchData(); |
| | | // 角色类型 1=超级管理员 2=审批人 3=工程师 4=实验员 |
| | | this.roleType = JSON.parse(sessionStorage.getItem("userInfo")).roleType; |
| | | }, |
| | | |
| | | activated() { |
| | | this.searchData(); |
| | | // 角色类型 1=超级管理员 2=审批人 3=工程师 4=实验员 |
| | |
| | | type: "warning", |
| | | }).then(() => { |
| | | deleteStrainLibrary({ id: row.id }).then((res) => { |
| | | this.$message.success("删除成功"); |
| | | this.searchData(); |
| | | this.$message.success("删除成功"); |
| | | this.searchData(); |
| | | }); |
| | | }); |
| | | }, |
| | |
| | | }, |
| | | handleEdit(row) { |
| | | this.$router.push({ |
| | | path: `/strain-library/strain-library-manage/add?id=${row.id}`, |
| | | path: `/strain-library/strain-library-manage/detail?id=${row.id}`, |
| | | }); |
| | | }, |
| | | handleDetail(row) { |
| | |
| | | padding: 20px; |
| | | } |
| | | |
| | | .custom-tooltip{ |
| | | width: 200px; |
| | | } |
| | | |
| | | .header-box { |
| | | margin-bottom: 20px; |
| | | border-radius: 16px; |
| | |
| | | overflow: hidden; |
| | | |
| | | &.collapsed { |
| | | max-height: 48px; |
| | | max-height: 130px; |
| | | overflow: hidden; |
| | | } |
| | | |
| | |
| | | word-break: break-all; |
| | | } |
| | | </style> |
| | | |
| | | <style lang="less"> |
| | | .custom-tooltip { |
| | | width: 200px !important; |
| | | max-width: 200px !important; |
| | | white-space: normal; |
| | | word-break: break-all; |
| | | } |
| | | </style> |
| | |
| | | handleAddRecordConfirm(record) { |
| | | addWarehousing({ ...record, trainLibraryId: this.$route.query.id }).then( |
| | | (res) => { |
| | | this.$message.success("操作成功"); |
| | | // this.$message.success("操作成功"); |
| | | this.getRecordList(); |
| | | } |
| | | ); |
| | |
| | | |
| | | // 编辑 |
| | | export const edit = (data) => { |
| | | console.log('qweqweqweqw',data); |
| | | return axios.post('/api/t-train-library/update', { ...data }) |
| | | } |
| | | |
| | |
| | | <span class="label">验证实验编号:</span>{{ detail.validationExperimentCode }} |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">实验时间:</span>{{ detail.experimentTime }} |
| | | <span class="label">实验时间:</span>{{ detail.experimentTime | formatDate }} |
| | | </div> |
| | | <div class="info-item"></div> |
| | | </el-col> |
| | |
| | | <script> |
| | | import DetailConditionDialog from "./DetailConditionDialog.vue"; |
| | | import { detail } from "./service.js"; |
| | | import moment from "moment"; |
| | | export default { |
| | | name: "DetailConditionDialog", |
| | | components: { DetailConditionDialog }, |
| | |
| | | default: () => ({}) |
| | | }, |
| | | }, |
| | | |
| | | data() { |
| | | return { |
| | | detail: { |
| | |
| | | dialogIndex: null, |
| | | }; |
| | | }, |
| | | filters: { |
| | | formatDate(date) { |
| | | if(date){ |
| | | return moment(date).format('YYYY-MM-DD') |
| | | }else{ |
| | | return '' |
| | | } |
| | | }, |
| | | }, |
| | | methods: { |
| | | handleOpen() { |
| | | if (this.value.id) { |
| | |
| | | </el-col> |
| | | <el-col :span="8" class="info-col"> |
| | | <div class="info-item"><span class="label">验证实验编号:</span>{{ detail.validationExperimentCode }}</div> |
| | | <div class="info-item"><span class="label">实验时间:</span>{{ detail.experimentTime }}</div> |
| | | <div class="info-item"><span class="label">实验时间:</span>{{ detail.experimentTime | formatDate }}</div> |
| | | <div class="info-item"></div> |
| | | </el-col> |
| | | <el-col :span="8" class="info-col "> |
| | |
| | | import EditConditionDialog from './EditConditionDialog.vue' |
| | | import DetailConditionDialog from './DetailConditionDialog.vue' |
| | | import { detail,confirm } from './service' |
| | | import moment from 'moment' |
| | | export default { |
| | | name: 'ConfirmDetail', |
| | | components: { EditConditionDialog, DetailConditionDialog }, |
| | |
| | | detailDialogValue: {} |
| | | } |
| | | }, |
| | | filters: { |
| | | formatDate(date) { |
| | | if(date){ |
| | | return moment(date).format('YYYY-MM-DD') |
| | | }else{ |
| | | return '' |
| | | } |
| | | }, |
| | | }, |
| | | mounted() { |
| | | this.getDetail() |
| | | }, |
| | |
| | | <span class="label">验证实验编号:</span>{{ detail.validationExperimentCode }} |
| | | </div> |
| | | <div class="info-item"> |
| | | <span class="label">实验时间:</span>{{ detail.experimentTime }} |
| | | <span class="label">实验时间:</span>{{ detail.experimentTime | formatDate }} |
| | | </div> |
| | | <div class="info-item"></div> |
| | | </el-col> |
| | |
| | | <script> |
| | | import DetailConditionDialog from "./DetailConditionDialog.vue"; |
| | | import { detail } from "./service.js"; |
| | | import moment from "moment"; |
| | | |
| | | export default { |
| | | name: "DetailConditionDialog", |
| | | components: { DetailConditionDialog }, |
| | |
| | | dialogIndex: null, |
| | | }; |
| | | }, |
| | | filters: { |
| | | formatDate(date) { |
| | | if(date){ |
| | | return moment(date).format('YYYY-MM-DD') |
| | | }else{ |
| | | return '' |
| | | } |
| | | }, |
| | | }, |
| | | methods: { |
| | | handleOpen() { |
| | | if (this.value.id) { |
| | |
| | | handleSignatureConfirm(signatureImage) { |
| | | this.signatureVisible = false; |
| | | const id = this.$route.query.id || this.$route.params.id; |
| | | const submitData = { ...this.form, strainType: 1, isDraft: this.currentAction == 'submit' ? 0 : 1, handleSignature: signatureImage.signature, experimentTime: moment(this.form.experimentTime).format('YYYY-MM-DD') }; |
| | | if (this.currentAction === 'submit') { |
| | | const submitData = { ...this.form, strainType: 1, isDraft:this.form.isDraft?this.form.isDraft:this.currentAction == 'submit' ? 0 : 1, handleSignature: signatureImage.signature, experimentTime:this.form.experimentTime?moment(this.form.experimentTime).format('YYYY-MM-DD'):''}; |
| | | if (this.currentAction === 'submit' || this.form.isDraft == 1) { |
| | | if (id) { |
| | | // 编辑 |
| | | edit({ ...submitData, id }).then(() => { |
| | |
| | | 草稿箱 |
| | | </div> |
| | | </div> |
| | | <div class="flex a-center" v-if="roleType == 4 || roleType == 3"> |
| | | <div class="flex a-center" v-if="roleType == 4"> |
| | | <el-button @click="handleNewStrain" class="el-icon-plus" type="primary" |
| | | style="margin-right: 12px">新增原始细胞库资料</el-button> |
| | | </div> |
| | |
| | | <div class="approval-content"> |
| | | <template> |
| | | <el-form ref="form" :model="form" :rules="rules" inline label-position="top"> |
| | | <div style="display: flex;" v-if="type=='approve'"> |
| | | <!-- <div style="display: flex;" v-if="type=='approve'"> |
| | | <div> |
| | | <div class="header-title" style="width: 100%;"> |
| | | <div class="header-title-left"> |
| | |
| | | placeholder="请输入报告名称" /> |
| | | </el-form-item> |
| | | </div> |
| | | </div> |
| | | </div> --> |
| | | |
| | | <div class="table"> |
| | | <el-table :data="assessmentTable" border style="width: 100%" :show-summary="true" |
| | |
| | | <p>2、在可行研究阶段,工艺开发升级,重新规划工艺研究路线,则以新规划的工艺路线方案来设定课题。</p> |
| | | </div> |
| | | </el-card> --> |
| | | <TableCustom :tableData="tableData" :queryForm="queryForm" :height="null" :total="total" |
| | | <TableCustom :tableData="tableData" :height="null" :total="total" |
| | | @handleCurrentChange="handleCurrentChange" @handleSizeChange="handleSizeChange"> |
| | | <template #search> |
| | | <el-form :model="form" label-width="auto" inline> |
| | |
| | | data() { |
| | | return { |
| | | form: { |
| | | pageSize: 10, |
| | | pageNum: 1, |
| | | teamName: '', |
| | | reportName: '', |
| | | evaluateName:'', |
| | | time: [], |
| | | }, |
| | | tableData: [], |
| | | showEvaluate: false, |
| | | queryForm: { |
| | | pageSize: 10, |
| | | pageNum: 1, |
| | | }, |
| | | total: 0, |
| | | isDraft: false, |
| | | obj: {}, |
| | |
| | | this.showEvaluate = true |
| | | }, |
| | | handleCurrentChange(page) { |
| | | this.queryForm.pageNum = page |
| | | this.form.pageNum = page |
| | | this.getLists() |
| | | }, |
| | | handleSizeChange(size) { |
| | |
| | | }, |
| | | getLists() { |
| | | const params = { |
| | | pageNum: this.queryForm.pageNum, |
| | | pageSize: this.queryForm.pageSize, |
| | | pageNum: this.form.pageNum, |
| | | pageSize: this.form.pageSize, |
| | | teamName: this.form.teamName, |
| | | reportName: this.form.reportName, |
| | | evaluateName: this.form.evaluateName, |
| | | time: this.form.time.length?moment(this.form.time[0]).format('YYYY-MM-DD 00:00:00') + ' - ' + moment(this.form.time[1]).format('YYYY-MM-DD 23:59:59'):'', |
| | | } |
| | | getList(params).then(res => { |
| | |
| | | this.form = { |
| | | teamName: '', |
| | | reportName: '', |
| | | status: '', |
| | | experimentName: '', |
| | | time: [], |
| | | } |
| | | this.getLists() |
| | |
| | | </div> |
| | | </el-form> |
| | | </Card> |
| | | <chooseProject @submit="getProjectData" :show="showChoose" @close="showChoose = false"></chooseProject> |
| | | <SelectMember title="选择菌种实验员" ref="selectMember" @submit="selectUser" :singleSelect="true" /> |
| | | |
| | | |
| | | <chooseProject @submit="getProjectData" :show="showChoose" @close="showChoose = false"></chooseProject> |
| | | <SelectMember :projectId="projectData.length&&projectData[0].id" title="选择菌种实验员" ref="selectMember" @submit="selectUser" :singleSelect="true" /> |
| | | </div> |
| | | |
| | | </template> |
| | |
| | | }); |
| | | }, getProjectData(data) { |
| | | this.projectData = [data]; // 将选中的项目组数据存储到数组中 |
| | | |
| | | this.showChoose = false |
| | | }, |
| | | selectUser(data) { |
| | |
| | | this.$refs.selectMember.close() |
| | | }, |
| | | getMember() { |
| | | if (!this.projectData.length) { |
| | | this.$message.warning('请选择参与人员!') |
| | | return |
| | | } |
| | | this.$refs.selectMember.open(null); |
| | | }, |
| | | handleModifyMember(member) { |
| | |
| | | </el-table-column> |
| | | <el-table-column label="操作"> |
| | | <template #default="{ row }"> |
| | | <el-button type="text" v-if="row.status == 1 && [1, 2].includes(roleType)" |
| | | <el-button type="text" style="margin-right: 10px;" v-if="row.status == 1 && [1, 2].includes(roleType)" |
| | | @click="handleAudit(row)">审核</el-button> |
| | | <el-button type="text" v-if="row.status == 2 && [1, 2].includes(roleType)" |
| | | <el-button type="text" style="margin-right: 10px;" v-if="row.status == 2 && [1, 2].includes(roleType)" |
| | | @click="handleEvaluate(row)">评定</el-button> |
| | | <el-button type="text" v-if="row.status != 1" @click="viewDetail(row)">详情</el-button> |
| | | <el-button type="text" v-if="roleType == 3 && (row.status == 4 || isDraft)" |
| | | <el-button type="text" style="margin-right: 10px;" v-if="row.status != 1" @click="viewDetail(row)">详情</el-button> |
| | | <el-button type="text" style="margin-right: 10px;" v-if="roleType == 3 && (row.status == 4 || isDraft)" |
| | | @click="handleDetail(row)">编辑</el-button> |
| | | <el-button type="text" v-if="roleType == 3 && isDraft" @click="handleDelete(row)">删除</el-button> |
| | | <el-button type="text" v-if="row.status == 1 && roleType == 3&&!isDraft" |
| | | <el-button type="text" style="margin-right: 10px;" v-if="roleType == 3 && isDraft" @click="handleDelete(row)">删除</el-button> |
| | | <el-button type="text" v-if="row.status == 1 && roleType == 3&&!isDraft" |
| | | @click="handleRevoke(row)">撤销审批</el-button> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | |
| | | // 列表 |
| | | export const getList = (data) => { |
| | | console.log('qweqweq',data); |
| | | |
| | | return axios.post('/api/t-strain-report/pageListAll', { ...data }) |
| | | } |
| | | |
| | |
| | | |
| | | //撤销审批 |
| | | export const revokeAudit = (data) => { |
| | | return axios.post('/api/t-strain-report/cancelReport', { ...data }) |
| | | return axios.get('/open/t-strain-report/cancelReport', {params: {id: data.id}}) |
| | | } |
| | | |
| | | //查看评定详情 |
| | |
| | | </el-form> |
| | | </Card> |
| | | <chooseProject @submit="getProjectData" :show="showChoose" @close="showChoose = false"></chooseProject> |
| | | <SelectMember title="选择菌种实验员" ref="selectMember" @submit="selectUser" :singleSelect="true" /> |
| | | <SelectMember :projectId="projectData.length&&projectData[0].id" title="选择菌种实验员" ref="selectMember" @submit="selectUser" :singleSelect="true" /> |
| | | |
| | | </div> |
| | | |
| | |
| | | return item |
| | | }) |
| | | |
| | | this.selectedMember = [{ |
| | | nickName:data.experimentName, |
| | | userId:data.experimentId |
| | | }] |
| | | |
| | | this.projectData = data.projectTeam ? |
| | | [{ ...data.projectTeam, staffName: data.projectTeam.staff || '' }] : |
| | | []; |
| | |
| | | this.$refs.selectMember.close() |
| | | }, |
| | | getMember() { |
| | | if (!this.projectData.length) { |
| | | this.$message.warning('请选择项目组'); |
| | | return; |
| | | } |
| | | this.$refs.selectMember.open(null); |
| | | }, |
| | | handleModifyMember(member) { |
| | |
| | | </el-table-column> |
| | | <el-table-column label="操作"> |
| | | <template #default="{ row }"> |
| | | <el-button type="text" v-if="row.status == 1 && [1, 2].includes(roleType)" |
| | | <el-button type="text" style="margin-right: 10px;" v-if="row.status == 1 && [1, 2].includes(roleType)" |
| | | @click="handleAudit(row)">审核</el-button> |
| | | <el-button type="text" v-if="row.status == 2 && [1, 2].includes(roleType)" |
| | | <el-button type="text" style="margin-right: 10px;" v-if="row.status == 2 && [1, 2].includes(roleType)" |
| | | @click="handleEvaluate(row)">评定</el-button> |
| | | <el-button type="text" v-if="row.status != 1" @click="viewDetail(row)">详情</el-button> |
| | | <el-button type="text" v-if="roleType == 3 && row.status == 4 || isDraft" |
| | | <el-button type="text" style="margin-right: 10px;" v-if="row.status != 1" @click="viewDetail(row)">详情</el-button> |
| | | <el-button type="text" style="margin-right: 10px;" v-if="roleType == 3 && row.status == 4 || isDraft" |
| | | @click="handleDetail(row)">编辑</el-button> |
| | | <el-button type="text" v-if="roleType == 3 && isDraft" @click="handleDelete(row)">删除</el-button> |
| | | <el-button type="text" style="margin-right: 10px;" v-if="roleType == 3 && isDraft" @click="handleDelete(row)">删除</el-button> |
| | | <el-button type="text" v-if="row.status == 1 && roleType == 3&&!isDraft" |
| | | @click="handleRevoke(row)">撤销审批</el-button> |
| | | </template> |
| | |
| | | time: this.form.date.length ? moment(this.form.date[0]).format('YYYY-MM-DD 00:00:00') + ' - ' + moment(this.form.date[1]).format('YYYY-MM-DD 23:59:59') : '', |
| | | status: this.form.status, |
| | | isDraft: this.isDraft ? 1 : 0, |
| | | reportType: 3 |
| | | reportType: 4 |
| | | } |
| | | getList(params).then(res => { |
| | | if (res.code === 200) { |
| | |
| | | }) |
| | | }, |
| | | handleDetail(row) { |
| | | this.$router.push(`/strainReportLibrary/detail?id=${row.id}`) |
| | | this.$router.push(`/strainReportLibrary/detailFour?id=${row.id}`) |
| | | }, |
| | | handleExperimentChange(val) { |
| | | this.getLists() |
| | |
| | | |
| | | //撤销审批 |
| | | export const revokeAudit = (data) => { |
| | | return axios.post('/api/t-strain-report/cancelReport', { ...data }) |
| | | return axios.get('/open/t-strain-report/cancelReport', {params: {id: data.id}}) |
| | | } |
| | | |
| | | //查看评定详情 |
| | |
| | | </el-form> |
| | | </Card> |
| | | <chooseProject @submit="getProjectData" :show="showChoose" @close="showChoose = false"></chooseProject> |
| | | <SelectMember title="选择菌种实验员" ref="selectMember" @submit="selectUser" :singleSelect="true" /> |
| | | <SelectMember :projectId="projectData.length&&projectData[0].id" title="选择菌种实验员" ref="selectMember" @submit="selectUser" :singleSelect="true" /> |
| | | |
| | | </div> |
| | | |
| | |
| | | }; |
| | | |
| | | let arr = data.evaluate.split(',') |
| | | this.selectedMember = [{ |
| | | nickName:data.experimentName, |
| | | userId:data.experimentId |
| | | }] |
| | | |
| | | this.assessmentTable = this.assessmentTable.map((item, index) => { |
| | | item.selectedScore = Number(arr[index]) |
| | |
| | | this.$refs.selectMember.close() |
| | | }, |
| | | getMember() { |
| | | if (!this.projectData.length) { |
| | | this.$message.warning('请选择项目组'); |
| | | return; |
| | | } |
| | | this.$refs.selectMember.open(null); |
| | | }, |
| | | handleModifyMember(member) { |
| | |
| | | <el-table-column prop="index" label="序号" width="60"> |
| | | <template slot-scope="scope">{{ scope.row.index }}</template> |
| | | </el-table-column> |
| | | <el-table-column prop="standard" :label="type == 1 || type == '1' ? '规程型课题评定标准' : '创新型课题评定标准'"> |
| | | <el-table-column prop="standard" :label="type == 2 || type == '2' ? '规程型课题评定标准' : '创新型课题评定标准'"> |
| | | <template slot-scope="scope">{{ scope.row.standard }}</template> |
| | | </el-table-column> |
| | | <el-table-column prop="fullScore" label="满分值" width="80"> |
| | |
| | | placeholder="请输入" :controls="false" style="width: 100%;" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="rule" :label="type == 1 || type == '1' ? '规程型课题报告评分规则' : '创新型课题报告评分规则'"> |
| | | <el-table-column prop="rule" :label="type == 2 || type == '2' ? '规程型课题报告评分规则' : '创新型课题报告评分规则'"> |
| | | <template slot-scope="scope"> |
| | | <span v-if="scope.$index === 0 && (type == 1 || type == '1')"> |
| | | 1. 规程型课题评定总分的满分为5分。<br> |
| | |
| | | return this.currentAssessmentTable.reduce((sum, item) => sum + (item.selectedScore || 0), 0); |
| | | }, |
| | | dialogTitle() { |
| | | return this.type === "1" ? "创新型课题评定" : "规程型课题评定标准"; |
| | | return this.type == "1" ? "创新型课题评定" : "规程型课题评定标准"; |
| | | } |
| | | }, |
| | | methods: { |
| | |
| | | </el-table-column> |
| | | <el-table-column label="操作"> |
| | | <template #default="{ row }"> |
| | | <el-button type="text" v-if="row.status == 1 && [1, 2].includes(roleType)" |
| | | <el-button type="text" style="margin-right: 10px;" v-if="row.status == 1 && [1, 2].includes(roleType)" |
| | | @click="handleAudit(row)">审核</el-button> |
| | | <el-button type="text" v-if="row.status == 2 && [1, 2].includes(roleType)" |
| | | <el-button type="text" style="margin-right: 10px;" v-if="row.status == 2 && [1, 2].includes(roleType)" |
| | | @click="handleEvaluate(row)">评定</el-button> |
| | | <el-button type="text" v-if="row.status != 1" @click="viewDetail(row)">详情</el-button> |
| | | <el-button type="text" v-if="roleType == 3 && row.status == 4 || isDraft" |
| | | <el-button type="text" style="margin-right: 10px;" v-if="row.status != 1" @click="viewDetail(row)">详情</el-button> |
| | | <el-button type="text" style="margin-right: 10px;" v-if="roleType == 3 && row.status == 4 || isDraft" |
| | | @click="handleDetail(row)">编辑</el-button> |
| | | <el-button type="text" v-if="roleType == 3 && isDraft" @click="handleDelete(row)">删除</el-button> |
| | | <el-button type="text" v-if="row.status == 1 && roleType == 3&&!isDraft" |
| | | <el-button type="text" style="margin-right: 10px;" v-if="roleType == 3 && isDraft" @click="handleDelete(row)">删除</el-button> |
| | | <el-button type="text" v-if="row.status == 1 && roleType == 3&&!isDraft" |
| | | @click="handleRevoke(row)">撤销审批</el-button> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | }) |
| | | }, |
| | | handleDetail(row) { |
| | | this.$router.push(`/strainReportLibrary/detail?id=${row.id}`) |
| | | this.$router.push(`/strainReportLibrary/detailTwo?id=${row.id}`) |
| | | }, |
| | | handleExperimentChange(val) { |
| | | this.getLists() |
| | |
| | | |
| | | //撤销审批 |
| | | export const revokeAudit = (data) => { |
| | | return axios.post('/api/t-strain-report/cancelReport', { ...data }) |
| | | return axios.get('/open/t-strain-report/cancelReport', {params: {id: data.id}}) |
| | | } |
| | | |
| | | //查看评定详情 |
| | |
| | | </el-form> |
| | | </Card> |
| | | <chooseProject @submit="getProjectData" :show="showChoose" @close="showChoose = false"></chooseProject> |
| | | <SelectMember title="选择菌种实验员" ref="selectMember" @submit="selectUser" :singleSelect="true" /> |
| | | <SelectMember :projectId="projectData.length&&projectData[0].id" title="选择菌种实验员" ref="selectMember" @submit="selectUser" :singleSelect="true" /> |
| | | |
| | | </div> |
| | | |
| | |
| | | item.selectedScore = Number(arr[index]) |
| | | return item |
| | | }) |
| | | |
| | | this.selectedMember = [{ |
| | | nickName:data.experimentName, |
| | | userId:data.experimentId |
| | | }] |
| | | this.projectData = data.projectTeam ? |
| | | [{ ...data.projectTeam, staffName: data.projectTeam.staff || '' }] : |
| | | []; |
| | |
| | | this.$refs.selectMember.close() |
| | | }, |
| | | getMember() { |
| | | if (!this.projectData.length) { |
| | | this.$message.warning('请选择项目组'); |
| | | return; |
| | | } |
| | | this.$refs.selectMember.open(null); |
| | | }, |
| | | handleModifyMember(member) { |
| | |
| | | </el-table-column> |
| | | <el-table-column label="操作"> |
| | | <template #default="{ row }"> |
| | | <el-button type="text" v-if="row.status == 1 && [1, 2].includes(roleType)" |
| | | <el-button type="text" style="margin-right: 10px;" v-if="row.status == 1 && [1, 2].includes(roleType)" |
| | | @click="handleAudit(row)">审核</el-button> |
| | | <el-button type="text" v-if="row.status == 2 && [1, 2].includes(roleType)" |
| | | <el-button type="text" style="margin-right: 10px;" v-if="row.status == 2 && [1, 2].includes(roleType)" |
| | | @click="handleEvaluate(row)">评定</el-button> |
| | | <el-button type="text" v-if="row.status != 1" @click="viewDetail(row)">详情</el-button> |
| | | <el-button type="text" v-if="roleType == 3 && row.status == 4 || isDraft" |
| | | <el-button type="text" style="margin-right: 10px;" v-if="row.status != 1" @click="viewDetail(row)">详情</el-button> |
| | | <el-button type="text" style="margin-right: 10px;" v-if="roleType == 3 && row.status == 4 || isDraft" |
| | | @click="handleDetail(row)">编辑</el-button> |
| | | <el-button type="text" v-if="roleType == 3 && isDraft" @click="handleDelete(row)">删除</el-button> |
| | | <el-button type="text" v-if="row.status == 1 && roleType == 3&&!isDraft" |
| | | <el-button type="text" style="margin-right: 10px;" v-if="roleType == 3 && isDraft" @click="handleDelete(row)">删除</el-button> |
| | | <el-button type="text" v-if="row.status == 1 && roleType == 3&&!isDraft" |
| | | @click="handleRevoke(row)">撤销审批</el-button> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | }) |
| | | }, |
| | | handleDetail(row) { |
| | | this.$router.push(`/strainReportLibrary/detail?id=${row.id}`) |
| | | this.$router.push(`/strainReportLibrary/detailThree?id=${row.id}`) |
| | | }, |
| | | handleExperimentChange(val) { |
| | | this.getLists() |
| | |
| | | |
| | | //撤销审批 |
| | | export const revokeAudit = (data) => { |
| | | return axios.post('/api/t-strain-report/cancelReport', { ...data }) |
| | | return axios.get('/open/t-strain-report/cancelReport', {params: {id: data.id}}) |
| | | } |
| | | |
| | | //查看评定详情 |