puzhibing
6 天以前 0db8c9b94a9ac655549d5eba5c2a6c92ac386c06
culture/src/views/strain-library/breeding-record/index.vue
@@ -1,19 +1,44 @@
<template>
  <div class="list">
    <TableCustom :queryForm="form" :tableData="tableData" :total="total">
    <TableCustom :queryForm="form" :tableData="tableData" :height="null" :total="total" @handleCurrentChange="handleCurrentChange"
    @handleSizeChange="handleSizeChange">
      <template #search>
        <el-form :model="form" labelWidth="auto" inline>
          <el-form-item label="来源类型:">
            <el-input v-model="form.planName" placeholder="请输入"></el-input>
        <el-form ref="searchForm" :model="form" :rules="rules" labelWidth="auto" inline>
          <el-form-item label="选择项目组:">
            <el-select
                v-model="form.projectIds"
                placeholder="请选择项目组"
                filterable
                clearable
                :key="teamList.length"
                :loading="teamLoading"
                @focus="fetchTeamList"
                multiple
            >
              <el-option
                  v-for="item in teamList"
                  :key="item.id"
                  :label="item.teamName"
                  :value="item.id"
              />
            </el-select>
          </el-form-item>
          <el-form-item label="培养基:">
            <el-input v-model="form.planCode" placeholder="请输入"></el-input>
          <el-form-item label="来源类型">
            <el-select v-model="form.preserveSource" placeholder="请选择">
              <el-option label="来源菌株" :value="1" />
              <el-option label="来源物资" :value="2" />
            </el-select>
          </el-form-item>
          <el-form-item label="培养基配方:">
            <el-input v-model="form.planCode" placeholder="请输入"></el-input>
          <el-form-item label="培养基">
            <el-input v-model="form.cultureMedium" placeholder="请输入"></el-input>
          </el-form-item>
          <el-form-item label="需氧类型">
            <el-input v-model="form.creator" placeholder="请输入"></el-input>
            <el-select v-model="form.aerobicType" placeholder="请选择">
              <el-option label="专性需氧" :value="1" />
              <el-option label="专性厌氧" :value="2" />
              <el-option label="兼性需氧" :value="3" />
              <el-option label="耐氧厌氧" :value="4" />
            </el-select>
          </el-form-item>
          <el-form-item label="">
            <el-button type="default" @click="resetForm">重置</el-button>
