From e950c38ba82e5e6bc8b0c50c35e5dbb6a180165a Mon Sep 17 00:00:00 2001
From: 13404089107 <puwei@sinata.cn>
Date: 星期二, 20 五月 2025 16:43:06 +0800
Subject: [PATCH] Merge branch 'main' of http://120.76.84.145:10101/gitblit/r/H5/leshan-laboratory

---
 culture/src/views/strain-library/breeding-record/SlantRecordDialog.vue |  196 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 196 insertions(+), 0 deletions(-)

diff --git a/culture/src/views/strain-library/breeding-record/SlantRecordDialog.vue b/culture/src/views/strain-library/breeding-record/SlantRecordDialog.vue
new file mode 100644
index 0000000..aa2a725
--- /dev/null
+++ b/culture/src/views/strain-library/breeding-record/SlantRecordDialog.vue
@@ -0,0 +1,196 @@
+<template>
+ <el-dialog :visible.sync="visible" title="新增培养皿观察记录" width="80%" @close="handleClose">
+    <el-form :model="form" :rules="rules" ref="formRef" label-width="120px" label-position="top">
+      <el-row :gutter="24">
+        <el-col :span="12">
+          <el-form-item label="分离菌落编号" prop="colonyNo" required>
+            <el-input v-model="form.colonyNo" placeholder="请输入分离菌落编号" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="形状强壮度排名" prop="rank" required>
+            <el-input v-model="form.rank" placeholder="请输入形状强壮度排名" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <el-table :data="tableData" border style="width: 100%; margin-bottom: 16px;">
+      <el-table-column prop="index" label="记录次数" width="90">
+        <template #default="{ row }">
+          第{{ row.index }}次
+        </template>
+      </el-table-column>
+      <el-table-column prop="desc" label="形态记录">
+        <template #default="{ row }">
+          <el-input v-model="row.desc" placeholder="请输入形态记录" style="width: 100%;" />
+        </template>
+      </el-table-column>
+      <el-table-column prop="images" label="拍照上传" width="120">
+        <template #default="{ row }">
+          <el-upload
+            :file-list="row.images"
+            list-type="picture-card"
+            :on-preview="file => handlePreview(row, file)"
+            :on-remove="(file, fileList) => handleRemove(row, file, fileList)"
+            :on-success="(res, file, fileList) => handleUpload(row, file, fileList)"
+            :before-upload="beforeUpload"
+            action="#"
+            :limit="5"
+            class="mini-upload"
+          >
+            <i class="el-icon-plus"></i>
+          </el-upload>
+        </template>
+      </el-table-column>
+      <el-table-column prop="time" label="记录时间" width="160">
+        <template #default="{ row }">
+          {{ row.time }}
+        </template>
+      </el-table-column>
+    </el-table>
+    <div style="text-align: center;">
+      <el-button type="primary" @click="handleOk">保存</el-button>
+    </div>
+    <el-dialog :visible.sync="previewVisible" width="400px">
+      <img :src="previewImg" alt="图片预览" style="width: 100%;" />
+    </el-dialog>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  name: 'SlantRecordDialog',
+  props: {
+    visible: Boolean,
+    value: {
+      type: Object,
+      default: () => ({ colonyNo: '', rank: '', records: [] })
+    }
+  },
+  data() {
+    return {
+      form: {
+        colonyNo: '',
+        rank: ''
+      },
+      rules: {
+        colonyNo: [{ required: true, message: '请输入分离菌落编号', trigger: 'blur' }],
+        rank: [{ required: true, message: '请输入形状强壮度排名', trigger: 'blur' }]
+      },
+      tableData: [],
+      previewVisible: false,
+      previewImg: ''
+    }
+  },
+  watch: {
+    value: {
+      immediate: true,
+      handler(val) {
+        this.form.colonyNo = val.colonyNo || ''
+        this.form.rank = val.rank || ''
+        this.tableData = (val.records && val.records.length === 10)
+          ? val.records.map((item, i) => ({ ...item, index: i + 1 }))
+          : Array.from({ length: 10 }, (_, i) => ({ index: i + 1, desc: '', images: [], time: this.getNowTime() }))
+      }
+    },
+    visible(val) {
+      if (!val) {
+        this.reset()
+      }
+    }
+  },
+  methods: {
+    getNowTime() {
+      const d = new Date()
+      return `${d.getFullYear()}-${d.getMonth() + 1}-${d.getDate()} ${d.getHours()}:${d.getMinutes()}:${d.getSeconds()}`
+    },
+    reset() {
+      this.form.colonyNo = ''
+      this.form.rank = ''
+      this.tableData = Array.from({ length: 10 }, (_, i) => ({ index: i + 1, desc: '', images: [], time: this.getNowTime() }))
+    },
+    handleOk() {
+      this.$refs.formRef.validate(valid => {
+        if (!valid) return
+        // 校验每行形态记录必填
+        for (let i = 0; i < this.tableData.length; i++) {
+          if (!this.tableData[i].desc) {
+            this.$message.error(`第${i + 1}次形态记录不能为空`)
+            return
+          }
+        }
+        this.$emit('ok', {
+          colonyNo: this.form.colonyNo,
+          rank: this.form.rank,
+          records: this.tableData
+        })
+        this.handleClose()
+      })
+    },
+    handleClose() {
+      this.$emit('update:visible', false)
+    },
+    beforeUpload(file) {
+      // 这里只做本地预览
+      return new Promise(resolve => {
+        const reader = new FileReader()
+        reader.onload = e => {
+          resolve()
+        }
+        reader.readAsDataURL(file)
+      })
+    },
+    handleUpload(row, file, fileList) {
+      // 这里只做本地预览
+      row.images = fileList.map(f => ({ ...f, url: f.url || URL.createObjectURL(f.raw) }))
+    },
+    handleRemove(row, file, fileList) {
+      row.images = fileList
+    },
+    handlePreview(row, file) {
+      this.previewImg = file.url
+      this.previewVisible = true
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+::v-deep(.el-upload--picture-card) {
+  width: 40px !important;
+  height: 40px !important;
+  line-height: 40px !important;
+}
+::v-deep(.mini-upload .el-upload-list--picture-card .el-upload-list__item) {
+  width: 40px !important;
+  height: 40px !important;
+}
+::v-deep(.mini-upload .el-upload-list--picture-card .el-upload-list__item-thumbnail) {
+  width: 40px !important;
+  height: 40px !important;
+  object-fit: cover;
+}
+::v-deep(.mini-upload .el-upload-list--picture-card .el-upload-list__item-preview),
+::v-deep(.mini-upload .el-upload-list--picture-card .el-upload-list__item-delete) {
+  width: 18px;
+  height: 18px;
+  font-size: 14px;
+}
+::v-deep(.el-upload--picture-card) {
+  width: 40px !important;
+  height: 40px !important;
+  line-height: 40px !important;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+::v-deep(.mini-upload .el-upload--picture-card i.el-icon-plus) {
+  font-size: 18px;      /* 缩小icon */
+  color: #999;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 100%;
+  height: 100%;
+}
+</style>

--
Gitblit v1.7.1