pyt
2025-04-10 9251aa2b02fa8bbad8cfba74d3b2d7ddf485a117
Merge branch 'main' of http://120.76.84.145:10101/gitblit/r/H5/leshan-laboratory
3个文件已修改
1个文件已添加
759 ■■■■ 已修改文件
src/components/SignatureCanvas.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dataManagement/sampleManage/addSample.vue 379 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dataManagement/sampleManage/components/confirmDialog.vue 363 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dataManagement/sampleManage/components/sampleDialog.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/SignatureCanvas.vue
@@ -5,6 +5,7 @@
    :width="dialogWidth"
    :close-on-click-modal="false"
    custom-class="signature-dialog"
    append-to-body
    @close="$emit('update:visible', false)"
  >
    <div class="signature-container">
src/views/dataManagement/sampleManage/addSample.vue
@@ -32,6 +32,7 @@
      <span>基础信息</span>
    </div>
    <el-form
      v-if="!isExperimenter"
      ref="form"
      :model="form"
      :rules="rules"
@@ -39,63 +40,144 @@
      label-position="top"
    >
      <el-form-item label="取样单编号" prop="sampleCode">
        <el-input
          v-model="form.sampleCode"
        <el-input
          v-model="form.sampleCode"
          :disabled="!isExperimenter"
          :placeholder="isExperimenter ? '请输入取样单编号' : '自动生成'"
          :placeholder="isExperimenter ? '请输入取样单编号' : '自动生成'"
        />
      </el-form-item>
    </el-form>
    <div v-else class="number">取样单编号:213421241</div>
    <div class="header-title-left" style="margin-top: 38px">
      <img src="@/assets/public/headercard.png" />
      <span>取样操作记录</span>
      <el-button
      <el-button
        v-if="isEngineer"
        type="primary"
        class="el-icon-plus"
        type="primary"
        class="el-icon-plus"
        @click="showAddTime = true"
      >
      >
        新增工艺时间
      </el-button>
      <el-button
        type="primary"
      <el-button
        type="primary"
        class="el-icon-plus"
        @click="showAdditives = !showAdditives"
      >
        {{ showAdditives ? '收起辅料详情' : '展开辅料详情' }}
      >
        {{ showAdditives ? "收起辅料详情" : "展开辅料详情" }}
      </el-button>
    </div>
    <Table :data="sampleData" :total="sampleTotal" :height="null">
      <template>
        <el-table-column prop="index" label="序号" width="80"></el-table-column>
        <el-table-column prop="processTime" label="工艺时间" width="150"></el-table-column>
        <el-table-column prop="sampleName" label="取样名称" width="150"></el-table-column>
        <el-table-column prop="sampleCode" label="取样样品编号" width="150"></el-table-column>
        <el-table-column prop="temperature" label="温度" width="150"></el-table-column>
        <el-table-column
          prop="processTime"
          label="工艺时间"
          width="150"
        ></el-table-column>
        <el-table-column
          prop="sampleName"
          label="取样名称"
          width="150"
        ></el-table-column>
        <el-table-column
          prop="sampleCode"
          label="取样样品编号"
          width="150"
        ></el-table-column>
        <el-table-column
          prop="temperature"
          label="温度"
          width="150"
        ></el-table-column>
        <el-table-column prop="ph" label="PH" width="150"></el-table-column>
        <el-table-column prop="waterAmount" label="加水量" width="150"></el-table-column>
        <el-table-column
          prop="waterAmount"
          label="加水量"
          width="150"
        ></el-table-column>
        <template v-if="showAdditives">
          <el-table-column prop="additive1" label="加辅1" width="150" ></el-table-column>
          <el-table-column prop="additive2" label="加辅2" width="150"></el-table-column>
          <el-table-column prop="additive3" label="加辅3" width="150"></el-table-column>
          <el-table-column prop="additive4" label="加辅4" width="150"></el-table-column>
          <el-table-column prop="additive5" label="加辅5" width="150"></el-table-column>
          <el-table-column prop="additive6" label="加辅6" width="150"></el-table-column>
          <el-table-column prop="additive7" label="加辅7" width="150"></el-table-column>
          <el-table-column prop="additive8" label="加辅8" width="150"></el-table-column>
          <el-table-column prop="additive9" label="加辅9" width="150"></el-table-column>
          <el-table-column prop="additive10" label="加辅10" width="150"></el-table-column>
          <el-table-column
            prop="additive1"
            label="加辅1"
            width="150"
          ></el-table-column>
          <el-table-column
            prop="additive2"
            label="加辅2"
            width="150"
          ></el-table-column>
          <el-table-column
            prop="additive3"
            label="加辅3"
            width="150"
          ></el-table-column>
          <el-table-column
            prop="additive4"
            label="加辅4"
            width="150"
          ></el-table-column>
          <el-table-column
            prop="additive5"
            label="加辅5"
            width="150"
          ></el-table-column>
          <el-table-column
            prop="additive6"
            label="加辅6"
            width="150"
          ></el-table-column>
          <el-table-column
            prop="additive7"
            label="加辅7"
            width="150"
          ></el-table-column>
          <el-table-column
            prop="additive8"
            label="加辅8"
            width="150"
          ></el-table-column>
          <el-table-column
            prop="additive9"
            label="加辅9"
            width="150"
          ></el-table-column>
          <el-table-column
            prop="additive10"
            label="加辅10"
            width="150"
          ></el-table-column>
        </template>
        <el-table-column prop="sampleAmount" label="取样量" width="150"></el-table-column>
        <el-table-column prop="sampleTime" label="取样时间" width="150"></el-table-column>
        <el-table-column prop="remark" label="拍照" width="150"></el-table-column>
        <el-table-column prop="operator" label="操作人员" width="150"></el-table-column>
        <el-table-column v-if="isExperimenter" fixed="right" label="操作" width="150">
        <el-table-column
          prop="sampleAmount"
          label="取样量"
          width="150"
        ></el-table-column>
        <el-table-column
          prop="sampleTime"
          label="取样时间"
          width="150"
        ></el-table-column>
        <el-table-column
          prop="remark"
          label="拍照"
          width="150"
        ></el-table-column>
        <el-table-column
          prop="operator"
          label="操作人员"
          width="150"
        ></el-table-column>
        <el-table-column
          v-if="isExperimenter"
          fixed="right"
          label="操作"
          width="150"
        >
          <template slot-scope="scope">
            <el-button
               type="text"
              @click="handleEdit(scope.$index, scope.row)"
            >编辑</el-button>
            <el-button type="text" @click="handleEdit(scope.$index, scope.row)"
              >编辑</el-button
            >
          </template>
        </el-table-column>
      </template>
