董国庆
2025-06-25 d8d68a0aee93073b5ec3195368ca0ed1076f66a2
laboratory/src/views/deliveryAssessment/processEngineerEvaluate/index.vue
@@ -1,157 +1,294 @@
<template>
    <div class="list">
        <TableCustom :queryForm="queryForm" :tableData="tableData" :total="total" @currentChange="handleCurrentChange"
            @sizeChange="handleSizeChange">
            <template #search>
                <el-form :model="form" label-width="140px" inline>
                    <el-form-item label="所属项目课题方案:">
                        <el-input v-model="form.name" placeholder="请输入" />
                    </el-form-item>
                    <el-form-item label="实验编号:">
                        <el-input v-model="form.name" placeholder="请输入" />
                    </el-form-item>
                    <el-form-item label="创建日期:">
                        <el-input v-model="form.name" placeholder="请输入" />
                    </el-form-item>
                    <el-form-item label="状态:">
                        <el-select v-model="form.name" placeholder="请选择" />
                    </el-form-item>
                    <el-form-item class="search-btn-box">
                        <el-button>重置</el-button>
                        <el-button type="primary">查询</el-button>
                    </el-form-item>
                </el-form>
            </template>
            <template #setting>
                <div class="table-title">
                    实验结果汇报列表
                </div>
            </template>
            <template #table>
                <el-table-column prop="name" label="所属项目课题方案" />
                <el-table-column prop="age" label="实验编号" />
                <el-table-column prop="age" label="工艺工程师" />
                <el-table-column prop="age" label="化验师" />
                <el-table-column prop="age" label="实验员" />
                <el-table-column prop="age" label="创建日期" />
                <el-table-column prop="age" label="状态">
                    <template #default="{ row }">
                        <el-tag v-if="row.status == 1" type="info" color="#fff">已评定</el-tag>
                        <el-tag v-else type="success">待评定</el-tag>
                    </template>
                </el-table-column>
                <el-table-column prop="age" label="操作">
                    <template #default="{ row }">
                        <el-button type="text" @click="assessmentVisible = true">详情</el-button>
                    </template>
                </el-table-column>
            </template>
        </TableCustom>
    </div>
  <div class="list">
    <TableCustom
      :queryForm="queryForm"
      :tableData="tableData"
      :total="total"
      @currentChange="handleCurrentChange"
      @sizeChange="handleSizeChange"
    >
      <template #search>
        <el-form :model="form" label-width="140px" inline>
          <el-form-item label="所属项目课题方案:">
            <el-input v-model="form.projectName" placeholder="请输入" />
          </el-form-item>
          <el-form-item label="实验编号:">
            <el-input v-model="form.experimentCode" placeholder="请输入" />
          </el-form-item>
          <el-form-item label="实验名称:">
            <el-input v-model="form.experimentName" placeholder="请输入" />
          </el-form-item>
          <el-form-item label="创建日期:">
            <el-input v-model="form.createTime" placeholder="请输入" />
          </el-form-item>
          <el-form-item label="状态:">
            <el-select v-model="form.status" placeholder="请选择">
              <el-option label="全部" value=""></el-option>
              <el-option label="待提交" :value="1"></el-option>
              <el-option label="待评定" :value="2"></el-option>
              <el-option label="已评定" :value="3"></el-option>
              <el-option label="已封存" :value="4"></el-option>
            </el-select>
          </el-form-item>
          <el-form-item class="search-btn-box">
            <el-button @click="resetForm">重置</el-button>
            <el-button type="primary" @click="handleSearch">查询</el-button>
          </el-form-item>
        </el-form>
      </template>
      <template #setting>
        <div class="table-title">实验结果汇报列表</div>
      </template>
      <template #table>
        <el-table-column prop="projectName" label="所属项目课题方案" />
        <el-table-column prop="experimentCode" label="实验编号" />
        <el-table-column prop="experimentName" label="实验名称" />
        <el-table-column prop="processEngineerName" label="工艺工程师" />
        <el-table-column prop="laboratoryChemistName" label="化验师" />
        <el-table-column prop="experimenterName" label="实验员" />
        <el-table-column prop="createTime" label="创建日期" />
        <el-table-column prop="status" label="状态">
          <template slot-scope="scope">
            <el-tag :type="getStatusType(scope.row.status)">
              {{ getStatusText(scope.row.status) }}
            </el-tag>
          </template>
        </el-table-column>
        <el-table-column prop="operation" label="操作">
          <template #default="{ row }">
            <el-button type="text" @click="handleDetail(row)">详情</el-button>
            <el-button
              v-if="row.status === 2"
              type="text"
              @click="handleEvaluate(row)"
              >评定</el-button
            >
          </template>
        </el-table-column>
      </template>
    </TableCustom>
    <evaluation-dialog
      :modelValue="evaluationDialogVisible"
      :type="'processEngineer'"
      :viewJson="currentEvaluationData"
      @update:modelValue="updateEvaluationDialogVisible"
      @submit="handleEvaluationSubmit"
    />
  </div>
