发布评审任务

This commit is contained in:
unknown 2022-01-07 12:20:13 +08:00
parent 26d81ab2bf
commit 11701869a1
20 changed files with 220 additions and 49 deletions

View File

@ -1,8 +1,8 @@
@font-face {
font-family: "iconfont"; /* Project id 2340181 */
src: url('iconfont.woff2?t=1639537334021') format('woff2'),
url('iconfont.woff?t=1639537334021') format('woff'),
url('iconfont.ttf?t=1639537334021') format('truetype');
src: url('iconfont.woff2?t=1641524827252') format('woff2'),
url('iconfont.woff?t=1641524827252') format('woff'),
url('iconfont.ttf?t=1641524827252') format('truetype');
}
.iconfont {
@ -13,6 +13,22 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-ioon:before {
content: "\e90e";
}
.icon-shanchu_tc_icon1:before {
content: "\e90c";
}
.icon-zhuanjiaicon:before {
content: "\e90d";
}
.icon-shengming:before {
content: "\e90b";
}
.icon-chenggong1:before {
content: "\e907";
}

File diff suppressed because one or more lines are too long

View File

@ -5,6 +5,34 @@
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
{
"icon_id": "27041503",
"name": "ioon",
"font_class": "ioon",
"unicode": "e90e",
"unicode_decimal": 59662
},
{
"icon_id": "26470602",
"name": "shanchu_tc_icon",
"font_class": "shanchu_tc_icon1",
"unicode": "e90c",
"unicode_decimal": 59660
},
{
"icon_id": "26470603",
"name": "专家icon",
"font_class": "zhuanjiaicon",
"unicode": "e90d",
"unicode_decimal": 59661
},
{
"icon_id": "12505154",
"name": "声明",
"font_class": "shengming",
"unicode": "e90b",
"unicode_decimal": 59659
},
{
"icon_id": "26470597",
"name": "成功",

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -43,7 +43,6 @@ const Expert = (propsTransmit) => {
}, []);
let propsF = { ...propsTransmit };
propsF.current_user = currentUser;
console.log(currentUser);
return (
<div className="newMain clearfix">

View File

@ -109,14 +109,24 @@ export function updateScoringDetails(data){
});
}
//编辑评审规则
//获取创客任务评审规则
export function getRules(params){
return fetch({
export async function getRules(params){
let response = await fetch({
url: `/api/taskRuleCriteria/getRuleAndCriteria`,
method: 'get',
params
})
});
if(response && response.message === "success"){
let criterias = [];
response.data.criteriaOne && (criterias[criterias.length] = (criterias.length+1)+"、"+response.data.criteriaOne);
response.data.criteriaTwo && (criterias[criterias.length] = (criterias.length+1)+"、"+response.data.criteriaTwo);
response.data.criteriaThree && (criterias[criterias.length] = (criterias.length+1)+"、"+response.data.criteriaThree);
response.data.criteriaFour && (criterias[criterias.length] = (criterias.length+1)+"、"+response.data.criteriaFour);
response.data.criteriaFive && (criterias[criterias.length] = (criterias.length+1)+"、"+response.data.criteriaFive);
response.data.criterias = criterias;
response.data.reviewData = response.data.reviewStartOn.substring(0,response.data.reviewStartOn.length-3) + " ~ " + response.data.reviewEndOn.substring(0,response.data.reviewEndOn.length-3)
}
return response;
}
//编辑评审规则(第一次)

View File

@ -1,10 +1,23 @@
import React from "react";
import Link from "react-router-dom/Link";
import './index.scss';
import '../index.scss';
import paginationTable from "src/military/components/paginationTable";
function ReviewResult() {
function ReviewResult({ location, history }) {
const { taskRecord } = location && location.state;
return (
<div className="expert_review_system centerbox">
aaa
<div className="head_title mb20">
<div className="df pb10 pt10">
<span className="font-16 font-w">评审结果</span>
<button className="but41_border goback_but" onClick={()=>{history.goBack()}}>返回创客任务列表</button>
</div>
<p className="mt10"><span className="font-w">任务名称</span><span className="ml10">{taskRecord.name}</span></p>
<p className="mt10 pb20"><span className="font-w">任务链接</span><Link className="taskLink ml10" target="_blank" to={`/task/taskDetail/${taskRecord.id}`} >{`/task/taskDetail/${taskRecord.id}`}</Link></p>
</div>
<p className="font-16 font-w">应征者排名</p>
<paginationTable></paginationTable>
</div>)
}
export default ReviewResult;

View File

@ -0,0 +1,14 @@
.expert_review_system.centerbox{
background: white;
font-family: 'PingFangSC-Semibold';
padding: 0 1.5em;
.font-w{
font-weight: bold;
}
.df{
display: flex;
justify-content: space-between;
align-items: center;
}
.mt10.pb20{border-bottom: 1px solid #eeeeee;}
}

View File

@ -15,6 +15,15 @@ function ReviewRules({ location, form, history }) {
//
const [ initValue, setInitValue] = useState(false);
const disabledDate = (current) =>{
if(taskRecord.status === 1){
return current && current < moment(taskRecord.createdAt).endOf('day');
}else if(taskRecord.status === 3){
const endDate = new Date((new Date(taskRecord.collectingEndTime)/1000 + 86400*taskRecord.collectingDays)*1000);
return current && current < moment(taskRecord.collectingEndTime).endOf('day') || current > moment(endDate).endOf('day');
}
}
useEffect(()=>{
//
const params = {
@ -75,7 +84,7 @@ function ReviewRules({ location, form, history }) {
<div className="head_title mb20">
<div className="-layout pb10">
<span className="font-16">任务信息</span>
<button className="but41_border" onClick={()=>{history.goBack()}}>返回上一页</button>
<button className="but41_border goback_but" onClick={()=>{history.goBack()}}>返回创客任务列表</button>
</div>
<p className="mt10">任务名称<span className="ml10">{taskRecord.name}</span></p>
<p className="mt10 pb20">任务链接<Link className="taskLink ml10" target="_blank" to={`/task/taskDetail/${taskRecord.id}`} >{`/task/taskDetail/${taskRecord.id}`}</Link></p>
@ -149,7 +158,7 @@ function ReviewRules({ location, form, history }) {
showTime={{ format: 'HH:mm' }}
format="YYYY-MM-DD HH:mm"
placeholder={['开始时间', '结束时间']}
disabledDate={disabledDate}
/>,
)}
</Form.Item>

View File

@ -37,6 +37,7 @@
.but41_fill, .but41_border, .butE3_border{
width: 6.5em;
}
.goback_but{width: 9.5em;}
.but41_border{padding: 0;}
.rules_bar{
margin: 25px -2em;

View File

@ -1,5 +1,5 @@
import React, { useState, useEffect, useMemo } from "react";
import { Tabs, Input, Select, Button, Modal, Form, message } from 'antd';
import { Tabs, Input, Select, Button, Modal, Form, message, Popconfirm } from 'antd';
import { professionalType, reviewArea } from '../static.js';
import { assignExperts, deleteExperts, expertList, selectExpertList } from "../api.js";
import Paginationtable from "../../components/paginationTable";
@ -97,7 +97,7 @@ function SelectExpert(props) {
render: (text, record) => {
return <React.Fragment>
{activeKey == "1" && (record.isExpertTask ? <span className="selected">已添加</span> : <a className="select" onClick={()=>{SelectExperts([record.id])}}>添加</a>)}
{activeKey == "0" && <Button className="mr5 font-12" type="danger" size="small" onClick={() => { deleteExpert(record.taskExpertId, record.id) }}>删除</Button>}
{activeKey == "0" && <Popconfirm placement="bottom" title="你确认要删除此专家吗?" onConfirm={() => { deleteExpert(record.taskExpertId, record.id)}} okText="是" cancelText="否"><Button className="mr5 font-12" type="danger" size="small">删除</Button></Popconfirm>}
</React.Fragment>
}
}
@ -215,6 +215,8 @@ function SelectExpert(props) {
setRandomErrorMessage('请输入随机抽取的专家数量!');
}else if(isNaN(randomCount)){
setRandomErrorMessage('请输入数字!');
}else if(randomCount.indexOf('.')!==-1){
setRandomErrorMessage('请输入整数!');
}else{
let params = {
searchInput,
@ -275,10 +277,12 @@ function SelectExpert(props) {
})
}
return (
<div className="centerbox select_expert">
<p className="title_one font-16">评审专家选取</p>
<div className="df">
<p className="title_one font-16">评审专家选取</p>
<button className="but41_border goback_but mr25" onClick={()=>{history.goBack()}}>返回创客任务列表</button>
</div>
<Tabs defaultActiveKey="0" type="card" onChange={(activeKey)=>{setActiveKey(activeKey);setSelectedRowKeys([]);setCurPage(1);}}>
<TabPane tab="已选专家" key="0">
<div>
@ -327,7 +331,7 @@ function SelectExpert(props) {
<p className="font-16">添加评审专家</p>
<div>
<button className="but41_fill" onClick={() => {selectedRowKeys && selectedRowKeys.length>0 && setOkConfirmExps(true)}}>批量添加</button>
<button className="but41_fill ml20" onClick={() => setOkConfirmExtract(true)}>随机抽取</button>
{allSelectedExpertsId && allSelectedExpertsId.size === total ? <button className="invalid_extraction butE3_border ml20">随机抽取</button> : <button className="but41_fill ml20" onClick={() => setOkConfirmExtract(true)}>随机抽取</button>}
<Modal
title="批量添加"
visible={okConfirmExps}

View File

@ -73,6 +73,9 @@
border-bottom: 1px solid #4154F1;
}
}
.invalid_extraction{
background: #F8F8F8;
}
}
.expert_modal.extract{
.ant-modal-content {

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1641461455018" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="50275" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M949.696 266.304a34.88 34.88 0 0 0-49.6 0L512 654.4 123.904 266.304a34.88 34.88 0 0 0-49.6 0 34.88 34.88 0 0 0 0 49.6l412.928 412.864c13.696 13.76 35.84 13.76 49.536 0l412.928-412.864a34.944 34.944 0 0 0 0-49.6z" fill="#bfbfbf" p-id="50276"></path></svg>

After

Width:  |  Height:  |  Size: 632 B

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1641461401607" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="25602" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M761.6 489.6l-432-435.2c-9.6-9.6-25.6-9.6-35.2 0-9.6 9.6-9.6 25.6 0 35.2l416 416-416 425.6c-9.6 9.6-9.6 25.6 0 35.2s25.6 9.6 35.2 0l432-441.6C771.2 515.2 771.2 499.2 761.6 489.6z" p-id="25603" fill="#bfbfbf"></path></svg>

After

Width:  |  Height:  |  Size: 599 B

View File

@ -126,7 +126,7 @@ export default Form.create()(({ form, showNotification, match, history, state })
showArrow
defaultValue={text?1:-1}
onChange={(key) => { changeExpertReviewStatus(key, record.id) }}
disabled={!(record.status < 4) || record.assignRuleAndExperts}
disabled={!(record.status < 4 && record.status !== 2) || record.assignRuleAndExperts}
>
{
expertReviewArr.map(item => {
@ -223,28 +223,28 @@ export default Form.create()(({ form, showNotification, match, history, state })
title: '评审规则',
dataIndex: 'ruleEditedCount',
render: (text, record) => {
return record.expertReview && (record.status < 4) && !record.assignRuleAndExperts ? <Link className="line_1 primary-link" to={{ pathname:'/expert/admin/task/review/rules', state: { 'taskRecord': record}}}>编辑</Link>:''
return record.assignRuleAndExperts ? <Button size='small' type="primary" onClick={()=>{viewRules(record)}}>查看</Button> : record.expertReview && (record.status === 1 || record.status === 3) ? <Link className="line_1 primary-link" to={{ pathname:'/expert/admin/task/review/rules', state: { 'taskRecord': record}}}>编辑</Link> : <span className='gary_span'>编辑</span>
}
},
{
title: '专家选取',
dataIndex: 'expertSelectedCount',
render: (text, record) => {
return record.expertReview && (record.status < 4) && !record.assignRuleAndExperts ? <Link className="line_1 primary-link" to={{ pathname: '/expert/admin/task/review/select', state: { 'taskRecord': record } }}>选择</Link>:''
return record.assignRuleAndExperts ? <Button size='small' type="primary" onClick={()=>{viewExperts(record)}}>查看</Button> : record.expertReview && (record.status === 1 || record.status === 3) ? <Link className="line_1 primary-link" to={{ pathname: '/expert/admin/task/review/select', state: { 'taskRecord': record } }}>选择</Link> : <span className='gary_span'>编辑</span>
}
},
{
title: '评审任务',
dataIndex: 'expertReview1',
render: (text, record) => {
return record.expertReview && (record.status < 4) ? !record.assignRuleAndExperts?<Button size='small' onClick={()=>{publishTaskReview(record)}}>发布</Button> : '已发布' :''
return record.expertReview && record.status < 4 && record.status !== 2 ? !record.assignRuleAndExperts ? <Button size='small' type="primary" onClick={()=>{publishTaskReview(record)}}>发布</Button> : <span className='gary_span'>已发布</span> :<span className='gary_span'>发布</span>
}
},
{
title: '评审结果',
dataIndex: 'expertReview2',
render: (text, record) => {
return record.assignRuleAndExperts && <Link className="line_1 primary-link" to='/expert/admin/task/review/results'>查看</Link>
return record.assignRuleAndExperts ? <Link className="line_1 primary-link" to={{ pathname: '/expert/admin/task/review/results', state: { 'taskRecord': record } }}>查看</Link>:<span className='gary_span'>查看</span>
}
},
{
@ -357,6 +357,7 @@ export default Form.create()(({ form, showNotification, match, history, state })
});
}
//
function publishTaskReview(record){
if(!record.ruleEditedCount || !record.expertSelectedCount){
message.error("请先编辑评审规则以及选取评选专家再发布此任务");
@ -365,13 +366,6 @@ export default Form.create()(({ form, showNotification, match, history, state })
let selectedExperts = undefined;
getRules({containerId: record.id, containerType: 1, statusString: 3}).then(response=>{
if(response && response.message === "success"){
let criterias = [];
response.data.criteriaOne && (criterias[criterias.length] = (criterias.length+1)+"、"+response.data.criteriaOne);
response.data.criteriaTwo && (criterias[criterias.length] = (criterias.length+1)+"、"+response.data.criteriaTwo);
response.data.criteriaThree && (criterias[criterias.length] = (criterias.length+1)+"、"+response.data.criteriaThree);
response.data.criteriaFour && (criterias[criterias.length] = (criterias.length+1)+"、"+response.data.criteriaFour);
response.data.criteriaFive && (criterias[criterias.length] = (criterias.length+1)+"、"+response.data.criteriaFive);
response.data.criterias = criterias;
rules = response.data;
}
})
@ -388,6 +382,47 @@ export default Form.create()(({ form, showNotification, match, history, state })
setTimeout(() => {
Modal.confirm({
className: 'publishReview',
title: "评审规则",
content:
<React.Fragment>
<div>{rules && rules.rule}</div>
<p>评分标准</p>
<div>
{rules.criterias.map(item=>{return <p>{item}</p>})}
</div>
<p>评审时间</p>
<div>{rules.reviewData}</div>
<p>已选取评审专家</p>
<PaginationTable
dataSource={selectedExperts}
columns={columnsExperts}/>
</React.Fragment>
,
okText: '确定',
cancelText: '取消',
onOk() {
publishExpertsAndRules(record.id).then(response=>{
if(response && response.message==="发布成功"){
setReload(Math.random());
}
})
},
});
}, 300);
}
}
//
function viewRules(record){
let rules = undefined;
getRules({containerId: record.id, containerType: 1, statusString: '-1,1'}).then(response=>{
if(response && response.message === "success"){
rules = response.data;
}
});
setTimeout(() => {
Modal.info({
className: 'publishReview',
title: "评审规则",
content:
<React.Fragment>
@ -397,25 +432,36 @@ export default Form.create()(({ form, showNotification, match, history, state })
{rules.criterias.map(item=>{return <p>{item}</p>})}
</div>
<p>评审时间</p>
<div>{rules.reviewStartOn}~{rules.reviewEndOn}</div>
<p>已选取评审专家</p>
<PaginationTable
dataSource={selectedExperts}
columns={columnsExperts}/>
<div>{rules.reviewData}</div>
</React.Fragment>
,
okText: '确定',
cancelText: '取消',
onOk() {
publishExpertsAndRules(record.id).then(response=>{
if(response && response.message==="发布成功"){
setReload(Math.random());
}
})
},
});
}, 300);
}
}, 300);
}
//
function viewExperts(record){
let selectedExperts = undefined;
selectExpertList({containerId: record.id, containerType: 1, curPage:curPage, pageSize: 10000, curPage: 1,}).then(response=>{
if(response && response.message === "success" && Array.isArray(response.data.rows)){
let index = 1;
for (const item of response.data.rows) {
item.reviewAreas = `${item.reviewAreaOne} ${item.reviewAreaTwo ? `${item.reviewAreaTwo}`:''} ${item.reviewAreaThree ? `${item.reviewAreaThree}`:''}`;
item.index = (index++) + (curPage > 1 ? (curPage - 1) * 10 : 0);
}
selectedExperts = response.data.rows
}
});
setTimeout(() => {
Modal.info({
className: 'publishReview',
title: "已选取评审专家",
content:
<PaginationTable
dataSource={selectedExperts}
columns={columnsExperts}/>,
});
}, 300);
}
function changeStatus(showUserMode, taskId) {

View File

@ -62,6 +62,10 @@
display: flex;
justify-content: space-around;
}
// .ant-table-row-collapsed::after, .ant-table-row-expanded::after {
// content: url('./image/down.svg');
// }
}
.inline-form {
@ -83,12 +87,17 @@
color: #29bd8b;
}
.gary_span{
color: rgba(176, 176, 176, 1);
}
// 发布评审任务弹框样式
.publishReview{
width: 1050px !important;
.ant-modal-confirm-title{
border-bottom: 1px solid #eeeeee;
padding-bottom: 10px;
font-weight: bold;
}
.ant-modal-confirm-body > .anticon{
display: none;
@ -102,12 +111,13 @@
color: rgba(51, 51, 51, 1);
border-bottom: 1px solid #eeeeee;
padding: 10px 0;
font-weight: bold;
}
&>div{
padding: 10px;
}
}
.ant-table-tbody > tr > td{
.pagination-table .ant-table-tbody > tr > td{
padding: 1px 16px;
}
}

View File

@ -12,6 +12,7 @@ import { getTaskDetail, getTaskCategory, getTaskPaper, makePublic, addPaper, get
import { taskModeIdArr, applyStatusArr, applyStatusAllArr, agreementContent, paperCheckTextArr } from '../static';
import { httpUrl } from '../fetch';
import './index.scss';
import { getRules } from 'src/military/expert/api';
const { TextArea } = Input;
@ -52,6 +53,8 @@ export default Form.create()(
const [relaodChildList, setRelaodChildList] = useState(0);
const [visibleProofs, setVisibleProofs] = useState(false);
//
const [publishedReviewRules, setPublishedReviewRules] = useState(undefined);
//
useEffect(() => {
@ -73,6 +76,11 @@ export default Form.create()(
history.push('/task');
}
setDetailData(data || {});
if(data && data.assignRuleAndExperts){
getRules({ containerId: data.id, containerType: 1, statusString: '-1,1', }).then(response=>{
response && setPublishedReviewRules(response.data || undefined);
})
}
});
}, [id, reload]);
@ -451,6 +459,14 @@ export default Form.create()(
<p className="color-grey-6 lineh-20 padding10-15 mb10">
应征者提交的稿件必须是设计作品广告等无效交稿一律不采用
</p>
{publishedReviewRules && <React.Fragment>
<div className="font-16 font-bd">评审规则</div>
<p className="color-grey-6 lineh-20 padding10-15 mb10">{publishedReviewRules.rule}</p>
<div className="font-16 font-bd">评分标准</div>
<p className="color-grey-6 lineh-20 padding10-15 mb10">{publishedReviewRules.criterias.map(item=>{return <p>{item}</p>})}</p>
<div className="font-16 font-bd">评审时间</div>
<p className="color-grey-6 lineh-20 padding10-15 mb10">{publishedReviewRules.reviewData}</p>
</React.Fragment>}
</div>
{!current_user.enterpriseCertification && <div className="edu-back-white padding30 mt20 font-16 text-center mb50">
@ -469,7 +485,7 @@ export default Form.create()(
{dataList.length > 0 && taskLimit && <a className="line_1 color-blue fr ml20" onClick={() => { window.open(`${httpUrl}/api/paper/papers/download/${id}`) }}>一键导出成果物 &gt;&gt;</a>}
{(!detailData.showUserStatus) && taskLimit && <a className="fr color-orange ml20" onClick={showUser}>应征者名单公示 &gt;&gt;</a>}
{/* [添加专家评审流程]按钮入口,仅管理员可见 */}
{taskLimit && !detailData.expertReview && <a className="fr color-orange ml20" onClick={addExpertReviewModal}>添加专家评审流程</a>}
{taskLimit && !detailData.expertReview && detailData.status<4 && <a className="fr color-orange ml20" onClick={addExpertReviewModal}>添加专家评审流程</a>}
</div>
<StatusNav
key={'applyStatus'}

View File

@ -772,7 +772,7 @@ class NewHeader extends Component {
{this.props.user && this.props.user.login &&
<div className='mr30'>
<a href={current_user.isExpert ? '/expert/user/tasks' : current_user.expertDraft ? '/expert/user/register' : '/expert'}>
<i className="iconfont icon-xiaoxilingdang color-grey-6"></i>
<i className={`iconfont icon-ioon ${activeIndex?'color-home':'color-grey-9'} font-22`}></i>
</a>
</div>
}