@@ -113,7 +195,7 @@
      </el-form>
    </div>
    <div class="add-project-footer">
      <el-button type="primary" class="save-btn">保存</el-button>
      <el-button type="primary" class="save-btn" @click="handleSave">保存</el-button>
      <el-button>存草稿</el-button>
    </div>
    <experimentalScheduling :show="showScheduling" />
@@ -123,6 +205,12 @@
      :data="currentSampleData"
      @submit="handleSampleSubmit"
    />
    <confirm-dialog
      :visible.sync="showConfirmDialog"
      :form-data="form"
      :sample-data="sampleData"
      @confirm="handleConfirm"
    />
  </Card>
</template>
@@ -130,13 +218,15 @@
import experimentalScheduling from "./components/experimental-scheduling.vue";
import addTime from "./components/addTime.vue";
import SampleDialog from "./components/sampleDialog.vue";
import ConfirmDialog from './components/confirmDialog.vue';
export default {
  name: "AddConfirmationSheet",
  components: {
    experimentalScheduling,
    addTime,
    SampleDialog
    SampleDialog,
    ConfirmDialog,
  },
  props: {},
  data() {
@@ -145,6 +235,7 @@
      showAddTime: false,
      showAdditives: true,
      showSampleDialog: false,
      showConfirmDialog: false,
      currentSampleData: {},
      currentEditIndex: -1,
      schedulingData: [], // 实验调度表格数据
@@ -152,63 +243,63 @@
      sampleData: [
        {
          index: 1,
          processTime: '2h',
          sampleName: '样品A',
          sampleCode: 'SP001',
          temperature: '25℃',
          ph: '7.0',
          waterAmount: '500ml',
          additive1: '10g',
          additive2: '5g',
          additive3: '3g',
          additive4: '',
          additive5: '',
          additive6: '',
          additive7: '',
          additive8: '',
          additive9: '',
          additive10: '',
          sampleAmount: '100ml',
          sampleTime: '2024-03-20 10:00:00',
          remark: '',
          operator: '张三'
          processTime: "2h",
          sampleName: "样品A",
          sampleCode: "SP001",
          temperature: "25℃",
          ph: "7.0",
          waterAmount: "500ml",
          additive1: "10g",
          additive2: "5g",
          additive3: "3g",
          additive4: "",
          additive5: "",
          additive6: "",
          additive7: "",
          additive8: "",
          additive9: "",
          additive10: "",
          sampleAmount: "100ml",
          sampleTime: "2024-03-20 10:00:00",
          remark: "",
          operator: "张三",
        },
        {
          index: 2,
          processTime: '4min',
          sampleName: '样品B',
          sampleCode: 'SP002',
          temperature: '30℃',
          ph: '6.5',
          waterAmount: '300ml',
          additive1: '8g',
          additive2: '4g',
          additive3: '',
          additive4: '',
          additive5: '',
          additive6: '',
          additive7: '',
          additive8: '',
          additive9: '',
          additive10: '',
          sampleAmount: '50ml',
          sampleTime: '2024-03-20 10:30:00',
          remark: '',
          operator: '李四'
        }
          processTime: "4min",
          sampleName: "样品B",
          sampleCode: "SP002",
          temperature: "30℃",
          ph: "6.5",
          waterAmount: "300ml",
          additive1: "8g",
          additive2: "4g",
          additive3: "",
          additive4: "",
          additive5: "",
          additive6: "",
          additive7: "",
          additive8: "",
          additive9: "",
          additive10: "",
          sampleAmount: "50ml",
          sampleTime: "2024-03-20 10:30:00",
          remark: "",
          operator: "李四",
        },
      ],
      sampleTotal: 2,
      form: {
        sampleCode: '',
        remark: '',
        sampleCode: "",
        remark: "",
      },
      rules: {
        sampleCode: [
          { required: true, message: '请输入取样单编号', trigger: 'blur' }
          { required: true, message: "请输入取样单编号", trigger: "blur" },
        ],
      },
      menu: [],
      userRole: 'experimenter', // 用户角色,可以是 'engineer' 或 'experimenter'
      userRole: "experimenter", // 用户角色,可以是 'engineer' 或 'experimenter'
    };
  },
  computed: {
@@ -216,11 +307,11 @@
      return this.$baseTableHeight();
    },
    isEngineer() {
      return this.userRole === 'engineer';
      return this.userRole === "engineer";
    },
    isExperimenter() {
      return this.userRole === 'experimenter';
    }
      return this.userRole === "experimenter";
    },
  },
  watch: {},
  created() {},
