董国庆
2025-06-26 1a61525947d43fd7c8a6df637bf5c1c8f9cc37f3
Merge branch 'main' of http://120.76.84.145:10101/gitblit/r/H5/leshan-laboratory
47个文件已修改
950 ■■■■■ 已修改文件
culture/src/App.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/components/SelectMember/index.vue 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/components/SelectMember/service.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/components/Table/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/router/index.js 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/utils/request.js 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/deliveryAssessment/projectTeamIntegral/index.vue 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/deliveryAssessment/projectTeamIntegral/service.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/pedigree-chart/add.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/pedigree-chart/addProgenitor.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/pedigree-chart/components/AddSublevelForm.vue 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/pedigree-chart/components/AddSublevelPlan.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/pedigree-chart/progenitorComponents/AddAncestor.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/pedigree-chart/progenitorComponents/AddSublevelForm.vue 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strain-library/breeding-record/SlantRecordDialog.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strain-library/breeding-record/add.vue 120 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strain-library/breeding-record/preserve-strain-record-dialog.vue 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strain-library/main-cell-library/add.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strain-library/main-cell-library/index.vue 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strain-library/production-cell-library/add.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strain-library/production-cell-library/index.vue 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strain-library/strain-library-manage/add.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strain-library/strain-library-manage/components/RecordTimeline.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strain-library/strain-library-manage/components/StrainDetail.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strain-library/strain-library-manage/index.vue 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strain-library/strain-library-manage/record.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strain-library/strain-library-manage/service.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strain-library/validation/chief-cell/DetailConditionDialog.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strain-library/validation/chief-cell/confirm-detail.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strain-library/validation/primitive-cell/DetailConditionDialog.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strain-library/validation/primitive-cell/add.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strain-library/validation/primitive-cell/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strainOperationAssessment/components/evaluate/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strainOperationAssessment/index.vue 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strainReportLibrary/reportLibraryOne/add.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strainReportLibrary/reportLibraryOne/index.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strainReportLibrary/reportLibraryOne/service.js 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strainReportLibrary/reportLibraryOneFour/add.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strainReportLibrary/reportLibraryOneFour/index.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strainReportLibrary/reportLibraryOneFour/service.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strainReportLibrary/reportLibraryOneTWO/add.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strainReportLibrary/reportLibraryOneTWO/components/evaluate/index.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strainReportLibrary/reportLibraryOneTWO/index.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strainReportLibrary/reportLibraryOneTWO/service.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strainReportLibrary/reportLibraryOneThree/add.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strainReportLibrary/reportLibraryOneThree/index.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/strainReportLibrary/reportLibraryOneThree/service.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/App.vue
@@ -52,31 +52,32 @@
</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 {
@@ -133,6 +134,10 @@
  }
}
.is-disabled .el-input__inner {
  color: rgba(0, 0, 0, 0.6) !important;
}
.el-dialog {
  border-radius: 16px 16px 6px 6px;
@@ -185,8 +190,8 @@
  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;
}
culture/src/components/SelectMember/index.vue
@@ -1,8 +1,8 @@
<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">
@@ -22,8 +22,8 @@
                        <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>
@@ -36,11 +36,12 @@
                        <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" />
@@ -60,7 +61,7 @@
</template>
<script>
import { getRoleList, getUserList } from './service'
import { getRoleList, getUserList,getUsersList } from './service'
export default {
    props: {
        projectId: {
@@ -71,9 +72,9 @@
            type: Boolean,
            default: false
        },
        title:{
            type:String,
            default:'选择参与人员'
        title: {
            type: String,
            default: '选择参与人员'
        },
    },
    data() {
@@ -104,16 +105,22 @@
            // 获取角色列表并根据项目组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(); // 获取后先进行一次过滤
            });
@@ -124,7 +131,7 @@
                // 获取当前表格中未被选中的用户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];
            }
