董国庆
2025-07-01 4ca375b2e3dae98d6ececc1b7b421a12f3fa8a26
修改bug,验收通过
23个文件已修改
500 ■■■■■ 已修改文件
laboratory/package.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/components/DynamicComponent/addTableData.vue 55 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/components/DynamicComponent/index.vue 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/router/index.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/utils/baseurl.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/utils/request.js 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/chemistQa/projectTesting/add.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/chemistQa/projectTesting/components/approval/index.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/inspectionReport/detail.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/sampleManage/components/experimental-scheduling.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/dataManagement/schemeManagement/addPlan.vue 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/deliveryAssessment/QA/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/deliveryAssessment/assayTaskList/components/AssessmentDialog.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/deliveryAssessment/assayTaskList/components/CraftDialog.vue 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/deliveryAssessment/chemistEvaluate/add.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/deliveryAssessment/clinicalTrial/components/detail.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/deliveryAssessment/processEngineerEvaluate/index.vue 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/deliveryAssessment/projectTeamIntegral/detail.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/deliveryAssessment/reportEvaluation/index.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/deliveryAssessment/testerWorkerEvaluate/add.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/login/service.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/middleground/index.vue 194 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/vue.config.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/package.json
@@ -3,7 +3,7 @@
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve:dev": "cross-env VUE_APP_ENV=development vue-cli-service serve --port 8090",
    "serve:dev": "cross-env VUE_APP_ENV=development vue-cli-service serve --port 11223",
    "serve:prod": "cross-env VUE_APP_ENV=production vue-cli-service serve",
    "build:dev": "cross-env VUE_APP_ENV=development vue-cli-service build",
    "build:prod": "cross-env VUE_APP_ENV=production vue-cli-service build",
laboratory/src/components/DynamicComponent/addTableData.vue
@@ -57,15 +57,16 @@
                    class="upload-demo"
                    :action="uploadUrl"
                    :headers="uploadHeaders"
                    :file-list="imageList"
                    :file-list="imageListMap[header.name] || []"
                    :auto-upload="true"
                    list-type="picture-card"
                    :beforeUpload="beforeImageUpload"
                    :on-change="handleImageChange"
                    :on-remove="handleImageRemove"
                    :on-success="handleImageSuccess"
                    :before-upload="beforeImageUpload"
                    :on-change="(file, fileList) => handleImageChange(file, fileList, header.name)"
                    :on-remove="(file, fileList) => handleImageRemove(file, fileList, header.name)"
                    :on-success="(res, file, fileList) => handleImageSuccess(res, file, fileList, header.name)"
                    :on-preview="handlePreview"
                    :disabled="!checkEditPermission(header)"
                    multiple
                  >
                    <div
                      style="
