董国庆
2025-06-24 29357b29ab363dae9d9688da1b580479bd7334a7
化验师QA换真实上传
7个文件已添加
14个文件已修改
1268 ■■■■ 已修改文件
laboratory/src/views/chemistQa/pilotAndProduction/add.vue 260 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/chemistQa/pilotAndProduction/components/approval/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/chemistQa/pilotAndProduction/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/chemistQa/productApproval/add.vue 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/chemistQa/productApproval/components/approval/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/chemistQa/projectTesting/add.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/chemistQa/projectTesting/components/approval/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/chemistQa/projectTesting/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/chemistQa/rawMaterials/add.vue 286 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/chemistQa/rawMaterials/components/approval/index.vue 176 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/deliveryAssessment/assayTaskList/service.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/deliveryAssessment/clinicalTrial/service.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/deliveryAssessment/experimentResults/service.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/deliveryAssessment/projectTeamIntegral/index.vue 63 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/deliveryAssessment/projectTeamIntegral/service.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/deliveryAssessment/restsTask/components/detail.vue 137 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/deliveryAssessment/restsTask/index.vue 90 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/deliveryAssessment/restsTask/service.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/deliveryAssessment/testerWorkerEvaluate/service.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/deliveryAssessment/testingAndEvaluation/service.js 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/reportLibrary/verificationRelease/components/approval/index.vue 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/chemistQa/pilotAndProduction/add.vue
@@ -1,7 +1,7 @@
<template>
    <div class="add-container" :loading="loading">
        <Card v-loading="loading">
            <div class="header-title" style="width: 100%;">
      <div class="header-title" style="width: 100%">
                <div class="header-title-left">
                    <img src="@/assets/public/headercard.png" />
                    <div>所属项目组</div>
@@ -20,50 +20,42 @@
                </template>
            </Table>
            <el-form ref="form" :model="form" :rules="rules" inline label-position="top" style="margin-top: 18px">
                <el-row :gutter="20">
                    <el-col :span="24">
                        <el-form-item prop="reportTitle" label="报告标题">
                            <el-input v-model="form.reportTitle" style="width: 100%;" placeholder="请输入报告标题" />
              <el-input v-model="form.reportTitle" style="width: 100%" placeholder="请输入报告标题" />
                        </el-form-item>
                        <el-form-item prop="reportCode" label="报告编号" style="margin-left: 100px;">
                            <el-input v-model="form.reportCode" style="width: 100%;" placeholder="请输入报告编号" disabled />
            <el-form-item prop="reportCode" label="报告编号" style="margin-left: 100px">
              <el-input v-model="form.reportCode" style="width: 100%" placeholder="请输入报告编号" disabled />
                        </el-form-item>
                    </el-col>
                    <el-col :span="24">
                        <el-form-item prop="developPersonName" label="制定人">
                            <el-input v-model="form.developPersonName" style="width: 100%;" placeholder="请输入制定人" disabled />
              <el-input v-model="form.developPersonName" style="width: 100%" placeholder="请输入制定人" disabled />
                        </el-form-item>
                        <el-form-item prop="developDate" label="制定日期" style="margin-left: 100px;">
                            <el-date-picker :prefix-icon="null" v-model="form.developDate" type="date" disabled
                                placeholder="请选择日期" />
            <el-form-item prop="developDate" label="制定日期" style="margin-left: 100px">
              <el-date-picker :prefix-icon="null" v-model="form.developDate" type="date" disabled placeholder="请选择日期" />
                        </el-form-item>
                    </el-col>
                </el-row>
                <div class="header-title" style="width: 100%;">
        <div class="header-title" style="width: 100%">
                    <div class="header-title-left">
                        <img src="@/assets/public/headercard.png" />
                        <div>报告正文</div>
                    </div>
                </div>
                <el-form-item prop="reportText" style="margin-top: 18px">
                    <ai-editor ref="materialEditor" :value="form.reportText" style="width: 100%;"
                        placeholder="请输入报告正文" />
          <ai-editor ref="materialEditor" :value="form.reportText" style="width: 100%" placeholder="请输入报告正文" />
                </el-form-item>
                <div class="header-title" style="width: 100%;">
        <div class="header-title" style="width: 100%">
                    <div class="header-title-left">
                        <img src="@/assets/public/headercard.png" />
                        <div class="noRequire">附件</div>
                    </div>
                </div>
                <el-form-item prop="name" style="margin-top: 18px">
                    <el-upload
                        action="#"
                        :file-list="fileList"
                        :http-request="handleUpload"
                        :before-upload="beforeUpload"
          <el-upload action="#" :file-list="fileList" :http-request="handleUpload" :before-upload="beforeUpload"
                        :on-remove="handleRemove">
                        <el-button size="small" type="primary">点击上传</el-button>
                        <div slot="tip" class="el-upload__tip">支持任意格式文件上传</div>
