From 993e5fd593398926af72af660cb5ed6aba8e4e2b Mon Sep 17 00:00:00 2001
From: 13404089107 <puwei@sinata.cn>
Date: 星期二, 20 五月 2025 16:43:04 +0800
Subject: [PATCH] 对接接口

---
 culture/src/views/strain-library/main-cell-library/add.vue |  573 ++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 406 insertions(+), 167 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 39b15f6..3e1e100 100644
--- a/culture/src/views/strain-library/main-cell-library/add.vue
+++ b/culture/src/views/strain-library/main-cell-library/add.vue
@@ -1,190 +1,429 @@
 <template>
-  <Card>
-      <el-form 
-          :model="form" 
-          :rules="rules" 
-          ref="strainForm" 
-          label-position="top"
-          class="strain-form"
-      >
-          <div class="form-grid">
-              <el-form-item label="菌种编号" prop="strainNo" required>
-                  <el-input v-model="form.strainNo" placeholder="请输入"></el-input>
-              </el-form-item>
-              <el-form-item label="菌种名称" prop="strainName" required>
-                  <el-input v-model="form.strainName" placeholder="请输入"></el-input>
-              </el-form-item>
-              <el-form-item label="菌种来源" prop="source" required>
-                  <el-input v-model="form.source" placeholder="请输入"></el-input>
-              </el-form-item>
-              <el-form-item label="鉴定方法" prop="identificationMethod" required>
-                  <el-input v-model="form.identificationMethod" placeholder="请输入"></el-input>
-              </el-form-item>
-              <el-form-item label="特征描述" prop="characteristics" required>
-                  <el-input v-model="form.characteristics" placeholder="请输入"></el-input>
-              </el-form-item>
-              <el-form-item label="菌种保存方法" prop="preservationMethod" required>
-                  <el-input v-model="form.preservationMethod" placeholder="请输入"></el-input>
-              </el-form-item>
-              <el-form-item label="保存位置" prop="storageLocation" required>
-                  <el-input v-model="form.storageLocation" placeholder="请输入"></el-input>
-              </el-form-item>
-          </div>
+    <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="strainCode">
+                    <el-input v-model="form.strainCode" placeholder="请输入"></el-input>
+                </el-form-item>
+                <el-form-item label="菌种名称" prop="strainName">
+                    <el-input v-model="form.strainName" placeholder="请输入"></el-input>
+                </el-form-item>
+                <el-form-item label="菌种来源" prop="strainSource">
+                    <el-input v-model="form.strainSource" placeholder="请输入"></el-input>
+                </el-form-item>
+            </div>
 
-          <div class="form-row">
-              <el-form-item label="备注" prop="remarks" class="full-width">
-                  <el-input 
-                      type="textarea" 
-                      v-model="form.remarks" 
-                      :rows="4"
-                      placeholder="请输入"
-                  ></el-input>
-              </el-form-item>
-          </div>
-          <div class="end-btn" style="margin-top: 38px">
-              <el-button type="primary" @click="handleSubmit">提交</el-button>
-              <el-button @click="handleDraft">存草稿</el-button>
-          </div>
-      </el-form>
+            <div class="form-row">
+                <el-form-item label="鉴定方法" prop="appraisalMethod">
+                    <el-input v-model="form.appraisalMethod" placeholder="请输入"></el-input>
+                </el-form-item>
+            </div>
 
