From 0db8c9b94a9ac655549d5eba5c2a6c92ac386c06 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期四, 08 十月 2026 11:20:56 +0800
Subject: [PATCH] 提交最新代码

---
 culture/src/views/strain-library/main-cell-library/add.vue |  507 ++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 364 insertions(+), 143 deletions(-)

diff --git a/culture/src/views/strain-library/main-cell-library/add.vue b/culture/src/views/strain-library/main-cell-library/add.vue
index cdcf2f7..8a399a7 100644
--- a/culture/src/views/strain-library/main-cell-library/add.vue
+++ b/culture/src/views/strain-library/main-cell-library/add.vue
@@ -2,8 +2,43 @@
     <Card>
         <el-form :model="form" :rules="rules" ref="strainForm" label-position="top" class="strain-form">
             <div class="form-row three-columns">
+              <el-form-item label="选择项目组:" prop="projectId">
+                <el-select
+                    v-model="form.projectId"
+                    placeholder="请选择项目组"
+                    filterable
+                    clearable
+                    :key="teamList.length"
+                    :loading="teamLoading"
+                    @focus="fetchTeamList"
+                >
+                  <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="菌种编号" prop="strainCode">
-                    <el-input v-model="form.strainCode" placeholder="请输入"></el-input>
+<!--                    <el-input v-model="form.strainCode" placeholder="请输入"></el-input>-->
+                  <div class="strain-code-wrapper">
+                    <el-input
+                        v-model="form.strainCode"
+                        placeholder="请输入前缀"
+                        class="strain-code-input"
+                    />
+                    <span class="strain-code-separator">-</span>
+                    <el-input
+                        :value="displayStrainSeq"
+                        placeholder="序号"
+                        class="strain-seq-input"
+                        maxlength="3"
+                        @input="handleSeqInput"
+                        @blur="formatSeq"
+                        @focus="handleFocus"
+                    />
+                  </div>
                 </el-form-item>
                 <el-form-item label="菌种名称" prop="strainName">
                     <el-input v-model="form.strainName" placeholder="请输入"></el-input>
@@ -14,8 +49,8 @@
             </div>
 
             <div class="form-row">
-                <el-form-item label="鉴定方法" prop="appraisalMethod">
-                    <el-input v-model="form.appraisalMethod" placeholder="请输入"></el-input>
+                <el-form-item label="鉴定方法" prop="appraisalMethod" class="full-width">
+                    <el-input type="textarea" :rows="4" v-model="form.appraisalMethod" placeholder="请输入"></el-input>
                 </el-form-item>
             </div>
 
@@ -78,149 +113,270 @@
 
 <script>
 import SignatureCanvas from '@/components/SignatureCanvas.vue'