@@ -81,15 +73,16 @@
</template>
<script>
import { Card } from 'element-ui';
import AiEditor from '@/components/AiEditor'
import chooseProject from '@/components/chooseProject'
import { addData, getDetail, editData } from './service'
import { Card } from "element-ui";
import AiEditor from "@/components/AiEditor";
import chooseProject from "@/components/chooseProject";
import { addData, getDetail, editData } from "./service";
import { customUploadRequest, getFullUrl } from '@/utils/utils'
export default {
    components: {
        AiEditor,
        chooseProject
    chooseProject,
    },
    data() {
        return {
@@ -112,86 +105,126 @@
            showChoose: false,
            rules: {
                reportTitle: [
                    { required: true, message: '请输入报告标题', trigger: 'blur' }
          { required: true, message: "请输入报告标题", trigger: "blur" },
                ],
            },
            queryForm: {}
        }
      queryForm: {},
    };
    },
    mounted() {
        console.log('JSON.parse(sessionStorage.getItem(',JSON.parse(sessionStorage.getItem('userInfo')))
        this.form.developPerson = JSON.parse(sessionStorage.getItem('userInfo')).nickName;
        this.form.developPersonName = JSON.parse(sessionStorage.getItem('userInfo')).nickName;
        this.form.commitPersonId= JSON.parse(sessionStorage.getItem('userInfo')).userId
        this.form.developDate = new Date().toISOString().split('T')[0];
    console.log(
      "JSON.parse(sessionStorage.getItem(",
      JSON.parse(sessionStorage.getItem("userInfo"))
    );
    this.form.developPerson = JSON.parse(
      sessionStorage.getItem("userInfo")
    ).nickName;
    this.form.developPersonName = JSON.parse(
      sessionStorage.getItem("userInfo")
    ).nickName;
    this.form.commitPersonId = JSON.parse(
      sessionStorage.getItem("userInfo")
    ).userId;
    this.form.developDate = new Date().toISOString().split("T")[0];
        
        if (this.$route.query.id) {
            this.getDetail()
      this.getDetail();
        }
    },
    methods: {
        getDetail() {
            getDetail(this.$route.query.id).then(res => {
                this.form = res
                this.tableData = [{ ...res.projectTeamVO,staffName:res.projectTeamVO.staffs.map(item=>item.nickName).join(',')}]
                this.fileList = res.fileList || []
            })
      getDetail(this.$route.query.id).then((res) => {
        this.form = res;
        this.tableData = [
          {
            ...res.projectTeamVO,
            staffName: res.projectTeamVO.staffs
              .map((item) => item.nickName)
              .join(","),
          },
        ];
        if (res.qaReportFileList && res.qaReportFileList.length > 0) {
          this.fileList = res.qaReportFileList.map(file => ({
            name: file.fileName,
            url: getFullUrl(file.fileUrl),
            uid: file.id
          }))
          this.form.qaReportFiles = res.qaReportFileList
        } else {
          this.fileList = []
          this.form.qaReportFiles = []
        }
      });
        },
        getProjectData(data) {
            this.tableData = [data]
            this.$forceUpdate()
            this.showChoose = false
      this.tableData = [data];
      this.$forceUpdate();
      this.showChoose = false;
        },
        submit() {
            if (this.tableData.length == 0) {
                this.$message.error('请选择项目组')
                return
        this.$message.error("请选择项目组");
        return;
            }
            this.$refs.form.validate((valid) => {
                if (this.$refs.materialEditor.getContent() == '<p></p>') {
                    this.$message.error('请输入报告正文')
                    return
        if (this.$refs.materialEditor.getContent() == "<p></p>") {
          this.$message.error("请输入报告正文");
          return;
                }
        // const prefix = apiConfig.showImgUrl;
                
                let data = {
                    ...this.form,
                    reportText: this.$refs.materialEditor.getContent(),
                    teamId: this.tableData[0].id,
                    status: 1, // 待审核状态
                    commitPersonId: JSON.parse(sessionStorage.getItem('userInfo')).userId
                }
          commitPersonId: JSON.parse(sessionStorage.getItem("userInfo")).userId,
          // qaReportFiles: this.form.qaReportFiles.map((file) => {
          //   if (file.fileUrl && file.fileUrl.startsWith(prefix)) {
          //     return {
          //       ...file,
          //       fileUrl: file.fileUrl.substring(prefix.length),
          //     };
          //   }
          //   return file;
          // }),
        };
                if (valid) {
                    this.loading = true
          this.loading = true;
                    if (this.$route.query.id) {
                        editData({ ...data, id: this.$route.query.id }).then(res => {
            editData({ ...data, id: this.$route.query.id })
              .then((res) => {
                            if (res.code === 200) {
                                this.$message.success('修改成功')
                                this.$router.back()
                  this.$message.success("修改成功");
                  this.$router.back();
                            } else {
                                this.$message.error(res.message)
                  this.$message.error(res.message);
                            }
                        }).finally(() => {
                            this.loading = false
                        })
              .finally(() => {
                this.loading = false;
              });
                    } else {
                        addData(data).then(res => {
            addData(data)
              .then((res) => {
                            if (res.code === 200) {
                                this.$message.success('发布成功')
                                this.$router.back()
                  this.$message.success("发布成功");
                  this.$router.back();
                            } else {
                                this.$message.error(res.message)
                            }
                        }).finally(() => {
                            this.loading = false
                        })
                    }
                  this.$message.error(res.message);
                }
            })
              .finally(() => {
                this.loading = false;
              });
          }
        }
      });
        },
        save() {
            this.$refs.form.validate((valid) => {
@@ -200,64 +233,105 @@
                    reportText: this.$refs.materialEditor.getContent(),
                    teamId: this.tableData[0].id,
                    status: -1, // 草稿箱状态
                    commitPersonId: JSON.parse(sessionStorage.getItem('userInfo')).userId
                }
console.log('data',data)
          commitPersonId: JSON.parse(sessionStorage.getItem("userInfo")).userId,
        };
        console.log('qaReportFiles qaReportFiles', this.form.qaReportFiles)
        // if (this.form.qaReportFiles && this.form.qaReportFiles.length > 0) {
        //   // const prefix = apiConfig.showImgUrl;
        //   console.log('0000000000000000')
        //   this.form = {
        //     ...this.form,
        //     qaReportFiles: this.form.qaReportFiles.map((file) => {
        //       if (file.fileUrl && file.fileUrl.startsWith(prefix)) {
        //         file.fileUrl = file.fileUrl.substring(prefix.length)
        //       }
        //       console.log('1111111111111', file)
        //       return file;
        //     }),
        //   };
        // }
        console.log("data", data);
                if (valid) {
                    this.loading = true
          this.loading = true;
                    if (this.$route.query.id) {
                        // 编辑草稿
                        editData({ ...data, id: this.$route.query.id }).then(res => {
            editData({ ...data, id: this.$route.query.id })
              .then((res) => {
                            if (res.code === 200) {
                                this.$message.success('草稿保存成功')
                                this.$router.back()
                  this.$message.success("草稿保存成功");
                  this.$router.back();
                            } else {
                                this.$message.error(res.message)
                  this.$message.error(res.message);
                            }
                        }).finally(() => {
                            this.loading = false
                        })
              .finally(() => {
                this.loading = false;
              });
                    } else {
                        // 新增草稿
                        addData(data).then(res => {
            addData(data)
              .then((res) => {
                            if (res.code === 200) {
                                this.$message.success('草稿保存成功')
                                this.$router.back()
                  this.$message.success("草稿保存成功");
                  this.$router.back();
                            } else {
                                this.$message.error(res.message)
                            }
                        }).finally(() => {
                            this.loading = false
                        })
                    }
                  this.$message.error(res.message);
                }
            })
              .finally(() => {
                this.loading = false;
              });
          }
        }
      });
        },
    // 上传前校验
        beforeUpload(file) {
            return true;
        },
    // 自定义上传处理
        handleUpload(options) {
            const file = options.file;
      const { file, onSuccess, onError } = options;
      // 使用封装的customUploadRequest方法
      customUploadRequest({
        file,
        onSuccess: (res) => {
          console.log()
          if (res.code === 200) {
            const fileObj = {
              id: new Date().getTime(),
              reportId: this.$route.query.id ? this.$route.query.id : '',
              fileUrl: res.msg || res.data || '',
              reportType: 2, // 可行性研究报告类型
                fileName: file.name,
                fileSize: file.size,
                createTime: new Date().toISOString(),
                createBy: '当前用户',
                reportType: 2,
                status: 1,
                id: Date.now().toString(),
                fileUrl: 'https://example.com/default-file-url'
            };
            
            // 添加到文件列表显示
            this.fileList.push({
                name: file.name,
                url: fileObj.fileUrl
              url: getFullUrl(fileObj.fileUrl),
              uid: fileObj.id
            });
            
            // 添加到表单数据
            this.form.qaReportFiles.push(fileObj);
            
            this.$message.success('文件上传成功');
            onSuccess(res);
          } else {
            this.$message.error(res.message || '文件上传失败');
            onError();
          }
        },
        onError: (err) => {
          this.$message.error('文件上传失败');
          onError(err);
        }
      });
    },
    // 删除文件
        handleRemove(file) {
            const index = this.fileList.findIndex(item => item.name === file.name);
            if (index !== -1) {
@@ -266,7 +340,7 @@
            }
        },
    },
}
};
</script>
<style lang="less" scoped>
laboratory/src/views/chemistQa/pilotAndProduction/components/approval/index.vue
@@ -62,9 +62,9 @@
                                    <span class="noRequire">附件</span>
                                </div>
                            </div>
                            <el-form-item prop="name" style="margin-top: 18px">
                            <el-form-item prop="name" style="margin-top: -18px">
                                <el-upload action="#" :file-list="fileList" disabled>
                                    <el-button size="small" type="primary" disabled>点击上传</el-button>
                                    <!-- <el-button size="small" type="primary" disabled>点击上传</el-button> -->
                                </el-upload>
                            </el-form-item>
                        </el-form>
laboratory/src/views/chemistQa/pilotAndProduction/index.vue
@@ -49,7 +49,7 @@
                <el-table-column prop="reportCode" label="报告编号" />
                <el-table-column prop="createBy" label="制定人" />
                <el-table-column prop="createTime" label="制定日期" />
                <el-table-column prop="status" label="状态">
                <el-table-column prop="status" label="状态" v-if="!isChemist">
                    <template #default="{ row }">
                        <el-tag :type="getStatusType(row.status)">
                            {{ getStatusText(row.status) }}