@@ -132,19 +139,27 @@
        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(() => {
@@ -198,7 +213,6 @@
</script>
<style scoped lang="less">
// to fix el-message弹框被el-dialog覆盖的问题。
.select-member-content {
    .select-member-content-left {
culture/src/components/SelectMember/service.js
@@ -5,6 +5,12 @@
    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 })
culture/src/components/Table/index.vue
@@ -4,7 +4,7 @@
            <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) *
@@ -39,7 +39,11 @@
        height: {
            type: Number,
            default: () => Vue.prototype.$baseTableHeight()
        }
        },
        type: {
            type: Number,
            default: 1
        },
    },
    methods: {
        toggleRowSelection(row, selected) {
culture/src/router/index.js
@@ -169,7 +169,6 @@
            name: "StrainLibraryManage",
            meta: {
              title: "原始细胞库",
              keepAlive: true,
            },
            component: () =>
              import("../views/strain-library/strain-library-manage"),
@@ -179,8 +178,16 @@
            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: () =>
@@ -203,7 +210,6 @@
            name: "MainCellLibrary",
            meta: {
              title: "主细胞库",
              keepAlive: true,
            },
            component: () =>
              import("../views/strain-library/main-cell-library"),
@@ -213,7 +219,16 @@
            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: () =>
@@ -224,7 +239,6 @@
            name: "ProductionCellLibrary",
            meta: {
              title: "生产细胞库",
              keepAlive: true,
            },
            component: () =>
              import("../views/strain-library/production-cell-library"),
@@ -234,7 +248,16 @@
            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: () =>
@@ -475,6 +498,16 @@
          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: "新增报告",
@@ -496,6 +529,16 @@
          ),
      },
      {
        path: "detailThree",
        meta: {
          title: "报告详情",
          hide: true,
          keepAlive: true,
        },
        component: () =>
          import("../views/strainReportLibrary/reportLibraryOneThree/add.vue"),
      },
      {
        path: "addThree",
        meta: {
          title: "新增报告",
@@ -515,6 +558,16 @@
          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: "新增报告",
culture/src/utils/request.js
@@ -63,23 +63,32 @@
      }
    }
    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',
culture/src/views/deliveryAssessment/projectTeamIntegral/index.vue
@@ -1,18 +1,26 @@
<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>
@@ -46,20 +54,25 @@
<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: {
@@ -78,22 +91,25 @@
        },
        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()
        },
culture/src/views/deliveryAssessment/projectTeamIntegral/service.js
@@ -2,6 +2,8 @@
// 列表
export const getListData = (data) => {
    console.log('qweqweqweqwe',data);
    return axios.post('/api/t-strain-report/pageListProject', { ...data })
}
culture/src/views/pedigree-chart/add.vue
@@ -413,11 +413,11 @@
      });
    },
    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() {
@@ -882,6 +882,9 @@
        })),
      };
      console.log('//////////////',processedData);
      // 更新图表数据
      this.graph.changeData(processedData);
culture/src/views/pedigree-chart/addProgenitor.vue
@@ -391,7 +391,7 @@
    addNodeSign(value, type) {
      this.nodeData = value;
      this.nodeType = type;
      this.$refs.addAncestor.closeDialog()
      // this.$refs.addAncestor.closeDialog()
      this.$refs.addSublevelForm.closeDialog()
      this.confirmStorageDialogVisible = true;
    },
