hejianhao
2025-04-11 8bd728b4557fdb128ea10c29110a6a177fe189b4
Merge branch 'main' of http://120.76.84.145:10101/gitblit/r/H5/leshan-laboratory
1个文件已修改
3个文件已添加
793 ■■■■■ 已修改文件
src/router/index.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dataManagement/SampleDeliveryRecord/components/receiveConfirmDialog.vue 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dataManagement/SampleDeliveryRecord/deliveryRecord.vue 440 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dataManagement/SampleDeliveryRecord/list.vue 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js
@@ -244,7 +244,24 @@
                ]
            },
            {
                path: "deliveryRecord",
                meta: {
                    title: "取样送样记录",
                    keepAlive: true,
                },
                component: () => import("../views/dataManagement/SampleDeliveryRecord/list.vue"),
            },
            {
                path: "delivery",
                name: "delivery",
                meta: {
                    title: "送样详情",
                    hide: true,
                    keepAlive: true,
                },
                component: () => import("../views/dataManagement/SampleDeliveryRecord/deliveryRecord"),
            },
        ],
    },
    {
src/views/dataManagement/SampleDeliveryRecord/components/receiveConfirmDialog.vue
New file
@@ -0,0 +1,149 @@
<template>
  <el-dialog
    title="发送签字确认"
    :visible.sync="visible"
    width="500px"
    :close-on-click-modal="false"
    @close="handleClose"
  >
    <div class="receive-dialog">
      <div class="receive-tip">
        您已选中 <span class="sample-count">{{ sampleCount }}</span> 条样品发送,请签字确认
      </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>
    <div slot="footer" class="dialog-footer select-member-footer">
      <el-button @click="handleClose">取 消</el-button>
      <el-button type="primary" @click="handleConfirm" :disabled="!imgSrc">
        确认发送
      </el-button>
    </div>
    <SignatureCanvas
      :visible="signatureDialogVisible"
      @confirm="handleSignatureConfirm"
      @close="signatureDialogVisible = false"
    />
  </el-dialog>
</template>
<script>
import SignatureCanvas from "@/components/SignatureCanvas.vue";
export default {
  name: "ReceiveConfirmDialog",
  components: {
    SignatureCanvas,
  },
  props: {
    visible: {
      type: Boolean,
      default: false,
    },
    sampleCount: {
      type: Number,
      default: 1,
    },
  },
  data() {
    return {
      signatureDialogVisible: false,
      imgSrc: "",
    };
  },
  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;
}
.receive-dialog {
  padding: 20px;
  .receive-tip {
    font-size: 14px;
    color: #333;
    margin-bottom: 20px;
    .sample-count {
      color: #409EFF;
      font-weight: bold;
    }
  }
}
.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/SampleDeliveryRecord/deliveryRecord.vue
New file
@@ -0,0 +1,440 @@
<template>
  <Card>
    <div class="header-title-left">
      <img src="@/assets/public/headercard.png" />
      <div>所属实验调度</div>
    </div>
    <Table :data="schedulingData" :total="schedulingTotal" :height="null">
      <template>
        <el-table-column
          prop="planCode"
          label="所属项目课题方案"
        ></el-table-column>
        <el-table-column
          prop="experimentCode"
          label="实验编号"
        ></el-table-column>
        <el-table-column
          prop="experimentName"
          label="实验名称"
        ></el-table-column>
        <el-table-column prop="notifyTime" label="通知时间"></el-table-column>
        <el-table-column
          prop="startTime"
          label="实验开始时间"
        ></el-table-column>
        <el-table-column prop="endTime" label="实验结束时间"></el-table-column>
        <el-table-column prop="participants" label="参加人员"></el-table-column>
        <el-table-column prop="status" label="状态"></el-table-column>
      </template>
    </Table>
    <!-- 送样-收样记录部分 -->
    <div class="sample-record-section">
      <div class="header-title-left" style="margin-top: 38px">
        <img src="@/assets/public/headercard.png" />
        <span>送样-收样记录</span>
        <el-button
          type="primary"
          class="el-icon-plus"
          @click="showAdditives = !showAdditives"
        >
          {{ showAdditives ? "收起辅料详情" : "展开辅料详情" }}
        </el-button>
      </div>
      <div class="sample-code">
        取样单编号:{{ form.sampleCode || "DD-25010BS01" }}
      </div>
      <div class="sample-code">待收样列表</div>
      <div class="sample-table">
        <Table
          :data="sampleList"
          :total="sampleTotal"
          :height="null"
          style="width: 100%"
        >
          <template>
            <el-table-column
              prop="index"
              label="序号"
              width="80"
            ></el-table-column>
            <el-table-column
              prop="processTime"
              label="工艺时间间/h"
              width="120"
            ></el-table-column>
            <el-table-column
              prop="sampleName"
              label="取样名称"
              min-width="150"
            ></el-table-column>
            <el-table-column
              prop="sampleCode"
              label="取样样品编号"
              min-width="150"
            ></el-table-column>
            <el-table-column
              prop="temperature"
              label="温度"
              width="100"
            ></el-table-column>
            <el-table-column prop="ph" label="PH" width="100"></el-table-column>
            <el-table-column
              prop="waterAmount"
              label="加水量"
              width="100"
            ></el-table-column>
            <template v-if="showAdditives">
              <el-table-column
                prop="additive1"
                label="加辅1"
                min-width="150"
              ></el-table-column>
              <el-table-column
                prop="additive2"
                label="加辅2"
                min-width="150"
              ></el-table-column>
              <el-table-column
                prop="additive3"
                label="加辅3"
                min-width="150"
              ></el-table-column>
              <el-table-column
                prop="additive4"
                label="加辅4"
                min-width="150"
              ></el-table-column>
              <el-table-column
                prop="additive5"
                label="加辅5"
                min-width="150"
              ></el-table-column>
              <el-table-column
                prop="additive6"
                label="加辅6"
                min-width="150"
              ></el-table-column>
              <el-table-column
                prop="additive7"
                label="加辅7"
                min-width="150"
              ></el-table-column>
              <el-table-column
                prop="additive8"
                label="加辅8"
                min-width="150"
              ></el-table-column>
              <el-table-column
                prop="additive9"
                label="加辅9"
                min-width="150"
              ></el-table-column>
              <el-table-column
                prop="additive10"
                label="加辅10"
                min-width="150"
              ></el-table-column>
            </template>
            <el-table-column
              prop="sampleAmount"
              label="取样量"
              width="100"
            ></el-table-column>
            <el-table-column
              prop="sampleTime"
              label="取样时间"
              min-width="150"
            ></el-table-column>
            <el-table-column prop="photo" label="拍照" width="100">
              <template slot-scope="scope">
                <img
                  v-if="scope.row.photo"
                  :src="scope.row.photo"
                  class="sample-photo"
                />
              </template>
            </el-table-column>
            <el-table-column
              prop="operator"
              label="操作人"
              width="100"
            ></el-table-column>
            <el-table-column
              prop="status"
              label="状态"
              width="100"
            ></el-table-column>
          </template>
        </Table>
      </div>
      <div class="received-samples">
        <div style="display: flex; align-items: center">
          <div class="sample-code">已收样列表</div>
          <el-button
            type="primary"
            class="el-icon-plus"
            style="margin-left: 16px"
            @click="showReceivedColumns = !showReceivedColumns"
          >
            {{ showReceivedColumns ? "收起辅料详情" : "展开辅料详情" }}
          </el-button>
        </div>
        <Table
          :data="receivedSamples"
          :total="receivedSamplesTotal"
          :height="null"
          style="width: 100%"
        >
          <template>
            <el-table-column
              prop="index"
              label="序号"
              width="80"
            ></el-table-column>
            <el-table-column
              prop="sampleName"
              label="取样名称"
              min-width="150"
            ></el-table-column>
            <el-table-column
              prop="sampleCode"
              label="取样样品编号"
              min-width="150"
            ></el-table-column>
            <el-table-column
              prop="temperature"
              label="温度"
              width="100"
            ></el-table-column>
            <el-table-column
              prop="waterAmount"
              label="加水量"
              width="100"
            ></el-table-column>
            <el-table-column prop="ph" label="PH" width="100"></el-table-column>
            <template v-if="showReceivedColumns">
              <el-table-column
                prop="additive1"
                label="加辅1"
                min-width="150"
              ></el-table-column>
              <el-table-column
                prop="additive2"
                label="加辅2"
                min-width="150"
              ></el-table-column>
              <el-table-column
                prop="additive3"
                label="加辅3"
                min-width="150"
              ></el-table-column>
              <el-table-column
                prop="additive4"
                label="加辅4"
                min-width="150"
              ></el-table-column>
              <el-table-column
                prop="additive5"
                label="加辅5"
                min-width="150"
              ></el-table-column>
            </template>
            <el-table-column
              prop="sampleAmount"
              label="取样量"
              width="100"
            ></el-table-column>
            <el-table-column
              prop="sendTime"
              label="送样时间"
              min-width="150"
            ></el-table-column>
            <el-table-column
              prop="sender"
              label="送样人"
              width="100"
            ></el-table-column>
            <el-table-column
              prop="receiveTime"
              label="收样时间"
              min-width="150"
            ></el-table-column>
            <el-table-column
              prop="receiver"
              label="收样人"
              width="100"
            ></el-table-column>
            <el-table-column
              prop="status"
              label="状态"
              width="100"
              fixed="right"
            ></el-table-column>
          </template>
        </Table>
      </div>
    </div>
  </Card>
</template>
<script>
export default {
  name: "SampleSubmission",
  data() {
    return {
      showAdditives: true,
      showReceivedColumns: true,
      schedulingData: [
        {
          planCode: "DD-EX001",
          experimentCode: "DD-EX001",
          experimentName: "名称名称名称",
          notifyTime: "2025-1-2 14:50:19",
          startTime: "2025-02-27",
          endTime: "2025-06-06",
          participants: "张弘, 李天浩, 陈三, 李四",
          status: "已确认",
        },
      ],
      schedulingTotal: 1,
      form: {
        sampleCode: "DD-25010BS01",
      },
      sampleList: [
        {
          index: 1,
          processTime: "2",
          sampleName: "名称名称名称",
          sampleCode: "314234321",
          temperature: "34",
          ph: "34",
          waterAmount: "34",
          additive1: "10g",
          additive2: "5g",
          additive3: "3g",
          additive4: "",
          additive5: "",
          additive6: "",
          additive7: "",
          additive8: "",
          additive9: "",
          additive10: "",
          sampleAmount: "34",
          sampleTime: "2025-1-9 15:26:08",
          photo: "@/assets/sample-photos/photo1.jpg",
          operator: "张三",
          status: "待发送",
        },
        {
          index: 2,
          processTime: "4",
          sampleName: "名称名称名称",
          sampleCode: "314234321",
          temperature: "23",
          ph: "23",
          waterAmount: "23",
          additive1: "8g",
          additive2: "4g",
          additive3: "",
          additive4: "",
          additive5: "",
          additive6: "",
          additive7: "",
          additive8: "",
          additive9: "",
          additive10: "",
          sampleAmount: "23",
          sampleTime: "2025-1-9 15:26:08",
          photo: "@/assets/sample-photos/photo2.jpg",
          operator: "李四",
          status: "待接收",
        },
        {
          index: 3,
          processTime: "8",
          sampleName: "名称名称名称",
          sampleCode: "314234321",
          temperature: "23",
          ph: "23",
          waterAmount: "23",
          additive1: "",
          additive2: "",
          additive3: "",
          additive4: "",
          additive5: "",
          additive6: "",
          additive7: "",
          additive8: "",
          additive9: "",
          additive10: "",
          sampleAmount: "23",
          sampleTime: "2025-1-9 15:26:08",
          photo: "@/assets/sample-photos/photo3.jpg",
          operator: "王五",
          status: "已接收",
        },
      ],
      sampleTotal: 3,
    };
  },
};
</script>
<style lang="less" scoped>
.header-title-left {
  display: flex;
  align-items: center;
  gap: 13px;
  margin-bottom: 20px;
  img {
    width: 12px;
    height: 19px;
  }
  div,
  span {
    flex-shrink: 0;
    font-weight: bold;
    font-size: 18px;
    color: #222222;
    line-height: 27px;
    font-family: "Source Han Sans CN Bold Bold";
  }
  div:before {
    content: "*";
    color: #f56c6c;
    margin-right: 4px;
  }
  .el-button {
    margin-left: 16px;
  }
}
.sample-record-section {
  .sample-code {
    font-family: PingFangSC, PingFang SC;
    font-weight: 400;
    font-size: 14px;
    color: rgba(0, 0, 0, 0.88);
    margin: 20px 0;
  }
  .table-header {
    margin-bottom: 16px;
    text-align: left;
  }
  .sample-photo {
    width: 60px;
    height: 60px;
    object-fit: cover;
  }
}
</style>
src/views/dataManagement/SampleDeliveryRecord/list.vue
New file
@@ -0,0 +1,185 @@
<template>
  <div class="list">
    <TableCustom :queryForm="form" :tableData="tableData" :total="total">
      <template #search>
        <el-form :model="form" labelWidth="auto" inline>
          <el-form-item label="项目课题方案名称:">
            <el-input v-model="form.planName" placeholder="请输入"></el-input>
          </el-form-item>
          <el-form-item label="实验编号:">
            <el-input v-model="form.planCode" placeholder="请输入"></el-input>
          </el-form-item>
          <el-form-item label="创建人:">
            <el-input v-model="form.creator" placeholder="请输入"></el-input>
          </el-form-item>
          <el-form-item label="创建时间:">
            <el-date-picker
              v-model="form.createTime"
              type="daterange"
              range-separator="至"
              start-placeholder="开始日期"
              end-placeholder="结束日期"
              value-format="yyyy-MM-dd"
            ></el-date-picker>
          </el-form-item>
          <el-form-item label="实验名称:">
            <el-input v-model="form.planCode" placeholder="请输入"></el-input>
          </el-form-item>
          <el-form-item label="">
            <el-button type="default" @click="resetForm">重置</el-button>
            <el-button type="primary" @click="handleSearch">查询</el-button>
          </el-form-item>
        </el-form>
      </template>
      <template #setting>
        <div class="tableTitle">
          <div class="flex a-center">
            <div class="title">待接收样品列表</div>
          </div>
        </div>
      </template>
      <template #table>
        <el-table-column
          prop="planName"
          label="所属项目课题方案"
        ></el-table-column>
        <el-table-column prop="experimentNo" label="实验编号"></el-table-column>
        <el-table-column
          prop="experimentName"
          label="实验名称"
        ></el-table-column>
        <el-table-column prop="sampleNo" 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="sampleStatus"
          label="样品总数/待接收/已接收"
        ></el-table-column>
        <el-table-column label="操作" width="100">
          <template slot-scope="scope">
            <el-button type="text" @click="handleDetail(scope.row)"
              >详情</el-button
            >
          </template>
        </el-table-column>
      </template>
    </TableCustom>
  </div>
</template>
<script>
export default {
  name: "ProjectList",
  data() {
    return {
      form: {
        planName: "",
        planCode: "",
        creator: "",
        createTime: [],
        approver: "",
        status: "",
      },
      tableData: [],
      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",
        },
      ],
    };
  },
  created() {
    this.getTableData();
  },
  methods: {
    resetForm() {
      this.form = {
        planName: "",
        planCode: "",
        creator: "",
        createTime: [],
        approver: "",
        status: "",
      };
    },
    handleSearch() {
      // 实现查询逻辑
      console.log("查询条件:", this.form);
      this.getTableData();
    },
    handleDetail(row) {
      this.$router.push({
        path: "/dataManagement/delivery",
        query: {
          id: row.id,
          type: "view",
        },
      });
    },
    getTableData() {
      // 获取列表数据
      this.tableData = this.mockListData;
      this.total = this.mockListData.length;
    },
  },
};
</script>
<style scoped lang="less">
.list {
  height: 100%;
}
.flex {
  display: flex;
  align-items: center;
}
.tableTitle {
  display: flex;
  padding-bottom: 20px;
  justify-content: space-between;
  align-items: center;
  .title {
    background: #ffffff;
    border-radius: 8px 8px 0px 0px;
    border: 1px solid #049c9a;
    padding: 16px 29px;
    font-weight: bold;
    font-size: 18px;
    color: #049c9a;
    width: unset;
  }
}
</style>