laboratory/src/views/chemistQa/productApproval/add.vue
@@ -57,11 +57,7 @@
                    </div>
                </div>
                <el-form-item prop="name" style="margin-top: 18px">
                    <el-upload
                        action="#"
                        :file-list="fileList"
                        :http-request="handleUpload"
                        :before-upload="beforeUpload"
                    <el-upload action="#" :file-list="fileList" :http-request="handleUpload" :before-upload="beforeUpload"
                        :on-remove="handleRemove">
                        <el-button size="small" type="primary">点击上传</el-button>
                        <div slot="tip" class="el-upload__tip">支持任意格式文件上传</div>
@@ -83,6 +79,7 @@
import AiEditor from '@/components/AiEditor'
import chooseProject from '@/components/chooseProject'
import { addData, getDetail, editData } from './service'
import { customUploadRequest, getFullUrl } from '@/utils/utils'
export default {
    components: {
@@ -133,7 +130,17 @@
            getDetail(this.$route.query.id).then(res => {
                this.form = res
                this.tableData = [{ ...res.projectTeamVO,staffName:res.projectTeamVO.staffs.map(item=>item.nickName).join(',')}]
                this.fileList = res.fileList || []
                if (res.qaReportFileList && res.qaReportFileList.length > 0) {
          this.fileList = res.qaReportFileList.map(file => ({
            name: file.fileName,
            url: getFullUrl(file.fileUrl),
            uid: file.id
          }))
          this.form.qaReportFiles = res.qaReportFileList
        } else {
          this.fileList = []
          this.form.qaReportFiles = []
        }
            })
        },
        getProjectData(data) {
@@ -229,31 +236,53 @@
                }
            })
        },
 // 上传前校验
        beforeUpload(file) {
            return true;
        },
    // 自定义上传处理
        handleUpload(options) {
            const file = options.file;
      const { file, onSuccess, onError } = options;
      // 使用封装的customUploadRequest方法
      customUploadRequest({
        file,
        onSuccess: (res) => {
          console.log()
          if (res.code === 200) {
            const fileObj = {
              id: new Date().getTime(),
              reportId: this.$route.query.id ? this.$route.query.id : '',
              fileUrl: res.msg || res.data || '',
              reportType: 4, // 可行性研究报告类型
                fileName: file.name,
                fileSize: file.size,
                createTime: new Date().toISOString(),
                createBy: '当前用户',
                reportType: 4,
                status: 1,
                id: Date.now().toString(),
                fileUrl: 'https://example.com/default-file-url'
            };
            
            // 添加到文件列表显示
            this.fileList.push({
                name: file.name,
                url: fileObj.fileUrl
              url: getFullUrl(fileObj.fileUrl),
              uid: fileObj.id
            });
            
            // 添加到表单数据
            this.form.qaReportFiles.push(fileObj);
            
            this.$message.success('文件上传成功');
            onSuccess(res);
          } else {
            this.$message.error(res.message || '文件上传失败');
            onError();
          }
        },
        onError: (err) => {
          this.$message.error('文件上传失败');
          onError(err);
        }
      });
    },
    // 删除文件
        handleRemove(file) {
            const index = this.fileList.findIndex(item => item.name === file.name);
            if (index !== -1) {
laboratory/src/views/chemistQa/productApproval/components/approval/index.vue
@@ -63,7 +63,7 @@
                            </div>
                            <el-form-item prop="name" style="margin-top: 18px">
                                <el-upload action="#" :file-list="fileList" disabled>
                                    <el-button size="small" type="primary" disabled>点击上传</el-button>
                                    <!-- <el-button size="small" type="primary" disabled>点击上传</el-button> -->
                                </el-upload>
                            </el-form-item>
                        </el-form>
laboratory/src/views/chemistQa/projectTesting/add.vue
@@ -177,7 +177,8 @@
                        }]
                    }
                    if(res.qaTestItemReportList.length > 0){
                        this.reportTableData = res.qaTestItemReportList
                        this.allReportTableData = res.qaTestItemReportList
                        this.reportTableData = res.qaTestItemReportList.filter(item => item.status != '-1')
                    }
                } else {
                    this.$message.error(res.msg || '获取详情失败')
@@ -249,7 +250,7 @@
        },
        handleTypeChange(type) {
            this.currentType = type;
            this.getReportList();
            this.getReportList(type);
        },
        handleReportRowClick(row, column, event) {
            if (column.label === '操作') return
@@ -269,9 +270,15 @@
                }
            })
        },
        getReportList() {
        getReportList(type) {
            // 获取报告列表数据
            // TODO: 调用接口获取数据
            if(type=='list'){
                this.reportTableData = this.allReportTableData.filter(item => item.status != '-1');
            }else{
                this.reportTableData = this.allReportTableData.filter(item => item.status == '-1');
            }
        },
        handleRevokeApproval(row) {
            this.currentRow = row;
laboratory/src/views/chemistQa/projectTesting/components/approval/index.vue
@@ -99,7 +99,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>
laboratory/src/views/chemistQa/projectTesting/index.vue
@@ -119,7 +119,7 @@
                    <el-table-column prop="createBy" label="创建人" />
                    <el-table-column prop="createTime" label="创建时间" />
                    <el-table-column prop="auditTime" label="审批时间" v-if="!isChemist" />
                    <el-table-column prop="age" label="状态" v-if="isApprovaler">
                    <el-table-column prop="age" label="状态" v-if="!isChemist">
                        <template #default="{ row }">
                           
                            <template v-if="isChemist">
laboratory/src/views/chemistQa/rawMaterials/add.vue
@@ -1,14 +1,19 @@
<template>
    <div class="add-container" :loading="loading">
        <Card v-loading="loading">
            <div class="header-title" style="width: 100%;">
      <div class="header-title" style="width: 100%">
                <div class="header-title-left">
                    <img src="@/assets/public/headercard.png" />
                    <div>所属项目组</div>
                </div>
                <div class="header-title-right">
                    <el-button @click="showChoose = true" class="el-icon-circle-plus-outline" type="primary">
                        选择项目组</el-button>
          <el-button
            @click="showChoose = true"
            class="el-icon-circle-plus-outline"
            type="primary"
          >
            选择项目组</el-button
          >
                </div>
            </div>
            <Table :height="null" :data="tableData" :queryForm="queryForm" :total="0">
@@ -19,38 +24,76 @@
                    <el-table-column prop="createTime" label="创建时间" />
                </template>
            </Table>
            <el-form ref="form" :model="form" :rules="rules" inline label-position="top" style="margin-top: 18px">
      <el-form
        ref="form"
        :model="form"
        :rules="rules"
        inline
        label-position="top"
        style="margin-top: 18px"
      >
                <el-row :gutter="20">
                    <el-col :span="24">
                        <el-form-item prop="reportTitle" label="报告标题">
                            <el-input v-model="form.reportTitle" style="width: 100%;" placeholder="请输入报告标题" />
              <el-input
                v-model="form.reportTitle"
                style="width: 100%"
                placeholder="请输入报告标题"
              />
                        </el-form-item>
                        <el-form-item prop="reportCode" label="报告编号" style="margin-left: 100px;">
                            <el-input v-model="form.reportCode" style="width: 100%;" placeholder="请输入报告编号" disabled />
            <el-form-item
              prop="reportCode"
              label="报告编号"
              style="margin-left: 100px"
            >
              <el-input
                v-model="form.reportCode"
                style="width: 100%"
                placeholder="请输入报告编号"
                disabled
              />
                        </el-form-item>
                    </el-col>
                    <el-col :span="24">
                        <el-form-item prop="developPersonName" label="制定人">
                            <el-input v-model="form.developPersonName" style="width: 100%;" placeholder="请输入制定人" disabled />
              <el-input
                v-model="form.developPersonName"
                style="width: 100%"
                placeholder="请输入制定人"
                disabled
              />
                        </el-form-item>
                        <el-form-item prop="developDate" label="制定日期" style="margin-left: 100px;">
                            <el-date-picker :prefix-icon="null" v-model="form.developDate" type="date" disabled
                                placeholder="请选择日期" />
            <el-form-item
              prop="developDate"
              label="制定日期"
              style="margin-left: 100px"
            >
              <el-date-picker
                :prefix-icon="null"
                v-model="form.developDate"
                type="date"
                disabled
                placeholder="请选择日期"
              />
                        </el-form-item>
                    </el-col>
                </el-row>
                <div class="header-title" style="width: 100%;">
        <div class="header-title" style="width: 100%">
                    <div class="header-title-left">
                        <img src="@/assets/public/headercard.png" />
                        <div>报告正文</div>
                    </div>
                </div>
                <el-form-item prop="reportText" style="margin-top: 18px">
                    <ai-editor ref="materialEditor" :value="form.reportText" style="width: 100%;"
                        placeholder="请输入报告正文" />
          <ai-editor
            ref="materialEditor"
            :value="form.reportText"
            style="width: 100%"
            placeholder="请输入报告正文"
          />
                </el-form-item>
                <div class="header-title" style="width: 100%;">
        <div class="header-title" style="width: 100%">
                    <div class="header-title-left">
                        <img src="@/assets/public/headercard.png" />
                        <div class="noRequire">附件</div>
@@ -62,32 +105,42 @@
                        :file-list="fileList"
                        :http-request="handleUpload"
                        :before-upload="beforeUpload"
                        :on-remove="handleRemove">
            :on-remove="handleRemove"
          >
                        <el-button size="small" type="primary">点击上传</el-button>
                        <div slot="tip" class="el-upload__tip">支持任意格式文件上传</div>
                    </el-upload>
                </el-form-item>
                <div class="end-btn" style="margin-top: 38px">
                    <el-button type="primary" @click="submit" :loading="loading">发送</el-button>
                    <el-button type="default" @click="save" :loading="loading">存草稿</el-button>
          <el-button type="primary" @click="submit" :loading="loading"
            >发送</el-button
          >
          <el-button type="default" @click="save" :loading="loading"
            >存草稿</el-button
          >
                </div>
            </el-form>
        </Card>
        <chooseProject @submit="getProjectData" :show="showChoose" @close="showChoose = false"></chooseProject>
    <chooseProject
      @submit="getProjectData"
      :show="showChoose"
      @close="showChoose = false"
    ></chooseProject>
    </div>
</template>
<script>
import { Card } from 'element-ui';
import AiEditor from '@/components/AiEditor'
import chooseProject from '@/components/chooseProject'
import { addData, getDetail, editData } from './service'
import { Card } from "element-ui";
import AiEditor from "@/components/AiEditor";
import chooseProject from "@/components/chooseProject";
import { addData, getDetail, editData } from "./service";
import { customUploadRequest, getFullUrl } from "@/utils/utils";
export default {
    components: {
        AiEditor,
        chooseProject
    chooseProject,
    },
    data() {
        return {
@@ -110,47 +163,70 @@
            showChoose: false,
            rules: {
                reportTitle: [
                    { required: true, message: '请输入报告标题', trigger: 'blur' }
          { required: true, message: "请输入报告标题", trigger: "blur" },
                ],
            },
            queryForm: {}
        }
      queryForm: {},
    };
    },
    mounted() {
        this.form.developPerson = JSON.parse(sessionStorage.getItem('userInfo')).nickName;
        this.form.developPersonName = JSON.parse(sessionStorage.getItem('userInfo')).nickName;
        this.form.commitPersonId = JSON.parse(sessionStorage.getItem('userInfo')).userId
        this.form.developDate = new Date().toISOString().split('T')[0];
    this.form.developPerson = JSON.parse(
      sessionStorage.getItem("userInfo")
    ).nickName;
    this.form.developPersonName = JSON.parse(
      sessionStorage.getItem("userInfo")
    ).nickName;
    this.form.commitPersonId = JSON.parse(
      sessionStorage.getItem("userInfo")
    ).userId;
    this.form.developDate = new Date().toISOString().split("T")[0];
        
        if (this.$route.query.id) {
            this.getDetail()
      this.getDetail();
        }
    },
    methods: {
        getDetail() {
            getDetail(this.$route.query.id).then(res => {
                this.form = res
                this.tableData = [{ ...res.projectTeamVO,staffName:res.projectTeamVO.staffs.map(item=>item.nickName).join(',')}]
                this.fileList = res.fileList || []
            })
      getDetail(this.$route.query.id).then((res) => {
        this.form = res;
        this.tableData = [
          {
            ...res.projectTeamVO,
            staffName: res.projectTeamVO.staffs
              .map((item) => item.nickName)
              .join(","),
          },
        ];
        if (res.qaReportFileList && res.qaReportFileList.length > 0) {
          this.fileList = res.qaReportFileList.map((file) => ({
            name: file.fileName,
            url: getFullUrl(file.fileUrl),
            uid: file.id,
          }));
          this.form.qaReportFiles = res.qaReportFileList;
        } else {
          this.fileList = [];
          this.form.qaReportFiles = [];
        }
      });
        },
        getProjectData(data) {
            this.tableData = [data]
            this.$forceUpdate()
            this.showChoose = false
      this.tableData = [data];
      this.$forceUpdate();
      this.showChoose = false;
        },
        submit() {
            if (this.tableData.length == 0) {
                this.$message.error('请选择项目组')
                return
        this.$message.error("请选择项目组");
        return;
            }
            this.$refs.form.validate((valid) => {
                if (this.$refs.materialEditor.getContent() == '<p></p>') {
                    this.$message.error('请输入报告正文')
                    return
        if (this.$refs.materialEditor.getContent() == "<p></p>") {
          this.$message.error("请输入报告正文");
          return;
                }
                
                let data = {
@@ -158,36 +234,40 @@
                    reportText: this.$refs.materialEditor.getContent(),
                    teamId: this.tableData[0].id,
                    status: 1, // 待审核状态
                    commitPersonId: JSON.parse(sessionStorage.getItem('userInfo')).userId
                }
          commitPersonId: JSON.parse(sessionStorage.getItem("userInfo")).userId,
        };
                if (valid) {
                    this.loading = true
          this.loading = true;
                    if (this.$route.query.id) {
                        editData({ ...data, id: this.$route.query.id }).then(res => {
            editData({ ...data, id: this.$route.query.id })
              .then((res) => {
                            if (res.code === 200) {
                                this.$message.success('修改成功')
                                this.$router.back()
                  this.$message.success("修改成功");
                  this.$router.back();
                            } else {
                                this.$message.error(res.message)
                  this.$message.error(res.message);
                            }
                        }).finally(() => {
                            this.loading = false
                        })
              .finally(() => {
                this.loading = false;
              });
                    } else {
                        addData(data).then(res => {
            addData(data)
              .then((res) => {
                            if (res.code === 200) {
                                this.$message.success('发布成功')
                                this.$router.back()
                  this.$message.success("发布成功");
                  this.$router.back();
                            } else {
                                this.$message.error(res.message)
                            }
                        }).finally(() => {
                            this.loading = false
                        })
                    }
                  this.$message.error(res.message);
                }
            })
              .finally(() => {
                this.loading = false;
              });
          }
        }
      });
        },
        save() {
            this.$refs.form.validate((valid) => {
@@ -196,64 +276,90 @@
                    reportText: this.$refs.materialEditor.getContent(),
                    teamId: this.tableData[0].id,
                    status: -1, // 草稿箱状态
                    commitPersonId: JSON.parse(sessionStorage.getItem('userInfo')).userId
                }
          commitPersonId: JSON.parse(sessionStorage.getItem("userInfo")).userId,
        };
                if (valid) {
                    this.loading = true
          this.loading = true;
                    if (this.$route.query.id) {
                        // 编辑草稿
                        editData({ ...data, id: this.$route.query.id }).then(res => {
            editData({ ...data, id: this.$route.query.id })
              .then((res) => {
                            if (res.code === 200) {
                                this.$message.success('草稿保存成功')
                                this.$router.back()
                  this.$message.success("草稿保存成功");
                  this.$router.back();
                            } else {
                                this.$message.error(res.message)
                  this.$message.error(res.message);
                            }
                        }).finally(() => {
                            this.loading = false
                        })
              .finally(() => {
                this.loading = false;
              });
                    } else {
                        // 新增草稿
                        addData(data).then(res => {
            addData(data)
              .then((res) => {
                            if (res.code === 200) {
                                this.$message.success('草稿保存成功')
                                this.$router.back()
                  this.$message.success("草稿保存成功");
                  this.$router.back();
                            } else {
                                this.$message.error(res.message)
                            }
                        }).finally(() => {
                            this.loading = false
                        })
                    }
                  this.$message.error(res.message);
                }
            })
              .finally(() => {
                this.loading = false;
              });
          }
        }
      });
        },
    // 上传前校验
        beforeUpload(file) {
            return true;
        },
    // 自定义上传处理
        handleUpload(options) {
            const file = options.file;
      const { file, onSuccess, onError } = options;
      // 使用封装的customUploadRequest方法
      customUploadRequest({
        file,
        onSuccess: (res) => {
          console.log()
          if (res.code === 200) {
            const fileObj = {
              id: new Date().getTime(),
              reportId: this.$route.query.id ? this.$route.query.id : '',
              fileUrl: res.msg || res.data || '',
              reportType: 3, // 可行性研究报告类型
                fileName: file.name,
                fileSize: file.size,
                createTime: new Date().toISOString(),
                createBy: '当前用户',
                reportType: 3,
                status: 1,
                id: Date.now().toString(),
                fileUrl: 'https://example.com/default-file-url'
            };
            
            // 添加到文件列表显示
            this.fileList.push({
                name: file.name,
                url: fileObj.fileUrl
              url: getFullUrl(fileObj.fileUrl),
              uid: fileObj.id
            });
            
            // 添加到表单数据
            this.form.qaReportFiles.push(fileObj);
            
            this.$message.success('文件上传成功');
            onSuccess(res);
          } else {
            this.$message.error(res.message || '文件上传失败');
            onError();
          }
        },
        onError: (err) => {
          this.$message.error('文件上传失败');
          onError(err);
        }
      });
    },
    // 删除文件
        handleRemove(file) {
            const index = this.fileList.findIndex(item => item.name === file.name);
            if (index !== -1) {
@@ -262,7 +368,7 @@
            }
        },
    },
}
};
</script>
<style lang="less" scoped>
laboratory/src/views/chemistQa/rawMaterials/components/approval/index.vue
@@ -1,12 +1,17 @@
<template>
    <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="80%"  :close-on-click-modal="false"
        @close="handleClose">
  <el-dialog
    :title="dialogTitle"
    :visible.sync="dialogVisible"
    width="80%"
    :close-on-click-modal="false"
    @close="handleClose"
  >
        <div class="approval-dialog">
            <!-- 左侧审批内容 -->
            <div class="approval-content">
                <Card class="approval-content-card">
                    <template style="position: relative">
                        <div class="header-title" style="width: 100%;">
            <div class="header-title" style="width: 100%">
                            <div class="header-title-left">
                                <img src="@/assets/public/headercard.png" />
                                <div>所属项目组</div>