culture/src/views/pedigree-chart/components/AddSublevelForm.vue
@@ -95,6 +95,7 @@
</template>
<script>
import moment from 'moment';
export default {
  data() {
    return {
@@ -160,25 +161,27 @@
        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();
    },
culture/src/views/pedigree-chart/components/AddSublevelPlan.vue
@@ -99,7 +99,7 @@
            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()
        },
culture/src/views/pedigree-chart/progenitorComponents/AddAncestor.vue
@@ -3,7 +3,7 @@
  <el-dialog
    :title="planForm.formStatus == 'add' ? '新增菌种传代项' : planForm.formStatus == 'edit' ? '编辑菌种传代项' : '菌种传代项详情'"
    :visible.sync="planDialogVisible"
    width="40%"
    width="60%"
    :close-on-click-modal="false"
  >
    <el-form
@@ -182,13 +182,13 @@
    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')
culture/src/views/pedigree-chart/progenitorComponents/AddSublevelForm.vue
@@ -1,11 +1,6 @@
<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">
@@ -30,20 +25,12 @@
        </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>
@@ -59,16 +46,8 @@
      </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>
@@ -106,6 +85,17 @@
      dialogTitle: "",
      form: {
        status: 1,
        thisName: '',
        thisTime: '',
        strainCode: '',
        strainName: '',
        strainCode1: '',
        strainName1: '',
        remark: '',
        vaccinateSignature: '',
        preserveSignature: '',
        confirmTime: '',
        type: 1,
      },
      rules: {
        status: [
@@ -126,10 +116,12 @@
  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(
@@ -139,19 +131,21 @@
      ).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() {
culture/src/views/strain-library/breeding-record/SlantRecordDialog.vue
@@ -33,7 +33,7 @@
            :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>
culture/src/views/strain-library/breeding-record/add.vue
@@ -22,19 +22,20 @@
        <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>
@@ -42,18 +43,19 @@
        <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>
@@ -66,19 +68,19 @@
        <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>
@@ -89,7 +91,7 @@
          </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>
@@ -106,7 +108,9 @@
              新增培养皿分离记录</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="接种操作人签字">
@@ -136,7 +140,9 @@
              新增观察记录</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="操作">
@@ -159,7 +165,9 @@
              新增斜面记录</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="接种斜面编号" />
@@ -189,7 +197,7 @@
          </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>
@@ -211,7 +219,9 @@
              新增菌种保藏记录</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="保藏方法" />
@@ -231,7 +241,7 @@
          </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>
@@ -256,8 +266,8 @@
        <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>
@@ -359,6 +369,10 @@
      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: {
@@ -371,6 +385,26 @@
    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() {
@@ -400,7 +434,6 @@
      this.form = res
    },
    handleSeparationConfirm(data) {
      console.log('分离', data)
      if (this.editSeparationIndex !== null) {
        // 编辑
        this.$set(this.form.separationOfCultureDishesList, this.editSeparationIndex, data);
@@ -520,6 +553,12 @@
    },
    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;
@@ -540,6 +579,11 @@
    },
    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;
@@ -576,6 +620,11 @@
    },
    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 }) {
      // 入库总数(只)列合并
@@ -601,6 +650,11 @@
    },
    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;
@@ -625,6 +679,34 @@
      }
    },
    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>
culture/src/views/strain-library/breeding-record/preserve-strain-record-dialog.vue
@@ -1,18 +1,6 @@
<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">
@@ -67,7 +55,7 @@
import moment from 'moment';
export default {
  components: { SignatureCanvas },
  props: {
  props: {
    visible: Boolean,
    editData: {
      type: Object,
@@ -117,8 +105,12 @@
  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();
        }
@@ -156,20 +148,24 @@
  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;
@@ -178,4 +174,4 @@
  font-weight: 400;
  margin-left: 12px;
}
</style>
</style>
culture/src/views/strain-library/main-cell-library/add.vue
@@ -124,6 +124,16 @@
        }
    },
    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
@@ -203,7 +213,7 @@
                    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('操作失败');
culture/src/views/strain-library/main-cell-library/index.vue
@@ -126,9 +126,9 @@
        </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>
@@ -167,7 +167,11 @@
      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;
@@ -195,7 +199,7 @@
    },
    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) {
@@ -250,10 +254,10 @@
    },
    getStatusType(status) {
      const types = {
        1: "warning",
        2: "warning",
        3: "success",
        4: "success",
        1: "info",
        2: "success",
        3: "info",
        4: "warning",
      };
      return types[status] || "info";
    },
@@ -310,7 +314,7 @@
    overflow: hidden;
    &.collapsed {
      max-height: 48px;
      max-height: 130px;
      overflow: hidden;
    }
@@ -460,3 +464,12 @@
  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>
culture/src/views/strain-library/production-cell-library/add.vue
@@ -124,6 +124,16 @@
        }
    },
    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
@@ -203,7 +213,7 @@
                    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('操作失败');
culture/src/views/strain-library/production-cell-library/index.vue
@@ -160,9 +160,10 @@
        </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)"
@@ -206,7 +207,12 @@
      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;
