管理-评审规则、选择评审专家

This commit is contained in:
谢思 2021-12-21 19:46:44 +08:00
parent c9cd52221e
commit 617eabebc8
16 changed files with 414 additions and 14 deletions

View File

@ -15,7 +15,21 @@ const RegisterList = Loadable({
loader: () => import("./registerList"),
loading: Loading,
});
//创客任务评审规则
const ReviewRules = Loadable({
loader : () => import("./reviewRules"),
loading: Loading,
});
//创客任务选择评审专家
const SelectExpert = Loadable({
loader: () => import("./selectExpert"),
loading: Loading,
});
//创客任务评审结果查看
const ReviewResult = Loadable({
loader: () => import("./reviewResult"),
loading: Loading,
});
const AdminPage = (propsF) => {
@ -37,7 +51,27 @@ const AdminPage = (propsF) => {
<ExpertList {...propsF} {...props} />
)}
></Route>
{/* 创客任务评审规则 */}
<Route
path="/expert/admin/task/review/rules"
render={(props) => (
<ReviewRules {...propsF} {...props} />
)}
></Route>
{/* 创客任务选择评审专家 */}
<Route
path="/expert/admin/task/review/select"
render={(props) => (
<SelectExpert {...propsF} {...props} />
)}
></Route>
{/* 创客任务评审结果查看 */}
<Route
path="/expert/admin/task/review/results"
render={(props) => (
<ReviewResult {...propsF} {...props} />
)}
></Route>
</Switch>
</React.Fragment>
);

View File

@ -0,0 +1,16 @@
import React, { useState } from "react";
import { Input } from 'antd';
const { TextArea } = Input;
//
function WordsInput(props){
const [wordCount, setWordCount] = useState(0);
return(
<div style={{position:'relative'}}>
<TextArea placeholder={props.placeholder} rows={props.rows} maxLength={props.maxLength} onChange={(e)=>setWordCount(e.target.value.length)}/>
<span style={{ position: 'absolute', bottom: '-4px', right: '12px', fontSize: '12px' }}>{wordCount}/{props.maxLength}</span>
</div>
)
}
export default WordsInput;

View File

