From d8d68a0aee93073b5ec3195368ca0ed1076f66a2 Mon Sep 17 00:00:00 2001
From: 董国庆 <364620639@qq.com>
Date: 星期三, 25 六月 2025 17:58:08 +0800
Subject: [PATCH] 对接评定接口和中台待办事项

---
 laboratory/src/views/deliveryAssessment/taskList/components/AssessmentDialog.vue |  528 +++++++++++++++++++++++++++++++++-------------------------
 1 files changed, 303 insertions(+), 225 deletions(-)

diff --git a/laboratory/src/views/deliveryAssessment/taskList/components/AssessmentDialog.vue b/laboratory/src/views/deliveryAssessment/taskList/components/AssessmentDialog.vue
index f607517..12b9d31 100644
--- a/laboratory/src/views/deliveryAssessment/taskList/components/AssessmentDialog.vue
+++ b/laboratory/src/views/deliveryAssessment/taskList/components/AssessmentDialog.vue
@@ -1,244 +1,322 @@
 <template>
-    <el-dialog :visible.sync="dialogVisible" title="课题评定详情" width="70%" @close="handleClose">
-        <el-form :model="form" inline label-position="top" :rules="rules" ref="formRef">
-            <el-row :gutter="20">
-                <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
-                    <el-form-item label="报告编号" prop="reportNo" required>
-                        <el-input v-model="form.reportNo" disabled placeholder="自动生成" />
-                    </el-form-item>
-                </el-col>
-                <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
-                    <el-form-item label="报告名称" prop="reportName">
-                        <el-input v-model="form.reportName" placeholder="请输入" />
-                    </el-form-item>
-                </el-col>
-            </el-row>
-        </el-form>
-        <div class="content-box">
-            <el-row :gutter="16">
-                <el-col :xs="24" :sm="24" :md="4" :lg="4" :xl="4">
-                    <div class="content-box-left">
-                        <div class="content-box-left-th">设立课题规则</div>
-                        <div class="content-box-left-body" :style="{ height: `calc(${$baseTableHeight()}px - 40px)` }">
-                            1、根据可研报告、产品构思设计的工艺研究路线,一条工艺路线设立一个课题。如果一个课题中有多个化合物需要开发研究,则每个化合物作为一个分题;分题归集到该课题中,最终形成课题报告。不同课题报告中的分题不能重复使用。
-                            2、在可行研究阶段,工艺开发升级,重新规划工艺研究路线,则以新规划的工艺路线方案来设定课题</div>
-                    </div>
-                </el-col>
-                <el-col style="margin-top: 5px;" :xs="24" :sm="24" :md="20" :lg="20" :xl="20">
-                    <Table :total="0" :height="null" :data="criteriaList" show-summary :summary-method="getSummaries"
-                        :span-method="arraySpanMethod">
-                        <el-table-column type="index" label="序号" width="80" />
-                        <el-table-column prop="criteria" label="创新型课题标准" />
-                        <el-table-column prop="fullScore" label="满分值" width="100" />
-                        <el-table-column label="评定分值" prop="score" width="200">
-                            <template #default="{ row }">
-                                <el-input-number v-model="row.score" :min="0" :max="row.fullScore" :step="1" />
-                            </template>
-                        </el-table-column>
-                        <el-table-column prop="rule" label="创新型课题报告评分规则">
-                            <template>
-                                <div>
-                                    <div>1、各分项评满分,应满足以下四项要求:</div>
-                                    <div>①分项内容:清晰、系统、完整,结构逻辑清晰,无缺项;</div>
-                                    <div>②团队工作运行顺畅、计划时间高效。</div>
-                                    <div>③工作结果完成度高。</div>
-                                    <div>④课题文档报告完成度高。</div>
-                                    <div>2、某分项工作完成,但出现以下三种错误中的1种,则减1分:</div>
-                                    <div>①有缺项、漏项;</div>
-                                    <div>②或不完整清晰;</div>
-                                    <div>③或工作效率人为拖延。</div>
-                                    <div>3、某分项工作基本完成,但出现三种错误中的2-3种,则减2分:</div>
-                                    <div> ①有缺项、漏项;</div>
-                                    <div>②或不完整清晰;</div>
-                                    <div>③或工作效率人为拖延。</div>
-                                    <div>4、不能完成某分项的全部工作,或课题不涉及该分项内容,则该分项评0分。</div>
-                                </div>
-                            </template>
-                        </el-table-column>
-                    </Table>
-                </el-col>
-            </el-row>
-        </div>
-        <div class="assessed">
-            <div>评定时间:2025-2-20 11:08:00</div>
-            <div>评定人:张三</div>
-        </div>
-        <template #footer>
-            <span class="dialog-footer select-member-footer">
-                <el-button type="primary" @click="handleSubmit">提交评定结果</el-button>
-            </span>
-        </template>
-    </el-dialog>
+  <el-dialog
+    :visible.sync="dialogVisible"
+    title="课题评定详情"
+    width="70%"
+    @close="handleClose"
+  >
+    <el-form
+      :model="form"
+      inline
+      label-position="top"
+      :rules="rules"
+      ref="formRef"
+    >
+      <el-row :gutter="20">
+        <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+          <el-form-item label="报告编号" prop="reportNo" required>
+            <el-input v-model="form.reportNo" disabled placeholder="自动生成" />
+          </el-form-item>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+          <el-form-item label="报告名称" prop="reportName">
+            <el-input v-model="form.reportName" disabled placeholder="请输入" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <div class="content-box">
+      <el-row :gutter="16">
+        <el-col :xs="24" :sm="24" :md="4" :lg="4" :xl="4">
+          <div class="content-box-left">
+            <div class="content-box-left-th">设立课题规则</div>
+            <div
+              class="content-box-left-body"
+              :style="{ height: `calc(${$baseTableHeight()}px - 40px)` }"
+            >
+              1、根据可研报告、产品构思设计的工艺研究路线,一条工艺路线设立一个课题。如果一个课题中有多个化合物需要开发研究,则每个化合物作为一个分题;分题归集到该课题中,最终形成课题报告。不同课题报告中的分题不能重复使用。
+              2、在可行研究阶段,工艺开发升级,重新规划工艺研究路线,则以新规划的工艺路线方案来设定课题
+            </div>
+          </div>
+        </el-col>
+        <el-col
+          style="margin-top: 5px"
+          :xs="24"
+          :sm="24"
+          :md="20"
+          :lg="20"
+          :xl="20"
+        >
+          <Table
+            :total="0"
+            :height="null"
+            :data="criteriaList"
+            show-summary
+            :summary-method="getSummaries"
+            :span-method="arraySpanMethod"
+          >
+            <el-table-column type="index" label="序号" width="80" />
+            <el-table-column prop="criteria" label="创新型课题标准" />
+            <el-table-column prop="fullScore" label="满分值" width="100" />
+            <el-table-column label="评定分值" prop="score" width="200">
+              <template #default="{ row }">
+                <el-input-number
+                  v-model="row.score"
+                  :min="0"
+                  :max="row.fullScore"
+                  :step="1"
+                  :disabled="type === 'detail'"
+                />
+              </template>
+            </el-table-column>
+            <el-table-column prop="rule" label="创新型课题报告评分规则">
+              <template>
+                <div>
+                  <div>1、各分项评满分,应满足以下四项要求:</div>
+                  <div>①分项内容:清晰、系统、完整,结构逻辑清晰,无缺项;</div>
+                  <div>②团队工作运行顺畅、计划时间高效。</div>
+                  <div>③工作结果完成度高。</div>
+                  <div>④课题文档报告完成度高。</div>
+                  <div>
+                    2、某分项工作完成,但出现以下三种错误中的1种,则减1分:
+                  </div>
+                  <div>①有缺项、漏项;</div>
+                  <div>②或不完整清晰;</div>
+                  <div>③或工作效率人为拖延。</div>
+                  <div>
+                    3、某分项工作基本完成,但出现三种错误中的2-3种,则减2分:
+                  </div>
+                  <div>①有缺项、漏项;</div>
+                  <div>②或不完整清晰;</div>
+                  <div>③或工作效率人为拖延。</div>
+                  <div>
+                    4、不能完成某分项的全部工作,或课题不涉及该分项内容,则该分项评0分。
+                  </div>
+                </div>
+              </template>
+            </el-table-column>
+          </Table>
+        </el-col>
+      </el-row>
+    </div>
+    <div class="assessed" v-if="evaluateInfo.status == 3">
+      <div>评定时间:{{ evaluateInfo.evaluateTime || "" }}</div>
+      <div>评定人:{{ evaluateInfo.evaluatePersonName || "" }}</div>
+    </div>
+    <template #footer>
+      <span class="dialog-footer select-member-footer" v-if="type !== 'detail'">
+        <el-button type="primary" @click="handleSubmit">提交评定结果</el-button>
+      </span>
+    </template>
+  </el-dialog>
 </template>
 
 <script>