@@ -234,7 +240,7 @@
    },
    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) {
@@ -287,10 +293,10 @@
    },
    getStatusType(status) {
      const types = {
        1: "warning",
        2: "warning",
        3: "success",
        4: "success",
        1: "info",
        2: "success",
        3: "info",
        4: "warning",
      };
      return types[status] || "info";
    },
@@ -347,7 +353,7 @@
    overflow: hidden;
    &.collapsed {
      max-height: 48px;
      max-height: 130px;
      overflow: hidden;
    }
@@ -498,3 +504,12 @@
  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>
culture/src/views/strain-library/strain-library-manage/add.vue
@@ -123,7 +123,17 @@
            }
        }
    },
    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
@@ -203,7 +213,7 @@
                    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('操作失败');
culture/src/views/strain-library/strain-library-manage/components/RecordTimeline.vue
@@ -129,9 +129,9 @@
  padding: 0;
  background: #f5f7fa;
  display: flex;
  min-width: 270px;
  min-width: 290px;
  /* 减小最小宽度 */
  max-width: 330px;
  max-width: 300px;
  /* 设置最大宽度 */
  width: 100%;
  /* 使用百分比宽度 */
culture/src/views/strain-library/strain-library-manage/components/StrainDetail.vue
@@ -71,10 +71,14 @@
            </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="状态">
culture/src/views/strain-library/strain-library-manage/index.vue
@@ -4,9 +4,7 @@
      <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>
@@ -18,59 +16,52 @@
        <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="菌种编号:">
@@ -98,35 +89,17 @@
      <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>
@@ -136,9 +109,9 @@
        <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>
@@ -147,28 +120,20 @@
        <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>
@@ -207,6 +172,12 @@
      roleType: "",
    };
  },
  mounted() {
    this.searchData();
    // 角色类型 1=超级管理员 2=审批人 3=工程师 4=实验员
    this.roleType = JSON.parse(sessionStorage.getItem("userInfo")).roleType;
  },
  activated() {
    this.searchData();
    // 角色类型 1=超级管理员 2=审批人 3=工程师 4=实验员
@@ -220,8 +191,8 @@
        type: "warning",
      }).then(() => {
        deleteStrainLibrary({ id: row.id }).then((res) => {
            this.$message.success("删除成功");
            this.searchData();
          this.$message.success("删除成功");
          this.searchData();
        });
      });
    },