@ -30,7 +30,6 @@
.butE3_border{
color: #404660;
border: 1px solid #E3E7ED;
width: 7em;
&:hover{
background-color: #F8F8F8;
border: 1px solid #E3E7ED;

View File

@ -0,0 +1,10 @@
import React from "react";
import './index.scss';
function ReviewResult() {
return (
<div className="expert_review_system centerbox">
aaa
</div>)
}
export default ReviewResult;

View File

@ -0,0 +1,11 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
<g id="组_58" data-name="组 58" transform="translate(-465 -602)">
<g id="注意_2_" data-name="注意 (2)" transform="translate(465 602)">
<path id="形状" d="M0,8a8,8,0,1,1,8,8A8,8,0,0,1,0,8Z" fill="#3078ff"/>
</g>
<g id="感叹号2" transform="translate(-3.7 417.189)">
<path id="路径_12" data-name="路径 12" d="M486.4,189.83v4.85a.3.3,0,0,0,.591,0v-4.85A.3.3,0,0,0,486.4,189.83Z" transform="translate(-9.727)" fill="#fff"/>
<path id="路径_13" data-name="路径 13" d="M476.969,759.04m-.409,0a.409.409,0,1,0,.409-.409A.409.409,0,0,0,476.559,759.04Z" transform="translate(0 -562.513)" fill="#fff"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 748 B

View File

@ -0,0 +1,100 @@
import React, { Component } from "react";
import { Button, DatePicker, Form } from "antd";
import WordsInput from "../components/wordsInput";
import './index.scss';
import '../index.scss';
const {RangePicker} = DatePicker;
function ReviewRules(props) {
const { getFieldDecorator } = props.form;
return (
<div className="centerbox setRules">
<div className="head_title mb20">
<div className="-layout pb10">
<span className="font-16">任务信息</span>
<button className="but41_border">返回上一页</button>
</div>
<p className="mt10">任务名称</p>
<p className="mt10 pb20">任务链接</p>
</div>
<Form className="pt10">
<Form.Item
label="评审规则"
>
{getFieldDecorator('reviewRule', {
rules: [{ required: true, message: '请输入评审规则' }],
})(
<WordsInput placeholder="请输入评审规则" rows={4} maxLength='200'/>,
)}
</Form.Item>
<p className="rules_bar"></p>
<p className="font-16 criteria_title mt25 mb10">评分标准<span className="ml5 be_carful">管理员可设置1-5个评分项及对应评分标准每个评分项固定设置为100分</span></p>
<Form.Item
label="评分标准一"
>
{getFieldDecorator('criteria1', {
rules: [{ required: true, message: '请输入一个评分标准' }],
})(
<WordsInput placeholder="请输入评分项对应分值及评分标准" rows={3} maxLength='100'/>,
)}
</Form.Item>
<Form.Item
label="评分标准二"
>
{getFieldDecorator('criteria2', {
rules: [{}],
})(
<WordsInput placeholder="请输入评分项对应分值及评分标准" rows={3} maxLength='100' />,
)}
</Form.Item>
<Form.Item
label="评分标准三"
>
{getFieldDecorator('criteria3', {
rules: [{}],
})(
<WordsInput placeholder="请输入评分项对应分值及评分标准" rows={3} maxLength='100'/>,
)}
</Form.Item>
<Form.Item
label="评分标准四"
>
{getFieldDecorator('criteria4', {
rules: [{}],
})(
<WordsInput placeholder="请输入评分项对应分值及评分标准" rows={3} maxLength='100'/>,
)}
</Form.Item>
<Form.Item
label="评分标准五"
>
{getFieldDecorator('criteria5', {
rules: [{}],
})(
<WordsInput placeholder="请输入评分项对应分值及评分标准" rows={3} maxLength='100'/>,
)}
</Form.Item>
<p className="rules_bar"></p>
<Form.Item
label="评审时间"
>
{getFieldDecorator('reviewDate', {
rules: [{ required: true, message: '请选择评审时间' }],
})(
<RangePicker
showTime={{ format: 'HH:mm' }}
format="YYYY-MM-DD HH:mm"
placeholder={['Start Time', 'End Time']}
/>,
)}
</Form.Item>
</Form>
<div className="rules_buttom mt20">
<button className="but41_fill">保存</button>
<button className="butE3_border ml30">取消</button>
</div>
</div>
)
}
export default Form.create()(ReviewRules);

View File

@ -0,0 +1,45 @@
.setRules.centerbox{
.head_title, .ant-form{
padding: 0 2em;
background: white;
}
.-layout{
justify-content: space-between;
margin: 0 -2em;
border-bottom: 1px solid #EEEEEE;
padding: 0.5em 1em;
}
.ant-form .ant-form-item label, .criteria_title{
color: #333333;
.be_carful{
color: #E02020;
&::before{
content: url('./image/beCarful.svg');
margin-right: 8px;
}
}
}
.ant-form{
padding: 1em 2em 2em;
.ant-form-item{
margin-bottom: 10px;
&:first-child label{
font-size: 16px;
}
.ant-form-item-label{
margin-bottom: 12px;
}
}
}
.rules_buttom{
text-align: center;
}
.but41_fill, .but41_border, .butE3_border{
width: 6.5em;
}
.but41_border{padding: 0;}
.rules_bar{
margin: 25px -2em;
border-bottom: 1px solid #EEEEEE;
}
}

View File

@ -0,0 +1,70 @@
import React, { Component, useCallback } from "react";
import { Tabs, Input, Select } from 'antd';
import { unitType, reviewArea } from '../static.js';
import './index.scss';
import '../index.scss';
const { TabPane } = Tabs;
const { Option } = Select;
function SelectExpert() {
// const TaskDetail = (
// <div>
// <p></p>
// <p className="mt10"></p>
// <p className="mt10 pb20"></p>
// </div>
// )
return (
<div className="centerbox select_expert">
<p className="title_one font-16">评审专家选取</p>
<Tabs defaultActiveKey="1" animated={false} type="card">
<TabPane tab="已选专家" key='0'>
<div>
<div className="box"></div>
<p className="font-16">任务信息</p>
<p className="mt10">任务名称</p>
<p className="mt10 pb20">任务链接</p>
</div>
</TabPane>
<TabPane tab="专家选取" key='1'>
<div>
<div className="box"></div>
<p className="font-16">任务信息</p>
<p className="mt10">任务名称</p>
<p className="mt10 pb20">任务链接</p>
</div>
<div className="df">
<p>添加评审专家</p>
<div>
<button className="but41_fill">批量添加</button>
<button className="but41_fill">随机抽取</button>
</div>
</div>
<div className="df">
查询条件<Input style={{ width: 220 }}></Input>
专家类别
<Select placeholder="所有类别" style={{ width: 220 }}>
<Option value='all'>所有类别</Option>
{unitType.map(item => {
return <Option key={item.value} value={item.value}>{item.label}</Option>
})}
</Select>
评审领域
<Select style={{ width: 220 }}>
<Option value='all'>所有领域</Option>
{reviewArea.map(item => {
return <Option key={item.value} value={item.value}>{item.label}</Option>
})}
</Select>
<button className="but41_fill ml80">查询</button>
<button className="butE3_border">清除</button>
</div>
</TabPane>
</Tabs>
</div>)
}
export default SelectExpert;

View File

@ -0,0 +1,16 @@
.centerbox.select_expert{
background: white;
.title_one, .ant-tabs-nav-wrap, .ant-tabs .ant-tabs-top-content{
padding: 0 2em;
}
.box{
height: 20px;
margin: 0 -2em;
background: #FAFAFA;
}
.df{
display: flex;
justify-content: space-between;
align-items: center;
}
}

View File

@ -581,4 +581,14 @@ export function closeTask(taskId) {
url: `/api/tasks/backend/admin/task/close/${taskId}`,
method: 'post',
});
}
}
// 任务添加专家评审流程
export function addExpertReview(taskId){
return fetch({
url: `/api/tasks/backend/admin/task/close/${taskId}`,
method: 'post',
});
}
// 管理页面修改创业