@@ -21,42 +26,76 @@
                            </template>
                        </Table>
                        <el-form ref="form" :model="form" :rules="rules" inline label-position="top"
                            style="margin-top: 18px">
            <el-form
              ref="form"
              :model="form"
              :rules="rules"
              inline
              label-position="top"
              style="margin-top: 18px"
            >
                            <el-row :gutter="20">
                                <el-col :span="24">
                                    <el-form-item prop="reportTitle" label="报告标题">
                                        <el-input v-model="form.reportTitle" style="width: 100%;" placeholder="请输入报告标题"
                                            disabled />
                    <el-input
                      v-model="form.reportTitle"
                      style="width: 100%"
                      placeholder="请输入报告标题"
                      disabled
                    />
                                    </el-form-item>
                                    <el-form-item prop="reportCode" label="报告编号" style="margin-left: 100px;">
                                        <el-input v-model="form.reportCode" style="width: 100%;" placeholder="请输入报告编号"
                                            disabled />
                  <el-form-item
                    prop="reportCode"
                    label="报告编号"
                    style="margin-left: 100px"
                  >
                    <el-input
                      v-model="form.reportCode"
                      style="width: 100%"
                      placeholder="请输入报告编号"
                      disabled
                    />
                                    </el-form-item>
                                </el-col>
                                <el-col :span="24">
                                    <el-form-item prop="developPerson" label="制定人">
                                        <el-input v-model="form.developPerson" style="width: 100%;" placeholder="请输入制定人"
                                            disabled />
                    <el-input
                      v-model="form.developPerson"
                      style="width: 100%"
                      placeholder="请输入制定人"
                      disabled
                    />
                                    </el-form-item>
                                    <el-form-item prop="developDate" label="制定日期" style="margin-left: 100px;">
                                        <el-date-picker :prefix-icon="null" v-model="form.developDate" type="date"
                                            disabled placeholder="请选择日期" />
                  <el-form-item
                    prop="developDate"
                    label="制定日期"
                    style="margin-left: 100px"
                  >
                    <el-date-picker
                      :prefix-icon="null"
                      v-model="form.developDate"
                      type="date"
                      disabled
                      placeholder="请选择日期"
                    />
                                    </el-form-item>
                                </el-col>
                            </el-row>
                            <div class="header-title" style="width: 100%;">
              <div class="header-title" style="width: 100%">
                                <div class="header-title-left">
                                    <img src="@/assets/public/headercard.png" />
                                    <div>报告正文</div>
                                </div>
                            </div>
                            <el-form-item prop="reportText" style="margin-top: 18px">
                                <ai-editor :value="form.reportText" style="width: 100%;" placeholder="请输入报告正文"
                                    :readOnly="true" />
                <ai-editor
                  :value="form.reportText"
                  style="width: 100%"
                  placeholder="请输入报告正文"
                  :readOnly="true"
                />
                            </el-form-item>
                            <div class="header-title" style="width: 100%;">
              <div class="header-title" style="width: 100%">
                                <div class="header-title-left">
                                    <img src="@/assets/public/headercard.png" />
                                    <span class="noRequire">附件</span>