-import { add, edit, getDetail, addBatch } from './service'
-
 export default {
-    name: 'StrainLibraryManageAdd',
-    components: {
-        SignatureCanvas
-    },
-    data() {
-        return {
-            batchAddDialogVisible: false,
-            signatureVisible: false,
-            currentAction: '', // 'submit' or 'batchAdd'
-            batchForm: {
-                count: ''
-            },
-            form: {
-                strainCode: '',
-                strainName: '',
-                source: '',
-                appraisalMethod: '',
-                characteristics: '',
-                storageLocation: '',
-                preservationMethod: '',
-                remark: ''
-            },
-            rules: {
-                strainCode: [{
-                    validator: (rule, value, callback) => {
-                        if (this.currentAction === 'submit' && !value) {
-                            callback(new Error('请输入菌种编号'));
-                        } else {
-                            callback();
-                        }
-                    },
-                    trigger: 'change'
-                }],
-                strainName: [{ required: true, message: '请输入菌种名称', trigger: 'blur' }],
-                strainSource: [{ required: true, message: '请输入菌种来源', trigger: 'blur' }],
-                appraisalMethod: [{ required: true, message: '请输入鉴定方法', trigger: 'blur' }],
-                features: [{ required: true, message: '请输入特征描述', trigger: 'blur' }],
-                saveLocation: [{ required: true, message: '请输入保存位置', trigger: 'blur' }],
-                saveMethod: [{ required: true, message: '请输入菌种保存方法', trigger: 'blur' }]
-            }
-        }
-    },
-    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
-            })
-        }
-    },
-    watch: {
-        '$route.query.id'() {
-            this.form = {
-                strainCode: '',
-                strainName: '',
-                source: '',
-                appraisalMethod: '',
-                characteristics: '',
-                storageLocation: '',
-                preservationMethod: '',
-                remark: ''
-            }
-        }
-    },
-    methods: {
-        handleSubmit(isDraft) {
-            this.currentAction = 'submit'
-            this.$refs.strainForm.validate((valid) => {
-                if (valid) {
-                    this.form.isDraft = isDraft
-                    if (isDraft == 1) {
-                        //存草稿
-                        this.handleSignatureConfirm('')
-                    } else {
-                        this.signatureVisible = true
-                    }
-                }
-            })
-        },
-        handleBatchAdd() {
-            this.currentAction = 'batchAdd'
-            this.$refs.strainForm.validate((valid) => {
-                if (valid) {
-                    this.batchAddDialogVisible = true
-                }
-            })
-        },
-        handleConfirmBatchAdd() {
-            this.$refs.batchFormRef.validate((valid) => {
-                if (valid) {
-                    this.batchAddDialogVisible = false
-                    this.signatureVisible = true
-                }
-            })
-        },
-        async handleSignatureConfirm(signatureImage) {
-            let requestData = {
-                strainCode: this.form.strainCode,
-                strainName: this.form.strainName,
-                strainSource: this.form.strainSource,
-                appraisalMethod: this.form.appraisalMethod,
-                features: this.form.features,
-                saveLocation: this.form.saveLocation,
-                saveMethod: this.form.saveMethod,
-                remark: this.form.remark,
-                signature: signatureImage,
-                type: 2,
-            };
-            if (this.currentAction === 'batchAdd') {
-                requestData.batchCount = this.batchForm.count;
+  name: 'MainCellLibraryAdd',
+  components: {
+    SignatureCanvas
+  },
+  data() {
+    return {
+      teamList: [], // 项目组列表
+      teamLoading: false, // 加载状态
+      cacheForm: null,
+      batchAddDialogVisible: false,
+      signatureVisible: false,
+      currentAction: '', // 'submit' or 'batchAdd'
+      batchForm: {
+        count: ''
+      },
+      displayStrainSeq: '', // 显示用的序号(可能包含前导零)
+      form: {
+        strainCode: '',
+        strainName: '',
+        source: '',
+        appraisalMethod: '',
+        projectId: '',
+        characteristics: '',
+        storageLocation: '',
+        preservationMethod: '',
+        remark: ''
+      },
+      rules: {
+        projectId: [{ required: true, message: '请选择所属项目组', trigger: 'change' }],
+        strainCode: [{required: true,
+          validator: (rule, value, callback) => {
+            if (this.currentAction === 'submit' && !value) {
+              callback(new Error('请输入菌种编号'));
             } else {
-                requestData.isDraft = this.form.isDraft
+              callback();
             }
-            try {
-                if (this.$route.query.id) {
-                    requestData.id = this.$route.query.id;
-                    await edit(requestData);
-                } else if (this.currentAction === 'batchAdd') {
-                    await addBatch(requestData);
-                } else {
-                    await add(requestData);
-                }
-                this.signatureVisible = false;
-                this.$router.push({ path: '/strain-library/main-cell-library' });
-                this.$message.success('操作成功');
-            } catch (error) {
-                this.$message.error('操作失败');
-            }
-        }
+          },
+          trigger: 'change'
+        }],
+        strainName: [{ required: true, message: '请输入菌种名称', trigger: 'blur' }],
+        strainSource: [{ required: true, message: '请输入菌种来源', trigger: 'blur' }],
+        appraisalMethod: [{ required: true, message: '请输入鉴定方法', trigger: 'blur' }],
+        features: [{ required: true, message: '请输入特征描述', trigger: 'blur' }],
+        saveLocation: [{ required: true, message: '请输入保存位置', trigger: 'blur' }],
+        saveMethod: [{ required: true, message: '请输入菌种保存方法', trigger: 'blur' }]
+      }
     }
+  },
+  async activated() {
+    await this.fetchTeamList()
+
+    this.resetForm()
+    if (this.cacheForm) {
+      this.form = this.cacheForm;
+
+      if (this.cacheForm.displayStrainSeq) {
+        this.displayStrainSeq = this.cacheForm.displayStrainSeq;
+      }
+    }
+    if (this.$route.query.id && !this.cacheForm) {
+      getDetail({ id: this.$route.query.id }).then(res => {
+        this.form = res
+
+        if (res.strainCode) {
+          const parts = res.strainCode.split('-');
+          if (parts.length > 1) {
+            const seq = parts.pop();
+            this.displayStrainSeq = seq.replace(/^0+/, '');
+            this.form.strainCode = parts.join('-');
+          } else {
+            this.form.strainCode = res.strainCode;
+          }
+        }
+      })
+    }
+  },
+  deactivated() {
+    this.cacheForm = JSON.parse(JSON.stringify(this.form));
+    this.cacheForm.displayStrainSeq = this.displayStrainSeq
+  },
+  watch: {
+    '$route.query.id'() {
+      this.form = {
+        strainCode: '',
+        strainName: '',
+        source: '',
+        appraisalMethod: '',
+        characteristics: '',
+        storageLocation: '',
+        preservationMethod: '',
+        remark: ''
+      }
+    }
+  },
+  methods: {
+    // 处理输入:只允许数字
+    handleSeqInput(value) {
+      console.log('输入值:', value);
+
+      // 如果是空字符串,清空所有
+      if (value === '') {
+        this.form.strainSeq = '';
+        this.displayStrainSeq = '';
+        return;
+      }
+
+      // 只保留数字,限制3位
+      let numStr = value.replace(/\D/g, '').slice(0, 3);
+
+      if (numStr) {
+        const num = parseInt(numStr);
+        if (!isNaN(num) && num >= 0 && num <= 999) {
+          // 存储时去除前导零
+          this.form.strainSeq = String(num);
+          // 显示时保留用户输入的内容(不补零,让用户看到自己输入的内容)
+          this.displayStrainSeq = numStr;
+        }
+      } else {
+        this.form.strainSeq = '';
+        this.displayStrainSeq = '';
+      }
+
+      console.log('存储值:', this.form.strainSeq);
+      console.log('显示值:', this.displayStrainSeq);
+    },
+
+    // 失去焦点时:补零到3位
+    formatSeq() {
+      console.log('失去焦点, 当前值:', this.form.strainSeq);
+
+      if (this.form.strainSeq) {
+        const num = parseInt(this.form.strainSeq);
+        if (!isNaN(num) && num >= 0 && num <= 999) {
+          // 保持存储值为数字字符串
+          this.form.strainSeq = String(num);
+          // 显示时补零到3位
+          this.displayStrainSeq = String(num).padStart(3, '0');
+        }
+      }
+
+      console.log('格式化后存储值:', this.form.strainSeq);
+      console.log('格式化后显示值:', this.displayStrainSeq);
+    },
+
+    // 获取焦点时:显示原始数字(去除前导零,便于编辑)
+    handleFocus() {
+      console.log('获取焦点, 当前值:', this.form.strainSeq);
+
+      if (this.form.strainSeq) {
+        // 显示原始数字,去除前导零
+        this.displayStrainSeq = this.form.strainSeq;
+      }
+    },
+    getFullStrainCode() {
+      const prefix = this.form.strainCode || '';
+      const seq = this.displayStrainSeq || '';
+      if (prefix && seq) {
+        const paddedSeq = String(seq).padStart(3, '0');
+        return `${prefix}-${paddedSeq}`;
+      }
+      return prefix;
+    },
+    // 获取项目组列表
+    async fetchTeamList() {
+      if (this.teamList.length > 0) return // 已有数据不再重复请求
+      this.teamLoading = true
+      try {
+        const res = await myTeamPageList()
+        // 根据实际接口返回的数据结构调整
+        this.teamList = res.data || res || []
+      } catch (error) {
+        console.error('获取项目组列表失败:', error)
+        this.$message.error('获取项目组列表失败')
+      } finally {
+        this.teamLoading = false
+      }
+    },
+    resetForm() {
+      this.form = {
+        strainCode: '',
+        strainName: '',
+        source: '',
+        appraisalMethod: '',
+        characteristics: '',
+        projectId: '',
+        storageLocation: '',
+        preservationMethod: '',
+        remark: ''
+      };
+    },
+    handleSubmit(isDraft) {
+      this.currentAction = 'submit'
+      this.$refs.strainForm.validate((valid) => {
+        if (valid) {
+          this.form.isDraft = isDraft
+          if (isDraft == 1) {
+            //存草稿
+            this.handleSignatureConfirm('')
+          } else {
+            this.signatureVisible = true
+          }
+        }
+      })
+    },
+    handleBatchAdd() {
+      this.currentAction = 'batchAdd'
+      this.$refs.strainForm.validate((valid) => {
+        if (valid) {
+          this.batchAddDialogVisible = true
+        }
+      })
+    },
+    handleConfirmBatchAdd() {
+      this.$refs.batchFormRef.validate((valid) => {
+        if (valid) {
+          this.batchAddDialogVisible = false
+          this.signatureVisible = true
+        }
+      })
+    },
+    async handleSignatureConfirm(signatureImage) {
+      const fullStrainCode = this.getFullStrainCode();
+      let requestData = {
+        projectId: this.form.projectId,
+        strainCode: fullStrainCode,
+        strainName: this.form.strainName,
+        strainSource: this.form.strainSource,
+        appraisalMethod: this.form.appraisalMethod,
+        features: this.form.features,
+        saveLocation: this.form.saveLocation,
+        saveMethod: this.form.saveMethod,
+        remark: this.form.remark,
+        signature: signatureImage,
+        type: 2,
+      };
+      if (this.currentAction === 'batchAdd') {
+        requestData.batchCount = this.batchForm.count;
+      } else {
+        requestData.isDraft = this.form.isDraft
+      }
+      try {
+        if (this.$route.query.id) {
+          requestData.id = this.$route.query.id;
+          await edit(requestData);
+        } else if (this.currentAction === 'batchAdd') {
+          await addBatch(requestData);
+        } else {
+          await add(requestData);
+        }
+        this.cacheForm = null
+        this.displayStrainSeq = null
+        this.signatureVisible = false;
+        this.$closeCurrentView('/strain-library/main-cell-library');
+        this.$message.success('操作成功');
+      } catch (error) {
+        this.$message.error('操作失败');
+      }
+    }
+  }
 }
+
+import { add, edit, getDetail, addBatch } from './service'
+import {myTeamPageList} from "@/components/chooseProject/servce";
 </script>
 
 <style scoped lang="less">
@@ -264,12 +420,77 @@
     button {
         width: 180px;
         height: 36px;
-        // background: #409EFF; 
+        // background: #409EFF;
     }
 }
 
 .strain-form {
     padding: 0 40px;
+
+  // 菌种编号表单项样式
+  .strain-code-form-item {
+    // 关键:让表单项占满宽度
+    flex: 1;
+    min-width: 280px;
+
+    :deep(.el-form-item__content) {
+      display: flex;
+      align-items: center;
+      width: 100%;
+      line-height: 36px;
+    }
+  }
+
+  .strain-code-wrapper {
+    display: flex;
+    align-items: center;
+    gap: 8px;
+    width: 100%;
+    flex: 1;
+
+    .strain-code-input {
+      flex: 1; // 改为 flex:1 自适应
+      min-width: 0; // 防止溢出
+
+      :deep(.el-input__inner) {
+        height: 36px;
+        line-height: 36px;
+        border-radius: 4px;
+        width: 100%;
+      }
+    }
+
+    .strain-code-separator {
+      color: #909399;
+      font-size: 16px;
+      font-weight: bold;
+      user-select: none;
+      flex-shrink: 0;
+      line-height: 36px;
+      padding: 0 2px;
+    }
+
+    .strain-seq-input {
+      width: 90px; // 固定宽度
+      flex-shrink: 0; // 不被压缩
+
+      :deep(.el-input__inner) {
+        height: 36px;
+        line-height: 36px;
+        text-align: center;
+        padding: 0 5px;
+        border-radius: 4px;
+        width: 100%;
+
+        &::-webkit-inner-spin-button,
+        &::-webkit-outer-spin-button {
+          -webkit-appearance: none;
+          margin: 0;
+        }
+        -moz-appearance: textfield;
+      }
+    }
+  }
 
     .form-row {
         display: flex;
@@ -436,4 +657,4 @@
         margin: 0;
     }
 }
-</style>
\ No newline at end of file
+</style>

--
Gitblit v1.7.1