-      <!-- 签字确认组件 -->
-      <SignatureCanvas
-          :visible.sync="signatureVisible"
-          @confirm="handleSignatureConfirm"
-      />
-  </Card>
+            <div class="form-row">
+                <el-form-item label="特征描述" prop="features" class="full-width">
+                    <el-input type="textarea" v-model="form.features" :rows="4" placeholder="请输入"></el-input>
+                </el-form-item>
+            </div>
+
+            <div class="form-row three-columns">
+                <el-form-item label="保藏位置" prop="saveLocation">
+                    <el-input v-model="form.saveLocation" placeholder="请输入"></el-input>
+                </el-form-item>
+                <el-form-item label="菌种保存方法" prop="saveMethod">
+                    <el-input v-model="form.saveMethod" placeholder="请输入"></el-input>
+                </el-form-item>
+                <div class="form-item-placeholder"></div>
+            </div>
+
+            <div class="form-row">
+                <el-form-item label="备注" prop="remarks" class="full-width">
+                    <el-input type="textarea" v-model="form.remark" :rows="4" placeholder="请输入"></el-input>
+                </el-form-item>
+            </div>
+
+            <div class="end-btn" style="margin-top: 38px">
+                <el-button type="primary" @click="handleSubmit(0)">提交</el-button>
+                <el-button v-if="!$route.query.id" type="primary" @click="handleBatchAdd">批量新增</el-button>
+                <el-button @click="handleSubmit(1)">存草稿</el-button>
+            </div>
+        </el-form>
+
+        <!-- 批量新增弹窗 -->
+        <el-dialog title="批量新增" :visible.sync="batchAddDialogVisible" width="520px" :close-on-click-modal="false"
+            :close-on-press-escape="false" custom-class="batch-add-dialog">
+            <div class="dialog-content">
+                <el-form :model="batchForm" ref="batchFormRef" label-position="top" class="batch-form">
+                    <el-form-item label="批量新增数量" prop="count"
+                        :rules="[{ required: true, message: '请输入批量新增数量', trigger: 'blur' }]">
+                        <el-input v-model.number="batchForm.count" placeholder="请输入" />
+                    </el-form-item>
+                </el-form>
+                <div class="dialog-notice">
+                    <p>注意:操作批量新增后,系统会自动生成对应数量的菌种数据,</p>
+                    <p>这些菌种的基础信息内容都是一致的,唯独菌种编号内容系统</p>
+                    <p>不会自动生成,需要操作员自行编辑</p>
+                </div>
+            </div>
+            <template #footer>
+                <div class="end-btn">
+                    <el-button type="primary" @click="handleConfirmBatchAdd">确认新增</el-button>
+                </div>
+            </template>
+        </el-dialog>
+
+        <!-- 签字确认组件 -->
+        <SignatureCanvas :visible.sync="signatureVisible" @confirm="handleSignatureConfirm" />
+    </Card>
 </template>
 
 <script>
 import SignatureCanvas from '@/components/SignatureCanvas.vue'
+import { add, edit, getDetail, addBatch } from './service'
 
 export default {
-  name: 'AddMainCell',
-  components: {
-      SignatureCanvas
-  },
-  data() {
-      return {
-          signatureVisible: false,
-          form: {
-              strainNo: '',
-              strainName: '',
-              source: '',
-              identificationMethod: '',
-              characteristics: '',
-              storageLocation: '',
-              preservationMethod: '',
-              remarks: ''
-          },
-          rules: {
-              strainNo: [{ required: true, message: '请输入菌种编号', trigger: 'blur' }],
-              strainName: [{ required: true, message: '请输入菌种名称', trigger: 'blur' }],
-              source: [{ required: true, message: '请输入菌种来源', trigger: 'blur' }],
-              identificationMethod: [{ required: true, message: '请输入鉴定方法', trigger: 'blur' }],
-              characteristics: [{ required: true, message: '请输入特征描述', trigger: 'blur' }],
-              storageLocation: [{ required: true, message: '请输入保存位置', trigger: 'blur' }],
-              preservationMethod: [{ required: true, message: '请输入菌种保存方法', trigger: 'blur' }]
-          }
-      }
-  },
-  methods: {
-      handleSubmit() {
-          this.$refs.strainForm.validate((valid) => {
-              if (valid) {
-                  this.signatureVisible = true
-              }
-          })
-      },
-      handleDraft() {
-          // 实现存草稿逻辑
-          console.log('save draft', this.form)
-          this.$message.success('草稿保存成功')
-      },
-      handleSignatureConfirm(signatureImage) {
-          this.signatureVisible = false
-          // 处理提交逻辑
-          console.log('submit form with signature:', this.form, signatureImage)
-          this.$message.success('提交成功')
-          this.$router.back()
-      }
-  }
+    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' }]
+            }
+        }
+    },
+    activated() {
+        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;
+            } 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.signatureVisible = false;
+                this.$router.back();
+                this.$message.success('操作成功');
+            } catch (error) {
+                this.$message.error('操作失败');
+            }
+        }
+    }
 }
 </script>
 
 <style scoped lang="less">
