Files
tougao_web/src/components/page/articleDetailEditor.vue
始于初见 5edf128cfb 1、审稿人14天超时 重新审稿邀请
2、nbsp 转换
3、H3标记为myh3
4、文章详情审稿和编委邮箱机构显示
5、稿号开头为Draft 状态为Reject->Awaiting Submission
6、作者端稿件重复(标题)
7、produce 增加 通讯作者详细地址
8、produce 增加 是否显示图文摘要1
2026-02-10 09:36:35 +08:00

3349 lines
155 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div>
<div class="crumbs">
<div class="art_state_message_id" style="padding-left: 18px">
<font
>ID : <b style="margin-right: 25px">{{ form.accept_sn }}</b></font
>
<font
>Journal : <b style="margin-right: 25px">{{ journal_me }}</b></font
>
<font
>Type : <b style="margin-right: 25px">{{ form.type | jtName }}</b></font
>
<font style=""
>Initial review score :
<el-popover placement="top-start" title="" width="540" trigger="hover">
<span style="cursor: pointer; color: rgb(219, 137, 14); font-weight: bold; font-size: 18px" slot="reference">{{
form.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="form.h_fen && form.h_fen > 0 ? `color:#db890e` : ''">{{ form.h_fen }}</span></span
>
</div>
<div>
<span
>图表:
<span :style="form.b_fen && form.b_fen > 0 ? `color:#db890e` : ''">{{ form.b_fen }}</span></span
>
</div>
<div>
<span
>国家:
<span :style="form.c_fen && form.c_fen > 0 ? `color:#db890e` : ''">{{ form.c_fen }}</span></span
>
</div>
<div>
<span
>单位:
<span :style="form.dw_fen && form.dw_fen > 0 ? `color:#db890e` : ''">{{
form.dw_fen
}}</span></span
>
</div>
<div>
<span
>领域分:
<span :style="form.ly_fen && form.ly_fen > 0 ? `color:#db890e` : ''">{{
form.ly_fen
}}</span></span
>
</div>
<div>
<span
>基金分:
<span :style="form.jj_fen && form.jj_fen > 0 ? `color:#db890e` : ''">{{
form.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>
<!-- <div>
<div class="scoringRules">
<div style="display: flex; justify-content: space-between; font-size: 16px; margin-bottom: 15px">
<div>
<span
>H指数:
<span :style="form.h_fen && form.h_fen > 0 ? `color:#db890e` : ''">{{ form.h_fen }}</span></span
>
</div>
<div>
<span
>图表:
<span :style="form.b_fen && form.b_fen > 0 ? `color:#db890e` : ''">{{ form.b_fen }}</span></span
>
</div>
<div>
<span
>国家:
<span :style="form.c_fen && form.c_fen > 0 ? `color:#db890e` : ''">{{ form.c_fen }}</span></span
>
</div>
<div>
<span
>单位:
<span :style="form.dw_fen && form.dw_fen > 0 ? `color:#db890e` : ''">{{
form.dw_fen
}}</span></span
>
</div>
<div>
<span
>领域分:
<span :style="form.ly_fen && form.ly_fen > 0 ? `color:#db890e` : ''">{{
form.ly_fen
}}</span></span
>
</div>
<div>
<span
>基金分:
<span :style="form.jj_fen && form.jj_fen > 0 ? `color:#db890e` : ''">{{
form.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>
</font>
</div>
<div style="position: relative" v-if="currentArticleData.ai_review == ''">
<el-tooltip
class="item"
effect="dark"
content="AI analysis takes 1 minute. Please click and refresh the page"
placement="top-start"
>
<img
src="@/assets/img/ai.png"
class="beautiful-gradient"
style="
opacity: 0.5;
width: 30px;
height: 30px;
margin-right: 4px;
position: absolute;
left: -15px;
top: -30px;
cursor: pointer;
"
@click="creatAI()"
/>
</el-tooltip>
</div>
<div style="position: relative" v-else>
<img
src="@/assets/img/ai.png"
class="beautiful-gradient"
style="width: 30px; height: 30px; margin-right: 4px; position: absolute; left: -15px; top: -30px; cursor: pointer"
@click="openAI()"
/>
</div>
</div>
<div class="container_state" v-loading="loading">
<div style="margin-bottom: 10px; margin-top: 0px; overflow: hidden">
<!-- <p class="beautiful-gradient"style="float: right;width: calc(100% - 40px);font-size: 13px;line-height: 16px;color: #1d45f2;" >{{ AIcontent }}</p> -->
</div>
<el-row :gutter="24">
<el-col :span="14">
<div class="art_state_">
<div class="art_state_message">
<p>
<font>Title :</font>
<b style="color: #333; font-weight: bold"> {{ form.title }}</b>
<b
v-if="form.articleId"
@click="corrSpe(form)"
class="btnCliArt"
style="cursor: pointer; margin-left: 20px; white-space: nowrap"
>
<i class="el-icon-paperclip"></i> Author's previous articles
</b>
</p>
<!-- <p v-show="form.type=='A'">
<font>Ethical Approval :</font><b>{{form.approval?'Yes':'No'}}</b>
</p> -->
<p>
<font>Ethical Approval :</font><b>{{ form.approval ? 'Yes' : 'No' }}</b>
<a
target="_blank"
:href="mediaUrl + form.approval_file"
v-if="form.approval == 1 && form.approval_file != ''"
style="color: #777"
>
<img
src="../../assets/img/icon_0.png"
style="vertical-align: text-bottom; margin: 0 10px 0 30px; width: 15px"
/>
<font>Ethical approval file</font>
<i
class="el-icon-download download"
style="vertical-align: middle; margin: 0 20px; font-weight: bold; color: #75abf1"
></i>
</a>
</p>
<p v-if="form.approval == 0 && form.approval_content != ''">
<font>Explain the reason clearly :</font><b>{{ form.approval_content }}</b>
</p>
<p v-if="form.special_num > 0">
<font>Special Issues :</font><b>{{ form.special_title }}</b>
</p>
<el-collapse class="auth_colla auth_collna_ew">
<el-collapse-item :title="authorList_name" name="1">
<div v-for="(item, index) in form.authorList" class="auth_mess">
<el-popover placement="top-start" title="" trigger="hover" v-if="item.isReport">
<span style="cursor: pointer" slot="reference">
<h4 style="font-weight: bolder">
<img
src="../../assets/img/state_one.png"
v-if="item.isSuper"
style="width: 15px; margin: 0 2px 0 0; vertical-align: text-bottom"
/>
{{ item.firstname }} {{ item.lastname }} {{ item.isSuper ? '#' : ''
}}{{ item.isReport ? '*' : '' }}
</h4>
</span>
<div>
<div class="scoringRules">
<p style="font-weight: bold; margin-bottom: 6px">Scopus</p>
<div v-if="item.scopus_index && item.scopus_website != ''">
<p style="margin-bottom: 6px">
<font>Inedx: </font> <span v-html="colorIndex1(item.scopus_index)"></span>
</p>
<p>
<font>Website: </font>
<a
:href="item.scopus_website"
target="_blank"
style="color: rgb(0, 102, 153) !important"
>{{ item.scopus_website }}</a
>
</p>
</div>
<p v-else style="color: #888">
No found
<i
@click="editScopus(item)"
class="el-icon-edit edit"
style="
cursor: pointer;
vertical-align: middle;
margin: 0px 20px;
font-weight: bold;
color: rgb(117, 171, 241);
"
></i>
</p>
</div>
</div>
</el-popover>
<h4 style="font-weight: bolder" v-else>
<img
src="../../assets/img/state_one.png"
v-if="item.isSuper"
style="width: 15px; margin: 0 2px 0 0; vertical-align: text-bottom"
/>
{{ item.firstname }} {{ item.lastname }} {{ item.isSuper ? '#' : ''
}}{{ item.isReport ? '*' : '' }}
</h4>
<div>
<p v-if="item.email">
<img
src="../../assets/img/state_email.png"
v-if="item.isReport"
style="width: 14px; margin: 0 8px 0 0; vertical-align: text-bottom"
/>
<font>Email : </font>{{ item.email }}
</p>
<p v-if="item.orcid"><font>ORCID iD : </font>{{ item.orcid }}</p>
<p>
<font>First author : </font>
<b v-if="item.isSuper">Yes</b>
<b v-if="!item.isSuper">No</b>
</p>
<p>
<font>Corresponding Author :</font>
<b v-if="item.isReport">Yes</b>
<b v-if="!item.isReport">No</b>
</p>
<!-- <p v-if="item.isReport">
<font>WOS H index :</font>
<b v-if="item.indexs_show!=0" style="font-size: 18px;">
<b :style="{color:item.indexs_color}">{{item.indexs_show}}</b>
<font style="font-size: 14px;color: #aaa;margin-left: 5px;">({{now_year}})</font>
</b>
<b v-if="item.indexs_show==0" style="color: #aaa;">Null</b>
<i class="el-icon-edit" @click="HIndexEdit(item)" v-if="form.state==1" style="margin-left: 10px;color: #006699;cursor: pointer;"></i>
</p> -->
<p v-if="item.address && isShowAuthorInfo"><font>Address : </font>{{ item.address }}</p>
<div v-if="item.company" style="display: flex; align-items: flex-start">
<font style="display: inline-block; width: 70px; color: #777">Affiliation : </font>
<p v-html="getAllCompany(item.company)" style="width: calc(100% - 70px)"></p>
</div>
<p v-if="item.department && isShowAuthorInfo">
<font>Department : </font>{{ item.department }}
</p>
<p v-if="item.title"><font>Title : </font>{{ item.title }}</p>
<p v-if="item.country"><font>Country : </font>{{ item.country }}</p>
</div>
</div>
</el-collapse-item>
</el-collapse>
<el-collapse class="auth_colla auth_collna_ew" style="margin-top: -15px">
<el-collapse-item name="2">
<template slot="title">
Abstract
<font v-if="form.keywords" style="margin-left: 3px">, Keywords</font>
<font v-if="form.fund" style="margin-left: 3px">, Fund</font>
</template>
<p>
<font>Abstract :</font><b>{{ form.abstrart }}</b>
</p>
<p v-if="form.keywords">
<font>Keywords :</font><b>{{ form.keywords }}</b>
</p>
<p v-if="form.fund">
<font>Fund :</font><b>{{ form.fund }}</b>
</p>
</el-collapse-item>
</el-collapse>
<el-collapse
v-model="AIcontent"
class="auth_colla auth_collna_ew"
style="margin-top: -15px"
v-if="form.is_use_ai == 1"
>
<el-collapse-item
title="Artificial intelligence was utilized in the research or manuscript of the article"
name="1"
>
{{ form.use_ai_explain }}
</el-collapse-item>
</el-collapse>
<el-collapse class="auth_colla auth_collna_ew" style="margin-top: -15px" v-if="form.is_use_ai == 2">
<el-collapse-item
title="No artificial intelligence was utilized in the research or manuscript writing process of this article"
name="1"
>
</el-collapse-item>
</el-collapse>
<el-collapse v-model="researchAreas" class="auth_colla auth_collna_ew research_area" style="margin-top: -15px">
<el-collapse-item title="Research areas" name="1">
<div style="position: relative; height: 30px" v-if="form.state == 0">
<common-major
v-if="form.state == 0"
:articleId="editform.articleId"
@load="initMajor()"
style="position: absolute; top: 10px; right: 10px"
></common-major>
</div>
<div style="margin: 12px 20px 30px 0px; line-height: 24px; font-size: 14px; position: relative">
<div>
<!-- 统计数据 -->
<div class="join_link">
<!-- 如果你想投稿 请点击 -->
<p style="" v-for="(v, i) in majorsList">
<span style="color: #006699; font-weight: bold; margin-right: 10px"
>Field {{ i + 1 }}:</span
>{{ v.str
}}<i
v-if="form.state == 0"
class="el-icon-delete-solid"
style="color: #f56c6c !important; margin-left: 10px"
@click="handleDeleteMajor(v)"
></i>
</p>
<!-- 查看已投稿件列表 -->
</div>
</div>
</div>
</el-collapse-item>
</el-collapse>
</div>
<el-collapse
v-model="FileList"
class="auth_colla auth_collna_ew research_area"
style="margin-top: -15px; margin-bottom: 0"
>
<el-collapse-item title="File" name="1">
<div class="art_file_">
<el-row :gutter="24">
<el-col :span="12" v-if="coverLetterFileList">
<h4>Cover letter :</h4>
<p class="fi_new">
<a v-for="item in coverLetterFileList" :href="mediaUrl + item.file_url">
<img src="../../assets/img/icon_0.png" />
<span>
<font>Uploader : </font>{{ item.username }}
<i><i class="el-icon-time"></i>{{ formatDate(item.ctime) }}</i>
</span>
<i class="el-icon-download download"></i>
</a>
</p>
<br clear="both" />
</el-col>
<el-col :span="12" v-if="picturesAndTablesFileList">
<h4>Figures :</h4>
<p class="fi_new">
<a v-for="item in picturesAndTablesFileList" :href="mediaUrl + item.file_url">
<img src="../../assets/img/icon_0.png" />
<span>
<font>Uploader : </font>{{ item.username }}
<i><i class="el-icon-time"></i>{{ formatDate(item.ctime) }}</i>
</span>
<i class="el-icon-download download"></i>
</a>
</p>
<br clear="both" />
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12" v-if="totalpageFileList">
<h4>Title page :</h4>
<p class="fi_new">
<a v-for="item in totalpageFileList" :href="mediaUrl + item.file_url">
<img src="../../assets/img/icon_0.png" />
<span>
<font>Uploader : </font>{{ item.username }}
<i><i class="el-icon-time"></i>{{ formatDate(item.ctime) }}</i>
</span>
<i class="el-icon-download download"></i>
</a>
</p>
<br clear="both" />
</el-col>
<el-col :span="12">
<h4>Manuscript :</h4>
<p class="fi_new">
<!-- <template v-for="item in manuscirptFileList"> -->
<!-- <a href="#">
<img
src="../../assets/img/icon_0.png"
@click="openDrawer(item, mediaUrl + item.file_url)"
/>
<span @click="openDrawer(item, mediaUrl + item.file_url)">
<font>Uploader : </font>{{ item.username }}
<i><i class="el-icon-time"></i>{{ formatDate(item.ctime) }}</i>
<i class="el-icon-view" style="font-weight: bold; color: #888; margin: 0 0 0 10px"></i>
</span>
<a :href="mediaUrl + item.file_url">
<i class="el-icon-download download"></i>
</a>
</a> -->
<a v-for="item in manuscirptFileList" :href="mediaUrl + item.file_url">
<img src="../../assets/img/icon_0.png" />
<span>
<font>Uploader : </font>{{ form.username }}
<i><i class="el-icon-time"></i>{{ formatDate(item.ctime) }}</i>
</span>
<i class="el-icon-download download"></i>
</a>
<!-- </template> -->
</p>
<br clear="both" />
</el-col>
</el-row>
<el-row :gutter="24" v-if="supplementaryFileList">
<el-col :span="24">
<h4>Supplementary Material :</h4>
<p class="fi_new">
<a v-for="item in supplementaryFileList" :href="mediaUrl + item.file_url">
<img src="../../assets/img/icon_0.png" />
<span>
<font>Uploader : </font>{{ item.username }}
<i><i class="el-icon-time"></i>{{ formatDate(item.ctime) }}</i>
</span>
<i class="el-icon-download download"></i>
</a>
</p>
<br clear="both" />
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="24">
<el-button type="text" style="position: absolute; top: -2px; right: 14px" @click="reOpenDialog">
<i class="el-icon-edit"></i> Upload
</el-button>
<h4>Figure Copyright Declaration :</h4>
<div style="line-height: 22px;padding-left: 10px;margin-top: 2px;color: #333;">
<p v-if="form.is_figure_copyright == 2">&nbsp;I confirm that all figures in this manuscript are original.</p>
<p v-if="form.is_figure_copyright == 1">&nbsp;I confirm that all figures in this manuscript used with proper permission.</p>
</div>
<p class="fi_new" v-if="fileL_articleCopyright.length > 0" style="margin-top: 10px;">
<a v-for="item in fileL_articleCopyright" :href="mediaUrl + item.file_url">
<img src="../../assets/img/icon_0.png" />
<span>
<font>Uploader : </font>{{ item.username }}
<i><i class="el-icon-time"></i>{{ formatDate(item.ctime) }}</i>
</span>
<i class="el-icon-download download"></i>
</a>
</p>
<FigureCopyright
:article_id="form.articleId"
:visible.sync="copyrightDialogVisible"
v-model="is_figure_copyright"
:upload-action="upload_articleCopyright"
:file-list="newfilearticleCopyrightList"
@on-success="upSuccess_articleCopyright"
@on-remove="removefilearticleCopyright"
@on-preview="dowloadFile"
/>
<br clear="both" />
</el-col>
</el-row>
<el-row v-if="responseFileList != ''">
<div style="height: 1px; width: 98%; background-color: #ebeef5; margin: 5px auto 20px auto"></div>
<el-col :span="24">
<h4>Response to reviewers :</h4>
<p class="fi_new">
<a v-for="item in responseFileList" :href="mediaUrl + item.file_url">
<img src="../../assets/img/icon_0.png" />
<span>
<font>Uploader : </font>{{ form.username }}
<i><i class="el-icon-time"></i>{{ formatDate(item.artr_ctime) }}</i>
</span>
<i class="el-icon-download download"></i>
</a>
</p>
</el-col>
</el-row>
</div>
</el-collapse-item>
</el-collapse>
<common-word-html :articleId="$route.query.id" style="box-sizing: border-box"></common-word-html>
</div>
<div style="margin-top: 40px">
<div v-if="![0].includes(form.state)">
<!-- under review -->
<el-collapse v-model="underReview" class="auth_colla auth_collna_ew under_review" style="margin-top: -15px">
<el-collapse-item title="" name="1">
<template slot="title">
<div class="under_review_title">
<span style="font-weight: bold; color: #333 !important; font-size: 18px">Under review</span>
<span
style="font-size: 16px; margin-left: 20px; text-align: right; font-weight: 400"
v-if="reviewList.length > 0"
>
Average score : <b style="font-size: 16px; color: #db890e">{{ avegeCount(reviewList) }}</b>
</span>
<b @click.stop="articleReviewer()" class="btnCliArt" style="" v-if="form.state != 0">
<i
:class="[1, 2, 4, 8].includes(form.state) ? 'el-icon-edit' : 'el-icon-view'"
style="margin-right: 5px"
></i
>Inviting Reviewer {{ [1, 2, 4, 8].includes(form.state) ? '' : 'History' }}
</b>
</div>
</template>
<div class="art_author_" style="padding: 20px" v-if="reviewList.length > 0">
<div class="fixCard reviewer_decision" style="position: relative">
<div class="overflow-x-auto">
<!-- 上面的表格代码放在这里 -->
<table class="review_table">
<thead>
<tr>
<th class="review_table_index">No.</th>
<th>Name <span style="color: #888">( score )</span></th>
<!-- 补充表头文本,原代码是空,建议加上 -->
<th>1<sup>st</sup> review</th>
<!-- 表头按最大重复次数遍历生成2nd、3rd...列 -->
<template v-for="(_, index1) in maxRepeatReviewCount()">
<th>{{ index1 + 2 }}<sup>nd</sup> review</th>
</template>
<!-- <th>final state</th> -->
</tr>
</thead>
<tbody>
<!-- 遍历每个评审者 -->
<tr v-for="(iken, reviewerIndex) in reviewList">
<td class="review_table_index">
Reviewer {{ reviewerIndex + 1 }}
<el-button
style="margin-left: 10px"
type="text"
@click="crateRevision(iken)"
v-if="iken.can_repeat == 1"
>Re-review</el-button
>
</td>
<td style="position: relative; cursor: pointer">
<span style="">{{ iken.realname }}</span>
<span
v-if="iken.state != 0"
style="
color: rgb(219, 137, 14);
font-weight: 700;
margin-left: 10px;
font-size: 14px;
"
>( {{ iken.rated }} )</span
>
<span
style="color: #888; float: right; margin-right: 20px"
@click="handleClick(iken, 'detail')"
>Detail</span
>
</td>
<!-- 1st review原逻辑不变 -->
<td style="cursor: pointer">
<span>
<span
style="display: inline-block; margin-left: 4px; margin-right: 8px"
>
<font
v-if="iken.recommend == 1 || iken.recommend == 2"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #67c23a;
"
>
</font>
<font
v-if="iken.recommend == 3 || iken.recommend == 4"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #f56c6c;
"
>
</font>
<font
v-if="iken.state == 0"
style="
width: 12px;
height: 12px;
display: block;
border-radius: 10px;
background-color: #ccc;
"
>
</font>
</span>
<span v-if="iken.recommend == 1">Minor</span>
<span v-else-if="iken.recommend == 2">Major</span>
<span v-else-if="iken.recommend == 3">reject and resubmission</span>
<span v-else-if="iken.recommend == 4">Reject</span>
</span>
<span
v-if="iken.state != 0"
style="color: #888; float: right; margin-right: 20px"
@click="handleClick(iken, 'question')"
>Detail</span
>
</td>
<!-- 关键按最大重复次数遍历而非仅遍历当前iken.repeat -->
<template v-for="(_1, index1) in maxRepeatReviewCount()">
<td>
<!-- 补全逻辑判断当前评审者的repeat中是否有第index1条数据 -->
<span
v-if="Array.isArray(iken.repeat) && iken.repeat[index1]"
style="cursor: pointer"
>
<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
v-if="[1, 2, 3].includes(iken.repeat[index1].recommend)"
style="color: #888; float: right; margin-right: 20px"
@click="handleClick(iken, 're-review', iken.repeat[index1])"
>Detail</span
>
</span>
<span v-else>
<!-- 无数据:补全空内容(可自定义为“-”“无”等) -->
<span>-</span>
</span>
</td>
</template>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</el-collapse-item>
</el-collapse>
<!-- 初审 -->
</div>
<div v-if="(![0].includes(form.state) && finalList.length > 0) || form.state == 8" style="margin-top: 40px">
<!-- under review -->
<el-collapse v-model="finalDecision" class="auth_colla auth_collna_ew under_review" style="margin-top: -15px">
<el-collapse-item title="" name="1">
<template slot="title">
<div class="under_review_title">
<span style="font-weight: bold; color: #333 !important; font-size: 18px">Final Decision</span>
<span
v-if="finalList.length > 0"
style="font-size: 16px; margin-left: 20px; text-align: right; font-weight: 400"
>
Comprehensive Score :
<b style="font-size: 16px; color: #db890e">{{ finalCount(reviewList) }}</b>
</span>
<b v-if="form.state != 0" @click.stop="articleEditorialBoard()" class="btnCliArt" style="">
<i :class="form.state == 8 ? 'el-icon-edit' : 'el-icon-view'" style="margin-right: 5px"></i>
Inviting Editorial Board {{ form.state == 8 ? '' : 'History' }}
</b>
</div>
</template>
<div class="art_author_" style="padding: 20px" v-if="finalList.length > 0">
<div class="fixCard reviewer_decision" style="position: relative">
<div class="overflow-x-auto">
<!-- 上面的表格代码放在这里 -->
<table class="review_table">
<thead>
<tr>
<th class="review_table_index">No.</th>
<th>Name</th>
<!-- 补充表头文本,原代码是空,建议加上 -->
<th>Final Decision</th>
</tr>
</thead>
<tbody>
<!-- 遍历每个评审者 -->
<tr v-for="(iken, reviewerIndex) in finalList">
<td style="position: relative; cursor: pointer">
Editorial Board {{ reviewerIndex + 1 }}
</td>
<td style="position: relative; cursor: pointer">
<span style="">{{ iken.realname }}</span>
<span
v-if="[1, 2, 3].includes(iken.state)"
style="color: #888; float: right"
@click="handleClickFinal(iken)"
>Detail</span
>
</td>
<!-- 1st review原逻辑不变 -->
<td style="cursor: pointer; font-weight: 700">
<span v-if="iken.state == 1" style="color: #67c23a">Accept</span>
<span v-else-if="iken.state == 2" style="color: #ff4949">Reject</span>
<span v-else-if="iken.state == 3" style="color: #ffc500">Revision</span>
<font v-if="iken.state == 5" style="color: #ccc; display: inline-block">
invitation
</font>
<font v-if="iken.state == 0" style="color: #67c23a; display: inline-block">
Agree to review
</font>
<font v-if="iken.state == 4" style="color: #ccc; display: inline-block">
invalid
</font>
<span style="color: #888; font-weight: 500; float: right">{{
formatDate_(iken.update_time)
}}</span>
</td>
<!-- 关键按最大重复次数遍历而非仅遍历当前iken.repeat -->
</tr>
</tbody>
</table>
</div>
</div>
</div>
</el-collapse-item>
</el-collapse>
<!-- 初审 -->
</div>
</div>
</el-col>
<el-col :span="10" style="padding: 0">
<!-- 被拒稿件操作 --->
<div style="margin-bottom: 20px">
<div class="art_caozuo_" v-if="opname == 'rejectArticles'">
<div>
<span>Status : </span>
<b>{{ articleState }}</b>
</div>
<div style="display: flex; width: 100%; align-items: flex-start">
<span style="display: inline-block; width: 65px !important">Remarks :</span>
<b :class="{ collapsed: !expanded }" class="remarkContent" style="" @click="handleClickRemark(form)">{{
form.remarks
}}</b>
<!-- <el-button type="text" @click="testedit" icon="el-icon-edit">Change</el-button> -->
</div>
<div>
<span>Repetition : </span>
<b>{{ form.repetition }}%</b>
</div>
<!--<br clear="both">
<el-button type="primary" @click="showResubmit" style="margin: 15px 0 0 0;">Resubmit the manuscript
</el-button> -->
</div>
<!-- 常规稿件操作 -->
<div class="art_caozuo_" v-else>
<div>
<span>Status : </span>
<b>{{ articleState }}</b>
<el-button type="text" @click="testvis" icon="el-icon-edit" v-if="!(form.is_draft==1&&form.state==3)">Change</el-button>
</div>
<div style="display: flex; width: 100%">
<span>Remarks :</span>
<b :class="{ collapsed: !expanded }" class="remarkContent" style="" @click="handleClickRemark(form)">{{
form.remarks
}}</b>
<el-button style="padding: 0" type="text" @click="testedit" icon="el-icon-edit">Change</el-button>
</div>
<div>
<span>Repetition : </span>
<b>{{ form.repetition }}%</b>
<a :href="mediaUrl + form.repeurl" v-if="form.repeurl" class="zip_load" target="_blank">
<img src="../../assets/img/icon_0.png" />
<span>Duplicate check file</span>
<i class="el-icon-download download"></i>
</a>
<el-button type="text" @click="changeRepe" icon="el-icon-edit">Change</el-button>
</div>
<div>
<span style="display: inline-block; vertical-align: top; margin-top: 7px">Manuscript : </span>
<el-upload
style="display: inline-block"
class="upload-demo"
:action="upload_manuscirpt"
accept=".docx,"
name="manuscirpt"
:before-upload="beforeupload_manuscirpt"
:on-error="uperr_coverLetter"
:on-success="upSuccess_manuscirpt"
:limit="1"
:on-exceed="alertlimit"
:on-remove="removefilemanuscirpt"
>
<div class="el-upload__text" style="padding: 8px 5px">
<em>Click Upload</em>
</div>
<div class="el-upload__tip" slot="tip">Only word and compressed files can be uploaded(.docx)</div>
</el-upload>
<br clear="both" />
<el-button type="primary" @click="onsubmit" style="margin: 15px 0 0 0">Upload Submit </el-button>
</div>
</div>
</div>
<timetalk :talkMsgs="talkMsgs" :msgform="msgform" @talksave="talksave" :height="300"></timetalk>
<div class="tree_box">
<h2 style="margin: 0 0 20px 0">Manuscript Tracking</h2>
<div class="block">
<el-timeline>
<el-timeline-item :timestamp="formatDate_(form.ctime)" placement="top">
<el-card>
<p style="line-height: 20px">
Manuscript submission :
<b>{{ form.username }}</b>
<span style="margin: 0 5px; color: #409eff">({{ form.user_email }})</span>
submitted to
<b>{{ journal_me }}</b>
</p>
</el-card>
</el-timeline-item>
<el-timeline-item
v-for="(activity, index) in msgs"
:key="index"
:timestamp="formatDate_(activity.ctime)"
placement="top"
>
<el-card v-if="activity.ftype == 0">
<p>Status change : {{ statetostr(activity.state_to) }}</p>
<p v-if="activity.content != ''">{{ activity.content }}</p>
</el-card>
<el-card v-else>
<p style="margin-bottom: 5px; font-weight: bold">Author message :</p>
<p style="line-height: 18px">{{ activity.content }}</p>
</el-card>
<!-- <el-card>
<p>state change :{{statetostr(activity.state_from)}} => {{statetostr(activity.state_to)}}</p>
<p>{{activity.content}}</p>
</el-card> -->
</el-timeline-item>
</el-timeline>
</div>
</div>
</el-col>
</el-row>
</div>
<el-dialog title="Final decision detail" :visible.sync="FinalDecisionVisible" width="1200px" :close-on-click-modal="false">
<common-editor-article-detail
style="margin-top: 20px"
:detailDate="{
reviewer: finalDecisionData.realname,
article_final: finalDecisionData,
ctime: formatDate_(finalDecisionData.update_time)
}"
></common-editor-article-detail>
<span slot="footer" class="dialog-footer">
<el-button type="" @click="FinalDecisionVisible = false">Cancel</el-button>
</span>
</el-dialog>
<!-- 审稿详情 start-->
<reviewerDetail ref="reviewerDetail" v-if="reviewerVisible" :reviewerDetail="reviewerDetail" destroy-on-close></reviewerDetail>
<!-- 审稿详情 end-->
<el-dialog title="Edit H Index" :visible.sync="HEditVisible" width="400px" :close-on-click-modal="false">
<div style="margin: 0 0 20px 10px; font-weight: bold">{{ HIxForm.realname }}</div>
<div style="margin: 0 0 20px 10px">Email :{{ HIxForm.email }}</div>
<el-form ref="old_Form" :model="HIxForm" label-width="150px">
<el-form-item>
<span slot="label"> WOS H index ({{ this.now_year }}) </span>
<el-input v-model="HIxForm.index"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="saveHIx(HIxForm)">OK</el-button>
</span>
</el-dialog>
<el-dialog title="Change Status" :visible.sync="editVisible" width="750px" v-loading="loading1" :close-on-click-modal="false">
<el-form ref="editform" :model="editform" label-width="220px">
<el-form-item label="">
<span slot="label">
<i style="color: #f56c6c">*</i>
Status :
</span>
<el-select v-model="editform.state" placeholder="Please select">
<el-option
v-for="item in items"
:key="item.state"
:label="item.title"
:value="item.state"
:disabled="item.disabled"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="Comments for authors :" v-show="editform.state == 4">
<el-input type="textarea" rows="3" v-model="editform.proposal_content" placeholder="" resize="4"> </el-input>
</el-form-item>
<!-- <el-form-item label="Figure Copyright Declaration:" v-show="editform.state == 4">
<div class="copyright-declaration-wrapper">
<el-radio-group v-model="editform.is_figure_copyright">
<el-radio label="2"> I confirm that all figures in this manuscript are original. </el-radio>
<el-radio label="1"> I confirm that all figures are used with proper permission. </el-radio>
<el-input
v-if="editform.is_figure_copyright == '1'"
type="textarea"
rows="3"
v-model="editform.is_figure_copyright_content"
placeholder=""
resize="4"
>
</el-input>
</el-radio-group>
</div>
</el-form-item> -->
<el-form-item label="Transfer :" v-show="editform.state == 3 && form.transList.length == 0">
<el-select v-model="editform.trsjournal" placeholder="Please select">
<el-option :key="0" label="No Transfer" :value="0"></el-option>
<el-option
v-for="item in journals"
:key="item.journal_id"
:label="item.title"
:value="item.journal_id"
:disabled="item.journal_id == form.journal"
></el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editVisible = false">Cancel</el-button>
<el-button type="primary" @click="saveEdit">Save</el-button>
</span>
</el-dialog>
<el-dialog title="Remarks" :visible.sync="editbox" width="1000px" v-loading="loading2" :close-on-click-modal="false">
<el-form ref="remark" :model="remark" label-width="85px">
<el-form-item label="Content :">
<el-input type="textarea" rows="20" v-model="remark.content"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editbox = false">Cancel</el-button>
<el-button type="primary" @click="saveRemark">Save</el-button>
</span>
</el-dialog>
<el-dialog title="Repetition" :visible.sync="repebox" width="550px" v-loading="loading3" :close-on-click-modal="false">
<el-form ref="repetition" :model="repeform" label-width="90px">
<el-form-item label="Content :">
<el-input maxlength="3" style="width: 100px" v-model="repeform.repefen">
<template slot="append">%</template>
</el-input>
</el-form-item>
<el-form-item label="Zip :">
<el-upload
class="upload-demo"
:action="upload_zip"
accept=".rar, .zip"
name="repezip"
:on-success="upSuccess_repezip"
:limit="1"
:on-exceed="alertlimit"
:on-remove="removefilerepezip"
>
<div class="el-upload__text" style="padding: 0 5px">
<em>Click Upload</em>
</div>
<div class="el-upload__tip" slot="tip">Only pdf and word files can be uploaded(.pdf,.doc,.docx)</div>
</el-upload>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="repebox = false">Cancel</el-button>
<el-button type="primary" @click="saveRepe">Save</el-button>
</span>
</el-dialog>
<el-dialog
title="Resubmit the manuscript"
:visible.sync="resubmitVisible"
width="550px"
v-loading="loading4"
:close-on-click-modal="false"
>
<el-form ref="resubmitJournal" :model="resubmitJournal" label-width="120" :rules="Resubmitrules">
<el-form-item label="journal" prop="journalId">
<el-select
v-if="editorJournalList.length > 0"
v-model="resubmitJournal.journalId"
filterable
placeholder="Please select a manuscript"
>
<el-option v-for="item in editorJournalList" :key="item.journal_id" :label="item.title" :value="item.journal_id">
</el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="closeResubmit">Cancel</el-button>
<el-button type="primary" @click="saveResubmit">Save</el-button>
</span>
</el-dialog>
<el-drawer
append-to-body
destroy-on-close
:title="previewData.drawerTitle"
:wrapperClosable="false"
:visible.sync="drawer"
direction="rtl"
:before-close="handleClose"
size="1000px"
>
<template #title>
<div style="display: inline-block; vertical-align: top">
Manuscript :
<img
src="../../assets/img/icon_0.png"
style="
width: 15px;
margin: 0 5px 0 0;
margin-left: 10px;
"
/>
<span>
<font>Uploader : </font>{{ previewData.username }}
<i style="color: #888; margin: 0 20px; font-style: normal"
><i class="el-icon-time" style="margin-right: 10px"></i>{{ formatDate(previewData.ctime) }}</i
>
<a :href="mediaUrl + previewData.file_url">
<i class="el-icon-download download" style="color: #75abf1; font-weight: bold"></i>
</a>
</span>
</div>
</template>
<iframe
:src="`https://view.officeapps.live.com/op/view.aspx?src=${previewData.previewUrl}&ui=en-US`"
width="100%"
height="98%"
frameborder="0"
></iframe>
</el-drawer>
<el-dialog title="" :visible.sync="corresVisible" width="800px" :close-on-click-modal="false">
<div class="corrPeo">
<div
v-if="corresList.article"
style="line-height: 30px; line-height: 22px; font-size: 16px; font-weight: bold; letter-spacing: -0.5px"
>
{{ corresList.article.title }}
</div>
<div v-for="(item, index) in corresList.author_articles">
<div class="corrPUser">
{{ item.firstname }} {{ item.lastname }}
<font v-if="item.is_super == 1">#</font>
<font v-if="item.is_report == 1">*</font>
</div>
<div
class="corrPTim"
v-for="(pku, iken) in item.articles"
@click="
corresVisible = false;
showdetaileditor(pku);
"
>
<span>{{ stateFormat(pku.state) }}</span>
{{ pku.title }}
<font> - {{ pku.journal_title }}</font>
</div>
<div v-if="item.articles.length == 0">No article</div>
</div>
<div class="corrPUser">User articles</div>
<div v-for="(item, index) in corresList.user_articles">
<div
class="corrPTim"
@click="
corresVisible = false;
showdetaileditor(item);
"
>
<span>{{ stateFormat(item.state) }}</span>
{{ item.title }}
<font> - {{ item.journal_title }}</font>
</div>
<div v-if="item.length == 0">No article</div>
</div>
</div>
</el-dialog>
<el-dialog
:title="$t('AI.AISummaryAnalysis')"
:visible.sync="isShowAI"
width="1100px"
class="AIDialog"
:close-on-click-modal="false"
>
<div class="AISummaryAnalysis">
<el-collapse class="auth_colla auth_collna_ew" style="margin-bottom: 10px; margin-top: -20px">
<el-collapse-item name="1">
<template slot="title">
Abstract
<font v-if="currentArticleData.keywords" style="margin-left: 3px">, Keywords</font>
</template>
<p>
<font>Abstract :</font><b>{{ currentArticleData.abstrart }}</b>
</p>
<p v-if="currentArticleData.keywords">
<font>Keywords :</font><b>{{ currentArticleData.keywords }}</b>
</p>
</el-collapse-item>
</el-collapse>
<div style="line-height: 20px" v-if="isShowAI">
<p style="overflow: hidden; margin-bottom: 8px">
<span style="float: left">{{
currentArticleData.ai_review.is_finish == 2
? 'AI is currently analyzing'
: currentArticleData.ai_review.is_finish == 1
? 'AI analysis has been completed'
: ''
}}</span>
<span style="float: right; color: #3830b9; margin-right: 8px"
>{{ this.$t('aiReview.state18') }} : {{ currentArticleData.ai_review['create_time'] }}</span
>
</p>
<p class="titleBox">
<span class="title" style="color: #fff; font-size: 16px">{{ $t('AI.AIAbstractInfo') }}</span>
</p>
<el-form label-width="240">
<el-form-item label="``" v-for="(v, i) in aiReview">
<span slot="label" class="title" :style="v.color ? `color:${v.color}` : ''">
{{ `${i + 1}. ${v.topic} : ` }}
</span>
<div style="" v-if="v.value!='hotspot'">
<div
style="color: #333; width: calc(100% - 180px); margin-left: 180px"
v-if="v.parameter && v.parameter.length > 0"
>
<div label="``" v-for="(item, index) in v.parameter">
<span class="title" style="" :style="item.color ? `color:${item.color}` : ''">
{{ `(${index + 1}) ${item.topic} : ` }}
</span>
<div style="">
<div style="color: #333">
<template v-if="item.isShowSign == 1">
【{{ currentArticleData.ai_review[item.value] }}】
</template>
<template v-else>
{{ currentArticleData.ai_review[item.value] }}
</template>
<div v-if="item.explanationValue">
<div>
<p
:class="{ 'short-content': !item.showFullContent }"
@click="toggleContent2(i, index)"
style="margin-top: 0; cursor: pointer; color: #888; line-height: 22px"
>
<span>{{ $t('aiReview.Explain') }} : </span>
{{ currentArticleData.ai_review[item.explanationValue] }}
</p>
</div>
<div
style="color: #006699"
v-if="
item.explanationValue == 'other_journal_explanation' &&
currentArticleData.ai_review['other_journal_issn']
"
>
ISSN : {{ currentArticleData.ai_review['other_journal_issn'] }}
</div>
</div>
</div>
</div>
</div>
</div>
<div style="color: #333" v-else>
<template v-if="v.isShowSign == 1"> 【{{ currentArticleData.ai_review[v.value] }}】 </template>
<template v-else>
{{ currentArticleData.ai_review[v.value] }}
</template>
</div>
<div style="color: #888; line-height: 22px" v-if="v.explanationValue">
<p
:class="{ 'short-content': !v.showFullContent }"
@click="toggleContent1(i)"
style="margin-top: 0; cursor: pointer; color: #888"
>
<span>{{ $t('aiReview.Explain') }} : </span> {{ currentArticleData.ai_review[v.explanationValue] }}
</p>
</div>
</div>
<div style="" v-else>
<div
style="color: #333; width: calc(100% - 180px); margin-left: 180px"
v-if=" currentArticleData.ai_review[v.value] && currentArticleData.ai_review[v.value].length > 0"
>
<div label="``" v-for="(item, index) in currentArticleData.ai_review[v.value]">
<span class="title" style="" :style="item.color ? `color:${item.color}` : ''">
{{ `(${index + 1}) 领域 : ${item['领域']} ` }}
</span>
<div style="">
<div style="color: #333">
是否热点 : 【{{item['是否热点'] }}】
<div v-if="item['解释说明']">
<div>
<p
:class="{ 'short-content': !item.showFullContent }"
@click="toggleContent2(i, index)"
style="margin-top: 0; cursor: pointer; color: #888; line-height: 22px"
>
<span>{{ $t('aiReview.Explain') }} : </span>
{{ item['解释说明'] }}
</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div style="color: #333" v-else>
<template v-if="v.isShowSign == 1"> 【{{ currentArticleData.ai_review[v.value] }}】 </template>
<template v-else>
{{ currentArticleData.ai_review[v.value] }}
</template>
</div>
<div style="color: #888; line-height: 22px" v-if="v.explanationValue">
<p
:class="{ 'short-content': !v.showFullContent }"
@click="toggleContent1(i)"
style="margin-top: 0; cursor: pointer; color: #888"
>
<span>{{ $t('aiReview.Explain') }} : </span> {{ currentArticleData.ai_review[v.explanationValue] }}
</p>
</div>
</div>
</el-form-item>
</el-form>
</div>
</div>
<span slot="footer" class="dialog-footer">
<el-button type="" @click="isShowAI = false">Close</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import timetalk from './time_talk';
import reviewerDetail from '../../components/page/components/articleDetail/reviewerdetail.vue';
import FigureCopyright from '../../components/page/components/articleDetail/FigureCopyright.vue';
export default {
components: {
timetalk,
reviewerDetail,
FigureCopyright
},
data() {
return {
copyrightDialogVisible: false, // 控制弹窗开关
reviewerDetail: {},
corresList: [],
finalDecisionData: {},
FinalDecisionVisible: false,
reviewerVisible: false,
expanded: false,
corresVisible: false,
isShowAuthorInfo: false,
activeFinalComment: [],
isShowAI: false,
currentArticleData: {},
researchAreas: ['1'],
FileList: ['1'],
AIcontent: ['1'],
// AIcontent: '',
previewData: {},
baseUrl: this.Common.baseUrl,
mediaUrl: this.Common.mediaUrl,
now_year: 0,
items: '',
drawer: false,
loading: false,
loading1: false,
loading2: false,
loading3: false,
loading4: false,
editVisible: false,
editbox: false,
resubmitVisible: false,
repebox: false,
HEditVisible: false,
HIxForm: {
index: ''
},
coverLetterFileList: [],
picturesAndTablesFileList: [],
totalpageFileList: [],
supplementaryFileList: [],
fileL_articleCopyright: [],
newfilearticleCopyrightList: [],
manuscirptFileList: [],
responseFileList: [],
authorList_name: '',
activeNames: ['2'],
editform: {
editname: localStorage.getItem('U_name'),
articleId: this.$route.query.id,
state: 0,
trsjournal: 0,
editormsg: '',
proposal_content: ''
},
remark: {
articleId: this.$route.query.id,
content: ''
},
repeform: {
articleId: this.$route.query.id,
repefen: '',
zipurl: ''
},
journals: [],
items: [
{
state: 0,
title: this.$t('artstate.state0'),
disabled: true
},
{
state: 1,
title: this.$t('artstate.state1')
},
{
state: 2,
title: this.$t('artstate.state2')
},
{
state: 3,
title: this.$t('artstate.state3')
},
{
state: 4,
title: this.$t('artstate.state4')
},
{
state: 8,
title: this.$t('artstate.state8')
},
{
state: 6,
title: this.$t('artstate.state6')
}
// {
// state: 5,
// title: this.$t('artstate.state5')
// }
],
form: {
articleId: this.$route.query.id,
journal: '',
journalname: '',
username: '',
title: '',
accept_sn: '',
abstrart: '',
keyWords: '',
fund: '',
type: '',
major: '',
approval: false,
approval_file: '',
approval_content: '',
is_figure_copyright: '',
repetition: '',
manuscirpt: '',
remarks: '',
state: '',
ctime: '',
is_draft: '',
authorList: [],
transList: []
},
msgs: [],
msgform: {
username: localStorage.getItem('U_name'),
article_id: this.$route.query.id,
user_id: '',
ad_content: ''
},
talkMsgs: [],
majorsList: [],
opname: '', // 稿件详细类型
editorJournalList: [], // 编辑期刊列表
resubmitJournal: {
journalId: null, // 转投期刊的id
manuscriptId: null // article id
},
Resubmitrules: {
journalId: [{ required: true, message: 'Please select the name of the journal to be forwarded to' }]
},
aiReview: [
//1
{
topic: this.$t('aiReview.state0'),
value: 'journal_scope_assessment1',
explanationValue: '',
isShowSign: 0,
parameter: [
{
topic: this.$t('aiReview.state0'),
value: 'journal_scope_assessment',
explanationValue: 'journal_scope_explanation',
isShowSign: 1
},
{
topic: this.$t('aiReview.state22'),
value: 'other_journal_assessment',
explanationValue: 'other_journal_explanation',
isShowSign: 1
}
]
},
{
topic: this.$t('aiReview.state8'),
value: 'ethics_assessment',
explanationValue: '',
isShowSign: 0,
parameter: [
{
topic: this.$t('aiReview.state8'),
value: 'ethics_assessment',
explanationValue: 'ethics_explanation',
isShowSign: 1
},
{
topic: this.$t('aiReview.state20'),
value: 'registration_assessment',
explanationValue: '',
isShowSign: 1
}
]
}, //6
{
topic: this.$t('aiReview.state10'),
value: 'academic_assessment',
explanationValue: 'academic_explanation',
isShowSign: 1
}, //3
{
topic: this.$t('aiReview.state4'),
value: 'contradiction_assessment',
explanationValue: 'contradiction_explanation',
isShowSign: 1
},
//8
{
topic: this.$t('aiReview.state14'),
value: 'fund_number',
explanationValue: '',
isShowSign: 0
},
//2
{
topic: this.$t('aiReview.state2'),
value: 'attribute_assessment',
explanationValue: 'attribute_explanation',
isShowSign: 1
},
{
topic: this.$t('aiReview.state15'),
value: 'hotspot',
explanationValue: '',
isShowSign: 0
},
//12
{
topic: this.$t('aiReview.state19'),
value: 'create_time',
explanationValue: '',
color: 'rgb(0, 112, 192)',
isShowSign: 0,
parameter: [
{
topic: this.$t('aiReview.state191'),
value: 'references_past_three',
explanationValue: '',
color: 'rgb(0, 112, 192)',
isShowSign: 0
},
{
topic: this.$t('aiReview.state192'),
value: 'references_past_five',
explanationValue: '',
color: 'rgb(0, 112, 192)',
isShowSign: 0
}
// {
// topic: this.$t('aiReview.state193'),
// value: 'references_ratio_JCR1',
// explanationValue: '',
// color: 'rgb(0, 112, 192)',
// isShowSign: 0
// },
// {
// topic: this.$t('aiReview.state194'),
// value: 'references_ratio_JCR2',
// explanationValue: '',
// color: 'rgb(0, 112, 192)',
// isShowSign: 0
// }
]
}
// {
// topic: this.$t('aiReview.state16'),
// value: 'submit_direction',
// explanationValue: '',
// isShowSign: 0
// },
//10
//4
// {
// topic: this.$t('aiReview.state6'),
// value: 'unreasonable_assessment',
// explanationValue: 'unreasonable_explanation',
// isShowSign: 1
// },
//9
//11
// {
// topic: this.$t('aiReview.state17'),
// value: 'overall_evaluation',
// explanationValue: ''
// },
//5
//7
// {
// topic: this.$t('aiReview.state12'),
// value: 'conclusion_assessment',
// explanationValue: 'conclusion_explanation',
// isShowSign: 1
// },
//12
//13
// {
// topic: this.$t('aiReview.state21'),
// value: 'cite_rate',
// explanationValue: '',
// isShowSign: 0
// }
// {
// topic: this.$t('aiReview.state18'),
// value: 'create_time',
// explanationValue: ''
// }
],
finalList: [],
reviewList: [],
underReview: ['1'],
finalDecision: ['1'],
is_figure_copyright: '',
figurecopyright_file: ''
};
},
async created() {
await this.initarticle();
await this.getAi();
this.initFileList();
this.getWordimgList();
this.getWordTablesList();
this.getFinalList();
},
computed: {
// coverLetterUrl: function() {
// return this.baseUrl + this.form.coverLetter;
// },
// picturesAndTablesUrl: function() {
// return this.baseUrl + this.form.picturesAndTables;
// },
manuscirptUrl: function () {
return this.baseUrl + this.form.manuscirpt;
},
//图片版权
upload_articleCopyright: function () {
return this.baseUrl + 'api/Article/up_file/type/figurecopyright';
},
upload_coverLetter: function () {
return this.baseUrl + 'api/Article/up_file/type/coverLetter';
},
upload_picturesAndTables: function () {
return this.baseUrl + 'api/Article/up_file/type/picturesAndTables';
},
upload_manuscirpt: function () {
return this.baseUrl + 'api/Article/up_file/type/manuscirpt';
},
upload_zip: function () {
return this.baseUrl + 'api/Article/up_file/type/repezip';
},
journal_me: function () {
var frag = this.form.journalname;
if (this.form.special_num > 0) {
frag += '(Special Issues)';
}
return frag;
},
articleState: function () {
let str = '';
if(this.form.is_draft==1&&this.form.state==3){
str = this.$t('artstate.stateDraft');
return str;
}else{
switch (this.form.state) {
case 0:
str = this.$t('artstate.state0');
break;
case 1:
str = this.$t('artstate.state1');
break;
case 2:
str = this.$t('artstate.state2');
break;
case 3:
str = this.$t('artstate.state3');
break;
case 4:
str = this.$t('artstate.state4');
break;
case 5:
str = this.$t('artstate.state5');
break;
case 8:
str = this.$t('artstate.state8');
break;
case 6:
str = this.$t('artstate.state6');
break;
}
return str;
}
}
},
methods: {
reOpenDialog() {
// 强制先关闭,确保状态发生位移
this.copyrightDialogVisible = false;
this.$nextTick(() => {
this.copyrightDialogVisible = true;
});
},
// 下载文件
dowloadFile(file) {
let filePath = '/public/' + file.url;
let fileName = file.name;
// 获取heads中的filename文件名
let downloadElement = document.createElement('a');
// 创建下载的链接
downloadElement.href = filePath; // 下载后文件名
downloadElement.download = fileName;
downloadElement.target = '_blank';
document.body.appendChild(downloadElement);
// 点击下载
downloadElement.click();
// 下载完成移除元素
document.body.removeChild(downloadElement);
},
removefilearticleCopyright(file, fileList) {
this.figurecopyright_file = '';
this.newfilearticleCopyrightList = [];
},
//图片版权
upSuccess_articleCopyright(res, file) {
this.initFileList();
console.log(this.form);
},
crateRevision(item) {
// 二次询问
this.$confirm('Do you want to send a review invitation?', 'Tip', {
type: 'warning'
})
.then(() => {
this.$api
.post('api/Reviewer/startRepeatReviewer', {
art_rev_id: item.art_rev_id
})
.then((res) => {
if (res.code == 0) {
this.$message.success('A review invitation was successfully sent!');
this.$nextTick(() => {
setTimeout(() => {
this.getFinalList();
this.$forceUpdate();
}, 1000);
});
} else {
this.$message.error(res.msg);
}
})
.catch((err) => {
console.log(err);
});
})
.catch(() => {});
},
handleClickFinal(data) {
console.log("🚀 ~ handleClickFinal ~ data:", data);
const loading = this.$loading({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)',
zIndex: 9999 // 设置一个足够高的层级
});
this.$api
.post('api/Finalreview/getById', {
record_id: data.id,
reviewer_id:data.reviewer_id,
})
.then((res) => {
if (res.status == 1) {
loading.close()
this.finalDecisionData = { ...res.data,reviewer_company : res.data.company,reviewer_email:res.data.email}
this.FinalDecisionVisible = true;
} else {
loading.close()
this.$message.error(res.msg);
}
})
.catch((err) => {
loading.close()
console.log(err);
});
},
handleClickRemark() {
this.expanded = !this.expanded;
this.$forceUpdate();
},
articleReviewer(row) {
this.$router.push({
path: 'articleReviewer',
query: {
id: this.form.articleId
}
});
},
articleEditorialBoard(row) {
this.$router.push({
path: 'articleEditorialBoard',
query: {
id: this.form.articleId
}
});
},
//格式化状态输出
stateFormat(e) {
let str = '';
switch (e) {
case 0:
str = this.$t('artstate.state0');
break;
case 1:
str = this.$t('artstate.state1');
break;
case 2:
str = this.$t('artstate.state2');
break;
case 3:
str = this.$t('artstate.state3');
break;
case 4:
str = this.$t('artstate.state4');
break;
case 5:
str = this.$t('artstate.state5');
break;
case 6:
str = this.$t('artstate.state6');
break;
case 8:
str = this.$t('artstate.state8');
break;
default:
str = 'error!!';
}
return str;
},
// 稿件信息展示
showdetaileditor(row) {
let stat_num = 'articleDetailEditor';
// 生成目标路由的完整信息(包含 URL
const routeData = this.$router.resolve({
path: stat_num,
query: { id: row.article_id } // 携带的参数不变
});
// 新窗口打开路由页面
window.open(routeData.href, '_blank');
},
// 相关文章
corrSpe(value) {
console.log('value at line 1545:', value);
this.$api
.post('api/Article/getArticlesByArticle', {
article_id: value.articleId
})
.then((res) => {
if (res.code == 0) {
this.corresList = res.data;
this.corresList.article = value;
this.corresVisible = true;
} else {
this.$message.error(res.msg);
}
});
},
getAllCompany(company) {
let str = '';
var list = company.split('/');
for (let i = 0; i < list.length; i++) {
str += `${i + 1}. ` + list[i] + '<br/>';
}
return str;
},
// 算平均分
avegeCount(arry) {
// 1. 计算有有效评分的数量
var ratedLength = arry.map((item) => item.rated).filter((rated) => rated && rated > 0).length;
let all = 0;
// 2. 累加总分
for (let i = 0; i < arry.length; i++) {
all += Number(arry[i].rated || 0); // 加上 || 0 防止出现 undefined 导致计算失败
}
// 3. 核心判断逻辑
// 如果没有评分的人(ratedLength 为 0),或者总分就是 0直接返回 "-"
// 否则计算平均分并保留一位小数
let str = ratedLength > 0 && all > 0 ? (all / ratedLength).toFixed(1) : '-';
return str;
},
// 算终审分
finalCount(arry) {
var ratedLength = arry.map((item) => item.rated).filter((rated) => rated && rated > 0).length;
let str = 0;
let all = 0;
let sgr = 0;
for (let i = 0; i < arry.length; i++) {
all += Number(arry[i].rated);
}
str = (all / ratedLength).toFixed(1);
sgr = ((Number(str) + Number(this.form.scoring)) / 2).toFixed(1);
return sgr;
},
editScopus(item) {
console.log('item at line 1442:', item);
this.$router.push({
path: 'partyRole',
query: {
id: item.user_id
}
});
},
colorIndex1(num, time) {
let str = '';
if (num < 10) {
str = '<b style="color:#cb160a">' + num + '</b>';
} else if (num < 15) {
str = '<b style="color:#cbb504">' + num + '</b>';
} else {
str = '<b style="color:#0cbc15">' + num + '</b>';
}
if (time == 0) {
str = '<b style="color:#aaa;">0 </b>';
}
return str;
},
toggleContent1(i) {
this.aiReview[i].showFullContent = !this.aiReview[i].showFullContent;
this.$forceUpdate();
},
toggleContent2(i, index) {
this.aiReview[i].parameter[index].showFullContent = !this.aiReview[i].parameter[index].showFullContent;
this.$forceUpdate();
},
maxRepeatReviewCount() {
if (!this.reviewList || !Array.isArray(this.reviewList)) return null; // 边界处理无数据返回null
// 遍历所有评审者找到repeat数组长度最大的那条数据
const maxItem = this.reviewList.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 && maxItem.repeat ? maxItem.repeat.length : 0;
},
handleClick(item, type, repeatItem) {
this.reviewerDetail = item;
this.reviewerVisible = true;
this.$nextTick(() => {
this.$refs.reviewerDetail.init(item.art_rev_id, type, repeatItem);
});
},
goReviewerDetail(id) {
console.log('id at line 1112:', id);
this.$router.push({
path: 'articleReviewerDetail',
query: {
id: id
}
});
},
getFinalList() {
this.$api
.post('api/Finalreview/getArticleFinalReview', {
article_id: this.editform.articleId
})
.then(async (res) => {
if (res.status == 1) {
this.finalList = [...res.data.final_review];
this.reviewList = res.data.review;
}
})
.catch((err) => {});
},
async creatAI() {
const loading = this.$loading({
lock: true,
text: 'loading...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
await this.$api
// api/Article/addArticle
.post('api/Aireview/review', {
article_id: this.editform.articleId
})
.then(async (res) => {
if (res.status == 1) {
loading.close();
this.$message.success(res.msg);
// await this.getAi();
// await this.openAI();
}
})
.catch((err) => {
loading.close();
this.$message.error('Please click to view again in 1 minute in AI analysis');
});
},
openAI(data) {
this.isShowAI = true;
},
async getAi() {
await this.$api
// api/Article/addArticle
.post('api/Aireview/get', {
article_id: this.editform.articleId
// article_id: 6332
})
.then((res) => {
this.currentArticleData = {
abstrart: this.form.abstrart,
keywords: this.form.keywords,
ai_review: ''
};
if (res.data) {
this.currentArticleData.ai_review = {...res.data, hotspot: res.data.hotspot?JSON.parse(res.data.hotspot):''};
var aiReview = {};
if (this.currentArticleData.ai_review.journal_scope_assessment == '') {
aiReview = {
topic: this.$t('aiReview.state0'),
value: 'journal_scope_assessment1',
explanationValue: '',
isShowSign: 0,
parameter: [
{
topic: this.$t('aiReview.state0'),
value: 'journal_scope_assessment',
explanationValue: 'journal_scope_explanation',
isShowSign: 1
},
{
topic: this.$t('aiReview.state22'),
value: 'other_journal_assessment',
explanationValue: 'other_journal_explanation',
isShowSign: 1
}
]
};
} else {
aiReview = {
topic: this.$t('aiReview.state0'),
value: 'journal_scope_assessment',
explanationValue: 'journal_scope_explanation',
isShowSign: 1
};
}
this.aiReview[0] = aiReview;
}
})
.catch((err) => {
// this.$message.error('AI analysis failed');
});
},
async getWordimgList() {
var that = this;
await this.$api
.post('api/Article/getArticleImages', {
article_id: this.$route.query.id
})
.then(async (res) => {
this.wordimgList = res.data.list;
if (this.wordimgList.length > 0) {
await this.$commonJS.getWordImagesThumbnails(this.wordimgList, function (html) {
that.imagesHtml = html;
});
}
});
},
getWordTablesList() {
this.$api
.post('api/Article/getArticleTable', {
article_id: this.$route.query.id
})
.then((res) => {
var that = this;
that.tables = res.data.list && res.data.list.length > 0 ? JSON.parse(res.data.list[0].table) : [];
if (that.tables.length > 0) {
that.$commonJS.getWordTablesThumbnails(that.tables, function (html) {
that.tablesHtml = html;
});
}
});
},
openDrawer(data, url) {
console.log('url at line 799:', data, url);
this.previewData = {
...data,
previewUrl: url,
drawerTitle: 'Uploader : ' + data.username + ' ' + this.formatDate(data.ctime)
};
this.drawer = true;
},
handleClose() {
this.drawer = false;
},
talksave(val) {
this.msgform.ad_content = '';
this.getTalkList();
},
formatDate(timestamp) {
var date = new Date(timestamp * 1000); //时间戳为10位需*1000时间戳为13位的话不需乘1000
var Y = date.getFullYear() + '-';
var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
var D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
var h = date.getHours() < 10 ? '0' + date.getHours() : date.getHours();
var m = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes();
var s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds();
return Y + M + D;
},
//弹出编辑框
testvis() {
this.editform.state = this.form.state;
this.editVisible = true;
},
testedit() {
this.editbox = true;
},
changeRepe() {
this.repebox = true;
},
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;
},
// mystate(mystate) {
// console.log('mystate at line 1052:', mystate);
// let str = '';
// switch (mystate) {
// case 1:
// str = 'Accept';
// break;
// case 2:
// str = 'Reject';
// break;
// case 3:
// // str = 'Accept';
// str = 'Revision';
// break;
// }
// return str;
// },
statetostr(mystate) {
let str = '';
switch (mystate) {
case 0:
str = this.$t('artstate.state0');
break;
case 1:
str = this.$t('artstate.state1');
break;
case 2:
str = this.$t('artstate.state2');
break;
case 3:
str = this.$t('artstate.state3');
break;
case 4:
str = this.$t('artstate.state4');
break;
case 5:
str = this.$t('artstate.state5');
break;
case 6:
str = this.$t('artstate.state6');
break;
}
return str;
},
async editArticleStatus() {
this.loading1 = true;
await this.$api
.post('api/Article/editArticleEditor', this.editform)
.then((res) => {
this.loading1 = false;
if (res.code == 1) {
this.$message.error(res.msg);
} else {
this.$message.success('success');
this.editVisible = false;
this.initarticle();
this.initFileList();
this.getWordimgList();
this.getWordTablesList();
}
})
.catch((err) => {
console.log(err);
});
},
async checkArticleStatus() {
var status;
var msg = '';
await this.$api
.post('api/Article/checkArticleStart', { article_id: this.editform.articleId })
.then((res) => {
if (res.code == 1) {
status = 1;
msg = res.msg;
} else {
status = 0;
}
})
.catch((err) => {
status = 'err';
// this.$message.err()
console.log(err);
});
return { status: status, msg: msg };
},
handleDeleteMajor(v) {
console.log('v at line 925:', v);
this.$confirm('Are you sure you want to delete this Field ?', 'Tip', {
type: 'warning'
})
.then(() => {
this.$api
.post('api/Major/delMajorByArticleIdForEditor', {
mta_id: v.mta_id
})
.then((res) => {
if (res.code == 0) {
this.initMajor();
} else {
this.$message.error(res.msg);
}
})
.catch((err) => {
this.$message.error(err);
});
})
.catch(() => {});
},
//修改文章状态
async saveEdit() {
if (this.form.state == 0) {
if (this.form.state != this.editform.state) {
var data = await this.checkArticleStatus();
if (data.status == 1) {
await this.$confirm(data.msg, this.$t('journalStatus.Prompt'), {
confirmButtonText: this.$t('journalStatus.Continue'),
cancelButtonText: this.$t('journalStatus.Cancel'),
type: 'warning'
})
.then(async () => {
this.editVisible = false;
await this.editArticleStatus();
})
.catch(() => {
this.editVisible = false;
});
} else if (data.status == 0) {
this.editArticleStatus();
}
} else {
this.editVisible = false;
}
} else {
this.editArticleStatus();
}
},
saveRemark() {
const load = this.$loading({
lock: true,
text: 'Loading...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
this.$api.post('api/Article/editArticleRemark', this.remark).then((res) => {
load.close();
this.editbox = false;
this.$message.success('success');
this.initarticle();
// this.$router.go(0);
});
},
saveRepe() {
if (this.repeform.zipurl == '') {
this.$message.error('please upload zip');
return false;
}
const load = this.$loading({
lock: true,
text: 'Loading...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
this.$api.post('api/Article/changeRepetition', this.repeform).then((res) => {
load.close();
this.$message.success('success');
this.initarticle();
this.initFileList();
this.getWordimgList();
this.getWordTablesList();
});
},
initMajor() {
this.$api
.post('api/Major/getMajorByArticleId', {
article_id: this.editform.articleId
})
.then((res) => {
this.majorsList = res.data.majors;
});
},
//初始化期刊信息
initarticle() {
this.now_year = new Date().getFullYear();
this.$api
.post('api/Article/getArticleDetail', {
articleId: this.editform.articleId,
human: 'editor'
})
.then((res) => {
this.$api.post('api/Workbench/updateArticleState', {
article_id: this.editform.articleId,
type: '4,5,6',
account: localStorage.getItem('U_name')
});
const dynamicTimestamp = res.article.ctime;
const dynamicDate = new Date(dynamicTimestamp * 1000);
const targetDate = new Date(2025, 10, 3);
dynamicDate.setHours(0, 0, 0, 0);
targetDate.setHours(0, 0, 0, 0);
// 2025-11-03 ---上线了自动解析word 识别作者功能 去掉了 address和department字段
const isDynamicDateAfterTarget = dynamicDate > targetDate;
if (!isDynamicDateAfterTarget) {
// 判断日期是否小于等于 2025-11-03
this.isShowAuthorInfo = true;
} else {
this.isShowAuthorInfo = false;
}
this.initMajor();
this.form.username = res.article.account;
this.form.user_email = res.article.user_email;
this.form.is_figure_copyright = res.article.is_figure_copyright;
this.is_figure_copyright =
res.article.is_figure_copyright == 1 || res.article.is_figure_copyright == 2
? res.article.is_figure_copyright.toString()
: '';
this.form.title = res.article.title;
this.form.journal = res.article.journal_id;
this.form.journalname = res.article.journalname;
this.form.abstrart = res.article.abstrart;
this.form.accept_sn = res.article.accept_sn;
this.form.scoring = res.article.scoring;
this.form.h_fen = res.article.h_fen;
this.form.b_fen = res.article.b_fen;
this.form.c_fen = res.article.c_fen;
this.form.dw_fen = res.article.dw_fen;
this.form.ly_fen = res.article.ly_fen;
this.form.jj_fen = res.article.jj_fen;
this.form.keywords = res.article.keywords;
this.form.fund = res.article.fund;
this.form.type = res.article.type;
this.form.special_num = res.article.special_num;
this.form.special_title = res.article.special_title;
this.form.major = res.major;
this.form.approval = res.article.approval == 1 ? true : false;
this.form.approval_file = res.article.approval_file;
this.form.approval_content = res.article.approval_content;
this.form.repetition = res.article.repetition;
this.form.remarks = res.article.remarks;
this.form.repeurl = res.article.repeurl;
this.repeform.repefen = res.article.repetition;
this.remark.content = res.article.remarks;
this.form.state = res.article.state;
this.form.ctime = res.article.ctime;
this.form.is_use_ai = res.article.is_use_ai;
this.form.use_ai_explain = res.article.use_ai_explain;
this.form.transList = res.transfer;
this.form.is_draft = res.article.is_draft;
this.msgs = res.msg;
var alist = res.authors;
let alist_name = [];
for (var i in alist) {
let index_h = 0;
let index_c = '#000';
this.form.authorList.push({
art_aut_id: alist[i].art_aut_id,
firstname: alist[i].firstname,
lastname: alist[i].lastname,
orcid: alist[i].orcid,
company: alist[i].company,
department: alist[i].department,
title: alist[i].author_title,
country: alist[i].country,
email: alist[i].email,
address: alist[i].address,
scopus_index: alist[i].scopus_index,
user_id: alist[i].user_id,
scopus_website: alist[i].scopus_website,
isSuper: alist[i].is_super == 1 ? true : false,
isReport: alist[i].is_report == 1 ? true : false
// indexs_show: index_h,
// indexs_color: index_c,
});
// if (alist[i].is_report) {
// this.$api
// .post('api/User/getIndexByEmail', {
// email: alist[i].email
// })
// .then(res => {
// if (res.data.indexs.length != 0) {
// if (res.data.indexs[0].year == this.now_year) {
// index_h = res.data.indexs[0].h_index
// if (index_h < 5) {
// index_c = "#cb160a"
// } else if (index_h < 10) {
// index_c = "#cbb504"
// } else {
// index_c = "#0cbc15"
// }
// this.form.authorList[i].indexs_show = index_h
// this.form.authorList[i].indexs_color = index_c
// }
// }
// })
// .catch(err => {
// console.log(err);
// });
// }
if (i == alist.length - 1) {
alist_name.push(alist[i].firstname + ' ' + alist[i].lastname);
} else {
alist_name.push(alist[i].firstname + ' ' + alist[i].lastname + ' , ');
}
}
this.authorList_name = 'Author : ' + alist_name.join('');
this.msgform.user_id = res.article.user_id;
this.$api
.post('api/Article/getJournalsByMajor', {
major_id: res.article.major_id
})
.then((res) => {
this.journals = res.data.journals;
});
})
.catch((err) => {
console.log(err);
});
// 获取作者发给审稿人邮件列表
this.$api
.post('api/Article/getArticleResponseFiles', {
article_id: this.editform.articleId
})
.then((res) => {
this.responseFileList = res.data.files;
})
.catch((err) => {
console.log(err);
});
// 留言板列表
this.$api
.post('api/Article/getArticleDialogs', {
article_id: this.$route.query.id
})
.then((res) => {
this.talkMsgs = res.data.dialogs;
})
.catch((err) => {
console.log(err);
});
},
// 获取留言列表
getTalkList() {
this.$api
.post('api/Article/getArticleDialogs', {
article_id: this.$route.query.id
})
.then((res) => {
this.talkMsgs = res.data.dialogs;
})
.catch((err) => {
console.log(err);
});
},
// H指数修改
HIndexEdit(row) {
this.HEditVisible = true;
this.HIxForm.email = row.email;
this.HIxForm.realname = row.firstname + row.lastname;
this.HIxForm.year = this.now_year;
if (row.indexs_show != 0) {
this.HIxForm.index = row.indexs_show;
} else {
this.HIxForm.index = '';
}
},
// 保存index
saveHIx() {
this.$api
.post('api/User/editIndexByEmail', this.HIxForm)
.then((res) => {
if (res.code == 0) {
this.$message.success('Edit H Index succeeded');
this.HEditVisible = false;
this.form.authorList = [];
this.initarticle();
} else {
this.$message.error(res.msg);
}
})
.catch((err) => {
this.$message.error(err);
});
},
//初始化filelist
initFileList() {
this.$api
.post('api/Article/getFilelistByArticleID', {
articleId: this.form.articleId
})
.then((res) => {
this.coverLetterFileList = res.coverLetter;
this.picturesAndTablesFileList = res.picturesAndTables;
this.manuscirptFileList = res.manuscirpt;
this.totalpageFileList = res.totalpage;
this.supplementaryFileList = res.supplementary;
this.fileL_articleCopyright = res.figurecopyright ? res.figurecopyright : [];
if (this.fileL_articleCopyright.length > 0) {
var figurecopyright_file = fileL_articleCopyright[this.fileL_articleCopyright.length - 1];
this.figurecopyright_file = figurecopyright_file.file_url;
this.newfilearticleCopyrightList = [
{
name: 'Figure Copyright Declaration File',
url: this.figurecopyright_file
}
];
this.$forceUpdate();
}
})
.catch((err) => {
console.log(err);
});
},
uperr_coverLetter(err) {
this.$message.error('upload error');
},
beforeupload() {},
filedateformate(row, column, cellValue, index) {
return this.formatDate(cellValue);
},
// upSuccess_coverLetter(res, file) {
// if (res.code == 0) {
// this.form.coverLetter = 'coverLetter/' + res.upurl;
// } else {
// this.$message.error('service error' + res.msg);
// }
// },
// upSuccess_picturesAndTables(res, file) {
// if (res.code == 0) {
// this.form.picturesAndTables = 'picturesAndTables/' + res.upurl;
// } else {
// this.$message.error('service error' + res.msg);
// }
// },
upSuccess_manuscirpt(res, file) {
if (res.code == 0) {
this.form.manuscirpt = 'manuscirpt/' + res.upurl;
} else {
this.$message.error('service error' + res.msg);
}
},
upSuccess_repezip(res, file) {
if (res.code == 0) {
this.repeform.zipurl = 'repezip/' + res.upurl;
}
},
//超出传送文件个数限制
alertlimit() {
this.$message.error('The maximum number of uploaded files has been exceeded');
},
getlinkurl(row) {
return this.mediaUrl + row.file_url;
},
//检验上传文件的格式
beforeupload_manuscirpt(file) {
let flieArr = file.name.split('.');
let fileSuffix = flieArr[flieArr.length - 1];
if (fileSuffix != 'docx') {
this.$message.error('Only word and compressed files can be uploaded(.docx)');
return false;
}
// const ismau =
// file.type === 'application/msword' ||
// file.type === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'||
// file.type === 'application/x-zip-compressed' ||
// file.name.split(".")[1] === 'rar';
// if (!ismau) {
// this.$message.error('Only word and compressed files(.doc,.docx,.rar,.zip)');
// }
// return ismau;
},
//清除文件时的事件
removefilemanuscirpt(file, fileList) {
this.form.manuscirpt = '';
},
removefilerepezip(file, fileList) {
this.repeform.zipurl = '';
},
formatDate_(timestamp) {
var date = new Date(timestamp * 1000); //时间戳为10位需*1000时间戳为13位的话不需乘1000
var Y = date.getFullYear() + '-';
var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
var D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
var h = date.getHours() < 10 ? '0' + date.getHours() : date.getHours();
var m = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes();
var s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds();
return Y + M + D + ' ' + h + ':' + m + ':' + s;
},
onsubmit() {
if (this.form.manuscirpt == '') {
this.$message.error('Manuscript is required!');
return false;
}
const load = this.$loading({
lock: true,
text: 'Loading...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
this.$api
.post('api/Article/changeArticleFileEditor', this.form)
.then((res) => {
load.close();
this.$message.success('success');
this.initarticle();
this.initFileList();
this.getWordimgList();
this.getWordTablesList();
})
.catch((err) => {
load.close();
console.log(err);
});
},
// 显示转投稿件弹窗
showResubmit() {
this.loading4 = true;
this.$api
.post('api/Journal/getJournalByeditor', { user_id: localStorage.getItem('U_id') })
.then((res) => {
this.loading4 = false;
this.editorJournalList = res.data.journals;
console.log(res);
this.resubmitVisible = true;
})
.catch((err) => {
console.log(err);
});
},
// 提交转投稿件
saveResubmit() {
// 验证表单
this.$refs['resubmitJournal'].validate((valid) => {
if (valid) {
alert('submit!');
console.log(this.resubmitJournal);
} else {
console.log('error submit!!');
return false;
}
});
},
// 关闭弹窗
closeResubmit() {
(this.resubmitVisible = false), this.$refs['resubmitJournal'].resetFields();
}
},
mounted() {
this.opname = this.$route.query.mark;
this.resubmitJournal.manuscriptId = this.$route.query.id;
}
};
</script>
<style scoped>
.art_state_ {
padding: 20px 20px 1px 20px;
}
.art_state_ .art_state_message_id {
margin-bottom: 15px;
color: #777;
line-height: 22px;
padding: 0 0 15px 5px;
}
.art_state_message_id > font {
display: inline-block;
}
.art_state_message_id b {
letter-spacing: -1px;
color: #333;
}
.tree_box {
border: 1px solid #dcdfe6;
border-radius: 5px;
background-color: #fff;
padding: 15px;
}
.art_caozuo_ {
margin-top: 0;
padding: 5px 15px;
}
.art_caozuo_ > div {
margin: 0 0 10px 0px;
}
.art_caozuo_ > p:last-child {
margin-bottom: 0;
}
.art_caozuo_ > div > span {
color: #777;
margin: 0 15px 0 0;
display: inline-block;
min-width: 65px !important;
}
.art_caozuo_ > div > button {
margin-left: 25px;
font-weight: bold;
}
.art_caozuo_ > div > button:hover {
text-decoration: underline;
}
.el-upload__tip {
display: inline-block;
line-height: 32px;
margin: 0 0 0 15px;
color: #888 !important;
vertical-align: text-bottom;
}
.art_file {
}
.art_file_ h4 {
margin: 1px 0 5px 15px;
float: left;
color: #777;
font-weight: normal;
}
.art_file_ p.fi_new {
margin: 0 0 0 10px;
margin-bottom: 10px;
float: left;
}
.art_file_ p.fi_new > a {
color: #333;
display: block;
margin: 0 0 10px 0;
}
.art_file_ p.fi_new > a:hover {
text-decoration: underline;
}
.art_file_ p.fi_new > a > img {
width: 15px;
vertical-align: text-bottom;
margin: 0 5px 0 0;
}
.art_file_ p.fi_new > a > span > font {
color: #888;
margin: 0 5px 0 0;
font-size: 13px;
letter-spacing: -1px;
}
.art_file_ p.fi_new > a > span > i {
font-size: 12px;
color: #888;
margin: 0 0 0 3px;
font-style: normal;
}
.art_file_ p.fi_new > a > span > i > i {
margin: 0 5px 0 0;
}
.art_file_ .download {
font-weight: bold;
color: #75abf1;
margin: 0 0 0 10px;
}
.art_state_message p {
margin-left: 15px;
}
::v-deep .el-drawer__header {
margin-bottom: 0;
padding: 15px;
}
::v-deep #wacframe #AppHeaderPanel {
width: 98% !important;
}
::v-deep .el-drawer__wrapper .WACContainer {
z-index: 10000 !important;
}
.beautiful-gradient {
/* background: linear-gradient(135deg, #f0f9fe, #dce6ff, #d7e9fd); */
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.01);
/* border-radius: 16px;
padding: 10px;
box-sizing: border-box;
color: #333;
font-family: "Segoe UI", sans-serif; */
transition: transform 0.3s ease, box-shadow 0.3s ease;
border-radius: 30px;
}
.beautiful-gradient:hover {
transform: translateY(-4px);
box-shadow: 0 12px 30px rgba(0, 0, 0, 0.15);
}
.AISummaryAnalysis .titleBox {
display: flex;
align-items: center;
justify-content: center;
background-color: #6157fd;
padding: 4px;
border-radius: 4px;
margin-bottom: 20px;
}
.AISummaryAnalysis div .title {
display: inline-block;
width: auto;
color: #6157fd;
/* font-weight: bold; */
}
::v-deep .AISummaryAnalysis .auth_collna_ew .el-collapse-item__header {
padding-left: 30px;
}
::v-deep .AISummaryAnalysis .el-form-item--mini.el-form-item,
.el-form-item--small.el-form-item {
margin-bottom: 10px;
}
.beautiful-gradient1 {
background: linear-gradient(135deg, #f0f9fe, #dce6ff, #d7e9fd);
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.01);
border-radius: 10px;
padding: 10px 20px 10px 20px !important;
box-sizing: border-box;
color: #333;
font-family: 'Segoe UI', sans-serif;
transition: transform 0.3s ease, box-shadow 0.3s ease;
border-radius: 30px;
}
/deep/.research_area .el-collapse-item__content {
padding-bottom: 0 !important;
}
.art_author_ {
padding: 15px 20px !important;
}
.art_author_ > h2 {
font-size: 18px;
margin: 0 0 15px 0;
letter-spacing: -0.8px;
}
.art_author_list {
margin: 0 0 0 5px;
}
.art_author_list .com_shu {
background-color: #006699;
color: #fff;
display: inline-block;
width: 18px;
height: 18px;
line-height: 18px;
text-align: center;
margin: 0 10px 0 0;
}
.art_author_peng {
margin: 10px 0 0px 10px;
line-height: 24px;
}
.art_author_peng > a {
color: #333;
}
.art_author_peng > a:hover {
text-decoration: underline;
}
.art_author_peng > a > img {
width: 15px;
vertical-align: text-bottom;
margin: 0 15px 0 0;
}
.art_author_peng > a > span {
color: #888;
margin: 0 0 0 30px;
}
.art_author_peng > a > i {
font-weight: bold;
color: #75abf1;
margin: 0 0 0 18px;
}
.art_author_btn > div {
margin-bottom: 30px;
color: #006699;
}
.art_author_btn > h4 {
float: left;
width: 180px;
padding: 8px 20px 0 0;
letter-spacing: -0.5px;
text-align: right;
}
.art_author_btn > p {
float: left;
margin: 0 0 30px 0;
}
.el-upload__tip {
margin-left: 6px;
}
.el-collapse {
border-bottom: 0;
}
.art_author_coment {
}
.art_author_coment > p {
line-height: 20px;
}
.art_author_coment > p:first-child {
margin-top: 0;
}
.art_author_coment > p > font,
.commentfs > font {
display: block;
margin: 15px 0 5px 0;
color: #333;
font-weight: bold;
letter-spacing: -0.5px;
}
.review_table {
width: 100%;
background-color: #fff;
/* margin-top: 10px; */
border-collapse: collapse; /* 合并表格边框 */
}
.review_table th,
td {
padding: 6px;
min-width: 70px;
border: 1px solid #ddd;
border-left: 0;
border-right: 0;
text-align: left;
}
.review_table th {
font-size: 14px;
background-color: #f0f0f0;
}
.review_table td {
font-size: 14px;
/* background-color: #f0f0f0; */
}
/* ::v-deep .review_table th:first-child, .review_table td:first-child {
width: 30px !important;
} */
.review_table tr:hover {
/* background-color: #fff; */
}
.overflow-x-auto {
overflow-x: auto;
}
.short-content {
max-height: 120px;
display: -webkit-box;
-webkit-line-clamp: 3; /* 设置显示的行数 */
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
overflow: hidden;
}
.show-more-btn {
background-color: #4caf50;
color: white;
padding: 10px;
border: none;
cursor: pointer;
margin-top: 10px;
}
.show-more-btn:hover {
background-color: #45a049;
}
.corrPeo {
word-break: normal;
}
.corrPeo .corrPUser {
border-bottom: 1px solid #00669936;
color: #006699;
font-size: 16px;
padding: 0 0 10px 0;
margin: 25px 0 10px 0;
font-weight: bold;
}
.corrPeo .corrPTim {
line-height: 22px;
margin-bottom: 20px;
}
.corrPeo .corrPTim:hover {
text-decoration: underline;
cursor: pointer;
}
.corrPeo .corrPTim span {
background: #db890e21;
color: #db890e;
display: inline-block;
padding: 1px 5px;
border-radius: 5px;
font-size: 12px;
margin-right: 10px;
letter-spacing: 0.5px;
font-weight: bold;
}
.corrPeo .corrPTim font {
font-weight: bold;
margin-left: 10px;
letter-spacing: -0.5px;
}
.btnCliArt {
color: #006699;
font-weight: normal;
margin-left: 40px;
}
.under_review .btnCliArt {
border: 1px solid #b3d8ff;
color: #409eff;
padding: 5px 10px;
border-radius: 5px;
background-color: #ecf5ff;
float: right;
margin-right: 20px;
}
.remarkContent {
margin-right: 10px;
line-height: 20px;
color: #888;
cursor: pointer;
max-width: calc(100% - 160px);
}
.collapsed {
display: -webkit-box;
-webkit-line-clamp: 2; /* 限制显示两行 */
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
white-space: normal;
}
.kuang_communtion {
margin-bottom: 15px;
}
::v-deep .under_review .el-icon-arrow-right {
right: 0px !important;
left: 0px !important;
position: relative !important;
}
.under_review_title {
width: 100%;
}
.under_review_title span {
line-height: 30px;
}
.scoringRules ul li {
list-style: none;
}
.scoringRules ul .scoringRulesEcharts {
display: flex;
align-items: flex-start;
justify-content: flex-start;
}
.scoringRulesTitle {
display: inline-block;
width: 70px;
color: #0077b8e6;
font-weight: 700;
}
.scoringRulesItem {
margin-top: 10px;
}
.copyright-declaration-wrapper {
background-color: #f8f9fb;
padding: 6px 6px;
border-radius: 8px;
border: 1px solid #e4e7ed;
margin-top: 10px;
}
.copyright-declaration-wrapper :deep(.el-radio-group) {
display: flex !important;
flex-direction: column !important;
align-items: flex-start !important;
gap: 10px;
}
.copyright-declaration-wrapper :deep(.el-radio) {
height: auto;
white-space: normal;
line-height: 1.2;
display: flex;
align-items: flex-start;
}
.copyright-declaration-wrapper :deep(.el-radio__input) {
margin-top: 3px;
}
.copyright-declaration-wrapper :deep(.el-radio:hover) {
color: #333;
}
.copyright-declaration-wrapper :deep(.el-radio.is-checked .el-radio__label) {
font-weight: 500;
}
</style>