增加上传支付凭证,修改bug

This commit is contained in:
何童崇 2021-07-14 09:09:30 +08:00
parent 16aac3b835
commit b6d6309c3c
12 changed files with 412 additions and 18 deletions

View File

@ -35,16 +35,14 @@ function Uploads({ className, size, actionUrl, fileList, showNotification, load
}
function backFiles(fileList) {
if (fileList && fileList.length) {
let filesId = [];
for (const item of fileList) {
if (item) {
let itemId = (item.response && item.response.data && item.response.data.id) || item.id;
itemId && filesId.push(itemId);
}
let filesId = [];
for (const item of fileList) {
if (item) {
let itemId = (item.response && item.response.data && item.response.data.id) || item.id;
itemId && filesId.push(itemId);
}
load && load(fileList, filesId.join());
}
load && load(fileList, filesId.join());
}

View File

@ -61,6 +61,11 @@ const AgreementManage = Loadable({
loading: Loading,
});
const PayProof = Loadable({
loader: () => import("./task/payProof"),
loading: Loading,
});
const Index = (propsTransmit) => {
// 开发时,从代理的位置获取用户信息
const [currentUser, setCurrentUser] = useState(null);
@ -161,6 +166,14 @@ const Index = (propsTransmit) => {
)}
></Route>
{/* 管理员待办 */}
<Route
path="/task/payProof"
render={(props) => (
<PayProof {...propsF} {...props} />
)}
></Route>
{/* 成果列表 */}
<Route
path="/task"

View File

@ -1,5 +1,6 @@
import fetch, { } from '../fetch';
import { notification } from 'antd';
import { func } from 'prop-types';
// 获取字典分类列表
export function getDictionary(id) {
@ -471,6 +472,35 @@ export function uploadAgreePaper(data) {
}
// 审核公示期申诉列表查询
export async function uploadPayProofList(params) {
let res = await fetch({
url: '/api/sign/admin/paper/payOrders',
method: 'get',
params,
});
if (res.data) {
return res.data;
} else {
notification.open({
message: "提示",
description: res.message || '请求错误',
});
}
}
// 管理员上传支付凭证
export function uploadPayProof(data){
return fetch({
url: `/api/sign/admin/paper/payment/${data.paperId}`,
method: 'post',
data: data.params
});
}
// 胜出者确认收款
export function confirmReceipt(paperId) {
return fetch({

View File

@ -130,7 +130,7 @@ export default Form.create()((props) => {
</div>
<div className="clearfix"></div>
<div className="width100 lineh-35 clearfix">
<span className="color-grey-9 fl">申诉材料</span>
<span className="color-grey-9 fl">协议文件</span>
{
item.materials && item.materials.map(fileItem => {
return <span className="file-list-prof " key={fileItem.id}>

View File

@ -26,7 +26,6 @@
}
.mytask-title {
align-items: start;
justify-content: left;
span{
flex: 0 0 auto;

View File

@ -157,7 +157,7 @@ export default Form.create()((props) => {
{item.status === 2 ? <img alt="胜出" className="mr5" src={winpng} /> : <span className="color-blue ml10">{item.checkStatus != 1 ? paperCheckStatus[item.checkStatus] : applyStatusAllNameArr[item.status]}</span>}
</li>
<li className="fr">
{(item.needComplain || detailStatus === 5) && (current_user.login === item.user.login) &&
{((item.needComplain && detailStatus === 3) || (detailStatus === 5 && item.status !== 2)) && (current_user.login === item.user.login) &&
<a className="base_smallBtn blue_line_btn fl" onClick={() => { setComplainVisible(true); setCheckedItem(item) }}>申诉</a>}
{item.status === 2 && detailStatus === 6 && (current_user.login === item.user.login) &&

View File

@ -0,0 +1,162 @@
import React, { useEffect, useState, useCallback } from 'react';
import { Pagination, Modal, Input, Button, Form, InputNumber } from 'antd';
import { Link } from "react-router-dom";
import Nodata from 'forge/Nodata';
import Loading from "src/Loading";
import Upload from 'military/components/Upload';
import { timeAgo, getImageUrl } from 'educoder';
import { uploadPayProof } from '../../api';
import './index.scss';
export default Form.create()((props) => {
const { form, list, curPage, total, changePage, loading, showNotification, reloadList } = props;
const { getFieldDecorator, validateFields, setFieldsValue } = form;
const [checkedItem, setCheckedItem] = useState({});
const [visible, setVisible] = useState(false);
const [page, setPage] = useState(1);
const [fileList, setFileList] = useState(null);
const pageSize = props.pageSize || 10;
useEffect(() => {
changePage(page);
}, [page]);
function goUser(login) {
window.location.href = `/users/${login}`;
}
function goUserMes(login) {
window.location.href = `/users/${login}/message_detail`;
}
//
function uploadFunc(fileList, files) {
setFileList(fileList);
setFieldsValue({ files });
}
function uploadPay() {
validateFields((err, values) => {
if (!err) {
uploadPayProof({
paperId: checkedItem.id,
params: {
files: values.files,
}
}).then(res => {
if (res.message === 'success') {
setFieldsValue({
files: '',
});
setFileList([]);
reloadList();
setVisible(false);
showNotification("上传支付凭证成功!");
} else {
showNotification(res.message || "上传支付凭证失败")
}
})
}
})
}
return (
loading ? <Loading /> :
<React.Fragment>
{
list.map(item => {
return (
<div className="list-box" key={item.id}>
<img alt="" className="radius mr15" height="50px" src={item.user && getImageUrl(item.user.logo)} width="50px" />
<div className="flex1">
<li className="clearfix mb20">
<a className="user-box fl mr15 color-grey-3 font-16" onClick={() => { goUser(item.user.login) }}>{item.user && (item.user.nickname || item.user.login)}</a>
<span className="fl color-grey-9 mt3 mr15">{timeAgo(item.createdAt)}</span>
<span className="infos_item color-grey-9 fl">发布方式:</span>
<span className="infos_item mr15 fl">{item.task && item.task.publishMode === 1 ? '统筹任务' : '自主提交'}</span>
<span className="fr">
{/* {item.status === 2 && <span className="spanTitle color-grey-6 fl ml20">已同意</span>} */}
{/* {item.status === 0 && <span className="spanTitle color-red fl ml20">已驳回</span>} */}
{
item.status === 1 && <React.Fragment>
<a className="edu-default-btn edu-orangeline-btn ml20 fl" onClick={() => { item.user && goUserMes(item.user.login) }}>私信</a>
</React.Fragment>
}
</span>
</li>
<div className="clearfix">
<div className="width100 lineh-35" style={{ display: "inline-flex" }}>
<span className="with40 fl lineh-35">
<span className="color-grey-9 fl">任务编号:</span>
<span className="infos_item mr15">{item.task.number}</span>
<span className="fl lineh-35 ml5">
<Link className="primary-link" to={`/task/taskDetail/${item.id}`}>{item.task.name}</Link>
</span>
</span>
<span className="with40 fl lineh-35">
<span className="color-grey-9 fl">联系手机:</span>
<span className="infos_item">{item.user.phone}</span>
</span>
</div>
<div className="clearfix"></div>
<div className="width100 lineh-35 clearfix">
<Button type="primary" onClick={() => { setVisible(true); setCheckedItem(item) }}>上传支付报酬凭证</Button>
</div>
</div>
</div>
</div>
)
})
}
{list.length > 0 ?
<div className="edu-txt-center mt20 mb20">
{total > pageSize && <Pagination
showQuickJumper
onChange={(page) => { setPage(page) }}
current={curPage}
total={total}
showTotal={total => `${total}`}
/>}
</div> :
<Nodata _html="暂无数据" />}
<Modal
title="上传支付报酬凭证"
visible={visible}
onOk={uploadPay}
onCancel={() => { setVisible(false) }}
className="form-edit-modal"
>
<div className="task-popup-content">
<Form.Item className="upload-form" label="附件上传" required={true}>
<Upload
className="commentStyle"
load={uploadFunc}
size={50}
showNotification={showNotification}
fileList={fileList}
/>
{getFieldDecorator('files', {
rules: [{ required: visible, message: "请上传文件" }],
validateFirst: true
})(<Input style={{ display: 'none' }} />)}
</Form.Item>
</div>
</Modal>
</React.Fragment>
)
}
)

View File

@ -0,0 +1,52 @@
.list-box {
position: relative;
display: flex;
justify-content: space-between;
padding: 20px;
margin: 0 1.5rem;
background: #fff;
border-bottom: 1px solid #dedede;
a.edu-orangeline-btn {
padding: 0px 10px;
}
}
a.primary-link {
color: #1890ff;
}
.infos_item {
float: left;
max-width: 273px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
color: #343434;
margin-right: 6px;
line-height: 35px;
margin-left: 5px;
}
.file-list-prof{
background: #fafafa;
padding:.25rem .5rem;
margin-right:.5rem;
}
.form-edit-modal {
.ant-form-item{
display: flex;
}
.ant-form-item-label{
min-width: 5rem;
}
.ant-form-item-control-wrapper{
width: 75%;
display: inline-block;
}
.ant-input-number{
width: 50%;
}
}

View File

@ -69,9 +69,10 @@ export default Form.create()((props) => {
}
const helper = useCallback(
(label, name, rules, widget) => (
(label, name, rules, widget, rightDom) => (
<Form.Item label={label}>
{getFieldDecorator(name, { rules, validateFirst: true })(widget)}
{rightDom}
</Form.Item>
),
[]
@ -124,7 +125,7 @@ export default Form.create()((props) => {
<div className="width100 lineh-35">
<span className="color-grey-9 fl">成果编号</span>
<span className="fl lineh-35 ml5">
<Link className="primary-link" to={`/task/taskDetail/${item.taskId}`}>{item.number}</Link>
<Link className="primary-link" to={`/task/taskDetail/${item.taskId}`}>{item.paperNumber}</Link>
</span>
</div>
<div className="clearfix"></div>
@ -214,12 +215,15 @@ export default Form.create()((props) => {
[{ required: true, message: "请输入延长天数" }],
<InputNumber
placeholder="您打算延长多少天呢"
/>
max={150}
min={0}
/>,
'天'
)
}
{
helper('原因', 'reason', [{ required: true, message: "请输入选择的原因" }, { max: 200, message: '不能超过200字符' }],
helper('原因', 'reason', [{ required: true, message: "请输入原因" }, { max: 200, message: '不能超过200字符' }],
<TextArea
placeholder="(必填)我想说点什么呢,200字以内"
autoSize={{ minRows: 6 }}

View File

@ -123,7 +123,7 @@ export default ({ taskCategoryValueArr, showNotification }) => {
render: (text, record) => (
<span>
<Link className="line_1 color-grey3" to={`/task/taskDetail/${record.task.id}`}>查看详情</Link>
{(record.needComplain || record.task.status === 5) &&
{((record.needComplain && record.task.status === 3) || (record.task.status === 5 && record.status !== 2)) &&
<a className="base_smallBtn blue_line_btn fl" onClick={() => { setComplainVisible(true); setCheckedItem(record) }}>申诉</a>}
{record.status === 2 && record.task.status === 6 &&

View File

@ -21,7 +21,7 @@ export default Form.create()(({ current_user, form, showNotification, match, his
const [loading, setLoading] = useState(false);
const [searchObj, setSearchObj] = useState({
checkStatus: '0,1,2'
checkStatus: '0'
});
const [curPage, setCurPage] = useState(1);
const [total, setTotal] = useState(0);
@ -204,7 +204,7 @@ export default Form.create()(({ current_user, form, showNotification, match, his
})
}
</Select>,
'0,1,2'
'0'
)}
</div>

View File

@ -0,0 +1,136 @@
import React, { useCallback, forwardRef, useEffect, useState } from 'react';
import { Input, Button, Form } from 'antd';
import ItemPayProof from '../components/itemPayProof';
// import StatusNav from '../../components/statusNav';
import { agreementArr } from '../static';
import { uploadPayProofList } from '../api';
import '../index.scss';
agreementArr.splice(1,1);
export default Form.create()(({ current_user, form, showNotification, match, history }) => {
const { getFieldDecorator, validateFields, setFieldsValue, } = form;
const [approve, setApprove] = useState(1);
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);
useEffect(() => {
const params = {
...searchObj,
status:approve,
type:'',
currentPage:curPage,
pageSize: 10,
};
setLoading(true);
uploadPayProofList(params).then(data => {
if (data) {
setTaskList(data.rows);
setTotal(data.total);
}
setLoading(false);
})
}, [reload, approve, curPage, searchObj]);
const helper = useCallback(
(name, rules, widget) => (
<Form.Item>
{getFieldDecorator(name, { rules, validateFirst: true, })(widget)}
</Form.Item>
), []);
function onSearch() {
validateFields((err, values) => {
if (!err) {
setSearchObj(values);
}
});
}
function changeApprove(approve) {
setApprove(approve);
setCurPage(1);
}
function clearSearch() {
setFieldsValue({
numberInput: '',
nameInput: '',
enterpriseNameInput: ''
});
setSearchObj({});
}
const reloadList = useCallback(() => {
setReload(reload + 1);
}, [])
return (
<div className="centerbox task-manage">
<div className="center-screen" >
<div className="center-left-but">
<Button className="circle-button" type={approve === 1 ? 'primary' : ''} onClick={() => { changeApprove(1) }}>待上传</Button>
<Button className="circle-button" type={approve === 2 ? 'primary' : ''} onClick={() => { changeApprove(2) }}>已上传</Button>
</div>
<div className="center-right-but">
{helper(
"numberInput",
[{ max: 20, message: '长度不能超过20个字符' }],
<Input
placeholder="输入任务编号进行检索"
/>
)}
{helper(
"nameInput",
[{ max: 20, message: '长度不能超过20个字符' }],
<Input
placeholder="输入任务名称进行检索"
/>
)}
{helper(
"enterpriseNameInput",
[{ max: 20, message: '长度不能超过20个字符' }],
<Input
placeholder="输入发布主体名称进行检索"
/>
)}
<Button className="mr10" type="primary" onClick={onSearch}>搜索</Button>
<Button className="mr10" type="" onClick={clearSearch}>清除</Button>
</div>
</div>
<div className="center-content">
<ItemPayProof
list={taskList}
curPage={curPage}
total={total}
changePage={(page) => { setCurPage(page) }}
loading={loading}
showNotification={showNotification}
reloadList={reloadList}
/>
</div>
</div>
)
}
)