This commit is contained in:
2025-09-19 18:09:20 +08:00
parent 832be81848
commit 2545c123c9
2 changed files with 223 additions and 147 deletions

View File

@@ -153,16 +153,16 @@
trigger: 'blur' trigger: 'blur'
} }
], ],
name: [{ // name: [{
required: true, // required: true,
message: 'Please enter your real name.', // message: 'Please enter your real name.',
trigger: 'blur' // trigger: 'blur'
}], // }],
phone: [{ // phone: [{
required: true, // required: true,
message: 'Please enter the correct mobile phone number.', // message: 'Please enter the correct mobile phone number.',
trigger: 'blur' // trigger: 'blur'
}], // }],
email: [{ email: [{
required: true, required: true,
message: 'Please enter your email address.', message: 'Please enter your email address.',

View File

@@ -401,7 +401,73 @@
v-if="item.reportList.length > 0" v-if="item.reportList.length > 0"
> >
<font style="font-size: 14px; font-weight: normal; color: #333">Initial review score :</font> <font style="font-size: 14px; font-weight: normal; color: #333">Initial review score :</font>
{{ item.scoring }} <el-popover placement="top-start" title="" width="540" trigger="hover">
<span style="cursor: pointer" slot="reference">{{ item.scoring }}</span>
<div>
<div class="scoringRules">
<div style="display: flex; justify-content: space-between;font-size:16px;margin-bottom: 15px;">
<div>
<span>H指数: <span :style="item.h_fen&&item.h_fen>0?`color:#db890e`:''">{{ item.h_fen }}</span></span>
</div>
<div>
<span>图表: <span :style="item.b_fen&&item.b_fen>0?`color:#db890e`:''">{{ item.b_fen }}</span></span>
</div>
<div>
<span>国家: <span :style="item.c_fen&&item.c_fen>0?`color:#db890e`:''">{{ item.c_fen }}</span></span>
</div>
<div>
<span>单位: <span :style="item.dw_fen&&item.dw_fen>0?`color:#db890e`:''">{{ item.dw_fen }}</span></span>
</div>
<div>
<span>领域分: <span :style="item.ly_fen&&item.ly_fen>0?`color:#db890e`:''">{{ item.ly_fen }}</span></span>
</div>
<div>
<span>基金分: <span :style="item.jj_fen&&item.jj_fen>0?`color:#db890e`:''">{{ item.jj_fen }}</span></span>
</div>
</div>
<ul>
<p style="font-size: 14px; font-weight: bold; margin-bottom:0px; color: #888">评分规则</p>
<div class="scoringRulesItem" style="margin-top: 6px;">
<li><span class="scoringRulesTitle">h指数</span> 0-1=0,2-5=1,6-11=2,12-19=3,20-~=4</li>
</div>
<div class="scoringRulesItem">
<div class="scoringRulesEcharts">
<span class="scoringRulesTitle">图表</span>
<div>
<li><span>Article</span> 0=1,1=0.5,2-3=1,4=1.5,5-~=2</li>
<li><span>Review</span> 0=1,1=0.5,2=1,3=1.5,4-~=2</li>
<li><span>其他类型:</span> 0=0,1=1,2=2</li>
</div>
</div>
</div>
<div class="scoringRulesItem">
<div class="scoringRulesEcharts">
<span class="scoringRulesTitle">图表扣分</span>
<div>
<p>tmr这本刊article文章&lt;3扣0.5&lt;2扣1,&lt;1扣2review:0扣1</p>
<p>其他期刊article&lt;2扣0.5&lt;1扣1review0扣0.5</p>
</div>
</div>
</div>
<div class="scoringRulesItem">
<li><span class="scoringRulesTitle">国家</span> 发达国家1,非中国印度国家0.5</li>
</div>
<div class="scoringRulesItem">
<li>
<span class="scoringRulesTitle">作者单位</span>
任意作者,来自热门机构+1.5,非热门机构+1 热门领域+1 带基金+1
</li>
</div>
</ul>
</div>
</div>
</el-popover>
<i class="el-icon-refresh refreshBtn" @click="refreshScore(item)"></i> <i class="el-icon-refresh refreshBtn" @click="refreshScore(item)"></i>
</p> </p>
<p style="font-size: 18px; font-weight: bold; fmargin-bottom: 5px" v-if="item.reportList.length == 0"> <p style="font-size: 18px; font-weight: bold; fmargin-bottom: 5px" v-if="item.reportList.length == 0">
@@ -559,119 +625,119 @@
<b style="font-size: 16px; letter-spacing: -0.5px">Reviewer Decision</b> <b style="font-size: 16px; letter-spacing: -0.5px">Reviewer Decision</b>
<p style="height: 5px"></p> <p style="height: 5px"></p>
<div class="overflow-x-auto"> <div class="overflow-x-auto">
<!-- 上面的表格代码放在这里 --> <!-- 上面的表格代码放在这里 -->
<table class="review_table" > <table class="review_table">
<thead> <thead>
<tr> <tr>
<th></th> <th></th>
<!-- 补充表头文本,原代码是空,建议加上 --> <!-- 补充表头文本,原代码是空,建议加上 -->
<th>1<sup>st</sup> review</th> <th>1<sup>st</sup> review</th>
<!-- 表头按最大重复次数遍历生成2nd、3rd...列 --> <!-- 表头按最大重复次数遍历生成2nd、3rd...列 -->
<template v-for="(_, index1) in maxRepeatReviewCount(item)"> <template v-for="(_, index1) in maxRepeatReviewCount(item)">
<th>{{ index1 + 2 }}<sup>nd</sup> review</th> <th>{{ index1 + 2 }}<sup>nd</sup> review</th>
</template> </template>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<!-- 遍历每个评审者 --> <!-- 遍历每个评审者 -->
<tr v-for="(iken, reviewerIndex) in item.reviewScore"> <tr v-for="(iken, reviewerIndex) in item.reviewScore">
<td>Reviewer {{ reviewerIndex + 1 }}</td> <td>Reviewer {{ reviewerIndex + 1 }}</td>
<!-- 1st review原逻辑不变 --> <!-- 1st review原逻辑不变 -->
<td >
<span style="display: inline-block; margin-left: 4px; margin-right: 8px">
<font
v-if="iken.state == 0"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #ccc;
"
>
</font>
<font
v-if="iken.state == 1 || iken.state == 3"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #67c23a;
"
>
</font>
<font
v-if="iken.state == 2"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #f56c6c;
"
>
</font>
</span>
<span>{{ mystate(iken.state) }}</span>
</td>
<!-- 关键按最大重复次数遍历而非仅遍历当前iken.repeat -->
<template v-for="(_1,index1) in maxRepeatReviewCount(item)">
<td> <td>
<!-- 补全逻辑判断当前评审者的repeat中是否有第index1条数据 --> <span style="display: inline-block; margin-left: 4px; margin-right: 8px">
<span v-if="Array.isArray(iken.repeat) && iken.repeat[index1]"> <font
<span style="display: inline-block; margin-left: 4px; margin-right: 8px"> v-if="iken.state == 0"
<font style="
v-if="iken.repeat[index1].recommend == 1" width: 12px;
style=" height: 12px;
width: 12px; display: block;
height: 12px; border-radius: 10px;
display: block; background-color: #ccc;
border-radius: 10px; "
background-color: #67c23a; >
" </font>
> <font
</font> v-if="iken.state == 1 || iken.state == 3"
<font style="
v-if="iken.repeat[index1].recommend == 2" width: 12px;
style=" height: 12px;
width: 12px; display: block;
height: 12px; border-radius: 10px;
display: block; background-color: #67c23a;
border-radius: 10px; "
background-color: #f56c6c; >
" </font>
> <font
</font> v-if="iken.state == 2"
<font style="
v-if="iken.repeat[index1].recommend == 3" width: 12px;
style=" height: 12px;
width: 12px; display: block;
height: 12px; border-radius: 10px;
display: block; background-color: #f56c6c;
border-radius: 10px; "
background-color: #006699; >
" </font>
>
</font>
</span>
<!-- 有数据按原逻辑显示Accept/Reject等 -->
<span v-if="iken.repeat[index1].recommend == 1">Accept</span>
<span v-else-if="iken.repeat[index1].recommend == 2">Reject</span>
<span v-else-if="iken.repeat[index1].recommend == 3">Revision</span>
<span v-else>No reply</span>
</span>
<span v-else>
<!-- 无数据:补全空内容(可自定义为“-”“无”等) -->
-
</span> </span>
<span>{{ mystate(iken.state) }}</span>
</td> </td>
</template> <!-- 关键按最大重复次数遍历而非仅遍历当前iken.repeat -->
</tr> <template v-for="(_1, index1) in maxRepeatReviewCount(item)">
</tbody> <td>
</table> <!-- 补全逻辑判断当前评审者的repeat中是否有第index1条数据 -->
</div> <span v-if="Array.isArray(iken.repeat) && iken.repeat[index1]">
<span style="display: inline-block; margin-left: 4px; margin-right: 8px">
<font
v-if="iken.repeat[index1].recommend == 1"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #67c23a;
"
>
</font>
<font
v-if="iken.repeat[index1].recommend == 2"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #f56c6c;
"
>
</font>
<font
v-if="iken.repeat[index1].recommend == 3"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #006699;
"
>
</font>
</span>
<!-- 有数据按原逻辑显示Accept/Reject等 -->
<span v-if="iken.repeat[index1].recommend == 1">Accept</span>
<span v-else-if="iken.repeat[index1].recommend == 2">Reject</span>
<span v-else-if="iken.repeat[index1].recommend == 3">Revision</span>
<span v-else>No reply</span>
</span>
<span v-else>
<!-- 无数据:补全空内容(可自定义为“-”“无”等) -->
-
</span>
</td>
</template>
</tr>
</tbody>
</table>
</div>
<!-- <div <!-- <div
v-for="(iken, index) in item.reviewScore" v-for="(iken, index) in item.reviewScore"
@@ -768,15 +834,13 @@
</div> --> </div> -->
<p style="margin-top: 10px"> <p style="margin-top: 10px">
<b @click="articleReviewer(item)" class="btnCliArt"> <b @click="articleReviewer(item)" class="btnCliArt">
<i :class="item.state == 8 ? 'el-icon-view' : 'el-icon-edit'"></i> Inviting Reviewer <i :class="item.state == 8 ? 'el-icon-view' : 'el-icon-edit'"></i> Inviting Reviewer
</b> </b>
</p> </p>
</div> </div>
</template> </template>
<template v-if="query.state == 8"> <template v-if="query.state == 8">
<div class="fixCard" style="width: calc((100% - 320px - 18px) / 2); flex-shrink: 0; position: relative"> <div class="fixCard" style="width: calc((100% - 320px - 18px) / 2); flex-shrink: 0; position: relative">
@@ -2175,23 +2239,21 @@ export default {
}, },
methods: { methods: {
maxRepeatReviewCount(item) { maxRepeatReviewCount(item) {
if (!item || !Array.isArray(item.reviewScore)) return null; // 边界处理无数据返回null if (!item || !Array.isArray(item.reviewScore)) return null; // 边界处理无数据返回null
// 遍历所有评审者找到repeat数组长度最大的那条数据 // 遍历所有评审者找到repeat数组长度最大的那条数据
const maxItem = item.reviewScore.reduce((maxItem, currentItem) => { const maxItem = item.reviewScore.reduce((maxItem, currentItem) => {
// 计算当前项的repeat长度非数组则视为0 // 计算当前项的repeat长度非数组则视为0
const currentLen = Array.isArray(currentItem.repeat) ? currentItem.repeat.length : 0; const currentLen = Array.isArray(currentItem.repeat) ? currentItem.repeat.length : 0;
// 计算当前最大项的repeat长度非数组则视为0 // 计算当前最大项的repeat长度非数组则视为0
const maxLen = Array.isArray(maxItem.repeat) ? maxItem.repeat.length : 0; const maxLen = Array.isArray(maxItem.repeat) ? maxItem.repeat.length : 0;
// 如果当前项长度更大,则更新最大项 // 如果当前项长度更大,则更新最大项
return currentLen > maxLen ? currentItem : maxItem; return currentLen > maxLen ? currentItem : maxItem;
}, {}); // 初始值设为一个空对象 }, {}); // 初始值设为一个空对象
// console.log('maxItem at line 2142:', maxItem.repeat.length) // console.log('maxItem at line 2142:', maxItem.repeat.length)
return maxItem&&maxItem.repeat?maxItem.repeat.length:0; return maxItem && maxItem.repeat ? maxItem.repeat.length : 0;
},
},
mystate(mystate) { mystate(mystate) {
let str = ''; let str = '';
switch (mystate) { switch (mystate) {
@@ -4055,7 +4117,7 @@ td {
padding: 6px; padding: 6px;
min-width: 70px; min-width: 70px;
border: 1px solid #ddd; border: 1px solid #ddd;
text-align: left; text-align: left;
} }
@@ -4066,15 +4128,29 @@ td {
.review_table td { .review_table td {
font-size: 12px; font-size: 12px;
/* background-color: #f0f0f0; */ /* background-color: #f0f0f0; */
} }
.review_table tr:hover { .review_table tr:hover {
/* background-color: #fff; */ /* background-color: #fff; */
} }
.overflow-x-auto{ .overflow-x-auto {
overflow-x: auto; overflow-x: auto;
} }
.scoringRules ul li {
list-style: none;
}
.scoringRules ul .scoringRulesEcharts {
display: flex;
align-items: flex-start;
justify-content: flex-start;
}
.scoringRulesTitle {
display: inline-block;
width: 60px;
color: #0077b8e6;
font-weight: 700;
}
.scoringRulesItem {
margin-top: 10px;
}
</style> </style>