@@ -64,7 +103,9 @@
                            </div>
                            <el-form-item prop="name" style="margin-top: 18px">
                                <el-upload action="#" :file-list="fileList" disabled>
                                    <el-button size="small" type="primary" disabled>点击上传</el-button>
                  <!-- <el-button size="small" type="primary" disabled
                    >点击上传</el-button
                  > -->
                                </el-upload>
                            </el-form-item>
                        </el-form>
@@ -84,10 +125,18 @@
                    <div class="status">
                        <div class="status-title">审批结果</div>
                        <div class="status-content">
                            <div class="resolve" :class="status == '1' && 'activeStatus'" @click.stop="status = 1">
              <div
                class="resolve"
                :class="status == '1' && 'activeStatus'"
                @click.stop="status = 1"
              >
                                通过
                            </div>
                            <div class="reject" :class="status == '2' && 'activeStatus'" @click.stop="status = 2">
              <div
                class="reject"
                :class="status == '2' && 'activeStatus'"
                @click.stop="status = 2"
              >
                                驳回
                            </div>
                        </div>
@@ -96,28 +145,34 @@
                <el-col :span="12">
                    <div class="remark">
                        <div class="remark-title">审批意见</div>
                        <el-input type="textarea" v-model="remark" placeholder="请输入审批意见" />
            <el-input
              type="textarea"
              v-model="remark"
              placeholder="请输入审批意见"
            />
                    </div>
                </el-col>
            </el-row>
        </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>