@@ -235,7 +206,7 @@
    },
    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) {
@@ -313,6 +284,10 @@
  padding: 20px;
}
.custom-tooltip{
  width: 200px;
}
.header-box {
  margin-bottom: 20px;
  border-radius: 16px;
@@ -348,7 +323,7 @@
    overflow: hidden;
    &.collapsed {
      max-height: 48px;
      max-height: 130px;
      overflow: hidden;
    }
@@ -499,3 +474,12 @@
  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>
culture/src/views/strain-library/strain-library-manage/record.vue
@@ -284,7 +284,7 @@
    handleAddRecordConfirm(record) {
      addWarehousing({ ...record, trainLibraryId: this.$route.query.id }).then(
        (res) => {
          this.$message.success("操作成功");
          // this.$message.success("操作成功");
          this.getRecordList();
        }
      );
culture/src/views/strain-library/strain-library-manage/service.js
@@ -12,6 +12,7 @@
// 编辑
export const edit = (data) => {
  console.log('qweqweqweqw',data);
  return axios.post('/api/t-train-library/update', { ...data })
}
culture/src/views/strain-library/validation/chief-cell/DetailConditionDialog.vue
@@ -18,7 +18,7 @@
            <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>
@@ -73,6 +73,7 @@
<script>
import DetailConditionDialog from "./DetailConditionDialog.vue";
import { detail } from "./service.js";
import moment from "moment";
export default {
  name: "DetailConditionDialog",
  components: { DetailConditionDialog },
@@ -87,6 +88,7 @@
      default: () => ({})
    },
  },
  data() {
    return {
      detail: {
@@ -127,6 +129,15 @@
      dialogIndex: null,
    };
  },
  filters: {
    formatDate(date) {
      if(date){
        return moment(date).format('YYYY-MM-DD')
      }else{
        return ''
      }
    },
  },
  methods: {
    handleOpen() {
      if (this.value.id) {
culture/src/views/strain-library/validation/chief-cell/confirm-detail.vue
@@ -9,7 +9,7 @@
        </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 ">
@@ -74,6 +74,7 @@
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 },
@@ -127,6 +128,15 @@
      detailDialogValue: {}
    }
  },
  filters: {
    formatDate(date) {
      if(date){
        return moment(date).format('YYYY-MM-DD')
      }else{
        return ''
      }
    },
  },
  mounted() {
    this.getDetail()
  },
culture/src/views/strain-library/validation/primitive-cell/DetailConditionDialog.vue
@@ -18,7 +18,7 @@
            <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>
@@ -73,6 +73,8 @@
<script>
import DetailConditionDialog from "./DetailConditionDialog.vue";
import { detail } from "./service.js";
import moment from "moment";
export default {
  name: "DetailConditionDialog",
  components: { DetailConditionDialog },
@@ -127,6 +129,15 @@
      dialogIndex: null,
    };
  },
  filters: {
    formatDate(date) {
      if(date){
        return moment(date).format('YYYY-MM-DD')
      }else{
        return ''
      }
    },
  },
  methods: {
    handleOpen() {
      if (this.value.id) {
culture/src/views/strain-library/validation/primitive-cell/add.vue
@@ -104,8 +104,8 @@
        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(() => {
culture/src/views/strain-library/validation/primitive-cell/index.vue
@@ -33,7 +33,7 @@
              草稿箱
            </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>
culture/src/views/strainOperationAssessment/components/evaluate/index.vue
@@ -6,7 +6,7 @@
            <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">
@@ -29,7 +29,7 @@
                                        placeholder="请输入报告名称" />
                                </el-form-item>
                            </div>
                        </div>
                        </div> -->
                        <div class="table">
                            <el-table :data="assessmentTable" border style="width: 100%" :show-summary="true"
culture/src/views/strainOperationAssessment/index.vue
@@ -10,7 +10,7 @@
                <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>
@@ -68,16 +68,15 @@
    data() {
        return {
            form: {
                pageSize: 10,
                pageNum: 1,
                teamName: '',
                reportName: '',
                evaluateName:'',
                time: [],
            },
            tableData: [],
            showEvaluate: false,
            queryForm: {
                pageSize: 10,
                pageNum: 1,
            },
            total: 0,
            isDraft: false,
            obj: {},
@@ -94,7 +93,7 @@
            this.showEvaluate = true
        }, 
        handleCurrentChange(page) {
            this.queryForm.pageNum = page
            this.form.pageNum = page
            this.getLists()
        },
        handleSizeChange(size) {
@@ -103,10 +102,10 @@
        },
        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 => {
@@ -120,6 +119,8 @@
            this.form = {
                teamName: '',
                reportName: '',
                status: '',
                experimentName: '',
                time: [],
            }
            this.getLists()
culture/src/views/strainReportLibrary/reportLibraryOne/add.vue
@@ -148,10 +148,8 @@
                </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>
@@ -362,6 +360,7 @@
            });
        }, getProjectData(data) {
            this.projectData = [data]; // 将选中的项目组数据存储到数组中
            this.showChoose = false
        },
        selectUser(data) {
@@ -369,6 +368,10 @@
            this.$refs.selectMember.close()
        },
        getMember() {
            if (!this.projectData.length) {
                this.$message.warning('请选择参与人员!')
                return
            }
            this.$refs.selectMember.open(null);
        },
        handleModifyMember(member) {
culture/src/views/strainReportLibrary/reportLibraryOne/index.vue
@@ -72,15 +72,15 @@
                </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>
culture/src/views/strainReportLibrary/reportLibraryOne/service.js
@@ -2,6 +2,8 @@
// 列表
export const getList = (data) => {
  console.log('qweqweq',data);
  return axios.post('/api/t-strain-report/pageListAll', { ...data })
}
@@ -35,7 +37,7 @@
//撤销审批
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}})
}
//查看评定详情
culture/src/views/strainReportLibrary/reportLibraryOneFour/add.vue
@@ -149,7 +149,7 @@
            </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>
@@ -259,6 +259,11 @@
                    return item
                })
                this.selectedMember = [{
                    nickName:data.experimentName,
                    userId:data.experimentId
                }]
                this.projectData = data.projectTeam ?
                    [{ ...data.projectTeam, staffName: data.projectTeam.staff || '' }] :
                    [];
