This commit is contained in:
2025-09-01 13:05:33 +08:00
parent d71f54f1f7
commit 4c30099d77
14 changed files with 510 additions and 136 deletions

View File

@@ -229,11 +229,11 @@ const en = {
man_ing1: 'Journal information',
man_ing2: 'Article List',
edit_oria: 'Editorial board member',
edit_oria1: 'Final Review',
edit_oria1: 'Final Decision',
edit_oria2: 'Accepted manuscript',
edit_ewer: 'Reviewer',
edit_ewer1: 'Final Review',
edit_ewer2: 'Final Review History',
edit_ewer1: 'Final Decision',
edit_ewer2: 'Final Decision History',
you_thed: 'Young scholar',
you_thed1: 'Pending review',
guest: 'Guest editor',
@@ -277,7 +277,7 @@ const en = {
state4: 'Revision',
state5: 'Accept',
state6: 'Pre-accept',
state8: 'Final Review',
state8: 'Final Decision',
act1: 'Dealing',
act2: 'Finished'
},

View File

@@ -1,5 +1,5 @@
<template>
<el-dialog destroy-on-close title="Final Reviewer Detail" :visible.sync="editVisible1" width="1200px">
<el-dialog destroy-on-close title="Final Decision Detail" :visible.sync="editVisible1" width="1200px">
<div>
<div class="crumbs">
<!-- <el-breadcrumb separator="/">
@@ -15,10 +15,10 @@
<el-form-item label="Article : ">
<span>{{ detailDate.article }}</span>
</el-form-item>
<el-form-item label="Final Reviewer : ">
<el-form-item label="Final Decision : ">
<span>{{ detailDate.reviewer }}</span>
</el-form-item>
<el-form-item label="Final Review Time : ">
<el-form-item label="Final Decision Time : ">
<span>{{ detailDate.ctime }}</span>
</el-form-item>
<el-form-item label="Feedback : ">
@@ -166,7 +166,7 @@
</el-col>
<el-col :span="8" v-if="recordList && recordList.length > 0">
<div class="clearfix fsheader">
<h4>Final Review Archive</h4>
<h4>Final Decision Archive</h4>
</div>
<div class="time">
<el-timeline>

View File

@@ -2,7 +2,7 @@
<div>
<div class="crumbs">
<el-breadcrumb separator="/">
<el-breadcrumb-item> <i class="el-icon-lx-calendar"></i> Manuscript final reviewer list </el-breadcrumb-item>
<el-breadcrumb-item> <i class="el-icon-lx-calendar"></i> Manuscript Final Decision list </el-breadcrumb-item>
<el-breadcrumb-item>
<div>
<span>ID:{{ articleBaseInfo.accept_sn }} </span>
@@ -131,7 +131,7 @@
custom-class="editorialBoardDialog"
>
<el-select
v-model="editorialBoardForm.type"
v-model="editorialBoardForm.board_type"
placeholder=""
@change="selectEditorialBoardType"
style="margin-bottom: 20px; width: 200px"
@@ -276,7 +276,7 @@ export default {
editorialBoardForm: {
page: 1,
size: 10,
type: 0
board_type: 0
},
majorData: [],
baseUrl: this.Common.baseUrl,
@@ -363,6 +363,7 @@ export default {
methods: {
selectEditorialBoardType(type) {
console.log('type at line 525:', type);
this.editorialBoardForm.board_type = type;
this.editorialBoardForm.page = 1;
this.$forceUpdate();
this.getEditorialBoardType();
@@ -507,6 +508,7 @@ export default {
},
getEditorialBoardType() {
const loading = this.$loading({
lock: true,
text: 'Loading',
@@ -532,6 +534,11 @@ export default {
},
// 添加推荐审稿人
async openSuggRev() {
this. editorialBoardForm= {
page: 1,
size: 10,
board_type: 0
}
await this.getEditorialBoardType();
},
selSuggest(e) {

View File

@@ -445,7 +445,7 @@
class="art_author_list">
<template slot="title">
<b class="com_shu">{{index+1}}</b>
Final Reviewer Comment
Final Decision Comment
<font style="margin: 0 0 0 17px;color: #888;">
<i class="el-icon-time" style="margin:0 2px 0 0;"></i>
{{item.review_time?item.review_time.split(' ')[0]:''}}
@@ -894,7 +894,7 @@ this.$router.push({
sfr = '#5a90e105;';
sgr = '#5a90e14D;';
skr = '#5a90e1;';
slr = 'Final Review';
slr = 'Final Decision';
break;
default:
str = '#8888881F;';

View File

@@ -552,79 +552,234 @@
</div>
</template>
<template v-if="query.state == 8">
<div class="fixCard reviewer_decision" style="width: 280px; flex-shrink: 0; position: relative">
<div
class="fixCard reviewer_decision"
style="width: calc((100% - 320px - 18px) / 2); flex-shrink: 0; position: relative"
>
<b style="font-size: 16px; letter-spacing: -0.5px">Reviewer Decision</b>
<p style="height: 5px"></p>
<div class="overflow-x-auto">
<!-- 上面的表格代码放在这里 -->
<table class="review_table" >
<thead>
<tr>
<th></th>
<!-- 补充表头文本,原代码是空,建议加上 -->
<th>1<sup>st</sup> review</th>
<!-- 表头按最大重复次数遍历生成2nd、3rd...列 -->
<template v-for="(_, index1) in maxRepeatReviewCount(item)">
<th>{{ index1 + 2 }}<sup>nd</sup> review</th>
</template>
</tr>
</thead>
<tbody>
<!-- 遍历每个评审者 -->
<tr v-for="(iken, reviewerIndex) in item.reviewScore">
<td>Reviewer {{ reviewerIndex + 1 }}</td>
<!-- 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>
<!-- 补全逻辑判断当前评审者的repeat中是否有第index1条数据 -->
<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>
<p v-for="(iken, index) in item.reviewScore" style="line-height: 24px" :key="index">
{{ iken.realname }} : <b style="color: #db890e; font-size: 18px">{{ iken.rated }}</b>
<span style="display: inline-block; margin-left: 10px">
<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>
<el-button
style="margin-left: 10px"
type="text"
icon="el-icon-tickets"
@click="showdetail(iken, 'reviewer')"
>Detail</el-button
>
</p>
<!-- <p v-if="item.reviewScore.length > 0" style="font-size: 15px; margin: 0 0 5px 0">
Average score: <b style="font-size: 18px; color: #db890e">{{ avegeCount(item.reviewScore) }}</b>
</p> -->
<!-- <div
v-for="(iken, index) in item.reviewScore"
style="line-height: 24px; text-align: left; display: flex; align-items: center; margin-bottom: 20px"
:key="index"
>
Reviewer{{ index + 1 }} :
<div>
<b style="color: #db890e; font-size: 18px">{{ iken.rated }}</b>
<span style="display: inline-block; margin-left: 4px; margin-right: 4px">
<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>
</div>
<span v-if="iken.repeat.length > 0" style="margin-left: 4px; margin-right: 4px"> -> </span>
<div v-if="iken.repeat.length > 0">
<span v-for="(iken1, index1) in iken.repeat" style="margin-right: 4px; display: block">
Second review {{ index1 + 1 }} :
<span style="display: inline-block; margin-left: 4px; margin-right: 4px">
<font
v-if="iken1.recommend == 1"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #67c23a;
"
>
</font>
<font
v-if="iken1.recommend == 2"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #f56c6c;
"
>
</font>
<font
v-if="iken1.recommend == 3"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #006699;
"
>
</font>
</span>
<span v-if="iken1.recommend == 1">Accept</span>
<span v-else-if="iken1.recommend == 2">Reject</span>
<span v-else-if="iken1.recommend == 3">Revison</span>
<span v-else>No reply </span>
</span>
</div>
</div> -->
<p style="margin-top: 10px">
<b @click="articleReviewer(item)" class="btnCliArt">
<i :class="item.state == 8 ? 'el-icon-view' : 'el-icon-edit'"></i> Inviting Reviewer
</b>
<!-- <el-button size="mini" type="primary" icon="el-icon-user" @click="articleReviewer(item)">
Inviting Reviewer</el-button> -->
</p>
<!-- <p style="height: 20px"></p> -->
<!-- <p
style="
position: absolute;
bottom: 10px;
display: flex;
justify-content: center;
width: calc(100% - 20px);
"
>
<b @click="articleReviewer(item)" class="btnCliArt">
<i :class="item.state == 8 ? 'el-icon-view' : 'el-icon-edit'"></i> Inviting Reviewer
</b>
</p> -->
</div>
</div>
</template>
<template v-if="query.state == 8">
<div class="fixCard" style="width: calc((100% - 320px - 280px - 18px)); flex-shrink: 0; position: relative">
<div class="fixCard" style="width: calc((100% - 320px - 18px) / 2); flex-shrink: 0; position: relative">
<b style="font-size: 16px; letter-spacing: -0.5px">Editorial Board Decision</b>
<p style="height: 20px"></p>
<p v-for="(iken, index) in item.final" style="line-height: 24px" :key="index" v-if="iken.state != 4">
@@ -718,7 +873,6 @@
</div> -->
<div class="fixCard" style="width: 320px; flex-shrink: 0" v-if="query.state == 8">
<b style="font-size: 16px; letter-spacing: -0.5px">Corresponding Author</b>
<p style="height: 10px"></p>
<div style="text-align: left">
@@ -728,23 +882,27 @@
<span v-if="item.H.phone != ''" style="margin-left: 5px; color: #666">({{ item.H.phone }})</span>
</p>
<p v-if="item.H.email != ''" style="margin: 8px 0 5px 0; line-height: 22px">
<b @click="linkEmail({...item, ...item.H})" class="btnCliArt" style="">
<b @click="linkEmail({ ...item, ...item.H })" class="btnCliArt" style="">
<font style="color: #999">Email :</font>
{{ item.H.email }}
</b>
<b @click="linkEmailist({...item, ...item.H})" v-if="item.H.emailh == 1" class="btnCliArt" style="margin-left: 15px">
<b
@click="linkEmailist({ ...item, ...item.H })"
v-if="item.H.emailh == 1"
class="btnCliArt"
style="margin-left: 15px"
>
<i class="el-icon-refresh-left"></i> History
</b>
</p>
</div>
<p style="margin-top: 20px">
<b @click="articleCommun({...item, ...item.H})" class="btnCliArt">
<b @click="articleCommun({ ...item, ...item.H })" class="btnCliArt">
<i class="el-icon-chat-line-square"></i> Communication
</b>
</p>
</div>
<div class="fixCard" style="width: 320px; flex-shrink: 0" v-else>
<b style="font-size: 16px; letter-spacing: -0.5px">Corresponding Author</b>
<p style="height: 10px"></p>
<div style="text-align: left">
@@ -1102,7 +1260,7 @@
<el-option :key="2" label="Under review" :value="2"></el-option>
<el-option :key="3" label="Reject" :value="3"></el-option>
<el-option :key="4" label="Revision" :value="4"></el-option>
<el-option :key="8" label="Final Review" :value="8"></el-option>
<el-option :key="8" label="Final Decision" :value="8"></el-option>
<el-option :key="6" label="Pre-accept" :value="6"></el-option>
<el-option :key="5" label="Accept" :value="5" :disabled="curState == 6 ? false : true"></el-option>
</el-select>
@@ -1677,9 +1835,8 @@
<el-button @click="dialogVisible = false">Cancel</el-button>
</span>
</el-dialog>
<articleEditorDetail :dateId="FinalDetailBaseInfo.id" ref="commonFinalDetail"></articleEditorDetail>
<articleEditorDetail :dateId="FinalDetailBaseInfo.id" ref="commonFinalDetail"></articleEditorDetail>
</div>
</template>
@@ -2017,6 +2174,43 @@ export default {
}
},
methods: {
maxRepeatReviewCount(item) {
if (!item || !Array.isArray(item.reviewScore)) return null; // 边界处理无数据返回null
// 遍历所有评审者找到repeat数组长度最大的那条数据
const maxItem = item.reviewScore.reduce((maxItem, currentItem) => {
// 计算当前项的repeat长度非数组则视为0
const currentLen = Array.isArray(currentItem.repeat) ? currentItem.repeat.length : 0;
// 计算当前最大项的repeat长度非数组则视为0
const maxLen = Array.isArray(maxItem.repeat) ? maxItem.repeat.length : 0;
// 如果当前项长度更大,则更新最大项
return currentLen > maxLen ? currentItem : maxItem;
}, {}); // 初始值设为一个空对象
console.log('maxItem at line 2142:', maxItem.repeat.length)
return maxItem.repeat.length;
},
mystate(mystate) {
let str = '';
switch (mystate) {
case 0:
str = 'With reviewer';
break;
case 1:
str = 'Major';
break;
case 2:
str = 'Reject';
break;
case 3:
// str = 'Accept';
str = 'Minor';
break;
}
return str;
},
showdetail(row, type) {
console.log('row at line 1964:', row);
if (type == 'reviewer') {
@@ -2032,7 +2226,7 @@ export default {
}
} else {
this.FinalDetailBaseInfo = { ...row };
this.$nextTick(() => {
this.$refs.commonFinalDetail.init();
});
@@ -3849,4 +4043,38 @@ background-color: #f5f5f5b3;
.articleBaseInfo7 .manuscript_files{
background-color: #f5f5f5b3;
} */
.review_table {
width: 100%;
margin-top: 10px;
border-collapse: collapse; /* 合并表格边框 */
}
.review_table th,
td {
padding: 6px;
min-width: 70px;
border: 1px solid #ddd;
text-align: left;
}
.review_table th {
font-size: 12px;
background-color: #f0f0f0;
}
.review_table td {
font-size: 12px;
/* background-color: #f0f0f0; */
}
.review_table tr:hover {
/* background-color: #fff; */
}
.overflow-x-auto{
overflow-x: auto;
}
</style>

View File

@@ -381,7 +381,7 @@ export default {
str = 'Proof';
break;
case 8:
str = 'Final Review';
str = 'Final Decision';
break;
default:

View File

@@ -100,14 +100,14 @@
</div>
<div class="art_author_">
<h2>
Comments from Final reviewers
Comments from Final Decision
</h2>
<el-collapse v-model="activeFinalComment" v-if="comentFinal!=''">
<el-collapse-item v-for="(item,index) in comentFinal" :name="index" :key="index"
class="art_author_list">
<template slot="title">
<b class="com_shu">{{index+1}}</b>
Final Reviewer Comment
Final Decision Comment
<font style="margin: 0 0 0 50px;color: #888;">
<i class="el-icon-time" style="margin:0 2px 0 0;"></i>
{{item.review_time?item.review_time.split(' ')[0]:''}}

View File

@@ -31,7 +31,7 @@
</div>
</el-form-item>
</template>
<el-form-item label="Confidential Comments to the Editor" prop="suggest_for_editor">
<el-form-item label="Comment for Editor" prop="suggest_for_editor">
<el-input v-if="isEdit"
type="textarea"
@@ -45,9 +45,9 @@
</el-form-item>
<!-- <el-form-item label="Please choose disclose your name or remain anonymous" v-if="isEdit">
<el-form-item label="Please choose disclose your name or remain anonymous" v-if="isEdit">
<el-radio-group v-model="questionform.is_anonymous" style="line-height: 30px">
<el-radio :label="0" :disabled="!isEdit && questionform.is_anonymous != 0">Disclose name</el-radio>
<el-radio :label="2" :disabled="!isEdit && questionform.is_anonymous != 2">Disclose name</el-radio>
<br />
<el-radio :label="1" :disabled="!isEdit && questionform.is_anonymous != 1">Remain anonymous</el-radio>
</el-radio-group>
@@ -57,14 +57,14 @@
<br />For example, {{ txt_mess.title }} would like to thank AAAAAAAA, BBBBBBBB, and other anonymous reviewers for their
invaluable contributions to the peer review process of this paper.
</p>
</el-form-item> -->
<!-- <el-form-item label="Please choose disclose your name or remain anonymous" v-if="!isEdit && pagetype == 'Editor'">
</el-form-item>
<el-form-item label="Please choose disclose your name or remain anonymous" v-if="!isEdit && pagetype == 'Editor'">
<el-radio-group v-model="questionform.is_anonymous" style="line-height: 30px">
<el-radio :label="0" :disabled="!isEdit && questionform.is_anonymous != 0">Disclose name</el-radio>
<el-radio :label="2" :disabled="!isEdit && questionform.is_anonymous != 2">Disclose name</el-radio>
<br />
<el-radio :label="1" :disabled="!isEdit && questionform.is_anonymous != 1">Remain anonymous</el-radio>
</el-radio-group>
</el-form-item> -->
</el-form-item>
<!-- 暂时注销 -->
<!-- -->
<el-form-item>
@@ -155,7 +155,11 @@ export default {
},
methods: {
getData() {
getData() { this.rules = {
state: [{ required: true, message: 'Please select the manuscript processing status', trigger: 'blur' }],
suggest_for_editor: [{ required: true, message: 'please Input Comments for the Editor', trigger: 'blur' }],
suggest_for_author: [{ required: true, message: 'please Input Comments for the Authors', trigger: 'blur' }]
};
// Fetch article data
this.questionform = {
reviewer_id: this.baseQuestionform.reviewer_id,
@@ -165,14 +169,16 @@ export default {
suggest_for_editor: this.baseQuestionform.suggest_for_editor,
suggest_for_author: this.baseQuestionform.suggest_for_author
};
this.rules = {
state: [{ required: true, message: 'Please select the manuscript processing status', trigger: 'blur' }],
suggest_for_editor: [{ required: true, message: 'please Input Comments for the Editor', trigger: 'blur' }],
suggest_for_author: [{ required: true, message: 'please Input Comments for the Authors', trigger: 'blur' }]
};
this.$refs.question.clearValidate();
},
questionSubmit() {
if (this.questionform.is_anonymous == '' && this.questionform.is_anonymous != '2') {
this.$message.error('Please choose disclose your name or remain anonymous.');
return false;
}
if (this.questionform.state == 0) {
this.$message.error('Please select the manuscript processing status.');
return false;

View File

@@ -3,7 +3,7 @@
<div class="crumbs">
<el-breadcrumb separator="/">
<el-breadcrumb-item>
<i class="el-icon-collection"></i> <span class="top_dao"> Final Review</span>
<i class="el-icon-collection"></i> <span class="top_dao"> Final Decision</span>
</el-breadcrumb-item>
</el-breadcrumb>
</div>
@@ -16,7 +16,7 @@
<div class="ma_title" style="height: 100%;">
<h2>
<!-- <img src="../../assets/img/icon_5.png" alt="" class="icon_img"> -->
Under review
Final Decision
</h2>
In this column, the manuscripts that currently need your comments are displayed. You can click
detail to review
@@ -29,7 +29,7 @@
<h3><span
style="margin-right: 6px;color: #006699;">{{index+1}}.</span>{{item.title }}
</h3>
<el-button type="primary" plain style="float: right;">Final Review</el-button>
<el-button type="primary" plain style="float: right;">Final Decision</el-button>
</router-link>
<h4>
<span>

View File

@@ -3,7 +3,7 @@
<div class="crumbs">
<el-breadcrumb separator="/">
<el-breadcrumb-item>
<i class="el-icon-collection"></i> <span class="top_dao"> Final Review History</span>
<i class="el-icon-collection"></i> <span class="top_dao"> Final Decision History</span>
</el-breadcrumb-item>
</el-breadcrumb>
</div>
@@ -44,7 +44,7 @@
<b v-if="scope.row.article_state == 3">Reject</b>
<b v-if="scope.row.article_state == 4">Revision</b>
<b v-if="scope.row.article_state == 5">Accept</b>
<b v-if="scope.row.article_state == 8">Final Review</b>
<b v-if="scope.row.article_state == 8">Final Decision</b>
<b v-if="scope.row.astate == 6">Pre-accept</b>
</template>
@@ -70,7 +70,7 @@
size="mini"
@click="saveNow(scope.$index, scope.row)"
v-if="scope.row.state == 5"
>Final Review Now
>Final Decision Now
</el-button>
<el-button
type="danger"
@@ -109,7 +109,7 @@
</el-row>
</div>
<el-dialog destroy-on-close title="Final Reviewe Detail" :visible.sync="editVisible1" width="1200px">
<el-dialog destroy-on-close title="Detailed Comment for Final decision" :visible.sync="editVisible1" width="1200px">
<common-editor-article
type="questionform"

View File

@@ -5,9 +5,9 @@
<el-breadcrumb-item>
<i class="el-icon-collection"></i>
<router-link :to="{ path: '/editPeerewer' }">
<span class="top_dao"> Final Review Article</span>
<span class="top_dao"> Final Decision Article</span>
</router-link>
>> Final Review Article Detail
>> Final Decision Article Detail
</el-breadcrumb-item>
</el-breadcrumb>
</div>
@@ -83,7 +83,8 @@ If you're still having trouble with Chrome, you could use other browsers to comp
</p>
</div>
<el-collapse v-model="activeNames" accordion v-if="conmentList.length > 0" style="margin-top: 10px;">
<el-collapse v-model="activeNames" v-if="conmentList.length > 0||article_response.length > 0" style="margin-top: 10px;">
<el-collapse-item name="1">
<template slot="title">
@@ -100,39 +101,69 @@ If you're still having trouble with Chrome, you could use other browsers to comp
</p>
<p><span class="comment_item_recommend_title">Reviewer : </span>
<p ><span class="comment_item_recommend_title">Reviewer : </span>
<b v-if="item.reviewer_id == User_Id">{{ item.realname }}</b>
<b v-if="item.reviewer_id != User_Id">XXXXXXXXXX</b>
<el-button type="primary" plain v-if="item.question&&item.question.art_rev_id" size="mini" @click="ques_visible(item.question)"
style="padding: 4px 10px;margin-left: 20px;">Referee's Assessment</el-button>
</p>
<p>
<p style="margin-top: 10px;">
<span class="comment_item_recommend_title"
>Recommendation : </span>
<span class="comment_item_recommend"><b v-if="item.question.recommend == 1">Minor revision</b>
<b v-if="item.question.recommend == 2">Major revision</b>
<b v-if="item.question.recommend == 3">Reject in current form, but may be resubmitted</b>
<b v-if="item.question.recommend == 4">Reject</b></span>
<el-timeline style="margin-left: 160px;" >
<el-timeline-item
v-for="(activity, index) in extractRecommendAndCtime(item)"
:key="index"
:timestamp="activity.ctimeFormatted">
<b style="margin-right: 20px;display: inline-block;width: 100px;color:#006699">{{ activity.title }}</b>
<span class="comment_item_recommend" v-if="activity.source=='question'"><b v-if="activity.recommend == 1">Minor revision</b>
<b v-if="activity.recommend == 2">Major revision</b>
<b v-if="activity.recommend == 3">Reject in current form, but may be resubmitted</b>
<b v-if="activity.recommend == 4">Reject</b></span>
<span class="comment_item_recommend" v-if="activity.source=='repeat'">
<b v-if="activity.recommend == 1">Accept</b>
<b v-else-if="activity.recommend == 2">Reject</b>
<b v-else-if="activity.recommend == 3">Revision</b>
<span v-else>No reply</span>
</span>
</el-timeline-item>
</el-timeline>
</p>
<p>
<p>
</p>
<!-- <p>
<span class="comment_item_recommend_title"
>Score : </span>
<span>{{item.question.score}}</span>
</p>
</p> -->
<p>
<!-- <p>
<span class="comment_item_recommend_title">Reviewed Time : </span>
<span class="">{{ item.ctime?item.ctime.split(' ')[0]:'' }}</span>
<el-button type="primary" v-if="item.question&&item.question.art_rev_id" size="mini" @click="ques_visible(item.question)"
style="padding: 4px 10px;margin-left: 20px;">Referee's Assessment</el-button>
</p>
</p> -->
@@ -143,6 +174,31 @@ If you're still having trouble with Chrome, you could use other browsers to comp
</div>
</el-collapse-item>
<el-collapse-item name="2">
<template slot="title">
<div class="review_title">
<b>Author's reply</b>
</div>
</template>
<div style="overflow: hidden">
<div class="file_sty" v-for="(item,i) in article_response" style="margin-top: 15px;width: 50%;float: left">
<img src="../../assets/img/icon_0.png" alt="" class="icon_img" />
<a :href="mediaUrl + item.file_url" target="_blank" class="txt_pdf"
>Manuscirpt
<span style="margin-left: 10px; color: #888; font-size: 13px">{{ item.artr_ctime }}</span>
<i class="el-icon-download" style="margin-left: 20px; color: #66b1ff; font-weight: bold"></i>
</a
><br />
</div>
</div>
</el-collapse-item>
</el-collapse>
@@ -198,7 +254,8 @@ import pdf from 'vue-pdf';
export default {
data() {
return {
activeNames:['1'],
activeNames:['1','2'],
questionVisible: false,
User_Id: localStorage.getItem('U_id'),
@@ -210,6 +267,7 @@ export default {
txt_mess: {},
fileList: [],
conmentList: [],
article_response: [],
picList: [],
SMList: [], //补充材料
mediaUrl: this.Common.mediaUrl,
@@ -306,6 +364,72 @@ export default {
this.questionform1.type = e.type;
this.questionform1.score = e.score;
},
formatTimeToDash(time) {
let date;
// 1. 处理时间戳(秒级,需转毫秒级)
if (typeof time === 'number') {
date = new Date(time * 1000);
}
// 2. 处理字符串时间(如 "2025/06/25" 或 "2025.06.25"
else if (typeof time === 'string') {
// 先把 "/" 或 "." 替换为 "-",避免 Date 解析失败
const standardTime = time.replace(/[\/.]/g, '-');
date = new Date(standardTime);
}
// 3. 非法格式直接返回原始值(避免报错)
else {
return time;
}
// 手动拼接格式(避免浏览器 toLocaleString() 差异,确保分隔符为 "-"
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份 0-11补 0 为两位数
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
,
extractRecommendAndCtime(data) {
const result = [];
// 提取question中的recommend和ctime
if (data.question && data.question.recommend !== undefined && data.question.ctime !== undefined) {
result.push({
source: 'question',
title:'First round of review',
recommend: data.question.recommend,
ctime: data.question.ctime,
// 转换时间戳为可读格式(如果是时间戳)
ctimeFormatted: typeof data.question.ctime === 'number'
?this.formatTimeToDash(data.question.ctime)
: data.question.ctime
});
}
// 提取repeat数组中的recommend和ctime
if (Array.isArray(data.repeat)) {
data.repeat.forEach((item, index) => {
if (item.recommend !== undefined && item.ctime !== undefined) {
result.push({
source: `repeat`,
title:'Second round of review',
recommend: item.recommend,
ctime: item.ctime,
ctimeFormatted: item.ctime
});
}
});
}
// 提取reviewsList数组中的recommend和ctime
return result;
},
getData() {
// 获取文章信息
this.$api
@@ -325,7 +449,10 @@ export default {
this.txt_mess = res.data.article;
this.journal_id = res.journal_id;
this.conmentList = res.data.article_review;
this.conmentList = res.data.article_review
this.article_response = res.data.article_response
// console.log('journal_id', this.journal_id);
@@ -345,7 +472,8 @@ export default {
record_id: this.Art_id
})
.then((res) => {
for (var i = 0; i < res.data.length; i++) {
if(res.status==1){
for (var i = 0; i < res.data.length; i++) {
let date = new Date(parseInt(res.data[i].ctime) * 1000);
let Y = date.getFullYear() + '-';
let M = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) + '-' : date.getMonth() + 1 + '-';
@@ -368,6 +496,11 @@ export default {
} else {
this.pdfUrl = 'https://submission.tmrjournals.com/public/' + pdfOut+`&ui=en-US`;
}
}else{
this.$message.error(res.msg);
}
})
.catch((err) => {
this.$message.error(err);
@@ -547,7 +680,7 @@ border-bottom: none !important;
}
.comment_item_recommend_title{
color: #888;
margin: 0 5px 0 0;
margin: 4px 5px 0 0;
font-weight: 600;

View File

@@ -5,9 +5,9 @@
<el-breadcrumb-item>
<i class="el-icon-collection"></i>
<router-link :to="{ path: '/peerewer' }">
<span class="top_dao"> Final Review Article</span>
<span class="top_dao"> Final Decision Article</span>
</router-link>
>> Final Review Completed
>> Final Decision Completed
</el-breadcrumb-item>
</el-breadcrumb>
</div>
@@ -45,7 +45,7 @@
p-id="29681"
></path>
</svg>
<p>Final Review completed !</p>
<p>Final Decision completed !</p>
<br clear="both" />
</div>
<!-- 暂时去掉 -->
@@ -53,10 +53,10 @@
Dear {{ getUserName() }}, We have received all of your review comments.<br />
The editorial team would like to express our sincere respect and gratitude to you for your meticulous review and
guidance as the final reviewer of this journal.
guidance as the final decision of this journal.
</div>
<div class="suss_page_3">
<a href="/editPeerewer">Return to Final Review page</a>
<a href="/editPeerewer">Return to Final Decision page</a>
</div>
</el-card>
</div>

View File

@@ -33,7 +33,7 @@
<b v-if="scope.row.astate == 3">Reject</b>
<b v-if="scope.row.astate == 4">Revision</b>
<b v-if="scope.row.astate == 5">Accept</b>
<b v-if="scope.row.astate == 8">Final Review</b>
<b v-if="scope.row.astate == 8">Final Decision</b>
<b v-if="scope.row.astate == 6">Pre-accept</b>
</template>
</el-table-column>

View File

@@ -672,13 +672,13 @@ export default new Router({
path: '/editPeerewer', //审稿人进行中列表
component: () => import('../components/page/edit_per_ewer'),
meta: {
title: 'Final Review'
title: 'Final Decision'
}
}, {
path: '/editPerhistory', //审稿人历史列表
component: () => import('../components/page/edit_per_history'),
meta: {
title: 'Final Review History',
title: 'Final Decision History',
}
},