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/QA/components/AssessmentDialog.vue |  451 +++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 266 insertions(+), 185 deletions(-)

diff --git a/laboratory/src/views/deliveryAssessment/QA/components/AssessmentDialog.vue b/laboratory/src/views/deliveryAssessment/QA/components/AssessmentDialog.vue
index 5534281..4f09166 100644
--- a/laboratory/src/views/deliveryAssessment/QA/components/AssessmentDialog.vue
+++ b/laboratory/src/views/deliveryAssessment/QA/components/AssessmentDialog.vue
@@ -1,201 +1,282 @@
 <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 style="margin-top: 5px;" :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-                    <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 label="创新型课题报告评分规则">
-                            <template>
-                                <div>
-                                    <div>1、规程型课题评定总分的满分为5分。</div>
-                                    <div>2、某分项工作完成,但出现以下三种错误中的1种,则减1分:</div>
-                                    <div>①有缺项、漏项;</div>
-                                    <div>②或不完整清晰;</div>
-                                    <div>③或工作效率人为拖延。</div>
-                                    <div>3、不能完成某分项的全部工作,或课题不涉及该分项内容,则该分项评0分。</div>
-                                </div>
-                            </template>
-                        </el-table-column>
-                    </Table>
-                </el-col>
-            </el-row>
-        </div>
-        <template #footer>
-            <span class="select-member-footer">
-                <el-button type="primary">提交评定结果</el-button>
-            </span>
-        </template>
-    </el-dialog>
+  <el-dialog
+    :visible.sync="dialogVisible"
+    :title="type === 'detail' ? '课题评定详情' : '课题评定'"
+    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
+          style="margin-top: 5px"
+          :xs="24"
+          :sm="24"
+          :md="24"
+          :lg="24"
+          :xl="24"
+        >
+          <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 label="创新型课题报告评分规则">
+              <template>
+                <div>
+                  <div>1、规程型课题评定总分的满分为5分。</div>
+                  <div>
+                    2、某分项工作完成,但出现以下三种错误中的1种,则减1分:
+                  </div>
+                  <div>①有缺项、漏项;</div>
+                  <div>②或不完整清晰;</div>
+                  <div>③或工作效率人为拖延。</div>
+                  <div>
+                    3、不能完成某分项的全部工作,或课题不涉及该分项内容,则该分项评0分。
+                  </div>
+                </div>
+              </template>
+            </el-table-column>
+          </Table>
+        </el-col>
+      </el-row>
+    </div>
+    <div class="assessed" style="display:flex" v-if="evaluateInfo.status == 3">
+      <div style="margin-right: 20px">评定时间:{{ evaluateInfo.evaluateTime }}</div>
+      <div>评定人:{{ evaluateInfo.evaluatePersonName }}</div>
+    </div>
+    <template #footer v-if="evaluateInfo.status === 2 && type=='approve'">
+      <span class="select-member-footer">
+        <el-button type="primary" @click="handleSubmit">提交评定结果</el-button>
+      </span>
+    </template>
+  </el-dialog>
 </template>
 
 <script>
+import { getDetailById, 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,
+    //   required: true,
+    default: () => "",
+    },
+    type: {
+      type: String,
+      default: "detail", // 'detail' 或 'evaluate'
+    },
+  },
+  data() {
+    return {
+      dialogVisible: false,
+      form: {
+        reportNo: "",
+        reportName: "",
+      },
+      rules: {
+        reportName: [
+          { required: true, message: "请输入报告名称", trigger: "blur" },
+        ],
+      },
+      criteriaList: [
+        {
+          criteria: "文献资料调查:全面性,系统性 编辑逻辑清晰,表达规范",
+          fullScore: 1,
+          score: 0,
+        },
+        {
+          criteria:
+            "专业/技术路线与方法:合理性、可行性;实验设计科学、能实现研究目标,方法先进、完整、可靠;",
+          fullScore: 2,
+          score: 0,
+        },
+        {
+          criteria:
+            "课题报告完成度高,预期研究结果果是否具有技术价值和应用价值。风险识别:识别了潜在的技术风险、市场风险和管理风险。",
+          fullScore: 3,
+          score: 0,
+        },
+      ],
+      evaluateInfo: {},
+    };
+  },
+  watch: {
+    modelValue: {
+      handler(val) {
+        this.dialogVisible = val;
+        if (val) {
+          this.fetchDataById();
+        }
+      },
+      immediate: true,
+    },
+    id: {
+      handler(val) {
+        if (this.dialogVisible && val) {
+          this.fetchDataById();
+        }
+      },
+      immediate: true,
+    },
+    type: {
+      handler(val) {
+        // 可根据type切换详情/评定模式
+      },
+      immediate: true,
+    },
+  },
+  methods: {
+    async fetchDataById() {
+      try {
+        const res = await getDetailById({id:this.id});
+        const data = res || {};
+        this.form.reportNo = data.reportCode || "";
+        this.form.reportName = data.reportTitle || "";
+        this.evaluateInfo = { ...data };
+        // 评定分数
+        if (data.evaluateScore) {
+          const scores = data.evaluateScore.split(",").map(Number);
+          this.criteriaList.forEach((item, idx) => {
+            item.score = scores[idx] || 0;
+          });
+        } else {
+          this.criteriaList.forEach((item) => (item.score = 0));
+        }
+      } catch (e) {
+        // 错误处理
+      }
+    },
+    handleClose() {
+        this.$emit("close", false);
+    },
+    async handleSubmit() {
+      try {
+        await this.$refs.formRef.validate();
+        const totalScore = this.criteriaList.reduce(
+          (sum, item) => sum + (item.score || 0),
+          0
+        );
+        const assessmentData = {
+          id: this.evaluateInfo.id,
+          evaluateScore: this.criteriaList
+            .map((item) => item.score || 0)
+            .join(","),
+        };
+        // 这里可以调用evaluate接口
+        evaluate(assessmentData).then((res) => {
+          if (res.code == 200) {
+            this.$message.success("提交成功");
+            this.handleClose();
+          }else{
+            this.$message.error(res.message)
+          }
+        });
+      } 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 {
-            dialogVisible: false,
-            form: {
-                reportNo: '',
-                reportName: '',
-            },
-            rules: {
-                reportName: [
-                    { required: true, message: '请输入报告名称', trigger: 'blur' }
-                ],
-            },
-            criteriaList: [
-                {
-                    criteria: '文献资料调查:全面性,系统性 编辑逻辑清晰,表达规范',
-                    fullScore: 1,
-                    score: 0,
-                },
-                {
-                    criteria: '专业/技术路线与方法:合理性、可行性;实验设计科学、能实现研究目标,方法先进、完整、可靠;',
-                    fullScore: 2,
-                    score: 0,
-                },
-                {
-                    criteria: '课题报告完成度高,预期研究结果果是否具有技术价值和应用价值。风险识别:识别了潜在的技术风险、市场风险和管理风险。',
-                    fullScore: 3,
-                    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;
+    }
+  }
 }
 </style>
\ No newline at end of file

--
Gitblit v1.7.1