@@ -216,6 +217,7 @@
      uploadHeaders: {
        Authorization: sessionStorage.getItem("token") || "",
      },
      imageListMap: {},
    };
  },
  computed: {
@@ -318,6 +320,9 @@
        this.headerList.forEach((header) => {
          if (header.type === "user") {
            formData[header.name] = [];
          } else if (header.type === "image") {
            formData[header.name] = [];
            this.$set(this.imageListMap, header.name, []);
          } else {
            formData[header.name] = "";
          }
@@ -340,6 +345,9 @@
        this.headerList.forEach((header) => {
          if (header.type === "user") {
            formData[header.name] = data[header.name] || [];
          } else if (header.type === "image") {
            formData[header.name] = Array.isArray(data[header.name]) ? data[header.name] : (data[header.name] ? [data[header.name]] : []);
            this.$set(this.imageListMap, header.name, (formData[header.name] || []).map(url => ({ name: "image", url: getFullUrl(url), status: "success" })));
          } else {
            formData[header.name] = data[header.name] || "";
          }
@@ -440,34 +448,25 @@
      }
      return true;
    },
    handleImageChange(file, fileList) {
      this.imageList = fileList;
      const imageHeader = this.headerList.find((h) => h.type === "image");
      if (imageHeader) {
        this.$refs.form.validateField(imageHeader.name);
      }
    handleImageChange(file, fileList, fieldName) {
      this.$set(this.imageListMap, fieldName, fileList);
      // 校验
      this.$refs.form && this.$refs.form.validateField(fieldName);
    },
    handleImageSuccess(res, file, fileList) {
    handleImageSuccess(res, file, fileList, fieldName) {
      const url = res.msg;
      file.url = getFullUrl(url);
      const imageHeader = this.headerList.find((h) => h.type === "image");
      if (imageHeader) {
        this.$set(this.form, imageHeader.name, url);
        this.$refs.form.validateField(imageHeader.name);
      if (!Array.isArray(this.form[fieldName])) {
        this.$set(this.form, fieldName, []);
      }
      this.imageList = fileList.map((f) => {
        if (f.uid === file.uid) {
          return file;
        }
        return f;
      });
      // 只保留 fileList 中的 url
      this.$set(this.form, fieldName, fileList.map(f => f.url ? (f.url.startsWith('http') ? f.url : getFullUrl(f.url)) : ''));
      this.$set(this.imageListMap, fieldName, fileList);
      this.$refs.form && this.$refs.form.validateField(fieldName);
    },
    handleImageRemove(file, fileList) {
      const imageHeader = this.headerList.find((h) => h.type === "image");
      if (imageHeader) {
        this.$set(this.form, imageHeader.name, "");
      }
      this.imageList = fileList;
    handleImageRemove(file, fileList, fieldName) {
      this.$set(this.form, fieldName, fileList.map(f => f.url ? (f.url.startsWith('http') ? f.url : getFullUrl(f.url)) : ''));
      this.$set(this.imageListMap, fieldName, fileList);
    },
    handlePreview(file) {
      this.imagePreviewUrl = file.url;
laboratory/src/components/DynamicComponent/index.vue
@@ -34,10 +34,25 @@
                <template v-if="header.type === 'user'">
                  {{ getUserDisplayText(header.name, scope.row) }}
                </template>
                <!-- 图片类型显示 -->
                <!-- 图片类型显示,兼容数组和字符串 -->
                <template v-else-if="header.type === 'image'">
                  <el-image v-if="scope.row[header.name]" :preview-src-list="[getFullUrl(scope.row[header.name])]" :src="getFullUrl(scope.row[header.name])" alt="头像"
                    class="table-image" />
                  <template v-if="Array.isArray(scope.row[header.name])">
                    <el-image
                      v-for="(img, i) in scope.row[header.name]"
                      :key="i"
                      :src="getFullUrl(img)"
                      :preview-src-list="scope.row[header.name].map(getFullUrl)"
                      class="table-image"
                    />
                  </template>
                  <template v-else>
                    <el-image
                      v-if="scope.row[header.name]"
                      :src="getFullUrl(scope.row[header.name])"
                      :preview-src-list="[getFullUrl(scope.row[header.name])]"
                      class="table-image"
                    />
                  </template>
                </template>
                <!-- 其他类型 -->
                <template v-else>
laboratory/src/router/index.js
@@ -257,8 +257,8 @@
                            title: "样品管理",
                            keepAlive: true,
                            privilege:'sampleManage',
                            hide:JSON.parse(sessionStorage.getItem('userInfo'))&&JSON.parse(sessionStorage.getItem('userInfo')).roleType=='5'?true:false,
                            //   privilege:'sampleManage_manage'
                            // hide:JSON.parse(sessionStorage.getItem('userInfo'))&&JSON.parse(sessionStorage.getItem('userInfo')).roleType=='5'?true:false,
                              privilege:'sampleManage_manage'
                        },
                        component: () => import("../views/dataManagement/sampleManage/list.vue"),
                    },
@@ -856,7 +856,7 @@
    }
    if (to.meta && to.meta.privilege) {
        if (!flatMenus.includes(to.meta.privilege)) {
            next('/403') // 无权限跳转403
            next('/login') // 无权限跳转403
            return
        }
    }
laboratory/src/utils/baseurl.js
@@ -1,9 +1,9 @@
const apiConfig = {
    // 开发环境
    development: {
        baseURL: "http://192.168.110.34:8081",
        imgUrl: "http://192.168.110.34:8081/open/file/upload",
        showImgUrl:'http://192.168.110.34:11222/'
        baseURL: "/",
        imgUrl: "/open/file/upload",
        showImgUrl: '/',
    },
    // 生产环境
    production: {
laboratory/src/utils/request.js
@@ -4,7 +4,7 @@
import { encryptBySM4, decryptBySM4 } from './sm4'  // 添加decryptBySM4
const service = axios.create({
  // baseURL: apiConfig.baseURL,
  baseURL: apiConfig.baseURL,
  withCredentials: false, // 当跨域请求时发送cookie
  timeout: 30000, // request timeout
})
@@ -71,8 +71,8 @@
            type: 'warning',
            duration: 2000
          })
          sessionStorage.clear();
          window.location.replace('/');
          // sessionStorage.clear();
          // window.location.replace('/');
          return Promise.reject(res.data.data.data)
        }
        Message({
@@ -95,8 +95,8 @@
          type: 'warning',
          duration: 2000
        })
        sessionStorage.clear();
        window.location.replace('/');
        // sessionStorage.clear();
        // window.location.replace('/');
        return Promise.reject(res.data.data)
      }
      Message({
laboratory/src/views/chemistQa/projectTesting/add.vue
@@ -67,8 +67,8 @@
                        </template>
                    </el-table-column>
                    <el-table-column prop="developPerson" label="制订人" />
                    <el-table-column prop="developDate" label="制订日期" />
                    <el-table-column prop="auditPersonId" label="审批人" />
                    <el-table-column prop="createTime" label="制订日期" />
                    <el-table-column prop="auditPersonName" label="审批人" />
                    <el-table-column prop="auditTime" label="审批时间" />
                    <el-table-column prop="status" label="状态">
                        <template #default="{ row }">
laboratory/src/views/chemistQa/projectTesting/components/approval/index.vue
@@ -76,7 +76,7 @@
                </div>
            </div>
        </div>
        <div class="approval-dialog-approve" v-if="type === 'approve'">
        <div class="approval-dialog-approve" v-if="type == 'approve'">
            <el-row :span="24">
                <el-col :span="12">
                    <div class="status">
@@ -103,7 +103,7 @@
        </div>
        <div slot="footer" class="dialog-footer">
            <el-button @click="handleClose">取 消</el-button>
            <el-button type="primary" @click="handleApprove" v-if="type === 'approve'">确认</el-button>
            <el-button type="primary" @click="handleApprove" v-if="type == 'approve'">确认</el-button>
        </div>
    </el-dialog>
</template>
@@ -157,7 +157,7 @@
    },
    computed: {
        dialogTitle() {
            return this.type === "approve" ? "审核项目检测项、检验包" : "项目检测项、检验包详情";
            return this.type == "approve" ? "审核项目检测项、检验包" : "项目检测项、检验包详情";
        },
    },
    watch: {
@@ -219,9 +219,9 @@
                    if (res.status == 2 || res.status == 3) {
                        processData.push({
                            type:
                                res.status === 2
                                res.status == 2
                                    ? "primary"
                                    : res.status === 3
                                    : res.status == 3
                                        ? "danger"
                                        : "warning",
                            mode: "list",
@@ -229,9 +229,9 @@
                                {
                                    label: "审核结果:",
                                    value:
                                        res.status === 2
                                        res.status == 2
                                            ? "通过"
                                            : res.status === 3
                                            : res.status == 3
                                                ? "驳回"
                                                : "待审批",
                                },
@@ -277,7 +277,7 @@
            const params = {
                id: this.data.id,
                auditRemark: this.remark,
                auditStatus: this.status === '1' ? 2 : 3
                auditStatus: this.status == '1' ? 2 : 3
            };
            detailAuditReport(params).then(res => {
                if (res) {
laboratory/src/views/dataManagement/inspectionReport/detail.vue
@@ -36,7 +36,7 @@
          label="实验名称"
        ></el-table-column>
        <el-table-column
          prop="experimentDate"
          prop="createTime"
          label="通知时间"
        ></el-table-column>
        <el-table-column
laboratory/src/views/dataManagement/sampleManage/components/experimental-scheduling.vue
@@ -42,7 +42,7 @@
                    <el-table-column prop="projectName" 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="experimentDate" label="通知时间"></el-table-column>
                    <el-table-column prop="createTime" label="通知时间"></el-table-column>
                    <el-table-column prop="experimentStartTime" label="实验开始时间"></el-table-column>
                    <el-table-column prop="experimentEndTime" label="实验结束时间"></el-table-column>
                    <el-table-column prop="participantsName" label="参加人员"></el-table-column>
laboratory/src/views/dataManagement/schemeManagement/addPlan.vue
@@ -631,13 +631,11 @@
        this.$message.error("请选择实验调度");
        return false;
      }
      // 校验实验日期
      if (!this.form.experimentDate) {
        this.$message.error("请填写实验日期");
        return false;
      }
      // 校验参与人员
      if (
        !this.selectedParticipants ||
@@ -646,46 +644,67 @@
        this.$message.error("请选择参与人员");
        return false;
      }
      // 校验实验目的
      const purpose = this.$refs.purposeEditor.getContent();
      if (!purpose || purpose === "<p></p>" || purpose.trim() === "<p></p>") {
        this.$message.error("请填写实验目的");
        return false;
      }
      // 校验工艺参数及路线
      const process = this.$refs.processEditor.getContent();
      if (!process || process === "<p></p>" || process.trim() === "<p></p>") {
        this.$message.error("请填写工艺参数及路线");
        return false;
      }
      // 校验 DynamicComponent 里的表格
      function checkDynamicComponentTables(list, label) {
        if (!Array.isArray(list)) return true;
        for (const comp of list) {
          if (comp.type === 'customTable') {
            if (!comp.data || !Array.isArray(comp.data.headers) || comp.data.headers.length === 0) {
              this.$message.error(`${label}中有表格未添加表头`);
              return false;
            }
            if (!Array.isArray(comp.data.rows) || comp.data.rows.length === 0) {
              this.$message.error(`${label}中有表格未添加数据`);
              return false;
            }
          }
        }
        return true;
      }
      // 校验实验材料
      if (!this.form.experimentMaterial) {
        this.$message.error("请添加实验材料");
        return false;
      }
      if (!checkDynamicComponentTables.call(this, this.form.experimentMaterial, '实验材料')) {
        return false;
      }
      // 校验实验设备
      if (!this.form.experimentDevice) {
        this.$message.error("请添加实验设备");
        return false;
      }
      if (!checkDynamicComponentTables.call(this, this.form.experimentDevice, '实验设备')) {
        return false;
      }
      // 校验实验步骤记录
      if (!this.stepList || this.stepList.length === 0) {
        this.$message.error("请添加实验操作步骤");
        return false;
      }
      // 校验每个步骤是否都有内容
      const invalidStep = this.stepList.findIndex((step) => !step.content);
      if (invalidStep !== -1) {
        this.$message.error(`请完善第${invalidStep + 1}个步骤的内容`);
        return false;
      // 校验每个步骤是否都有内容及表格
      for (let i = 0; i < this.stepList.length; i++) {
        const step = this.stepList[i];
        if (!step.content) {
          this.$message.error(`请完善第${i + 1}个步骤的内容`);
          return false;
        }
        if (!checkDynamicComponentTables.call(this, step.content, `第${i + 1}个步骤`)) {
          return false;
        }
      }
      return true;
    },
    handleStopExperiment() {
laboratory/src/views/deliveryAssessment/QA/index.vue
@@ -60,7 +60,7 @@
        <el-table-column prop="reportTitle" label="报告名称" />
        <el-table-column prop="reportCode" label="报告编号" />
        <el-table-column prop="developPerson" label="制定人" />
        <el-table-column prop="developDate" label="制定日期" />
        <el-table-column prop="createTime" label="制定日期" />
        <el-table-column prop="evaluatePersonName" label="评定人" />
        <el-table-column prop="evaluateTime" label="评定时间" />
        <el-table-column prop="status" label="状态">
laboratory/src/views/deliveryAssessment/assayTaskList/components/AssessmentDialog.vue
@@ -156,7 +156,7 @@
        if (res) {
          this.evaluateInfo = { ...res };
          this.form.reportNo = res.reportCode || "";
          this.form.reportName = res.reportName || "";
          this.form.reportName = res.reportTitle || "";
          // 详情回显分数
          if (res.evaluateScore) {
            if (
laboratory/src/views/deliveryAssessment/assayTaskList/components/CraftDialog.vue
@@ -59,6 +59,7 @@
</template>
<script>
import {getDetailById} from '../service'
export default {
    name: 'CraftDialog',
    props: {
@@ -69,7 +70,11 @@
        reportData: {
            type: Object,
            default: () => { }
        }
        },id: {
      type: [String, Number],
      default: "",
    //   required: true,
    },
    },
    data() {
        return {
@@ -121,20 +126,45 @@
        modelValue: {
            handler(val) {
                this.dialogVisible = val;
                if (val && this.id) {
          this.fetchDetail();
        }
            },
            immediate: true
        },
        reportData: {
            handler(val) {
                if (val) {
                    this.form.reportNo = val.reportNo || '';
                    this.form.reportName = val.reportName || '';
                }
            },
            immediate: true
        }
        id(val) {
      if (this.modelValue && val) {
        this.fetchDetail();
      }
    },
    },
    methods: {
        async fetchDetail() {
      try {
        const res = await getDetailById({ id: this.id });
        if (res) {
          this.evaluateInfo = { ...res };
          this.form.reportNo = res.reportCode || "";
          this.form.reportName = res.reportTitle || "";
          // 详情回显分数
          if (res.evaluateScore) {
            if (
              this.type === "detail" &&
              typeof res.evaluateScore === "string"
            ) {
              const scoreArr = res.evaluateScore
                .split(",")
                .map((s) => Number(s));
              this.criteriaList.forEach((item, idx) => {
                item.score = scoreArr[idx] || 0;
              });
            }
          }
        }
      } catch (e) {
        this.$message && this.$message.error("获取详情失败");
      }
    },
        handleClose() {
            this.$emit('update:modelValue', false);
        },
laboratory/src/views/deliveryAssessment/chemistEvaluate/add.vue
@@ -250,12 +250,12 @@
      const activeIndex = evaluateTable.activeIndex;
      const evaluateData = {
        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),
        evaluateOne: activeIndex[0].score ?this.getEvaluateValue(activeIndex[0].score):0,
        evaluateTwo: activeIndex[1].score ?this.getEvaluateValue(activeIndex[1].score):0,
        evaluateThree: activeIndex[2].score ?this.getEvaluateValue(activeIndex[2].score):0,
        evaluateFour: activeIndex[3].score ?this.getEvaluateValue(activeIndex[3].score):0,
        evaluateFive: activeIndex[4].score ?this.getEvaluateValue(activeIndex[4].score):0,
        evaluateSix: activeIndex[5].score ?this.getEvaluateValue(activeIndex[5].score):0,
        evaluateTime: moment().format("YYYY-MM-DD HH:mm:ss"),
        resultEvaluateJson: JSON.stringify(activeIndex),
        dispatchId: this.tableData[0]?.id,
laboratory/src/views/deliveryAssessment/clinicalTrial/components/detail.vue
@@ -134,8 +134,10 @@
  },
  methods: {
    open() { 
        const teamRes = getDetailByUserId();
        this.projectTeamList = [{ ...teamRes }];
       getDetailByUserId().then(res=>{
          this.projectTeamList = [{ ...res }];
        });
    },
    async initForm() {
      this.isDetail = this.type === "detail";
laboratory/src/views/deliveryAssessment/processEngineerEvaluate/index.vue
@@ -58,7 +58,7 @@
          <template #default="{ row }">
            <el-button type="text" @click="handleDetail(row)">详情</el-button>
            <el-button
              v-if="row.status === 2"
              v-if="row.status === 2 && roleType!=3"
              type="text"
              @click="handleEvaluate(row)"
              >评定</el-button
@@ -80,6 +80,7 @@
<script>
import EvaluationDialog from "./components/evaluation-dialog.vue";
import { evaluatePageList,evaluateProcess } from './service.js';
import moment from "moment";
export default {
  name: "ProcessEngineerEvaluate",
@@ -100,6 +101,7 @@
        pageSize: 10,
        pageNum: 1,
      },
      roleType:'',
      total: 0,
      evaluationDialogVisible: false,
      currentEvaluationData: null,
@@ -107,6 +109,8 @@
  },
  created() {
    this.getList();
    const  userInfo= JSON.parse(sessionStorage.getItem('userInfo'));
    this.roleType=userInfo?.roleType;
  },
  methods: {
    handleCurrentChange(page) {
@@ -151,22 +155,32 @@
      this.evaluationDialogVisible = val;
      if (!val) this.currentEvaluationData = null;
    },
    getEvaluateValue(score) {
      // 2分 = 良好(1), 1分 = 正确(2), 0分 = 失误(3)
      const scoreMap = {
        2: 2, // 良好
        1: 1, // 正确
        0: 0, // 失误
        '-3':'-3'
      };
      return scoreMap[score] || 0; // 默认返回失误
    },
     // 处理评价提交
     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),
        evaluateOne:activeIndex[0].score? this.getEvaluateValue(activeIndex[0].score):0,
        evaluateTwo:activeIndex[1].score? this.getEvaluateValue(activeIndex[1].score):0,
        evaluateThree:activeIndex[2].score? this.getEvaluateValue(activeIndex[2].score):0,
        evaluateFour:activeIndex[3].score? this.getEvaluateValue(activeIndex[3].score):0,
        evaluateFive:activeIndex[4].score? this.getEvaluateValue(activeIndex[4].score):0,
        evaluateSix:activeIndex[5].score? this.getEvaluateValue(activeIndex[5].score):0,
        evaluateTime: moment().format('YYYY-MM-DD HH:mm:ss'),
        resultEvaluateJson: JSON.stringify(activeIndex),
        resultReportId: this.currentOperationRow.id,
        dispatchId: this.currentOperationRow.dispatchId,
        resultReportId: this.currentEvaluationData.id,
        dispatchId: this.currentEvaluationData.dispatchId,
        status: 1
      };
      evaluateProcess(evaluateData).then(res => {
laboratory/src/views/deliveryAssessment/projectTeamIntegral/detail.vue
@@ -77,8 +77,8 @@
                            </div>
                            <div v-if="item.startTime">{{item.startTime}}</div>
                            <div v-if="item.endTime">{{item.endTime}}</div>
                            <div >
                                <el-button  type="text" v-if="roleType == 1 || roleType == 2" @click.stop='toChange(item.url)'>{{item.url? '修改':''}}</el-button>
                            <div v-if="roleType == 1 || roleType == 2">
                                <el-button  type="text"  @click.stop='toChange(item.url)'>{{item.url? '修改':''}}</el-button>
                            </div>
                        </div>
                    </div>
laboratory/src/views/deliveryAssessment/reportEvaluation/index.vue
@@ -133,7 +133,7 @@
            <el-button
              type="text"
              @click="handleAssessment(row)"
              v-if="row.status == 2"
              v-if="row.status == 2 && roleType != 3"
              >评定</el-button
            >
          </template>
@@ -172,6 +172,7 @@
      assessmentVisible: false,
      currentId: null,
      dialogType: '',
      roleType:'',
      statistics: {
        totalCount: 0,
        toEvaluatedCount: 0,
@@ -233,6 +234,8 @@
  mounted() {
    this.getList();
    this.getStatistics();
    const userInfo=JSON.parse(sessionStorage.getItem('userInfo'));
    this.roleType=userInfo?.roleType;
  },
};
</script>
laboratory/src/views/deliveryAssessment/testerWorkerEvaluate/add.vue
@@ -263,12 +263,12 @@
      }
      const activeIndex = evaluateTable.activeIndex;
      const evaluateData = {
        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),
        evaluateOne:activeIndex[0].score? this.getEvaluateValue(activeIndex[0].score):0,
        evaluateTwo: activeIndex[1].score?this.getEvaluateValue(activeIndex[1].score):0,
        evaluateThree: activeIndex[2].score?this.getEvaluateValue(activeIndex[2].score):0,
        evaluateFour: activeIndex[3].score?this.getEvaluateValue(activeIndex[3].score):0,
        evaluateFive: activeIndex[4].score?this.getEvaluateValue(activeIndex[4].score):0,
        evaluateSix: activeIndex[5].score?this.getEvaluateValue(activeIndex[5].score):0,
        evaluateTime: moment().format("YYYY-MM-DD HH:mm:ss"),
        resultEvaluateJson: JSON.stringify(activeIndex),
        dispatchId: this.tableData[0]?.id,
laboratory/src/views/login/service.js
@@ -2,5 +2,5 @@
// 登录
export const loginReq = (data) => {
    return axios.post('/login', { ...data })
    return axios.post('/api/login', { ...data })
}
laboratory/src/views/middleground/index.vue
@@ -4,23 +4,36 @@
      <HeaderNav class="header-main" :logo="'true'" />
    </div>
    <div class="middleground" :class="{
      column: windowWidth < 1440,
      mobile: windowWidth < 800,
    }">
    <div
      class="middleground"
      :class="{
        column: windowWidth < 1440,
        mobile: windowWidth < 800,
      }"
    >
      <!-- 左侧模块区域 -->
      <div class="left-modules" :class="[
        currentModuleLayout,
        {
          'mobile-layout': windowWidth < 800,
        },
      ]">
        <div class="module-item" v-for="(item, index) in filteredModuleList" :key="index"
          @click="handleModuleClick(item)">
      <div
        class="left-modules"
        :class="[
          currentModuleLayout,
          {
            'mobile-layout': windowWidth < 800,
          },
        ]"
      >
        <div
          class="module-item"
          v-for="(item, index) in filteredModuleList"
          :key="index"
          @click="handleModuleClick(item)"
        >
          <div class="module-bg"></div>
          <div class="module-content">
            <div class="icon-wrapper">
              <div class="module-icon" :style="{ backgroundImage: `url(${item.icon})` }"></div>
              <div
                class="module-icon"
                :style="{ backgroundImage: `url(${item.icon})` }"
              ></div>
            </div>
            <div class="module-text">{{ item.text }}</div>
          </div>
@@ -40,20 +53,29 @@
          <div class="title">待办事项</div>
          <!-- 待办事项列表将放置在这里 -->
          <div class="todo-list">
            <div class="todo-item" v-for="(item,index) in list" :key="index" @click.stop="toDetail(item)">
            <div
              class="todo-item"
              v-for="(item, index) in list"
              :key="index"
              @click.stop="toDetail(item)"
            >
              <div class="todo-details">
                <div class="notice-card">
                  <div class="todo-icon"></div>
                  <div class="red-notice" v-if="item.isRead==0"></div>
                  <div class="red-notice" v-if="item.isRead == 0"></div>
                </div>
                <span class="todo-title" :title="item.content || ''">{{item.content||''}}</span>
                <span class="todo-title" :title="item.content || ''">{{
                  item.content || ""
                }}</span>
              </div>
              <div class="todo-meta">
                <div class="me"></div>
                <span class="todo-submitter">提交人: {{item.commitName||''}}</span>
                <span class="todo-submitter"
                  >提交人: {{ item.commitName || "" }}</span
                >
                <div class="time"></div>
                <span class="todo-submitter">{{item.commitTime||''}}</span>
                <span class="todo-submitter">{{ item.commitTime || "" }}</span>
              </div>
            </div>
          </div>
@@ -64,7 +86,7 @@
</template>
<script>
import { Calendar } from "ant-design-vue";
import { getList,read } from "./service";
import { getList, read } from "./service";
import HeaderNav from "../../layouts/components/HeaderNav.vue";
import zhCN from "ant-design-vue/lib/locale-provider/zh_CN";
// 引入 Element UI 的日历组件
@@ -88,7 +110,7 @@
      date: new Date(),
      viewWidth: "",
      scale: 1,
      list:[],
      list: [],
      // 审批人
      moduleList2: [
        {
@@ -102,7 +124,7 @@
          path: "/reportLibrary/feasibilityStudy",
        },
        {
          text: "化验师提交",
          text: "化验师QA专题报告",
          icon: require("../../assets/login/img7.png"),
          path: "/chemistQa/projectTesting",
        },
@@ -153,7 +175,7 @@
        //   path: "/reportLibrary/feasibilityStudy",
        // },
        {
          text: "化验师提交",
          text: "化验师QA专题报告",
          icon: require("../../assets/login/img7.png"),
          path: "/chemistQa/projectTesting",
        },
@@ -171,9 +193,9 @@
        //   path: "/projectList/list",
        // },
        {
          text: '评定模块',
          icon: require('../../assets/login/img4.png'),
          path: '/deliveryAssessment/projectTeamIntegral'
          text: "评定模块",
          icon: require("../../assets/login/img4.png"),
          path: "/deliveryAssessment/projectTeamIntegral",
        },
        // {
        //   text: "专业报告库",
@@ -185,7 +207,6 @@
        //   icon: require("../../assets/login/img3.png"),
        //   path: "/chemistQa/projectTesting",
        // },
      ],
      // 超级管理员
      moduleList6: [
@@ -226,10 +247,9 @@
  created() {
    // 初始化时检查窗口大小
    this.handleResize();
    getList().then(res=>{
      this.list = res
    })
    getList().then((res) => {
      this.list = res;
    });
  },
  mounted() {
    // 监听窗口大小变化
@@ -240,8 +260,7 @@
    window.removeEventListener("resize", this.handleResize);
  },
  methods: {
    onPanelChange(e) {
    },
    onPanelChange(e) {},
    // 添加处理窗口大小变化的方法
    handleResize() {
      this.windowWidth = window.innerWidth;
@@ -253,21 +272,87 @@
        });
      }
    },
    toDetail(item){
      read({id:item.id}).then(res=>{
        let urlList=['/dataManagement/approvalPlan','/dataManagement/suspendExperiment','/dataManagement/testResultReport'
          ,'/reportLibrary/feasibilityStudy','/deliveryAssessment/reportEvaluation','/dataManagement/confirmation-sheet',
          '/dataManagement/inspectionReport','/dataManagement/scheme-management','/chemistQa/projectTesting',
          '/deliveryAssessment/reportEvaluation','/dataManagement/dispatching','/dataManagement/confirmation-sheet',
          '/sampleManage/manage','/dataManagement/dispatching'
        ]
        let url=urlList[(item.noticeType *1) -1]
    toDetail(item) {
      read({ id: item.id }).then((res) => {
        if (item.noticeType == 4) {
          if (item.content.includes("可研")) {
            this.$router.push({
              path: "/reportLibrary/feasibilityStudy",
            });
          } else if (item.content.includes("可行")) {
            this.$router.push({
              path: "/reportLibrary/feasibilityReport",
            });
          } else if (item.content.includes("工艺开发")) {
            this.$router.push({
              path: "/reportLibrary/processDevelopment",
            });
          } else if (item.content.includes("验证与发布")) {
            this.$router.push({
              path: "/reportLibrary/verificationRelease",
            });
          } else if (item.content.includes("立项报告库")) {
            this.$router.push({
              path: "/reportLibrary/projectProposalLibrary",
            });
          }
          return;
        }
        if (item.noticeType == 9) {
          if (item.content.includes("项目检测项")) {
            this.$router.push({
              path: "/chemistQa/projectTesting",
            });
          } else if (item.content.includes("中试")) {
            this.$router.push({
              path: "/chemistQa/pilotAndProduction",
            });
          } else if (item.content.includes("辅料")) {
            this.$router.push({
              path: "/chemistQa/rawMaterials",
            });
          } else if (item.content.includes("产品报批")) {
            this.$router.push({
              path: "/chemistQa/productApproval",
            });
          }
          return;
        }
        if (item.noticeType == 10) {
          if (item.content.includes("项目检测项")) {
            this.$router.push({
              path: "/deliveryAssessment/testingAndEvaluation",
            });
          } else{
            this.$router.push({
              path: "/deliveryAssessment/assayTaskList",
            });
          }
          return;
        }
        let urlList = [
          "/dataManagement/approvalPlan",
          "/dataManagement/suspendExperiment",
          "/dataManagement/testResultReport",
          "/reportLibrary/feasibilityStudy",
          "/deliveryAssessment/reportEvaluation",
          "/dataManagement/confirmation-sheet",
          "/dataManagement/testResultReport",
          "/dataManagement/scheme-management",
          "/chemistQa/projectTesting",
          "/deliveryAssessment/reportEvaluation",
          "/dataManagement/dispatching",
          "/dataManagement/confirmation-sheet",
          "/sampleManage/manage",
          "/dataManagement/dispatching",
        ];
        let url = urlList[item.noticeType - 1];
        console.log("url url", url, "item.noticeType-1", item.noticeType - 1);
        this.$router.push({
          path: url,
        });
      })
    }
      });
    },
  },
  computed: {
    currentModuleList() {
@@ -492,9 +577,11 @@
        top: 0;
        width: 100%;
        height: 40px;
        background: linear-gradient(to bottom,
            rgba(255, 255, 255, 0.3) 0%,
            rgba(255, 255, 255, 0) 100%);
        background: linear-gradient(
          to bottom,
          rgba(255, 255, 255, 0.3) 0%,
          rgba(255, 255, 255, 0) 100%
        );
        backdrop-filter: blur(4px);
        -webkit-backdrop-filter: blur(4px);
        pointer-events: none;
@@ -508,9 +595,11 @@
        bottom: 0;
        width: 100%;
        height: 40px;
        background: linear-gradient(to bottom,
            rgba(255, 255, 255, 0) 0%,
            rgba(255, 255, 255, 0.8) 100%);
        background: linear-gradient(
          to bottom,
          rgba(255, 255, 255, 0) 0%,
          rgba(255, 255, 255, 0.8) 100%
        );
        backdrop-filter: blur(4px);
        -webkit-backdrop-filter: blur(4px);
        pointer-events: none;
@@ -922,7 +1011,8 @@
            }
            &.ant-fullcalendar-next-month-btn-day {
              .ant-fullcalendar-date {}
              .ant-fullcalendar-date {
              }
              .ant-fullcalendar-value {
                color: #ffffff !important;
@@ -1058,7 +1148,7 @@
          display: flex;
          align-items: center;
          justify-content: space-between;
          min-width:260px;
          min-width: 260px;
        }
        .time {
laboratory/vue.config.js
@@ -10,17 +10,17 @@
        disableHostCheck: true, //禁用主机检查 
        proxy: {
            "/api": { // 设置以什么前缀开头的请求用来代理
                target: "http://192.168.110.34:8081", //要访问的跨域的域名
                target: "http://221.182.45.100:11221", //要访问的跨域的域名
                secure: false, // 使用的是http协议则设置为false,https协议则设置为true
                changOrigin: true, //开启代理
                changeOrigin: true, //开启代理
                pathRewrite: {
                    "^/api": "/api",
                },
            },
            "/": { // 设置以什么前缀开头的请求用来代理
                target: "http://192.168.110.34:8081", //要访问的跨域的域名
                target: "http://221.182.45.100:11221", //要访问的跨域的域名
                secure: false, // 使用的是http协议则设置为false,https协议则设置为true
                changOrigin: true, //开启代理
                changeOrigin: true, //开启代理
                pathRewrite: {
                    "^/": "/",
                },