增加成果审核页面

This commit is contained in:
何童崇 2021-07-01 17:09:41 +08:00
parent 76b23f88db
commit 4493711521
12 changed files with 347 additions and 59 deletions

View File

@ -5,11 +5,12 @@ import cookie from 'react-cookies';
<<<<<<< HEAD
=======
// export const httpUrl='http://117.50.100.12:8001';
export const httpUrl='http://192.168.31.72:8081';
// export const httpUrl='http://192.168.31.72:8081';
// export const httpUrl = 'http://106.75.31.211:58088';
// export const httpUrl = 'http://192.168.31.72:8089';
<<<<<<< HEAD
<<<<<<< HEAD
<<<<<<< HEAD
// export const httpUrl = 'http://192.168.31.104:8081';
>>>>>>> 09e81b9... 添加成果内容
=======
@ -17,6 +18,9 @@ export const httpUrl = 'http://192.168.31.104:8081';
>>>>>>> 6b63cd2... 上传成果修改
=======
// export const httpUrl = 'http://192.168.31.104:8081';
=======
export const httpUrl = 'http://192.168.31.104:8081';
>>>>>>> 2aa8942... 增加成果审核页面
// export const httpUrl = 'http://192.168.31.168:8081';
>>>>>>> 5131dac... 修复成果提交时的bug联调我是创客

View File