+import { evaluateDetail, evaluate } from "../service.js";
 export default {
-    name: 'AssessmentDialog',
-    props: {
-        modelValue: {
-            type: Boolean,
-            default: false
-        },
-        reportData: {
-            type: Object,
-            default: () => { }
-        }
+  name: "AssessmentDialog",
+  props: {
+    modelValue: {
+      type: Boolean,
+      default: false,
     },
-    data() {
+    id: {
+      type: [String, Number],
+      required: true,
+    },
+    type: {
+      type: String,
+      default: "assessment",
+    },
+  },
+  data() {
+    return {
+      dialogVisible: false,
+      form: {
+        reportNo: "",
+        reportName: "",
+      },
+      evaluateInfo: {},
+      rules: {
+        reportName: [
+          { required: true, message: "请输入报告名称", trigger: "blur" },
+        ],
+      },
+      criteriaList: [
+        {
+          criteria:
+            "课题名称依准确性、报告内容完整性:研究目标是否完整、是否研究工作内容合理性、是否围绕目标展开开、是否具有逻辑性和条理性",
+          fullScore: 3,
+          score: 0,
+        },
+        {
+          criteria: "文献资料调查:全面性、系统性编辑逻辑顺畅,表达规范",
+          fullScore: 2,
+          score: 0,
+        },
+        {
+          criteria:
+            "专业/技术路线与方法:合理性、可行性;实验设计科学、能完成研究目标、方法完整、完整、可靠;",
+          fullScore: 3,
+          score: 0,
+        },
+        {
+          criteria:
+            "实验验证工作可行性强,团队工作调度支持实验设备、材料等条件的准备良好,时间计划合理,能效按时完成",
+          fullScore: 2,
+          score: 0,
+        },
+        {
+          criteria:
+            "实验设计合理性:①对照设置,重复次数,样本量足够。②变量控制:自变量控制,因变量测量,干扰因素分析识别;确保结果的准确性③验证结果解释分析:符合科学原理、逻辑严密、不存在漏洞。具有实际应用价值,解决了实际问题或实现了研究目的。",
+          fullScore: 3,
+          score: 0,
+        },
+        {
+          criteria:
+            "课题报告完成度高,预期研究结果果是否具有技术价值和应用价值。风险识别:识别了潜在的技术风险、市场风险和管理风险。",
+          fullScore: 2,
+          score: 0,
+        },
+      ],
+    };
+  },
+  watch: {
+    modelValue: {
+      handler(val) {
+        this.dialogVisible = val;
+        if (val && this.id) {
+          this.fetchDetail();
+        }
+      },
+      immediate: true,
+    },
+    id(val) {
+      if (this.modelValue && val) {
+        this.fetchDetail();
+      }
+    },
+  },
+  methods: {
+    async fetchDetail() {
+      try {
+        const res = await evaluateDetail({ id: this.id });
+        if (res) {
+          this.evaluateInfo = { ...res };
+          this.form.reportNo = res.reportCode || "";
+          this.form.reportName = res.reportName || "";
+          // 详情回显分数
+          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);
+      this.$emit("close");
+    },
+    async handleSubmit() {
+      try {
+        // 拼接分数
+        const evaluateScore = this.criteriaList
+          .map((item) => item.score)
+          .join(",");
+        const params = {
+          id: this.id,
+          evaluateScore,
+        };
+        evaluate(params).then((res) => {
+          if (res) {
+            this.$message && this.$message.success("评定成功");
+            this.handleClose();
+          }
+        });
+      } catch (error) {
+        this.$message && this.$message.error("评定失败");
+      }
+    },
+    getSummaries(param) {
+      const { columns, data } = param;
+      const sums = [];
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = "合计";
+          return;
+        }
+        const values = data.map((item) => Number(item[column.property]));
+        if (!values.every((value) => isNaN(value))) {
+          sums[index] = values.reduce((prev, curr) => {
+            const value = Number(curr);
+            if (!isNaN(value)) {
+              return prev + curr;
+            } else {
+              return prev;
+            }
+          }, 0);
+          sums[index] += " 分";
+        } else {
+          sums[index] = "";
+        }
+      });
+      return sums;
+    },
+    arraySpanMethod({ row, column, rowIndex, columnIndex }) {
+      if (columnIndex === 4 && rowIndex == 0) {
         return {
-            dialogVisible: false,
-            form: {
-                reportNo: '',
-                reportName: '',
-            },
-            rules: {
-                reportName: [
-                    { required: true, message: '请输入报告名称', trigger: 'blur' }
-                ],
-            },
-            criteriaList: [
-                {
-                    criteria: '课题名称依准确性、报告内容完整性:研究目标是否完整、是否研究工作内容合理性、是否围绕目标展开开、是否具有逻辑性和条理性',
-                    fullScore: 3,
-                    score: 0,
-                },
-                {
-                    criteria: '文献资料调查:全面性、系统性编辑逻辑顺畅,表达规范',
-                    fullScore: 2,
-                    score: 0,
-                },
-                {
-                    criteria: '专业/技术路线与方法:合理性、可行性;实验设计科学、能完成研究目标、方法完整、完整、可靠;',
-                    fullScore: 3,
-                    score: 0,
-                },
-                {
-                    criteria: '实验验证工作可行性强,团队工作调度支持实验设备、材料等条件的准备良好,时间计划合理,能效按时完成',
-                    fullScore: 2,
-                    score: 0,
-                },
-                {
-                    criteria: '实验设计合理性:①对照设置,重复次数,样本量足够。②变量控制:自变量控制,因变量测量,干扰因素分析识别;确保结果的准确性③验证结果解释分析:符合科学原理、逻辑严密、不存在漏洞。具有实际应用价值,解决了实际问题或实现了研究目的。',
-                    fullScore: 3,
-                    score: 0,
-                },
-                {
-                    criteria: '课题报告完成度高,预期研究结果果是否具有技术价值和应用价值。风险识别:识别了潜在的技术风险、市场风险和管理风险。',
-                    fullScore: 2,
-                    score: 0,
-                }
-            ]
-        }
+          rowspan: 6,
+          colspan: 1,
+        };
+      } else if (rowIndex !== 0 && columnIndex === 4) {
+        return [0, 0];
+      }
     },
-    watch: {
-        modelValue: {
-            handler(val) {
-                this.dialogVisible = val;
-            },
-            immediate: true
-        },
-        reportData: {
-            handler(val) {
-                if (val) {
-                    this.form.reportNo = val.reportNo || '';
-                    this.form.reportName = val.reportName || '';
-                }
-            },
-            immediate: true
-        }
-    },
-    methods: {
-        handleClose() {
-            this.$emit('update:modelValue', false);
-        },
-        async handleSubmit() {
-            try {
-                await this.$refs.formRef.validate();
-                const totalScore = this.criteriaList.reduce((sum, item) => sum + (item.score || 0), 0);
-                const assessmentData = {
-                    ...this.form,
-                    totalScore,
-                    criteriaScores: this.criteriaList.map(item => ({
-                        criteria: item.criteria,
-                        score: item.score || 0
-                    }))
-                };
-                this.$emit('submit', assessmentData);
-                this.handleClose();
-            } catch (error) {
-                // 表单验证失败
-            }
-        },
-        getSummaries(param) {
-            const { columns, data } = param;
-            const sums = [];
-            columns.forEach((column, index) => {
-                if (index === 0) {
-                    sums[index] = '合计';
-                    return;
-                }
-                const values = data.map(item => Number(item[column.property]));
-                if (!values.every(value => isNaN(value))) {
-                    sums[index] = values.reduce((prev, curr) => {
-                        const value = Number(curr);
-                        if (!isNaN(value)) {
-                            return prev + curr;
-                        } else {
-                            return prev;
-                        }
-                    }, 0);
-                    sums[index] += ' 分';
-                } else {
-                    sums[index] = '';
-                }
-            });
-            return sums;
-        },
-        arraySpanMethod({ row, column, rowIndex, columnIndex }) {
-            if (columnIndex === 4 && rowIndex == 0) {
-                return {
-                    rowspan: 6,
-                    colspan: 1
-                }
-            } else if (rowIndex !== 0 && columnIndex === 4) {
-                return [0, 0]
-            }
-        }
-    }
-}
+  },
+};
 </script>
 
 <style lang="less" scoped>
 .content-box {
+  &-left {
+    margin-top: 5px;
+    display: flex;
+    flex-direction: column;
+    border: 1px solid #ebeef5;
+    border-radius: 8px 8px 0px 0px;
+    font-size: 12px;
 
-    &-left {
-        margin-top: 5px;
-        display: flex;
-        flex-direction: column;
-        border: 1px solid #EBEEF5;
-        border-radius: 8px 8px 0px 0px;
-        font-size: 12px;
-
-        &-th {
-            line-height: 40px;
-            background: #FAFAFA !important;
-            color: #909399;
-            padding: 0 10px;
-            font-weight: bold;
-        }
-
-        &-body {
-            padding: 0 10px;
-            line-height: 23px;
-        }
+    &-th {
+      line-height: 40px;
+      background: #fafafa !important;
+      color: #909399;
+      padding: 0 10px;
+      font-weight: bold;
     }
+
+    &-body {
+      padding: 0 10px;
+      line-height: 23px;
+    }
+  }
 }
 
 .assessed {
-    display: flex;
-    flex-wrap: wrap;
-    align-items: center;
-    gap: 25px;
-    margin-top: 20px;
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  gap: 25px;
+  margin-top: 20px;
 }
 </style>
\ No newline at end of file

--
Gitblit v1.7.1