@@ -364,6 +369,10 @@
            this.$refs.selectMember.close()
        },
        getMember() {
            if (!this.projectData.length) {
                this.$message.warning('请选择项目组');
                return;
            }
            this.$refs.selectMember.open(null);
        },
        handleModifyMember(member) {
culture/src/views/strainReportLibrary/reportLibraryOneFour/index.vue
@@ -71,14 +71,14 @@
                </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>
@@ -226,7 +226,7 @@
                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) {
@@ -282,7 +282,7 @@
            })
        },
        handleDetail(row) {
            this.$router.push(`/strainReportLibrary/detail?id=${row.id}`)
            this.$router.push(`/strainReportLibrary/detailFour?id=${row.id}`)
        },
        handleExperimentChange(val) {
            this.getLists()
culture/src/views/strainReportLibrary/reportLibraryOneFour/service.js
@@ -35,7 +35,7 @@
//撤销审批
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}})
}
//查看评定详情
culture/src/views/strainReportLibrary/reportLibraryOneTWO/add.vue
@@ -149,7 +149,7 @@
            </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>
@@ -253,6 +253,10 @@
                };
                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])
@@ -362,6 +366,10 @@
            this.$refs.selectMember.close()
        },
        getMember() {
            if (!this.projectData.length) {
                this.$message.warning('请选择项目组');
                return;
            }
            this.$refs.selectMember.open(null);
        },
        handleModifyMember(member) {
culture/src/views/strainReportLibrary/reportLibraryOneTWO/components/evaluate/index.vue
@@ -45,7 +45,7 @@
                        <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">
@@ -57,7 +57,7 @@
                                 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>
@@ -206,7 +206,7 @@
            return this.currentAssessmentTable.reduce((sum, item) => sum + (item.selectedScore || 0), 0);
        },
        dialogTitle() {
            return this.type === "1" ? "创新型课题评定" : "规程型课题评定标准";
            return this.type == "1" ? "创新型课题评定" : "规程型课题评定标准";
        }
    },
    methods: {
culture/src/views/strainReportLibrary/reportLibraryOneTWO/index.vue
@@ -71,15 +71,15 @@
                </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>
@@ -282,7 +282,7 @@
            })
        },
        handleDetail(row) {
            this.$router.push(`/strainReportLibrary/detail?id=${row.id}`)
            this.$router.push(`/strainReportLibrary/detailTwo?id=${row.id}`)
        },
        handleExperimentChange(val) {
            this.getLists()
culture/src/views/strainReportLibrary/reportLibraryOneTWO/service.js
@@ -36,7 +36,7 @@
//撤销审批
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}})
}
//查看评定详情
culture/src/views/strainReportLibrary/reportLibraryOneThree/add.vue
@@ -149,7 +149,7 @@
            </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>
@@ -258,7 +258,10 @@
                    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 || '' }] :
                    [];
@@ -364,6 +367,10 @@
            this.$refs.selectMember.close()
        },
        getMember() {
            if (!this.projectData.length) {
                this.$message.warning('请选择项目组');
                return;
            }
            this.$refs.selectMember.open(null);
        },
        handleModifyMember(member) {
culture/src/views/strainReportLibrary/reportLibraryOneThree/index.vue
@@ -71,15 +71,15 @@
                </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>
@@ -283,7 +283,7 @@
            })
        },
        handleDetail(row) {
            this.$router.push(`/strainReportLibrary/detail?id=${row.id}`)
            this.$router.push(`/strainReportLibrary/detailThree?id=${row.id}`)
        },
        handleExperimentChange(val) {
            this.getLists()
culture/src/views/strainReportLibrary/reportLibraryOneThree/service.js
@@ -35,7 +35,7 @@
//撤销审批
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}})
}
//查看评定详情