<script>
import ApprovalProcess from '@/components/approvalProcess'
import AiEditor from '@/components/AiEditor'
import { getDetail, audit } from '../../service'
import ApprovalProcess from "@/components/approvalProcess";
import AiEditor from "@/components/AiEditor";
import { getDetail, audit } from "../../service";
export default {
    name: "ApprovalDialog",
    components: {
        ApprovalProcess,
        AiEditor
    AiEditor,
    },
    props: {
        visible: {
@@ -148,7 +203,7 @@
                teamId: "",
                qaReportFiles: [],
                commitPersonId: null,
                processData:[]
        processData: [],
            },
            tableData: [],
            fileList: [], // 附件列表
@@ -170,12 +225,13 @@
                    this.getDetail();
                }
            },
            immediate: true
        }
      immediate: true,
    },
    },
    methods: {
        getDetail() {
            getDetail(this.data.id).then(res => {
      getDetail(this.data.id)
        .then((res) => {
                if (res) {
                    this.form = { ...res, processData: [] };
                    // 组装流程数据
@@ -209,7 +265,10 @@
                                                : "待审批",
                                },
                                { label: "审批意见:", value: res.auditRemark || "" },
                                { label: "审核人:", value: res.auditPersonName || res.auditPersonId||"" },
                  {
                    label: "审核人:",
                    value: res.auditPersonName || res.auditPersonId || "",
                  },
                                { label: "审核时间:", value: res.auditTime || "" },
                            ],
                        });
@@ -217,29 +276,40 @@
                        processData.push({
                            type: "warning",
                            mode: "list",
                            fields: [
                                { label: "等待审核" },
                            ],
                fields: [{ label: "等待审核" }],
                        });
                    }
                    this.tableData = [{ ...res.projectTeamVO,staffName:res.projectTeamVO.staffs.map(item=>item.nickName).join(',')}]
                    this.fileList = res.qaReportFileList.map(item => {
            this.tableData = [
              {
                ...res.projectTeamVO,
                staffName: res.projectTeamVO.staffs
                  .map((item) => item.nickName)
                  .join(","),
              },
            ];
            if (res.qaReportFileList && res.qaReportFileList.length > 0) {
              this.fileList = res.qaReportFileList.map((item) => {
                        return {
                            ...item,
                            name: item.fileName,
                            url: item.fileUrl
                  url: item.fileUrl,
                };
              });
            } else {
              this.fileList = [];
                        }
                    }) || [];
                    this.$nextTick(() => {
                        this.form.processData = processData;
                    })
            });
                } else {
                    this.$message.error(res.message || '获取详情失败');
            this.$message.error(res.message || "获取详情失败");
                }
            }).catch(err => {
                console.error('获取详情失败:', err);
                this.$message.error('获取详情失败');
        })
        .catch((err) => {
          console.error("获取详情失败:", err);
          this.$message.error("获取详情失败");
            });
        },
        handleClose() {
@@ -254,20 +324,22 @@
            const params = {
                id: this.data.id,
                auditStatus: this.status == "1" ? 2 : 4, // 1=通过(2),2=驳回(4)
                auditRemark: this.remark
        auditRemark: this.remark,
            };
            audit(params).then(res => {
      audit(params)
        .then((res) => {
                if (res) {
                    this.$message.success("审批成功");
                    this.$emit("close");
                } else {
                    this.$message.error(res.message || "审批失败");
                }
            }).catch(err => {
        })
        .catch((err) => {
                console.error("审批失败:", err);
                this.$message.error("审批失败");
            });
        }
    },
    },
};
</script>
@@ -432,7 +504,7 @@
            line-height: 32px;
            display: flex;
            align-items: center;
            justify-content: center
      justify-content: center;
        }
        .reject {
@@ -446,7 +518,7 @@
            cursor: pointer;
            display: flex;
            align-items: center;
            justify-content: center
      justify-content: center;
        }
        .activeStatus {
laboratory/src/views/deliveryAssessment/assayTaskList/service.js
New file
@@ -0,0 +1,13 @@
import axios from '@/utils/request';
// 获取中试、生产验证分析报告;辅料;产品报告管理评定列表
export function evaluateList(data) {
  return axios.post('/api/t-qa-produce-report/evaluateList', { ...data })
}
// 查看中试、生产验证分析报告;辅料;产品报告管理详情
export function getDetailById(data) {
  return axios.post('/open/t-qa-produce-report/getDetailById', { ...data })
}
laboratory/src/views/deliveryAssessment/clinicalTrial/service.js
New file
@@ -0,0 +1,22 @@
import axios from '@/utils/request';
// 项目组总积分分页列表
export const pageList = (data) => {
    return axios.post('/api/t-clinical-trial-points/pageList', { ...data })
}
export const add = (data) => {
    return axios.post('/api/t-clinical-trial-points/add', { ...data })
}
export const update = (data) => {
    return axios.post('/api/t-clinical-trial-points/update', { ...data })
}
export const deleteById = (data) => {
    return axios.delete('/open/t-clinical-trial-points/deleteById', { params:data })
}
export const deleteByIds = (data) => {
    return axios.delete('/open/t-clinical-trial-points/deleteByIds', { params:data })
}
export const getDetailById = (data) => {
    return axios.get('/open/t-clinical-trial-points/getDetailById', { params:data })
}
laboratory/src/views/deliveryAssessment/experimentResults/service.js
New file
@@ -0,0 +1,22 @@
import axios from '@/utils/request';
// 获取实验结果汇报评定列表-审批人使用
export const evaluatePageList = (data) => {
    return axios.post('/api/t-experiment-result-report/evaluatePageList', { ...data })
}
export const add = (data) => {
    return axios.post('/api/t-tester-other-task/add', { ...data })
}
export const update = (data) => {
    return axios.post('/api/t-tester-other-task/update', { ...data })
}
export const deleteById = (data) => {
    return axios.delete('/open/t-tester-other-task/deleteById', { params:data })
}
export const deleteByIds = (data) => {
    return axios.delete('/open/t-tester-other-task/deleteByIds', { params:data })
}
export const getDetailById = (data) => {
    return axios.get('/open/t-tester-other-task/getDetailById', { params:data })
}
laboratory/src/views/deliveryAssessment/projectTeamIntegral/index.vue
@@ -5,7 +5,7 @@
            <template #search>
                <el-form :model="form" label-width="140px" inline>
                    <el-form-item label="项目组名称:">
                        <el-input v-model="form.name" placeholder="请输入"></el-input>
                        <el-input v-model="form.teamName" placeholder="请输入"></el-input>
                    </el-form-item>
                    <el-form-item label="创建日期:">
                        <el-date-picker v-model="value1" type="daterange" range-separator="至" start-placeholder="开始日期"
@@ -13,11 +13,15 @@
                        </el-date-picker>
                    </el-form-item>
                    <el-form-item label="状态:">
                        <el-select placeholder="请选择"></el-select>
                        <el-select v-model="form.status" placeholder="请选择">
                            <el-option label="全部" value="" />
                            <el-option label="草稿箱" value="-1" />
                            <el-option label="已提交" value="1" />
                        </el-select>
                    </el-form-item>
                    <el-form-item class="search-btn-box">
                        <el-button>重置</el-button>
                        <el-button type="primary">查询</el-button>
                        <el-button @click="handleReset">重置</el-button>
                        <el-button type="primary" @click="handleSearch">查询</el-button>
                    </el-form-item>
                </el-form>
            </template>
@@ -41,12 +45,17 @@
</template>
<script>
import {pageList} from './service.js'
export default {
    name: 'ProjectTeamIntegral',
    data() {
        return {
            form: {
                teamName: '', // 项目组名称
                status: '', // 状态
                date: [], // 日期范围
            },
            value1: [], // 用于日期选择器
            tableData: [],
            queryForm: {
                pageSize: 10,
@@ -58,7 +67,7 @@
    methods: {
        goDetail() {
            this.$router.push({
                path: '/projectList/addProject'
                path: '/deliveryAssessment/projectTeamIntegral-detail'
            })
        },
        handleCurrentChange(page) {
@@ -69,9 +78,49 @@
            this.queryForm.pageSize = size
            this.getList()
        },
        getList() {
        // 查询按钮
        async handleSearch() {
            this.queryForm.pageNum = 1
            await this.getList()
        },
        // 重置按钮
        handleReset() {
            this.form = {
                teamName: '',
                status: '',
                date: [],
        }
            this.value1 = []
            this.queryForm.pageNum = 1
            this.getList()
        },
        async getList() {
            // 参数组装
            const params = {
                ...this.queryForm,
                teamName: this.form.teamName,
                status: this.form.status === '' ? undefined : Number(this.form.status),
            }
            // 日期处理
            if (this.value1 && this.value1.length === 2) {
                params.startTime = this.value1[0]
                params.endTime = this.value1[1]
            } else {
                params.startTime = undefined
                params.endTime = undefined
            }
            try {
                const res = await pageList(params)
                this.tableData = res.records || []
                this.total = res.total || 0
            } catch (e) {
                this.tableData = []
                this.total = 0
            }
        }
    },
    mounted() {
        this.getList()
    }
}
</script>
laboratory/src/views/deliveryAssessment/projectTeamIntegral/service.js
New file
@@ -0,0 +1,6 @@
import axios from '@/utils/request';
// 项目组总积分分页列表
export const pageList = (data) => {
    return axios.post('/api/t-result-work-evaluate/pageList', { ...data })
}
laboratory/src/views/deliveryAssessment/restsTask/components/detail.vue
@@ -1,5 +1,10 @@
<template>
    <el-dialog :visible.sync="dialogVisible" title="其他任务详情" width="70%" @close="handleClose">
  <el-dialog
    :visible.sync="dialogVisible"
    :title="type === 'add' ? '新增其他任务' : '其他任务详情'"
    width="70%"
    @close="handleClose"
  >
        <div class="content-box">
            <div class="header-title-left">
                <img src="@/assets/public/headercard.png" />
@@ -11,71 +16,133 @@
                <el-table-column prop="name" label="项目组成员" />
                <el-table-column prop="name" label="创建时间" />
            </Table>
            <div class="header-title-left">
                <img src="@/assets/public/headercard.png" />
                <div>任务内容</div>
            </div>
            <div>清理</div>
            <div class="header-title-left">
                <img src="@/assets/public/headercard.png" />
                <div>任务时间</div>
            </div>
            <div>2020-12-31 12:00:00</div>
            <div class="header-title-left">
                <img src="@/assets/public/headercard.png" />
                <div>评定积分</div>
            </div>
            <div>2</div>
      <el-row>
        <el-col :span="2"> </el-col>
        <el-col :span="12" :offset="1">
          <el-form
            :model="form"
            :rules="rules"
            ref="formRef"
            label-width="100px"
            :span="12"
            label-position="top"
            style="margin-top: 20px"
          >
            <el-form-item label="任务人" prop="assignee" required>
              <el-select
                v-model="form.assignee"
                placeholder="请选择"
                :disabled="type === 'detail'"
              >
                <el-option
                  v-for="member in memberList"
                  :key="member.id"
                  :label="member.name"
                  :value="member.id"
                />
              </el-select>
            </el-form-item>
            <el-form-item label="任务内容" prop="taskContent" required>
              <el-input
                v-model="form.taskContent"
                placeholder="请输入"
                :disabled="type === 'detail'"
              />
            </el-form-item>
            <el-form-item label="任务时间" prop="taskTime" required>
              <el-date-picker
                v-model="form.taskTime"
                type="datetime"
                placeholder="请选择"
                style="width: 100%"
                :disabled="type === 'detail'"
              />
            </el-form-item>
            <el-form-item label="评定积分" prop="score" required>
              <el-input
                v-model="form.score"
                placeholder="请输入"
                :disabled="type === 'detail'"
              />
            </el-form-item>
          </el-form>
        </el-col>
      </el-row>
        </div>
    </el-dialog>
</template>
<script>
export default {
    name: 'Detail',
  name: "Detail",
    props: {
        modelValue: {
            type: Boolean,
            default: false
      default: false,
        },
        reportData: {
            type: Object,
            default: () => { }
        }
      default: () => ({}),
    },
    type: {
      type: String,
      default: "detail", // 'add' 或 'detail'
    },
    },
    data() {
        return {
            dialogVisible: false,
            form: {},
            rules: {
                reportName: [
                    { required: true, message: '请输入报告名称', trigger: 'blur' }
                ],
      form: {
        assignee: "",
        taskContent: "",
        taskTime: "",
        score: "",
            },
            criteriaList: []
        }
      rules: {
        assignee: [
          { required: true, message: "请选择任务人", trigger: "change" },
        ],
        taskContent: [
          { required: true, message: "请输入任务内容", trigger: "blur" },
        ],
        taskTime: [
          { required: true, message: "请选择任务时间", trigger: "change" },
        ],
        score: [{ required: true, message: "请输入评定积分", trigger: "blur" }],
      },
      criteriaList: [],
      memberList: [],
    };
    },
    watch: {
        modelValue: {
            handler(val) {
                this.dialogVisible = val;
            },
            immediate: true
      immediate: true,
        },
        reportData: {
            handler(val) {
                if (val) {
                    this.form = val || {};
          this.form = {
            assignee: val.assignee || "",
            taskContent: val.taskContent || "",
            taskTime: val.taskTime || "",
            score: val.score || "",
          };
          this.memberList = val.memberList || [];
                }
            },
            immediate: true
        }
      immediate: true,
    },
    },
    methods: {
        handleClose() {
      this.$emit("update:modelValue", false);
        },
    }
}
  },
};
</script>
<style lang="less" scoped>
@@ -96,9 +163,7 @@
        font-size: 18px;
        color: #222222;
        line-height: 27px;
        font-family: 'Source Han Sans CN Bold Bold';
    font-family: "Source Han Sans CN Bold Bold";
    }
}
</style>
laboratory/src/views/deliveryAssessment/restsTask/index.vue
@@ -5,44 +5,48 @@
            <template #search>
                <el-form :model="form" label-width="140px" inline>
                    <el-form-item label="项目组名称:">
                        <el-input v-model="form.name" placeholder="请输入" />
                        <el-input v-model="form.groupName" placeholder="请输入" />
                    </el-form-item>
                    <el-form-item label="任务内容:">
                        <el-input v-model="form.name" placeholder="请输入" />
                        <el-input v-model="form.taskContent" placeholder="请输入" />
                    </el-form-item>
                    <el-form-item class="search-btn-box">
                        <el-button>重置</el-button>
                        <el-button type="primary">查询</el-button>
                        <el-button @click="handleReset">重置</el-button>
                        <el-button type="primary" @click="getList">查询</el-button>
                    </el-form-item>
                </el-form>
            </template>
            <!-- 工艺工程师 -->
            <template #setting>
                <el-button @click="assessmentVisible = true, currentReport = {}" class="el-icon-plus" type="primary">
                    新增其他任务</el-button>
                <el-button v-if="roleType==3" @click="handleAdd" class="el-icon-plus" type="primary">新增其他任务</el-button>
            </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="评定时间" />
                <el-table-column prop="age" label="操作">
                <el-table-column :prop="'projectTeam.teamName'" label="所属项目组" />
                <el-table-column prop="taskContent" label="任务内容" />
                <el-table-column prop="taskTime" label="任务时间" />
                <el-table-column prop="testerName" label="添加人" />
                <el-table-column prop="evaluateScore" label="评定积分" />
                <el-table-column label="累计分数">
                  <template #default>
                    <!-- 累计分数接口未返回,留空或后端补充 -->
                  </template>
                </el-table-column>
                <el-table-column prop="evaluateTime" label="评定时间" />
                <el-table-column label="操作">
                    <template #default="{ row }">
                        <el-button type="text">详情</el-button>
                        <el-button type="text" @click="handleDetail(row)">详情</el-button>
                    </template>
                </el-table-column>
            </template>
        </TableCustom>
        <Detail :modelValue="assessmentVisible" :reportData="currentReport" />
        <Detail :modelValue="assessmentVisible" :reportData="currentReport" :type="detailType" @close="assessmentVisible = false" />
    </div>