@@ -367,53 +458,71 @@
        // 更新表格数据
        this.$set(this.sampleData, this.currentEditIndex, {
          ...this.sampleData[this.currentEditIndex],
          ...formData
          ...formData,
        });
        this.currentEditIndex = -1;
      }
      this.showSampleDialog = false;
    },
    handleDelete(index, row) {
      this.$confirm('确认删除该记录吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.sampleData.splice(index, 1);
        // 重新计算序号
        this.sampleData.forEach((item, i) => {
          item.index = i + 1;
        });
        this.$message.success('删除成功');
      }).catch(() => {});
      this.$confirm("确认删除该记录吗?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          this.sampleData.splice(index, 1);
          // 重新计算序号
          this.sampleData.forEach((item, i) => {
            item.index = i + 1;
          });
          this.$message.success("删除成功");
        })
        .catch(() => {});
    },
    handleAddTime(processTime) {
      if (!this.isEngineer) return;
      const newRow = {
        index: this.sampleData.length + 1,
        processTime,
        sampleName: '',
        sampleCode: '',
        temperature: '',
        ph: '',
        waterAmount: '',
        additive1: '',
        additive2: '',
        additive3: '',
        additive4: '',
        additive5: '',
        additive6: '',
        additive7: '',
        additive8: '',
        additive9: '',
        additive10: '',
        sampleAmount: '',
        sampleTime: '',
        remark: '',
        operator: ''
        sampleName: "",
        sampleCode: "",
        temperature: "",
        ph: "",
        waterAmount: "",
        additive1: "",
        additive2: "",
        additive3: "",
        additive4: "",
        additive5: "",
        additive6: "",
        additive7: "",
        additive8: "",
        additive9: "",
        additive10: "",
        sampleAmount: "",
        sampleTime: "",
        remark: "",
        operator: "",
      };
      this.sampleData.push(newRow);
      this.$message.success('添加工艺时间成功');
      this.$message.success("添加工艺时间成功");
    },
    handleSave() {
      if (this.isExperimenter) {
        this.showConfirmDialog = true;
      } else {
        this.submitForm();
      }
    },
    handleConfirm(signature) {
      this.submitForm(signature);
    },
    submitForm(signature = null) {
      // 在这里实现表单提交逻辑
      console.log('提交表单数据', { signature });
      this.$message.success('保存成功');
      this.showConfirmDialog = false;
    },
  },
};
@@ -461,6 +570,12 @@
.el-checkbox {
  display: flex;
  align-items: center;
}
.number{
font-family: PingFangSC, PingFang SC;
font-weight: 400;
font-size: 14px;
color: rgba(0,0,0,0.88);
}
.row,
@@ -576,13 +691,37 @@
.remark-section {
  margin-top: 20px;
  .el-form-item {
    width: 100%;
    .el-textarea {
      width: 100%;
    }
  }
}
.signature-section {
  margin-top: 26px;
}
.add-group {
  padding-left: 25px;
  margin-top: 14px;
  display: flex;
  align-items: center;
  margin-bottom: 19px;
  div {
    color: #f56c6c;
  }
  span {
    font-weight: 500;
    font-size: 14px;
    color: #222222;
    line-height: 21px;
    margin: 0 32px 0 8px;
  }
}
</style>
src/views/dataManagement/sampleManage/components/confirmDialog.vue
New file
@@ -0,0 +1,363 @@
<template>
  <el-dialog
    title="提交确认"
    :visible.sync="visible"
    width="80%"
    :close-on-click-modal="false"
    @close="handleClose"
  >
    <div class="approval-dialog">
      <div class="approval-content">
        <Card class="approval-content-card">
          <template>
            <div class="sample-info">
              <div class="info-item">
                <span class="label">项目课题方案名称:</span>
                <span class="value">{{ formData.planName }}</span>
              </div>
              <div class="info-item">
                <span class="label">申请项目执行方案编号:</span>
                <span class="value">{{ formData.planName }}</span>
              </div>
              <div class="info-item">
                <span class="label">实验编号:</span>
                <span class="value">{{ formData.testCode }}</span>
              </div>
              <div class="info-item">
                <span class="label">实验名称:</span>
                <span class="value">{{ formData.testName }}</span>
              </div>
              <div class="info-item">
                <span class="label">取样单编号:</span>
                <span class="value">{{ formData.sampleCode }}</span>
              </div>
            </div>
            <div class="header-title" >
              <div class="header-title-left">
                <el-button
                  type="primary"
                  class="el-icon-plus"
                  @click="showAdditives = !showAdditives"
                >
                  {{ showAdditives ? "收起辅料详情" : "展开辅料详情" }}
                </el-button>
              </div>
            </div>
            <Table :data="sampleData" :total="0" :height="null">
              <template>
                <el-table-column
                  prop="index"
                  label="序号"
                  width="80"
                ></el-table-column>
                <el-table-column
                  prop="processTime"
                  label="工艺时间"
                  width="150"
                ></el-table-column>
                <el-table-column
                  prop="sampleName"
                  label="取样名称"
                  width="150"
                ></el-table-column>
                <el-table-column
                  prop="sampleCode"
                  label="取样样品编号"
                  width="150"
                ></el-table-column>
                <el-table-column
                  prop="temperature"
                  label="温度"
                  width="150"
                ></el-table-column>
                <el-table-column
                  prop="ph"
                  label="PH"
                  width="150"
                ></el-table-column>
                <el-table-column
                  prop="waterAmount"
                  label="加水量"
                  width="150"
                ></el-table-column>
                <template v-if="showAdditives">
                  <el-table-column
                    prop="additive1"
                    label="加辅1"
                    width="150"
                  ></el-table-column>
                  <el-table-column
                    prop="additive2"
                    label="加辅2"
                    width="150"
                  ></el-table-column>
                  <el-table-column
                    prop="additive3"
                    label="加辅3"
                    width="150"
                  ></el-table-column>
                  <el-table-column
                    prop="additive4"
                    label="加辅4"
                    width="150"
                  ></el-table-column>
                  <el-table-column
                    prop="additive5"
                    label="加辅5"
                    width="150"
                  ></el-table-column>
                  <el-table-column
                    prop="additive6"
                    label="加辅6"
                    width="150"
                  ></el-table-column>
                  <el-table-column
                    prop="additive7"
                    label="加辅7"
                    width="150"
                  ></el-table-column>
                  <el-table-column
                    prop="additive8"
                    label="加辅8"
                    width="150"
                  ></el-table-column>
                  <el-table-column
                    prop="additive9"
                    label="加辅9"
                    width="150"
                  ></el-table-column>
                  <el-table-column
                    prop="additive10"
                    label="加辅10"
                    width="150"
                  ></el-table-column>
                </template>
                <el-table-column
                  prop="sampleAmount"
                  label="取样量"
                  width="150"
                ></el-table-column>
                <el-table-column
                  prop="sampleTime"
                  label="取样时间"
                  width="150"
                ></el-table-column>
                <el-table-column
                  prop="remark"
                  label="拍照"
                  width="150"
                ></el-table-column>
                <el-table-column
                  prop="operator"
                  fixed="right"
                  label="操作人员"
                  width="150"
                ></el-table-column>
              </template>
            </Table>
          </template>
        </Card>
      </div>
    </div>
    <div class="approval-dialog-approve">
      <div class="add-group">
        <div>*</div>
        <span>签字确认</span>
        <el-button type="primary" class="el-icon-plus" @click="openSignature"
          >签名</el-button
        >
      </div>
      <img
        v-if="imgSrc"
        style="width: 200px; height: 100px; margin-left: 25px"
        :src="imgSrc"
        fit="fit"
      />
    </div>
    <div slot="footer" class="dialog-footer">
      <el-button @click="handleClose">取 消</el-button>
      <el-button type="primary" @click="handleConfirm" :disabled="!imgSrc"
        >确 认</el-button
      >
    </div>
    <SignatureCanvas
      :visible="signatureDialogVisible"
      @confirm="handleSignatureConfirm"
    />
  </el-dialog>
