Merge branch 'dev_military_competition' of http://106.75.45.236:3000/tongChong/forgeplus-react into competition

This commit is contained in:
unknown 2022-01-24 15:34:53 +08:00
commit 4b31ec629a
11 changed files with 227 additions and 120 deletions

View File

@ -1,4 +1,4 @@
import fetch from './fetch';
import fetch,{main_web_site_url} from './fetch';
import { notification } from 'antd';
// 专家列表查询
@ -18,6 +18,14 @@ export async function expertList(params) {
}
}
//删除专家
export function deleteExpert(expertId) {
return fetch({
url: `/api/experts/${expertId}?isDelete=1`,
method: 'delete'
});
}
// 获取用户信息
export function getUserInfo() {
return fetch({
@ -82,6 +90,14 @@ export function getExpertTasks(params) {
});
}
// 获取竞赛作品列表
export function getCompetition(id) {
return fetch({
url: `${main_web_site_url}/api/v1/competitions/${id}/works`,
method: 'get',
});
}
// 查看竞赛/任务的评分细则
export function getScoringDetails(params) {
return fetch({

View File

@ -1,10 +1,10 @@
import React, { useState, useMemo, useEffect } from "react";
import { Input, Select, Button, Form, Table, Upload, Modal } from 'antd';
import { Input, Select, Button, Form, Table, Upload, Modal, Popconfirm, message } from 'antd';
import cookie from 'react-cookies';
import { exportExcel } from '../components/exportExcel.js';
import Paginationtable from "../../components/paginationTable";
import { Info } from '../../components/ModalFun';
import { expertList } from "../api";
import { expertList, deleteExpert } from "../api";
import { professionalType, reviewArea } from "../static";
import { httpUrl } from '../fetch';
@ -38,12 +38,14 @@ function RegisterList({ showNotification }) {
return [{
title: '姓名',
dataIndex: 'expertName',
width: 75,
width: 85,
key: 'expertName',
fixed: 'left',
// render: (text, record) => {
// return record.user ? record.user.nickname || record.user.login : ''
// }
},
{
title: '手机号码',
dataIndex: 'phone',
key: 'phone',
},
{
title: '最高学历',
@ -52,9 +54,13 @@ function RegisterList({ showNotification }) {
width: 80,
},
{
title: '手机号码',
dataIndex: 'phone',
key: 'phone',
title: '专家评估',
dataIndex: 'expertScore',
key: 'expertScore',
width: 80,
render: (text, record) => {
return text || '--'
}
},
{
title: '工作单位',
@ -186,6 +192,15 @@ function RegisterList({ showNotification }) {
})
}
},
{
title: '操作',
dataIndex: 'id',
key: 'action',
fixed: 'right',
render: (text, record)=>{
return <Popconfirm placement="bottom" title="你确认要删除此专家吗?" onConfirm={() => { delExpert(text);}} okText="是" cancelText="否"><Button size="small" type="primary">删除</Button></Popconfirm>
}
}
];
}, []);
@ -233,6 +248,20 @@ function RegisterList({ showNotification }) {
});
}, [download]);
//
const delExpert=(expertId)=>{
setLoading(true);
deleteExpert(expertId).then(response=>{
if(response && response.message === "删除专家成功"){
message.success("删除成功");
setReload(Math.random());
}else{
message.error("删除失败");
}
}).finally(()=>{
setLoading(false);
})
}
function beforeUpload(file) {
const isExcel = file.type.indexOf('xlsx') || file.type.indexOf('xls') || file.type.indexOf('sheet');
@ -350,7 +379,6 @@ function RegisterList({ showNotification }) {
rowKey={(row) => row.id}
/>
<Modal
title="上传"
visible={visible}

View File

@ -9,7 +9,7 @@
.center-right-but{
flex:auto;
justify-content: space-between;
margin:0 4em 2em 0;
margin-right: 4em;
}
.ant-form-item-control-wrapper{

View File

@ -252,7 +252,6 @@ export default Form.create()(({ match, history, showNotification, form, current_
}
}
return (
<div className='register_right'>
{
@ -561,9 +560,10 @@ export default Form.create()(({ match, history, showNotification, form, current_
<div className='hint'>提示个人简介职称证明学术成果荣誉称号都只能上传一个文件建议上传zip或rar格式的压缩文件</div>
</Form>
<div className='buts'>
<Button className="but41_fill mr20" type="primary" disabled={forbidden} onClick={() => expertRegisterSubmit(true)}>{lastRegister && lastRegister.status === 1 ? '修改' : '提交'}资料</Button>
{/* 专家: 修改,非专家: 提交 */}
<Button className="but41_fill mr20" type="primary" disabled={forbidden} onClick={() => expertRegisterSubmit(true)}>{current_user.expert ? '修改' : '提交'}资料</Button>
{(!lastRegister || lastRegister.status !== 1) && <Button className="but41_border mr20" disabled={forbidden} onClick={draft}>保存资料</Button>}
<Button className="butE3_border" onClick={cancel}></Button>
<Button className="butE3_border" onClick={cancel}>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</Button>
<Modal
title={`${lastRegister && lastRegister.status === 1 ? '修改' : '提交'}资料`}

View File

@ -85,15 +85,9 @@
border: 1px solid #4154f1 !important;
}
}
.but41_border {
margin-bottom: 0.6em;
padding: 0 0.5em;
}
.ant-cascader-menu-item:hover {
background: #f2f3ff;
}
// }
.buts {
font-size: 0.7em;
padding: 1.5em 2em;

View File

@ -4,9 +4,9 @@ import { Link } from "react-router-dom";
import Paginationtable from "../../../components/paginationTable";
import { Info, Confirm } from '../../../components/ModalFun';
import WordsInput from 'military/expert/components/wordsInput';
import { getScoringDetails, initScoringDetails, getRules, updateScoringDetails } from "../../api";
import { getScoringDetails, initScoringDetails, getRules, updateScoringDetails, getCompetition } from "../../api";
import { readyCheckPapers } from "../../../task/api";
import { httpUrl } from '../../fetch';
import { httpUrl, main_web_site_url } from '../../fetch';
import './index.scss';
import '../../index.scss';
@ -22,7 +22,7 @@ function ReviewTasks({ showNotification, match, history, current_user }) {
const [dataList, setDataList] = useState([]);
const [taskId, setTaskId] = useState();
const [competitionId, setCompetitionId] = useState(461);
const [competitionId, setCompetitionId] = useState();
//
const [rules, setRules] = useState({});
@ -61,8 +61,9 @@ function ReviewTasks({ showNotification, match, history, current_user }) {
className: 'text-tooltip',
render: (text, record) => {
return text && text.map(item => {
return <Tooltip key={item.id} overlayClassName="expert-tooltip" title={item.fileName} placement="top">
<p className="link" onClick={() => { downFile(item.id) }}>{item.fileName}</p>
return <Tooltip key={item.id} overlayClassName="expert-tooltip" title={item.fileName} placement="top">
<p className="link" onClick={() => { downFile(item) }}>{item.fileName}</p>
{/* <a className="link" href={main_web_site_url + item.fileDownPath} download={item.fileName}>{item.fileName}</a> */}
</Tooltip>
})
}
@ -83,7 +84,7 @@ function ReviewTasks({ showNotification, match, history, current_user }) {
return <Tooltip overlayClassName="expert-tooltip" title={text} placement="top">
<a className="link" onClick={() => { writeComments(text, index, 'comments') }}>{record.status === 2 ? text ? '编辑' : '填写' : '查看'}意见</a>
</Tooltip>
}
},
];
@ -204,9 +205,55 @@ function ReviewTasks({ showNotification, match, history, current_user }) {
});
}, [taskId, disabled, current_user.expertId]);
function downFile(id) {
let url = httpUrl + '/busiAttachments/download/' + id;
window.open(url);
//
useEffect(() => {
//
!dataList.length && competitionId && current_user.expertId && getCompetition(competitionId).then(res => {
let dataArr = [];
if (res && Array.isArray(res.data)) {
for (const item of res.data) {
let fileId = item.work_attachments && item.work_attachments.split('?')[0].split('/')[3];
console.log(fileId);
dataArr.push({
comments: "",
expertId: current_user.expertId,
gradesAverage: '',
gradesFive: '',
gradesFour: '',
gradesOne: '',
gradesThree: '',
gradesTwo: '',
opsContent: item.works_remark,
opsFiles: fileId,
opsFilesAttachments: item.work_attachments ? [{ id: fileId, fileName: '作品下载', fileDownPath: item.work_attachments }] : [],
opsId: item.id,
opsParentId: containerId,
opsParentType: containerType,
opsType: containerType,
status: 2
});
}
}
setDataList(dataArr);
disabled && setLoading(false);
!disabled && dataArr.length && rules && initScoringDetails(dataArr).then(res => {
if (res) {
setReload(Math.random());
setLoading(false);
}
});
});
}, [competitionId, disabled, current_user.expertId]);
function downFile(item) {
if (containerType == 1) {
let url = httpUrl + '/busiAttachments/download/' + item.id;
window.open(url);
} else {
let url = main_web_site_url + item.fileDownPath;
window.open(url);
}
}
function editGrade(value, index, dataIndex) {
@ -329,9 +376,9 @@ function ReviewTasks({ showNotification, match, history, current_user }) {
typeof item.gradesFour === 'number' && gradesArr.push(item.gradesFour);
typeof item.gradesFive === 'number' && gradesArr.push(item.gradesFive);
if (gradesArr.length < gradesNum && gradesArr.length) {
errorArr.push(index+1);
errorArr.push(index + 1);
} else if (!item.comments && gradesArr.length) {
commentsError.push(index+1);
commentsError.push(index + 1);
} else if (gradesArr.length) {
scoringArr.push(index);
}
@ -378,23 +425,29 @@ function ReviewTasks({ showNotification, match, history, current_user }) {
return (
<div className='register_right task_detail'>
<p className="task-head">
创客成果评审
{containerType == 1 ? '创客成果' : '竞赛作品'}评审
<button className="back-button but41_border" onClick={() => { history.goBack() }}>返回上一页</button>
</p>
<Tabs defaultActiveKey="1" animated={false}>
<Tabs defaultActiveKey="0" animated={false}>
<TabPane tab="评信息" key="0">
<TabPane tab="评信息" key="0">
<div className="task-rules">
<div className="rules-box">
<p className="rules-head">任务信息</p>
<p className="rules-head">{containerType == 1 ? '任务信息' : '赛事信息'}</p>
<div className="rules-content">
<div className="rules-content-item"><span className="font-w">任务名称</span><span className="ml10">{rules.containerName}</span></div>
<div className="rules-content-item"><span className="font-w">任务链接</span><Link className="taskLink ml10" target="_blank" to={`/task/taskDetail/${rules.containerId}`} >{`${window.location.origin}/task/taskDetail/${rules.containerId}`}</Link></div>
<div className="rules-content-item">
<span className="font-w">{containerType == 1 ? '任务' : '赛事'}名称</span>
<span className="ml10">{rules.containerName}</span>
</div>
<div className="rules-content-item">
<span className="font-w">{containerType == 1 ? '任务' : '赛事'}链接</span>
{containerType == 1 && <Link className="taskLink ml10" target="_blank" to={`/task/taskDetail/${rules.containerId}`} >{`${window.location.origin}/task/taskDetail/${rules.containerId}`}</Link>}
{containerType == 2 && <Link className="taskLink ml10" target="_blank" to={`${main_web_site_url}/competitions/${rules.containerId}/home`} >{`${main_web_site_url}/competitions/${rules.containerId}/home`}</Link>}
</div>
</div>
</div>
<div className="rules-box">
<p className="rules-head">评审规则</p>
<div className="rules-content">{rules.rule}</div>

View File

@ -7,4 +7,5 @@ let actionUrl = settings.api_urls && settings.api_urls.expert ? settings.api_url
// http://117.50.100.12:8067/
const service = javaFetch(actionUrl);
export const httpUrl = actionUrl;
export const main_web_site_url=settings.main_web_site_url;
export default service;

View File

@ -85,7 +85,7 @@ function SelectExpert(props) {
align: 'center',
},
{
title: '专家评',
title: '专家评',
dataIndex: 'expertScore',
align: 'center',
render:(text,record)=>{

View File

@ -41,6 +41,14 @@ export default Form.create()(({ form, showNotification, match, history, state })
const [taskList, setTaskList] = useState([]);
const [expertReview, setExpertReview] = useState('');
//
const [lookRules, setLookRules] = useState(false);
const [lookExperts, setLookExperts] = useState(false);
const [pulicReview, setPublicReview] = useState(false);
const [rules, setRules] = useState(undefined);
const [selectedExperts, setSelectedExperts] = useState(undefined);
const [publicTaskId, setPublicTaskId] = useState(undefined);
useEffect(()=>{
setCurPage(hashDate(hash) || 1);
},[hash])
@ -127,7 +135,7 @@ export default Form.create()(({ form, showNotification, match, history, state })
showArrow
defaultValue={text?1:-1}
onChange={(key) => { changeExpertReviewStatus(key, record.id) }}
disabled={!record.status == 1 || !record.status == 3 || record.assignRuleAndExperts}
disabled={record.assignRuleAndExperts || !(record.status == 1 || record.status == 3)}
>
{
expertReviewArr.map(item => {
@ -238,7 +246,7 @@ export default Form.create()(({ form, showNotification, match, history, state })
title: '评审任务',
dataIndex: 'expertReview1',
render: (text, record) => {
return record.assignRuleAndExperts ? <span className='gary_span'>已发布</span> : record.expertReview && record.status < 4 && record.status !== 2 ? <Button size='small' type="primary" onClick={()=>{publishTaskReview(record)}}>发布</Button> : <span className='gary_span'>发布</span>
return record.assignRuleAndExperts ? <span className='gary_span'>已发布</span> : record.expertReview && (record.status === 1 || record.status === 3) ? <Button size='small' type="primary" onClick={()=>{publishTaskReview(record)}}>发布</Button> : <span className='gary_span'>发布</span>
}
},
{
@ -316,7 +324,7 @@ export default Form.create()(({ form, showNotification, match, history, state })
width: 260,
},
{
title: '专家评',
title: '专家评',
dataIndex: 'expertScore',
align: 'center',
render:(text,record)=>{
@ -360,16 +368,86 @@ export default Form.create()(({ form, showNotification, match, history, state })
});
}
//lookRules,lookExperts,pulicReview
useEffect(()=>{
//
lookRules && rules && Modal.info({
className: 'publishReview',
title: "评审规则",
content:
<React.Fragment>
<div>{rules && rules.rule}</div>
<p>评分标准</p>
<div>
{rules.criterias.map(item=>{return <p key={Math.random()}>{item}</p>})}
</div>
<p>评审时间</p>
<div>{rules.reviewData}</div>
</React.Fragment>
,
});
lookRules && setLookRules(false);
//
lookExperts && selectedExperts && Modal.info({
className: 'publishReview',
title: "已选取评审专家",
content:
<PaginationTable
dataSource={selectedExperts}
columns={columnsExperts}
scroll={{ y: 395 }}/>,
});
lookExperts && setLookExperts(false);
//
pulicReview && rules && selectedExperts && Modal.confirm({
className: 'publishReview',
title: "发布评审任务",
centered: true,
content:
<React.Fragment>
<div className='tip'>
<i className='iconfont icon-erciqueren_icon'></i>
<span className='publicTitle'>确定发布此评审任务确定发布后评审规则与评审专家信息将无法重新编辑</span>
</div>
<p>评审规则</p>
<div>{rules && rules.rule}</div>
<p>评分标准</p>
<div>
{rules.criterias.map(item=>{return <p key={Math.random()}>{item}</p>})}
</div>
<p>评审时间</p>
<div>{rules.reviewData}</div>
<p>已选取评审专家</p>
<PaginationTable
dataSource={selectedExperts}
columns={columnsExperts}
scroll={{ y: 230 }}/>
</React.Fragment>
,
okText: '确定',
cancelText: '取消',
onOk() {
publishExpertsAndRules(publicTaskId).then(response=>{
if(response && response.message==="发布成功"){
setReload(Math.random());
}
})
},
});
pulicReview && setPublicReview(false);
},[lookRules,lookExperts,pulicReview])
//
function publishTaskReview(record){
if(!record.ruleEditedCount || !record.expertSelectedCount){
message.error("请先编辑评审规则以及选取评选专家再发布此任务");
}else{
let rules = undefined;
let selectedExperts = undefined;
getRules({containerId: record.id, containerType: 1, statusString: 3}).then(response=>{
if(response && response.message === "success"){
rules = response.data;
setRules(response.data);
}
})
selectExpertList({containerId: record.id, containerType: 1, curPage:curPage, pageSize: 10000, curPage: 1,}).then(response=>{
@ -379,79 +457,26 @@ export default Form.create()(({ form, showNotification, match, history, state })
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
setPublicTaskId(record.id);
setSelectedExperts(response.data.rows);
setPublicReview(true);
}
});
setTimeout(() => {
Modal.confirm({
className: 'publishReview',
title: "发布评审任务",
centered: true,
content:
<React.Fragment>
<div className='tip'>
<i className='iconfont icon-erciqueren_icon'></i>
<span className='publicTitle'>确定发布此评审任务确定发布后评审规则与评审专家信息将无法重新编辑</span>
</div>
<p>评审规则</p>
<div>{rules && rules.rule}</div>
<p>评分标准</p>
<div>
{rules.criterias.map(item=>{return <p key={Math.random()}>{item}</p>})}
</div>
<p>评审时间</p>
<div>{rules.reviewData}</div>
<p>已选取评审专家</p>
<PaginationTable
dataSource={selectedExperts}
columns={columnsExperts}
scroll={{ y: 230 }}/>
</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,2'}).then(response=>{
if(response && response.message === "success"){
rules = response.data;
setRules(response.data);
setLookRules(true);
}
});
setTimeout(() => {
Modal.info({
className: 'publishReview',
title: "评审规则",
content:
<React.Fragment>
<div>{rules && rules.rule}</div>
<p>评分标准</p>
<div>
{rules.criterias.map(item=>{return <p key={Math.random()}>{item}</p>})}
</div>
<p>评审时间</p>
<div>{rules.reviewData}</div>
</React.Fragment>
,
});
}, 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;
@ -459,20 +484,10 @@ export default Form.create()(({ form, showNotification, match, history, state })
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
setSelectedExperts(response.data.rows);
setLookExperts(true);
}
});
setTimeout(() => {
Modal.info({
className: 'publishReview',
title: "已选取评审专家",
content:
<PaginationTable
dataSource={selectedExperts}
columns={columnsExperts}
scroll={{ y: 395 }}/>,
});
}, 300);
}
function changeStatus(showUserMode, taskId) {

View File

@ -20,10 +20,10 @@ class Shixunauthority extends Component {
<p className="font-18 mt40">
您可以稍后尝试&nbsp;<a href="/"
className="color-blue">返回首页</a>
或者&nbsp;
{/* &nbsp;
<a target="_blank"
href="//shang.qq.com/wpa/qunwpa?idkey=2f2043d88c1bd61d182b98bf1e061c6185e23055bec832c07d8148fe11c5a6cd"
className="color-blue">QQ反馈&gt;&gt;</a>
className="color-blue">QQ反馈&gt;&gt;</a> */}
</p>
</div>
{/*<div style="clear:both;"></div>*/}

View File

@ -41,10 +41,10 @@ class http500 extends Component {
<p className="font-18 mt40">
您可以稍后尝试&nbsp;<a href="/"
className="color-blue">返回首页</a>
或者&nbsp;
{/* &nbsp;
<a target="_blank"
href="//shang.qq.com/wpa/qunwpa?idkey=2f2043d88c1bd61d182b98bf1e061c6185e23055bec832c07d8148fe11c5a6cd"
className="color-blue">QQ反馈&gt;&gt;</a>
className="color-blue">QQ反馈&gt;&gt;</a> */}
</p>
</div>
}