@@ -24,148 +49,156 @@
      <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" v-if="roleType==4" :class="{ active: currentType === 'draft' }" @click="handleTypeChange('draft')">
              草稿箱
            </div>
          </div>
          <div class="flex a-center">
            <el-button
              @click="handleNewStrain"
              class="el-icon-plus"
              type="primary"
              style="margin-right: 12px"
              >新增保藏记录</el-button
            >
          <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>
      </template>
      <template #table>
        <el-table-column prop="stage" label="来源类型"></el-table-column>
        <el-table-column prop="creator" label="培养基"></el-table-column>
        <el-table-column prop="creator" label="培养基配方"></el-table-column>
        <el-table-column prop="createTime" label="培养温度"></el-table-column>
        <el-table-column prop="approver" label="需氧类型"></el-table-column>
        <el-table-column prop="approver" label="创建人"></el-table-column>
        <el-table-column prop="approveTime" label="创建时间"></el-table-column>
        <el-table-column prop="projectName" label="项目组名称"/>
        <el-table-column prop="preserveSource" label="来源类型">
          <template slot-scope="scope">
            <span>{{ scope.row.preserveSource === 1 ? '来源菌株' : '来源物资' }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="strainName" label="来源信息">
          <template slot-scope="scope">
            <span>{{ scope.row.preserveSource === 1 ? scope.row.strainName : scope.row.sourceMaterialTimeBatchNumber }}</span>
          </template>
        </el-table-column>
        <!-- <el-table-column prop="sourceMaterialTimeBatchNumber" label="来源物资、时间及批号">
        </el-table-column> -->
        <el-table-column prop="cultureMedium" label="培养基"></el-table-column>
        <el-table-column prop="temperature" label="培养温度"></el-table-column>
        <el-table-column prop="aerobicType" label="需氧类型">
          <template slot-scope="scope">
            <span>{{ scope.row.aerobicType == 1 ? '专性需氧' : scope.row.aerobicType == 2 ? '专性厌氧' : scope.row.aerobicType
              ==
              3 ? '兼性需氧' : '耐氧厌氧'}}</span>
          </template>
        </el-table-column>
        <el-table-column prop="createBy" label="创建人"></el-table-column>
        <el-table-column prop="createTime" label="创建时间"></el-table-column>
        <el-table-column prop="status" label="状态">
          <template slot-scope="scope">
            {{ scope.row.status === 1 ? '已提交' : scope.row.status === 2 ? '已同步/未提交' :'草稿' }}
          </template>
        </el-table-column>
        <el-table-column label="操作" width="250">
          <template slot-scope="scope">
            <el-button type="text" @click="handleDetail(scope.row)"
              >详情</el-button
            >
            <el-button type="text" @click="handleEdit(scope.row)"
              >编辑</el-button
            >
            <el-button  style="margin-right: 10px" type="text" @click="handleDetail(scope.row)">详情</el-button>
            <el-button  style="margin-right: 10px" type="text" @click="handleEdit(scope.row)"
              v-if="[1, 4].includes(roleType) && scope.row.status != 1">编辑</el-button>
            <el-button type="text" @click="handleDelete(scope.row)"
              >删除</el-button
            >
              v-if="[1].includes(roleType) || ([1, 4].includes(roleType) && currentType != 'list')">删除</el-button>
          </template>
        </el-table-column>
      </template>
    </TableCustom>
    <ShowDelConfirm :show="showDelConfirm" @close="showDelConfirm = false" @confirm="handleDelConfirm" />
  </div>
</template>
<script>
import { getList, del } from './service'
import ShowDelConfirm from '@/components/showDelConfirm'
import {myTeamPageList} from "@/components/chooseProject/servce";
export default {
  name: "BreedingRecord",
  components: {},
  components: {
    ShowDelConfirm
  },
  data() {
    return {
      teamList: [], // 项目组列表
      teamLoading: false, // 加载状态
      currentType: "list", // 当前显示类型:list-列表,draft-草稿箱
      form: {
        planName: "",
        planCode: "",
        creator: "",
        createTime: [],
        approver: "",
        status: "",
        aerobicType: '',
        cultureMedium: '',
        preserveSource: '',
        projectIds: [],
        strainCode: '',
        strainName: '',
        pageNum: 1,
        pageSize: 10,
        isDraft: 0,
      },
      showDelConfirm: false,
      rules: {
        aerobicType: [
          { required: true, message: '需氧类型不能为空', trigger: 'blur' }
        ],
        cultureMedium: [
          { required: true, message: '培养基不能为空', trigger: 'blur' }
        ],
        preserveSource: [
          { required: true, message: '来源类型不能为空', trigger: 'change' }
        ],
        strainCode: [
          { required: true, message: '菌种编号不能为空', trigger: 'blur' }
        ],
        strainName: [
          { required: true, message: '菌种名称不能为空', trigger: 'blur' }
        ],
      },
      tableData: [],
      delData: null,
      total: 0,
      // 模拟数据
      mockListData: [
        {
          planCode: "PLAN-2024-001",
          planName: "2024年度实验室设备升级方案",
          stage: "规划阶段",
          creator: "张三",
          createTime: "2024-03-15",
          status: "pending",
          approver: "李四",
          approveTime: "2024-03-16",
        },
        {
          planCode: "PLAN-2024-002",
          planName: "实验室安全管理制度更新方案",
          stage: "实施阶段",
          creator: "王五",
          createTime: "2024-03-14",
          status: "approved",
          approver: "赵六",
          approveTime: "2024-03-15",
        },
        {
          planCode: "PLAN-2024-003",
          planName: "实验室人员培训计划",
          stage: "准备阶段",
          creator: "孙七",
          createTime: "2024-03-13",
          status: "rejected",
          approver: "周八",
          approveTime: "2024-03-14",
        },
      ],
      mockDraftData: [
        {
          planCode: "DRAFT-2024-001",
          planName: "实验室设备采购计划(草稿)",
          stage: "规划阶段",
          creator: "张三",
          createTime: "2024-03-16",
          status: "draft",
          approver: "",
          approveTime: "",
        },
        {
          planCode: "DRAFT-2024-002",
          planName: "实验室改造方案(草稿)",
          stage: "准备阶段",
          creator: "李四",
          createTime: "2024-03-15",
          status: "draft",
          approver: "",
          approveTime: "",
        },
      ],
      approvalDialogVisible: false,
      approvalDialogType: "approve",
      currentApprovalData: null,
      roleType: Number(JSON.parse(sessionStorage.getItem('userInfo')).roleType),
    };
  },
  created() {
  activated() {
    this.getTableData();
    this.fetchTeamList();
  },
  methods: {
    // 获取项目组列表
    async fetchTeamList() {
      if (this.teamList.length > 0) return // 已有数据不再重复请求
      this.teamLoading = true
      try {
        const res = await myTeamPageList()
        console.log('res', res)
        // 根据实际接口返回的数据结构调整
        this.teamList = res.data || res || []
      } catch (error) {
        console.error('获取项目组列表失败:', error)
        this.$message.error('获取项目组列表失败')
      } finally {
        this.teamLoading = false
      }
    },
    handleCurrentChange(page) {
      this.form.pageNum = page;
      this.getTableData();
    },
    handleSizeChange(size) {
      this.form.pageSize = size;
      this.getTableData();
    },
    resetForm() {
      this.form = {
        planName: "",
        planCode: "",
        creator: "",
        createTime: [],
        approver: "",
        status: "",
        aerobicType: '',
        cultureMedium: '',
        preserveSource: '',
        projectIds: '',
        strainCode: '',
        strainName: '',
        pageNum: 1,
        pageSize: 10,
        isDraft: this.currentType === 'draft' ? 1 : 0,
      };
      this.getTableData();
    },
    handleNewStrain() {
      this.$router.push({
@@ -173,8 +206,21 @@
      });
    },
    handleSearch() {
      // 实现查询逻辑
      console.log("查询条件:", this.form);
      this.$refs.searchForm.validate(valid => {
        if (valid) {
          this.form.isDraft = this.currentType === 'draft' ? 1 : 0;
          this.form.pageNum = 1;
          this.getTableData();
        }
      });
    },
    handlePageChange(page) {
      this.form.pageNum = page;
      this.getTableData();
    },
    handleSizeChange(size) {
      this.form.pageSize = size;
      this.getTableData();
    },
    getStatusType(status) {
      const statusMap = {
@@ -201,55 +247,50 @@
        path: "/dataManagement/addPlan",
      });
    },
    handleApprove(row) {
      this.currentApprovalData = row;
      this.approvalDialogType = "approve";
      this.approvalDialogVisible = true;
    },
    handleApproveSubmit(data) {
      // 处理审批通过
      console.log("审批通过:", data);
      this.approvalDialogVisible = false;
      this.$message.success("审批通过成功");
      this.getTableData();
    },
    handleRejectSubmit(data) {
      // 处理审批驳回
      console.log("审批驳回:", data);
      this.approvalDialogVisible = false;
      this.$message.success("审批驳回成功");
      this.getTableData();
    },
    handleRevokeApprove(row) {
      // 实现撤销审批逻辑
      console.log("撤销审批数据:", row);
    },
    handleEdit(row) {
      // 实现编辑逻辑
      console.log("编辑数据:", row);
    },
    handleDelete(row) {
      // 实现删除逻辑
      console.log("删除数据:", row);
      this.showDelConfirm = true
      this.delData = row
    },
    handleDelConfirm() {
      del({ id: this.delData.id }).then(res => {
        this.$message.success('删除成功');
        this.showDelConfirm = false
        this.getTableData();
      })
    },
    handleDetail(row) {
      this.currentApprovalData = row;
      this.approvalDialogType = "view";
      this.approvalDialogVisible = true;
      this.$router.push({
        path: "/strain/detail-breeding-record",
        query: {
          id: row.id,
          isDetail: true
        }
      });
    },
    handleEdit(row) {
      this.$router.push({
        path: "/strain/edit-breeding-record",
        query: {
          id: row.id,
          isEdit: true
        }
      });
    },
    handleTypeChange(type) {
      this.currentType = type;
      this.form.isDraft = type === 'draft' ? 1 : 0;
      this.form.pageNum = 1;
      this.getTableData();
    },
    getTableData() {
      // 根据currentType请求不同的数据
      if (this.currentType === "list") {
        this.tableData = this.mockListData;
        this.total = this.mockListData.length;
      } else {
        this.tableData = this.mockDraftData;
        this.total = this.mockDraftData.length;
      }
      getList({ ...this.form }).then(res => {
        this.tableData = res.data.records || [];
        this.total = res.data.total || 0;
      }).catch(() => {
        this.tableData = [];
        this.total = 0;
      });
    },
  },
};
@@ -259,15 +300,18 @@
.list {
  height: 100%;
}
.flex {
  display: flex;
  align-items: center;
}
.tableTitle {
  display: flex;
  padding-bottom: 20px;
  justify-content: space-between;
  align-items: center;
  .title {
    background: #fafafc;
    border-radius: 8px 8px 0px 0px;
@@ -279,6 +323,7 @@
    width: unset;
    cursor: pointer;
  }
  .drafts {
    padding: 16px 65px;
    background: #fafafc;
@@ -290,6 +335,7 @@
    margin-left: 16px;
    cursor: pointer;
  }
  .active {
    color: #049c9a;
    background: #ffffff;