</template>
<script>
import EvaluationDialog from "./components/evaluation-dialog.vue";
import { evaluatePageList,evaluateProcess } from './service.js';
export default {
    name: 'ProcessEngineerEvaluate',
    data() {
        return {
            form: {
            },
            tableData: [],
            queryForm: {
                pageSize: 10,
                pageNum: 1
            },
            total: 0,
        }
  name: "ProcessEngineerEvaluate",
  components: {
    EvaluationDialog,
  },
  data() {
    return {
      form: {
        projectName: '',
        experimentCode: '',
        experimentName: '',
        createTime: '',
        status: '',
      },
      tableData: [],
      queryForm: {
        pageSize: 10,
        pageNum: 1,
      },
      total: 0,
      evaluationDialogVisible: false,
      currentEvaluationData: null,
    };
  },
  created() {
    this.getList();
  },
  methods: {
    handleCurrentChange(page) {
      this.queryForm.pageNum = page;
      this.getList();
    },
    methods: {
        handleCurrentChange(page) {
            this.queryForm.pageNum = page
            this.getList()
    handleSizeChange(size) {
      this.queryForm.pageSize = size;
      this.getList();
    },
    getList() {
      const params = {
        ...this.form,
        pageNum: this.queryForm.pageNum,
        pageSize: this.queryForm.pageSize,
      };
      evaluatePageList(params).then(res => {
        if (res && res.code === 200) {
          this.tableData = res.data.records || [];
          this.total = res.data.total || 0;
        } else {
          this.$message.error(res.msg || '获取数据失败');
        }
      }).catch(() => {
        this.$message.error('获取数据失败');
      });
    },
    handleDetail(row) {
      this.$router.push({
        path: "/dataManagement/testResultReport/detail",
        query: {
          id: row.id,
          type: "view",
        },
        handleSizeChange(size) {
            this.queryForm.pageSize = size
            this.getList()
        },
        getList() {
      });
    },
    handleEvaluate(row) {
      this.currentEvaluationData = row; // 可根据实际需要传递数据
      this.evaluationDialogVisible = true;
    },
    updateEvaluationDialogVisible(val) {
      this.evaluationDialogVisible = val;
      if (!val) this.currentEvaluationData = null;
    },
     // 处理评价提交
     handleEvaluationSubmit(evaluationData) {
      const { activeIndex } = evaluationData;
      // 将评分数据转换为后端需要的格式
      const evaluateData = {
        evaluateType: 1, // 1=工艺工程师
        evaluateOne: this.getEvaluateValue(activeIndex[0].score),
        evaluateTwo: this.getEvaluateValue(activeIndex[1].score),
        evaluateThree: this.getEvaluateValue(activeIndex[2].score),
        evaluateFour: this.getEvaluateValue(activeIndex[3].score),
        evaluateFive: this.getEvaluateValue(activeIndex[4].score),
        evaluateSix: this.getEvaluateValue(activeIndex[5].score),
        evaluateTime: moment().format('YYYY-MM-DD HH:mm:ss'),
        resultEvaluateJson: JSON.stringify(activeIndex),
        resultReportId: this.currentOperationRow.id,
        dispatchId: this.currentOperationRow.dispatchId,
        status: 1
      };
      console.log('evaluateData',evaluateData)
        },
        handleDetail(row) {
            // 处理详情
        },
    }
}
      evaluateProcess(evaluateData).then(res => {
        if (res.code == 200) {
          this.$message.success('评定成功');
          this.evaluationDialogVisible = false;
          this.getList(); // 重新获取列表数据
        } else {
          this.$message.error(res.msg || '评定失败');
        }
      }).catch(err => {
        this.$message.error('评定失败');
      });
    },
    resetForm() {
      this.form = {
        projectName: '',
        experimentCode: '',
        experimentName: '',
        createTime: '',
        status: '',
      };
      this.getList();
    },
    handleSearch() {
      this.getList();
    },
    getStatusType(status) {
      const statusMap = {
        '-1': 'info',
        '1': 'warning',
        '2': 'warning',
        '3': 'success',
        '4': 'info',
        '5': 'warning'
      };
      return statusMap[status] || 'info';
    },
    getStatusText(status) {
      const statusMap = {
        '-1': '草稿箱',
        '1': '待提交',
        '2': '待评定',
        '3': '已评定',
        '4': '已封存',
        '5': '已解封'
      };
      return statusMap[status] || '未知';
    },
  },
};
</script>
<style scoped lang="less">
.list {
    height: 100%;
  height: 100%;
}
.top-box-integral {
    display: flex;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 28px;
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 28px;
    &-card {
        flex: 1;
        background: #E8FAF6;
        box-shadow: 0px 10px 10px 0px rgba(0, 0, 0, 0.06);
        border-radius: 10px;
        padding: 21px 20px;
  &-card {
    flex: 1;
    background: #e8faf6;
    box-shadow: 0px 10px 10px 0px rgba(0, 0, 0, 0.06);
    border-radius: 10px;
    padding: 21px 20px;
        &-title {
            font-family: 'SourceHanSansCN-Medium';
            font-size: 14px;
            color: rgba(0, 0, 0, 0.8);
        }
        &-num {
            font-family: 'SF Compact Display Black';
            text-align: center;
            font-weight: 900;
            font-size: 50px;
            color: #049C9A;
            line-height: 60px;
        }
    &-title {
      font-family: "SourceHanSansCN-Medium";
      font-size: 14px;
      color: rgba(0, 0, 0, 0.8);
    }
    &-num {
      font-family: "SF Compact Display Black";
      text-align: center;
      font-weight: 900;
      font-size: 50px;
      color: #049c9a;
      line-height: 60px;
    }
  }
}
.tip-warring {
    margin-top: 20px;
    color: rgba(255, 73, 85, 1);
  margin-top: 20px;
  color: rgba(255, 73, 85, 1);
}
.table-title {
    width: 220px;
    height: 50px;
    background: #FFFFFF;
    border-radius: 8px 8px 0px 0px;
    border: 1px solid #049C9A;
    display: flex;
    align-items: center;
    justify-content: center;
    font-family: SourceHanSansCN, SourceHanSansCN;
    font-weight: bold;
    font-size: 18px;
    color: #049C9A;
    line-height: 27px;
  width: 220px;
  height: 50px;
  background: #ffffff;
  border-radius: 8px 8px 0px 0px;
  border: 1px solid #049c9a;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: SourceHanSansCN, SourceHanSansCN;
  font-weight: bold;
  font-size: 18px;
  color: #049c9a;
  line-height: 27px;
}
.expand-box {
    padding: 20px;
    background: linear-gradient(180deg, #049C9A 0%, #0ACBCA 100%);
    border-radius: 20px;
  padding: 20px;
  background: linear-gradient(180deg, #049c9a 0%, #0acbca 100%);
  border-radius: 20px;
    &-title {
        font-weight: 500;
        font-size: 16px;
        color: #FFFFFF;
        line-height: 24px;
        margin-bottom: 20px;
    }
  &-title {
    font-weight: 500;
    font-size: 16px;
    color: #ffffff;
    line-height: 24px;
    margin-bottom: 20px;
  }
}
</style>