</template>
<script>
import SignatureCanvas from "@/components/SignatureCanvas.vue";
export default {
  name: "ConfirmDialog",
  components: {
    SignatureCanvas,
  },
  props: {
    visible: {
      type: Boolean,
      default: false,
    },
    formData: {
      type: Object,
      default: () => ({}),
    },
    sampleData: {
      type: Array,
      default: () => [],
    },
  },
  data() {
    return {
      signatureDialogVisible: false,
      imgSrc: "",
      showAdditives: true,
    };
  },
  methods: {
    handleClose() {
      this.$emit("update:visible", false);
      this.imgSrc = "";
    },
    openSignature() {
      this.signatureDialogVisible = true;
    },
    handleSignatureConfirm(imageData) {
      this.signatureDialogVisible = false;
      this.imgSrc = imageData;
    },
    handleConfirm() {
      if (!this.imgSrc) {
        this.$message.warning("请先完成签名确认");
        return;
      }
      this.$emit("confirm", this.imgSrc);
      this.handleClose();
    },
  },
};
</script>
<style lang="less" scoped>
::v-deep .el-dialog__header {
  border-bottom: 1px solid #e4e7ed;
}
.approval-dialog {
  display: flex;
  max-height: 60vh;
  overflow-y: auto;
  .approval-content {
    width: 100%;
    flex: 1;
    background: #ffffff;
    box-shadow: 0px 4px 12px 4px rgba(0, 0, 0, 0.08);
    border-radius: 10px;
  }
}
.approval-content-card {
  box-shadow: none !important;
  padding-top: 0px !important;
  padding-bottom: 0px !important;
  height: calc(100% - 10px) !important;
  // overflow: unset !important;
}
.header-title {
  display: flex;
  align-items: center;
  gap: 13px;
  margin-bottom: 20px;
  .header-title-left {
    display: flex;
    align-items: center;
    gap: 13px;
    img {
      width: 12px;
      height: 19px;
    }
    span {
      flex-shrink: 0;
      font-weight: bold;
      font-size: 18px;
      color: #222222;
      line-height: 27px;
      font-family: "Source Han Sans CN Bold Bold";
    }
  }
}
.sample-info {
  padding: 0 25px;
  margin-bottom: 20px;
  display: flex;
  flex-wrap: wrap;
  gap: 15px;
  .info-item {
    width: calc(50% - 7.5px);
    display: flex;
    align-items: center;
    .label {
      color: #606266;
      margin-right: 10px;
      white-space: nowrap;
    }
    .value {
      color: #303133;
      font-weight: 500;
    }
  }
}
.approval-dialog-approve {
  margin-top: 26px;
  img {
    border: 2px dashed #049c9a;
  }
}
.add-group {
  padding-left: 25px;
  margin-top: 14px;
  display: flex;
  align-items: center;
  margin-bottom: 19px;
  div {
    color: #f56c6c;
  }
  span {
    font-weight: 500;
    font-size: 14px;
    color: #222222;
    line-height: 21px;
    margin: 0 32px 0 8px;
  }
}
.dialog-footer {
  align-items: center;
  display: flex;
  justify-content: center;
  button {
    width: 150px;
  }
}
</style>
src/views/dataManagement/sampleManage/components/sampleDialog.vue
@@ -1,6 +1,6 @@
<template>
  <el-dialog
    title="取样样品"
    title="编辑取样样品"
    :visible.sync="visible"
    width="60%"
    :close-on-click-modal="false"
@@ -41,7 +41,7 @@
            </el-row>
            <el-row :gutter="20">
              <el-col :span="8">
              <el-col :span="7.5">
                <el-form-item label="温度" prop="temperature">
                  <el-input
                    v-model="form.temperature"
@@ -49,7 +49,7 @@
                  />
                </el-form-item>
              </el-col>
              <el-col :span="8">
              <el-col :span="7.5">
                <el-form-item label="PH" prop="ph">
                  <el-input
                    v-model="form.ph"
@@ -57,7 +57,7 @@
                  />
                </el-form-item>
              </el-col>
              <el-col :span="8">
              <el-col :span="7.5">
                <el-form-item label="加水量" prop="waterAmount">
                  <el-input
                    v-model="form.waterAmount"
@@ -225,10 +225,10 @@
</script>
<style scoped lang="less">
::v-deep .el-dialog__header {
  border-bottom: 1px solid #e4e7ed;
  padding: 15px 20px;
}
// ::v-deep .el-dialog__header {
//   border-bottom: 1px solid #e4e7ed;
//   padding: 15px 20px;
// }
::v-deep .el-dialog__body {
  padding: 0;