@ -35,6 +35,11 @@ const TaskManage = Loadable({
loading: Loading,
});
const PaperManage = Loadable({
loader: () => import("./task/paperManage"),
loading: Loading,
});
class Index extends Component {
render() {
return (
@ -76,6 +81,13 @@ class Index extends Component {
)}
></Route>
<Route
path="/task/paperManage"
render={(props) => (
<PaperManage {...this.props} {...props} />
)}
></Route>
<Route
path="/task"
render={(props) => (

View File

@ -122,7 +122,7 @@ export function deleteTask(id) {
//新增成果
export function addAchieve(data) {
export function addPaper(data) {
return fetch({
url: '/api/paper/',
method: 'post',
@ -131,7 +131,7 @@ export function addAchieve(data) {
}
// 任务成果
export async function getTaskAchieve(params){
export async function getTaskPaper(params){
let res = await fetch({
url: '/api/paper/',
method: 'get',
@ -148,7 +148,7 @@ export async function getTaskAchieve(params){
}
//更新成果
export function updateAchieve(data) {
export function updatePaper(data) {
return fetch({
url: '/api/paper/',
method: 'put',
@ -157,7 +157,7 @@ export function updateAchieve(data) {
}
//举报成果
export function reportAchieve(data) {
export function reportPaper(data) {
return fetch({
url: `/api/paper/${data.paperId}/paperReport`,
method: 'post',
@ -166,7 +166,7 @@ export function reportAchieve(data) {
}
//点赞成果
export function thumbUpAchieve(id) {
export function thumbUpPaper(id) {
return fetch({
url: `/api/paper/${id}/thumbUp`,
method: 'post',
@ -183,7 +183,7 @@ export function checkAgreement(taskId) {
}
// 检查用户是否提交了成果
export function checkAchieve(taskId){
export function checkHavePaper(taskId){
return fetch({
url: `/api/paper/${taskId}/check`,
method: 'get'
@ -191,8 +191,6 @@ export function checkAchieve(taskId){
}
// 获取协议
export function getAgreement() {
return fetch({
@ -246,3 +244,12 @@ export function checkTask(data) {
});
}
// 审核成果/评论
export function checkPaper(data){
return fetch({
url: `/api/paper/admin/complainPaper/${data.paperId}`,
method: 'post',
data: data
});
}

View File

@ -5,7 +5,7 @@ import { getImageUrl, timeAgo } from 'educoder';
import Nodata from 'forge/Nodata';
import Loading from "src/Loading";
import { editorConfig } from 'military/components/config';
import { reportAchieve, thumbUpAchieve, commentAdd } from '../../api';
import { reportPaper, thumbUpPaper, commentAdd } from '../../api';
import { httpUrl } from '../../../fetch';
import winpng from '../../image/win.png';
@ -39,7 +39,7 @@ export default (props) => {
if (!reportValue) {
return;
}
reportAchieve({
reportPaper({
paperId: checkedItem.id,
content: reportValue
}).then(res => {
@ -52,7 +52,7 @@ export default (props) => {
}
function thumbUp(id) {
thumbUpAchieve(id).then(res => {
thumbUpPaper(id).then(res => {
reloadList();
});
}
@ -114,7 +114,7 @@ export default (props) => {
</li>
<li className="fr">
<a className="base_smallBtn fl">
<a className="color-blue fl">
{applyStatusAllNameArr[item.status]}
</a>
</li>
@ -136,7 +136,7 @@ export default (props) => {
</div>
{item.comments.length > 0 && <div className="padding20 fileCommentsList">
{item.comments && item.comments.length > 0 && <div className="padding20 fileCommentsList">
{item.comments.map(commentsItem => {
return <div className="comments-item">
<div className="comments-author">
@ -158,7 +158,7 @@ export default (props) => {
<span className="fl"><span className="color-grey9">稿件状态</span>{item.read ? '雇主已浏览' : '雇主未浏览'}</span>
<span className="fr">
<a className="mr20" onClick={() => { setReportVisible(true); setCheckedItem(item) }}><i className="iconfont icon-jinggao font-15 mr3"></i>举报</a>
<a className="mr20" onClick={() => { commentEdit(item.id) }}><i className="iconfont icon-huifu1 font-15 mr3"></i>{item.comments.length}</a>
<a className="mr20" onClick={() => { commentEdit(item.id) }}><i className="iconfont icon-huifu1 font-15 mr3"></i>{item.comments ? item.comments.length : 0}</a>
<a onClick={() => { thumbUp(item.id) }}><i className="iconfont icon-dianzan11 font-16 mr3"></i>{item.thumbsUp}</a>
</span>
</li>

View File

@ -0,0 +1,46 @@
// 本功能模块公告样式
.task-manage {
margin-top: 1.25rem;
.status-list {
margin: 0 1.5rem;
}
.center-screen {
display: flex;
justify-content: space-between;
height: 4.5rem;
margin: 1.25rem 0;
background-color: #fff;
}
.center-left-but {
.circle-button {
border-radius: 1rem;
margin-right: 0.5rem;
}
}
.ant-form-item {
margin: 0 1rem 0 0;
}
.ant-form-item-control-wrapper {
display: inline-block;
}
.ant-select {
min-width: 200px;
}
.ant-table-thead th {
text-align: center;
&:first-child {
text-align: left;
}
}
td {
text-align: center;
color: #333;
&:first-child {
text-align: left;
font-weight: bold;
font-size: 1rem;
}
}
}

View File

@ -21,7 +21,7 @@ export default ({ taskCategoryValueArr }) => {
const [paperStatusString, setPaperStatusString] = useState('0,1,2,3,4');
const [taskStatusString, setTaskStatusString] = useState('3,4,5,6,7,8');
const [requireAchieve, setRequireAchieve] = useState('1');
const [requirePaper, setRequirePaper] = useState('1');
const [searchInput, setSearchInput] = useState('');
const [orderBy, setOrderBy] = useState('createdAtDesc');
@ -112,7 +112,7 @@ export default ({ taskCategoryValueArr }) => {
setCurPage(1);
}, [])
function changeRequireAchieve(key) {
function changeRequirePaper(key) {
if (key === '1') {
setPaperStatusString('0,1,2,3,4');
} else {
@ -120,14 +120,14 @@ export default ({ taskCategoryValueArr }) => {
setPaperStatusString('0,1,2,3,4');
}
setCurPage(1);
setRequireAchieve(key);
setRequirePaper(key);
}
return (
<Tabs className="childTab"
activeKey={requireAchieve}
onChange={changeRequireAchieve}
activeKey={requirePaper}
onChange={changeRequirePaper}
tabBarExtraContent={
<Search
maxLength={20}

View File

@ -0,0 +1,237 @@
import React, { useCallback, forwardRef, useEffect, useState, useMemo } from 'react';
import { Input, Radio, Select, Button, Form, DatePicker, Table, Pagination, Modal } from 'antd';
import { Link } from "react-router-dom";
import { paperVerifyStatusArr } from '../static';
import { getTaskPaper, checkPaper } from '../api';
import '../index.scss';
const format = "YYYY-MM-DD HH:mm:ss";
const Option = Select.Option;
const TextArea = Input.TextArea;
export default Form.create()(({ current_user, form, showNotification, match, history }) => {
const { getFieldDecorator, validateFields, setFieldsValue, getFieldsValue } = form;
const [loading, setLoading] = useState(false);
const [searchObj, setSearchObj] = useState({});
const [curPage, setCurPage] = useState(1);
const [total, setTotal] = useState(0);
const [taskList, setTaskList] = useState([]);
const [reload, setReload] = useState(0);
const [visible, setVisible] = useState(false);
const [activeId, setActiveId] = useState('');
const [pass, setPass] = useState(2);
const [message, setMessage] = useState('');
useEffect(() => {
const params = {
...searchObj,
orderBy: 'createdAtDesc',
curPage,
pageSize: 10,
};
setLoading(true);
getTaskPaper(params).then(data => {
if (data) {
setTaskList(data.rows);
setTotal(data.total);
}
setLoading(false);
})
}, [reload, curPage, searchObj]);
const helper = useCallback(
(label, name, rules, widget, initialValue) => (
<Form.Item label={label}>
{getFieldDecorator(name, { rules, initialValue, validateFirst: true, })(widget)}
</Form.Item>
), []);
function onSearch() {
validateFields((err, values) => {
if (!err) {
if (values.startTime) values.startTime = values.startTime.format(format);
if (values.endTime) values.endTime = values.endTime.format(format);
if (values.verifyStatus === '-1') values.verifyStatus = '';
setSearchObj(values);
}
});
}
function clearSearch() {
setFieldsValue({
startTime: '',
endTime: '',
verifyStatus: '-1'
});
setSearchObj({});
}
const columns = useMemo(() => {
return [
{
title: '来源任务',
dataIndex: 'name',
render: (text, record) => (
<span>
<Link className="line_1 color-grey3" to={`/task/taskDetail/${record.taskId}`}>{text}</Link>
</span >
),
},
{
title: '评论/成果内容',
dataIndex: 'content',
render: (text, record) => {
return record.paperDetail ? <div dangerouslySetInnerHTML={{ __html: record.paperDetail.content }}></div> : ''
}
},
{
title: '评论/提交者',
dataIndex: 'user',
render: (text, record) => {
return record.user.nickname || record.user.login
}
},
{
title: '评论/提交时间',
dataIndex: 'createdAt',
},
{
title: '审核状态',
dataIndex: 'verifyStatus',
render: (text, record) => {
return text ? '通过' : '未通过'
}
},
{
title: '操作',
key: 'action',
render: (text, record) => (
<React.Fragment>
<Button className="mr5 font-12" type="primary" size="small" onClick={() => { checkPaperItem(record.id, true) }}>通过</Button>
<Button className="mr5 font-12" type="info" size="small" onClick={() => { setActiveId(record.id); setVisible(true) }}>不通过</Button>
{/* <Link className="line_1 color-grey3" to={`/task/taskDetail/${record.id}`}>查看详情</Link> */}
</React.Fragment>
),
},
]
}, []);
function checkPaperItem(paperId, passStatus) {
checkPaper({
paperId,
auditingVo: {
pass: passStatus ? 1 : pass,
message,
}
}).then(res => {
console.log(res);
});
}
return (
<div className="centerbox task-manage">
<div className="center-screen" >
<div className="center-left-but">
{helper(
"",
"verifyStatus",
[],
<Select
showArrow
placeholder="请选择审核状态"
>
{
paperVerifyStatusArr.map(item => {
return <Option key={item.dicItemCode}>{item.dicItemName}</Option>
})
}
</Select>,
'-1'
)}
</div>
<div className="center-right-but">
{helper(
"发布时间:",
"startTime",
[],
<DatePicker
showTime
format={format}
placeholder="请选择开始时间"
/>
)}
{helper(
"",
"endTime",
[],
<DatePicker
showTime
format={format}
placeholder="请选择结束时间"
/>
)}
<Button className="mr10" type="primary" onClick={onSearch}>搜索</Button>
<Button className="mr10" type="" onClick={clearSearch}>清除</Button>
</div>
</div>
<div className="center-content">
<Table
loading={loading}
rowKey={(row) => row.id}
dataSource={taskList}
columns={columns}
pagination={false}
className="mt10"
/>
{taskList.length > 10 &&
<Pagination
onChange={(page) => { setCurPage(page) }}
current={curPage}
total={total}
/>}
</div>
<Modal
title="不通过的原因"
visible={visible}
onOk={() => { checkPaperItem(activeId, false) }}
onCancel={() => { setVisible(false) }}
className="form-edit-modal"
>
<Radio.Group
className="mb10"
value={pass}
onChange={(e) => { setPass(e.target.value) }}>
<Radio value={2}>允许申诉</Radio>
<Radio value={0}>不允许申诉</Radio>
</Radio.Group>
<TextArea
value={message}
placeholder="(必填)我想说点什么呢,200字以内"
autoSize={{ minRows: 6 }}
className="applyText"
onChange={(e) => { setMessage(e.target.value) }}
maxLength={200}
/>
</Modal>
</div>
)
}
)

View File

@ -73,6 +73,12 @@ export const applyStatusAllArr = [
{ dicItemCode: '4', name: "待确认", dicItemName: '待确认' },
];
export const paperVerifyStatusArr=[
{ dicItemCode: '-1', name: "全部成果评论", dicItemName: '全部成果评论' },
{ dicItemCode: '1', name: "通过", dicItemName: '通过' },
{ dicItemCode: '0', name: "未通过", dicItemName: '未通过' },
]
export const formItemLayout = {
labelCol: {
xs: { span: 10 },

View File

@ -5,8 +5,8 @@ import { Link } from "react-router-dom";
import { getImageUrl, formatDuring } from 'educoder';
import Upload from '../../components/Upload';
import StatusNav from '../../components/statusNav';
import ItemListAchieve from '../components/itemListAchieve';
import { getTaskDetail, getTaskCategory, getTaskAchieve, updateTask, addAchieve, getAgreement, agreement, checkAgreement, checkAchieve } from '../api';
import ItemListPaper from '../components/itemListPaper';
import { getTaskDetail, getTaskCategory, getTaskPaper, updateTask, addPaper, getAgreement, agreement, checkAgreement, checkHavePaper } from '../api';
import { taskModeIdArr, applyStatusArr, applyStatusAllArr, agreementContent } from '../static';
import { httpUrl } from '../../fetch';
import winpng from '../image/win.png';
@ -59,7 +59,7 @@ export default Form.create()(
const [applyContent, setApplyContent] = useState({ title: '应征投稿协议内容', content: agreementContent });
const [agreementCheckBox, setAgreementCheckBox] = useState(false);
const [signAgreement, setSignAgreement] = useState(false);
const [isAchieve, setIsAchieve] = useState(false);
const [isPaper, setIsPaper] = useState(false);
const [status, setStatus] = useState('');
const [curPage, setCurPage] = useState(1);
@ -101,9 +101,9 @@ export default Form.create()(
//
useEffect(() => {
id && checkAchieve(id).then(res => {
id && checkHavePaper(id).then(res => {
if (res && res.data && res.data.status === 1) {
setIsAchieve(true);
setIsPaper(true);
}
})
}, []);
@ -130,7 +130,7 @@ export default Form.create()(
curPage,
status,
}
id && getTaskAchieve(params).then(data => {
id && getTaskPaper(params).then(data => {
if (data && Array.isArray(data.rows)) {
for (const item of data.rows) {
item.detail = item.paperDetail.content;
@ -210,10 +210,10 @@ export default Form.create()(
...values,
taskId: id
}
addAchieve(params).then((res) => {
addPaper(params).then((res) => {
if (res.message === 'success') {
showNotification('成果提交成功');
setIsAchieve(true);
setIsPaper(true);
setReload(reload + 1);
setCurPage(1);
}
@ -271,8 +271,8 @@ export default Form.create()(
const signContent = useCallback(() => {
if (signAgreement && isAchieve) {
return <div class="edu-back-white padding30 mt20 font-16 color-orange text-center">
if (signAgreement && isPaper) {
return <div className="edu-back-white padding30 mt20 font-16 color-orange text-center">
您已成功提交请等待审核
</div>
} else if (signAgreement) {
@ -310,13 +310,13 @@ export default Form.create()(
<Button className="mr20" type={"primary"} onClick={() => { setApplyModal(true) }}>我要应征投稿</Button>
</div>
}
}, [signAgreement, isAchieve]);
}, [signAgreement, isPaper]);
function goUser(login) {
window.location.href = `/users/${login}`;
}
function exportAchieve() {
function exportPaper() {
Modal.info({ title: '暂未提供接口' });
}
@ -415,7 +415,7 @@ export default Form.create()(
</Tooltip>}
{/* <a href="javascript:void(0)" onclick="upload_proofs_popup(130)" className="line_1 color-blue fr ml20" id="proof-upload-button">上传佐证材料</a> */}
{/* <a href="/tasks/130/export_papers" className="line_1 color-blue fr ml20" data-disable-with="<img alt=&quot;Loading&quot; className=&quot;download-loading&quot; src=&quot;/images/loading.gif?1564989000&quot; ></a>下载中..." target="_blank">一键导出成果物</a> */}
{dataList.length > 0 && <a className="line_1 color-blue fr ml20" onClick={exportAchieve}>一键导出成果物 &gt;&gt;</a>}
{dataList.length > 0 && <a className="line_1 color-blue fr ml20" onClick={exportPaper}>一键导出成果物 &gt;&gt;</a>}
{!detailData.showUserStatus && <a className="fr color-orange ml20" onClick={showUser}>应征者名单公示 &gt;&gt;</a>}
</div>
@ -444,7 +444,7 @@ export default Form.create()(
/>}
</React.Fragment>
:
<ItemListAchieve
<ItemListPaper
list={dataList}
itemClick={dataList}
curPage={curPage}

View File

@ -4,7 +4,7 @@ import ItemTaskManage from '../components/itemTaskManage';
import StatusNav from '../../components/statusNav';
import { approveArr } from '../static';
import { manageTaskList, getTaskCategory } from '../api';
import './index.scss';
import '../index.scss';
export default Form.create()(({ current_user, form, showNotification, match, history }) => {
const { getFieldDecorator, validateFields, setFieldsValue, getFieldsValue } = form;

View File

@ -1,24 +0,0 @@
.task-manage{
margin-top:1.25rem;
.status-list{
margin: 0 1.5rem;
}
}
.center-screen {
display: flex;
justify-content: space-between;
height: 4.5rem;
margin:1.25rem 0;
background-color: #fff;
}
.center-left-but {
.circle-button {
border-radius: 1rem;
margin-right: 0.5rem;
}
}
.center-right-but {
.ant-form-item {
margin: 0 1rem 0 0;
}
}