-.strain-form {
-  padding: 0 40px;
+.add-strain {
+    height: 100%;
+    background: #F5F7FA;
 
-  .form-grid {
-      display: grid;
-      grid-template-columns: repeat(3, 1fr);
-      gap: 24px;
-      margin-bottom: 24px;
-      
-      @media screen and (max-width: 1200px) {
-          grid-template-columns: repeat(2, 1fr);
-      }
-      
-      @media screen and (max-width: 768px) {
-          grid-template-columns: 1fr;
-      }
-  }
+    .form-card {
+        background: #fff;
+        border-radius: 8px;
+    }
+}
 
-  .form-row {
-      display: flex;
-      flex-wrap: wrap;
-      gap: 24px;
-      margin-bottom: 24px;
+.header-title {
+    margin-bottom: 24px;
 
-      .el-form-item {
-          margin-bottom: 0;
+    &-left {
+        display: flex;
+        align-items: center;
 
-          &.full-width {
-              width: 100%;
-          }
-      }
-  }
+        img {
+            width: 20px;
+            height: 20px;
+            margin-right: 8px;
+        }
 
-  :deep(.el-form-item__label) {
-      font-weight: normal;
-      color: #606266;
-      padding-bottom: 8px;
-      line-height: 20px;
-  }
-
-  :deep(.el-form-item__content) {
-      line-height: unset;
-  }
-
-  :deep(.el-input__inner) {
-      border-radius: 4px;
-      height: 36px;
-      line-height: 36px;
-  }
-
-  :deep(.el-textarea__inner) {
-      border-radius: 4px;
-      padding: 8px 12px;
-      min-height: 120px;
-  }
+        div {
+            font-size: 18px;
+            font-weight: bold;
+            color: #303133;
+        }
+    }
 }
 
 .end-btn {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  gap: 10px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    gap: 10px;
 
-  :deep(.el-button) {
-      width: 180px;
-      height: 36px;
-      padding: 0;
-      display: flex;
-      align-items: center;
-      justify-content: center;
-      font-size: 14px;
-      border-radius: 4px;
-      margin: 0;
-  }
+    button {
+        width: 180px;
+        height: 36px;
+        // background: #409EFF; 
+    }
 }
-</style>
+
+.strain-form {
+    padding: 0 40px;
+
+    .form-row {
+        display: flex;
+        flex-wrap: wrap;
+        gap: 24px;
+        margin-bottom: 24px;
+
+        &.three-columns {
+
+            .el-form-item,
+            .form-item-placeholder {
+                flex: 1;
+                min-width: 280px;
+
+                @media screen and (max-width: 1200px) {
+                    min-width: calc(50% - 12px);
+                }
+
+                @media screen and (max-width: 768px) {
+                    min-width: 100%;
+                }
+            }
+
+            .form-item-placeholder {
+                @media screen and (max-width: 1200px) {
+                    display: none;
+                }
+            }
+        }
+
+        .el-form-item {
+            margin-bottom: 0;
+
+            &.full-width {
+                width: 100%;
+            }
+        }
+    }
+
+    :deep(.el-form-item__label) {
+        font-weight: normal;
+        color: #606266;
+        padding-bottom: 8px;
+        line-height: 20px;
+    }
+
+    :deep(.el-form-item__content) {
+        line-height: unset;
+    }
+
+    :deep(.el-input__inner) {
+        border-radius: 4px;
+        height: 36px;
+        line-height: 36px;
+    }
+
+    :deep(.el-textarea__inner) {
+        border-radius: 4px;
+        padding: 8px 12px;
+        min-height: 120px;
+    }
+}
+
+.batch-add-dialog {
+    :deep(.el-dialog__header) {
+        margin: 0;
+        padding: 20px;
+        text-align: center;
+        border-bottom: 1px solid #EBEEF5;
+
+        .el-dialog__title {
+            font-size: 16px;
+            font-weight: 600;
+            color: #303133;
+        }
+    }
+
+    :deep(.el-dialog__body) {
+        padding: 20px;
+    }
+
+    .dialog-content {
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+    }
+
+    .batch-form {
+        width: 100%;
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+
+        :deep(.el-form-item) {
+            width: 320px;
+            margin-bottom: 0;
+        }
+
+        :deep(.el-form-item__label) {
+            width: 100%;
+            color: #606266;
+            font-weight: normal;
+            padding-bottom: 8px;
+
+            &::before {
+                color: #F56C6C;
+            }
+        }
+
+        :deep(.el-input) {
+            width: 100%;
+
+            input {
+                width: 100%;
+            }
+        }
+    }
+
+    .dialog-notice {
+        margin-top: 16px;
+        text-align: center;
+
+        p {
+            margin: 0;
+            line-height: 22px;
+            color: #606266;
+            font-size: 14px;
+        }
+    }
+
+    :deep(.el-dialog__footer) {
+        padding: 0 20px 20px;
+        text-align: center;
+
+        .el-button {
+            width: 180px;
+            height: 36px;
+            padding: 0;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            font-size: 14px;
+            border-radius: 4px;
+            margin: 0;
+        }
+    }
+}
+
+.end-btn {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    gap: 10px;
+
+    :deep(.el-button) {
+        width: 180px;
+        height: 36px;
+        padding: 0;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        font-size: 14px;
+        border-radius: 4px;
+        margin: 0;
+    }
+}
+</style>
\ No newline at end of file

--
Gitblit v1.7.1