File diff suppressed because one or more lines are too long

View File

@ -3,7 +3,7 @@ import classNames from 'classnames';
import { Input, Select, Button, Form, DatePicker, Table, Pagination, Modal } from 'antd';
import { Link } from "react-router-dom";
import { paperCheckStatusArr, publishModeArr, taskStatusAllArr, showUserModeArr, main_web_site_url } from '../static';
import { paperCheckStatusArr, publishModeArr, taskStatusAllArr, showUserModeArr, main_web_site_url, expertReviewArr } from '../static';
import { getTaskAdminList, changeShowUserMode, deleteTask, recommendTask } from '../api';
import '../index.scss';
import './index.scss';
@ -37,9 +37,10 @@ export default Form.create()(({ form, showNotification, match, history }) => {
const [curPage, setCurPage] = useState(1);
const [total, setTotal] = useState(0);
const [taskList, setTaskList] = useState([]);
const [expertReview, setExpertReview] = useState('');
useEffect(() => {
console.log('ues', curPage);
const params = {
...searchObj,
statusString,
@ -50,6 +51,7 @@ export default Form.create()(({ form, showNotification, match, history }) => {
orderBy: order + sort,
isDelete,
recommend,
expertReview: expertReview==='-1'?"":expertReview,
};
setLoading(true);
getTaskAdminList(params).then(data => {
@ -59,7 +61,7 @@ export default Form.create()(({ form, showNotification, match, history }) => {
}
setLoading(false);
})
}, [statusString, order, sort, publishMode, showUserMode, curPage, searchObj, isDelete, reload, recommend]);
}, [statusString, order, sort, publishMode, showUserMode, curPage, searchObj, isDelete, reload, recommend, expertReview]);
const helper = useCallback(
@ -100,15 +102,43 @@ export default Form.create()(({ form, showNotification, match, history }) => {
{
title: '任务编号',
dataIndex: 'number',
width: "6%",
},
{
title: '任务名称',
dataIndex: 'name',
width: "15%",
width: "10%",
render: (text, record) => (
<Link className="line_1 primary-link" target="_blank" to={`/task/taskDetail/${record.id}`} >{text}</Link>
),
},
{
title: <Select
className="column-select"
showArrow
defaultValue={'-1'}
onChange={setExpertReview}
>
<Option key={'-1'} >专家评审</Option>
<Option key={'1'} >已加入评审</Option>
<Option key={'0'} >未加入评审</Option>
</Select>,
dataIndex: 'expertReview',
render: (text, record) => {
return <Select
className="column-select"
showArrow
defaultValue={text?1:0}
onChange={(key) => { changeStatus(key, record.id) }}
>
{
expertReviewArr.map(item => {
return <Option key={item.dicItemCode} value={item.dicItemCode}>{item.dicItemName}</Option>
})
}
</Select>
}
},
{
title: <Select
className="column-select"
@ -139,7 +169,7 @@ export default Form.create()(({ form, showNotification, match, history }) => {
})
}
</Select>,
width: '10%',
width: '6%',
dataIndex: 'status',
render: (text, record) => {
return record.exceptClosedBoolean ? '已关闭' : statusArr[text]
@ -184,6 +214,7 @@ export default Form.create()(({ form, showNotification, match, history }) => {
}
</Select>,
dataIndex: 'showUserMode',
width:'8%',
render: (text, record) => {
return <Select
className="column-select"
@ -200,6 +231,34 @@ export default Form.create()(({ form, showNotification, match, history }) => {
</Select>
}
},
{
title: '评审规则',
dataIndex: 'ruleEditedCount',
render: (text, record) => {
return record.expertReview ? '' : <Link className="line_1 primary-link" to={{ pathname:'/expert/admin/task/review/rules',query:{'page':curPage}}}>编辑</Link>
}
},
{
title: '专家选取',
dataIndex: 'expertSelectedCount',
render: (text, record) => {
return record.expertReview ? '' : <Link className="line_1 primary-link" to='/expert/admin/task/review/select'>选择</Link>
}
},
{
title: '评审任务',
dataIndex: 'expertReview1',
render: (text, record) => {
return <Button>发布</Button>
}
},
{
title: '评审结果',
dataIndex: 'expertReview2',
render: (text, record) => {
return <Link className="line_1 primary-link" to='/expert/admin/task/review/results'>查看</Link>
}
},
{
title: '操作',
key: 'action',
@ -271,6 +330,9 @@ export default Form.create()(({ form, showNotification, match, history }) => {
})
}
function changeExpertReviewStatus(expertReviewStatus, taskId) {
}
//
const changeSortName = useCallback((sortType) => {
@ -416,6 +478,7 @@ export default Form.create()(({ form, showNotification, match, history }) => {
columns={columns}
pagination={false}
className="mt10"
scroll={{ x: 1800 }}
/>
{total > 10 &&
<Pagination

View File

@ -8,7 +8,7 @@ import Upload from '../../components/Upload';
import StatusNav from '../../components/statusNav';
import ItemListPaper from '../components/itemListPaper';
import ProofModal from '../components/proofModal';
import { getTaskDetail, getTaskCategory, getTaskPaper, makePublic, addPaper, getAgreement, agreement, checkAgreement, checkHavePaper } from '../api';
import { getTaskDetail, getTaskCategory, getTaskPaper, makePublic, addPaper, getAgreement, agreement, checkAgreement, checkHavePaper, addExpertReview } from '../api';
import { taskModeIdArr, applyStatusArr, applyStatusAllArr, agreementContent, paperCheckTextArr } from '../static';
import { httpUrl } from '../fetch';
import './index.scss';
@ -278,6 +278,22 @@ export default Form.create()(
}
}
function addExpertReviewModal(){
Modal.confirm({
title: '提示',
content: '确定将此创客任务添加专家评审流程?',
onOk: () => {
addExpertReview(id).then(res => {
if (res && res.message === 'success') {
setReload(Math.random());
} else {
showNotification('操作失败');
}
})
}
})
}
const reloadList = useCallback(() => {
setRelaodChildList(Math.random());
});
@ -452,6 +468,8 @@ export default Form.create()(
<a className="line_1 color-blue fr ml20" onClick={() => { setVisibleProofs(true) }}>上传佐证材料</a> : ''}
{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>}
</div>
<StatusNav
key={'applyStatus'}

View File

@ -1,5 +1,5 @@
import React, { forwardRef, useCallback, useEffect, useState } from 'react';
import { Form, Radio, Input, InputNumber, Icon, Button, Modal } from 'antd';
import { Form, Radio, Input, InputNumber, Icon, Button, Modal, Checkbox } from 'antd';
import classNames from 'classnames';
import moment from 'moment';
import ReactWEditor from 'wangeditor-for-react';
@ -358,6 +358,13 @@ export default Form.create()(forwardRef(({ current_user, form, showNotification,
任务发布之后将会公开展示在交易中心不要把与项目客户相关等隐私信息以及QQ号微信号电话号码等联系方式填写在任务中
</p>
<Form.Item >
{getFieldDecorator('expertReview', {
validateFirst: true,
initialValue: false
})(<Checkbox className="color-grey-3 font-bd mb10 font-18">是否增加专家评审流程添加后可联系管理员发布此专家评审任务</Checkbox>)}
</Form.Item>
<Form.Item >
<Upload
className="commentStyle"

View File

@ -57,9 +57,7 @@ class NewHeader extends Component {
}
componentDidMount() {
getUserInfo().then(response =>{
console.log('111',response);
response && this.setState({isExpert: response.data.expert});
console.log('222',this.state.isExpert);
});
// this.getAppdata();
this.geturlsdata();
@ -528,7 +526,6 @@ class NewHeader extends Component {
if (oldLink) {
document.head.removeChild(oldLink);
}
console.log("ac12111:",response.data.setting.tab_logo_url);
document.head.appendChild(link);
}