</template>
<script>
import Detail from './components/detail.vue'
import { pageList, getDetailById } from './service.js'
export default {
    name: 'RestsTask',
@@ -52,6 +56,8 @@
    data() {
        return {
            form: {
                groupName: '',
                taskContent: ''
            },
            tableData: [],
            queryForm: {
@@ -60,8 +66,16 @@
            },
            total: 0,
            assessmentVisible: false,
            currentReport: {}
            currentReport: {},
            detailType: 'detail',
            loading: false,
            roleType:'',
        }
    },
    mounted() {
        this.getList();
        const userInfo = JSON.parse(sessionStorage.getItem('userInfo'));
        this.roleType = userInfo?.roleType;
    },
    methods: {
        handleCurrentChange(page) {
@@ -73,10 +87,48 @@
            this.getList()
        },
        getList() {
            this.loading = true;
            const params = {
                ...this.form,
                ...this.queryForm
            };
            pageList(params).then(res => {
                if (res && res.data) {
                    this.tableData = res.data.records || [];
                    this.total = res.data.total || 0;
                }
            }).finally(() => {
                this.loading = false;
            });
        },
        handleReset() {
            this.form = {
                groupName: '',
                taskContent: ''
            };
            this.queryForm.pageNum = 1;
            this.getList();
        },
        handleAdd() {
            this.currentReport = {
                assignee: '',
                taskContent: '',
                taskTime: '',
                score: '',
                memberList: [] // 这里需要你根据实际情况传入项目组成员
            };
            this.detailType = 'add';
            this.assessmentVisible = true;
        },
        handleDetail(row) {
            // 处理详情
            if (!row || !row.id) return;
            getDetailById({ id: row.id }).then(res => {
                if (res && res.data) {
                    this.currentReport = res.data;
                    this.detailType = 'detail';
                    this.assessmentVisible = true;
                }
            });
        },
        handleAssessment(row) {
            this.currentReport = row;
laboratory/src/views/deliveryAssessment/restsTask/service.js
New file
@@ -0,0 +1,22 @@
import axios from '@/utils/request';
// 项目组总积分分页列表
export const pageList = (data) => {
    return axios.post('/api/t-tester-other-task/pageList', { ...data })
}
export const add = (data) => {
    return axios.post('/api/t-tester-other-task/add', { ...data })
}
export const update = (data) => {
    return axios.post('/api/t-tester-other-task/update', { ...data })
}
export const deleteById = (data) => {
    return axios.delete('/open/t-tester-other-task/deleteById', { params:data })
}
export const deleteByIds = (data) => {
    return axios.delete('/open/t-tester-other-task/deleteByIds', { params:data })
}
export const getDetailById = (data) => {
    return axios.get('/open/t-tester-other-task/getDetailById', { params:data })
}
laboratory/src/views/deliveryAssessment/testerWorkerEvaluate/service.js
New file
@@ -0,0 +1,22 @@
import axios from '@/utils/request';
// 项目组总积分分页列表
export const pageList = (data) => {
    return axios.post('/api/t-result-work-evaluate/testerEvaluateList', { ...data })
}
export const add = (data) => {
    return axios.post('/api/t-result-work-evaluate/add', { ...data })
}
export const update = (data) => {
    return axios.post('/api/t-tester-other-task/update', { ...data })
}
export const deleteById = (data) => {
    return axios.delete('/open/t-tester-other-task/deleteById', { params:data })
}
export const deleteByIds = (data) => {
    return axios.delete('/open/t-tester-other-task/deleteByIds', { params:data })
}
export const getDetailById = (data) => {
    return axios.delete('/open/t-tester-other-task/getDetailById', { params:data })
}
laboratory/src/views/deliveryAssessment/testingAndEvaluation/service.js
New file
@@ -0,0 +1,39 @@
import axios from '@/utils/request';
// 查询列表
export function getDataList(data) {
  return axios.post('/api/t-qa-test-item/pageList', { ...data })
}
//获取详情
export function getDetail(id) {
  return axios.get(`/open/t-qa-test-item/getDetailById?id=${id}`)
}
//评定QA检测项管理
export function evaluate(data) {
  return axios.put(`/api/t-qa-test-item/evaluate`, { ...data })
}
// 下面的是二级的接口
export function detailPageList(data) {
  return axios.post(`/api/t-qa-test-item-report/pageList`,{...data})
}
export function detailAuditReport(data) {
  return axios.post(`/api/t-qa-test-item-report/auditReport`,{...data})
}
export function getDetailInfo(data) {
  return axios.get(`/open/t-qa-test-item-report/getDetailById?id=${data.id}`)
}
// 获取QA检测项报告管理下拉列表-化验师使用、评定使用
export function getListByItemId(data) {
  return axios.get(`/open/t-qa-test-item-report/getListByItemId?itemId=${data.id}`)
}
laboratory/src/views/reportLibrary/verificationRelease/components/approval/index.vue
@@ -30,7 +30,7 @@
                                    <div>报告编号</div>
                                </div>
                            </div>
                            <el-form-item prop="reportCode" style="margin-top: 38px">
                            <el-form-item prop="reportCode" style="margin-top: 18px">
                                <el-input disabled v-model="form.reportCode" style="width: 100%;"
                                    placeholder="请输入报告编号" />
                            </el-form-item>
@@ -41,7 +41,7 @@
                                    <div>报告名称</div>
                                </div>
                            </div>
                            <el-form-item prop="reportName" style="margin-top: 38px">
                            <el-form-item prop="reportName" style="margin-top: 18px">
                                <el-input disabled v-model="form.reportName" style="width: 100%;"
                                    placeholder="请输入报告名称" />
                            </el-form-item>
@@ -52,9 +52,21 @@
                                    <div>报告正文</div>
                                </div>
                            </div>
                            <el-form-item prop="reportText" style="margin-top: 38px">
                            <el-form-item prop="reportText" style="margin-top: 18px">
                                <ai-editor :readOnly="true" :value="form.reportText" style="width: 100%;"
                                    placeholder="请输入报告正文" />
                            </el-form-item>
                            <div class="header-title" style="width: 100%;">
                                <div class="header-title-left">
                                    <img src="@/assets/public/headercard.png" />
                                    <div>附件</div>
                                </div>
                            </div>
                            <el-form-item prop="feasibilityReportFiles" style="margin-top: -18px">
                                <el-upload
                                disabled
                                    :file-list="form.feasibilityReportFiles"
                                />
                            </el-form-item>
                        </el-form>
@@ -169,6 +181,10 @@
                this.form = {
                    ...this.form,
                    ...data,
                    feasibilityReportFiles:data.feasibilityReportFiles.map(item => ({
                        name: item.fileName,
                        url: item.fileUrl
                    })) || [],
                    processData: []
                };
@@ -187,7 +203,7 @@
                    ]
                });
                if (data.status == 2 || data.status == 3) {
                if (data.status == 2 || data.status == 4) {
                    processData.push({
                        type: "primary",
                        mode: "list",
@@ -310,14 +326,14 @@
    // display: flex;
    align-items: center;
    flex-wrap: wrap;
    margin-bottom: 20px;
    margin-bottom: 10px;
    gap: 13px;
    .header-title-left {
        display: flex;
        align-items: center;
        gap: 13px;
        margin-top: 38px;
        margin-top: 18px;
        img {
            width: 12px;