323 lines
11 KiB
JavaScript
323 lines
11 KiB
JavaScript
import React,{useEffect,useState,useRef} from 'react';
|
||
import { Form, Button, Input, Row, Col,Upload,DatePicker,Modal,message,Image } from 'antd';
|
||
import {PaperClipOutlined,DeleteOutlined,FileWordOutlined,FilePdfOutlined,FilePptOutlined,FileZipOutlined,FileExcelOutlined} from '@ant-design/icons';
|
||
import { formItemLayout, btnItemLayout } from '../../../components/crud/FormLayoutProps';
|
||
import apiurl from '../../../service/apiurl';
|
||
import { httpget2 } from '../../../utils/request';
|
||
import moment from 'moment';
|
||
import "./index.less";
|
||
const url = "http://223.75.53.141:9100/gs-tsg"
|
||
const ModalForm = ({ mode, record,onEdit,onSave,onCrudSuccess }) => {
|
||
const [form] = Form.useForm();
|
||
const [fileList, setFileList] = useState([]) //上传文件列表
|
||
const [loading, setLoading] = useState(false)
|
||
const [iframeId, setIframeId] = useState('')
|
||
const [perviewOpen, setPerviewOpen] = useState(false)
|
||
|
||
const fileChange = (info) => {
|
||
console.log("file",info);
|
||
|
||
if (info.file.status === "done") {
|
||
setLoading(false);
|
||
setFileList(info.fileList)
|
||
|
||
}
|
||
if (info.file.status === "uploading") {
|
||
setLoading(true);
|
||
}
|
||
if (info.file.status === "error") {
|
||
message.error("文件上传失败")
|
||
setLoading(false);
|
||
}
|
||
if (fileList.length > 0) {
|
||
return
|
||
}
|
||
setFileList(info.fileList)
|
||
}
|
||
|
||
const deleteFile = (fileId) => {
|
||
let filterFile = fileList.filter(item => item.response?.data?.fileId !== fileId);
|
||
setFileList(filterFile)
|
||
}
|
||
const onFinish = async (values) => {
|
||
if (fileList.length <= 0) {
|
||
message.error("请上传预案文件")
|
||
return
|
||
}
|
||
let oldFiles = fileList.map(item => ({ fileId: item.response?.data?.fileId }))
|
||
values.resCode = "42112230001"
|
||
values.type = 2
|
||
values.files = oldFiles;
|
||
values.prepTime = moment(values.prepTime).format("YYYY-MM-DD 00:00:00")
|
||
values.apprTime = moment(values.apprTime).format("YYYY-MM-DD 00:00:00")
|
||
if (mode === 'edit') {
|
||
values.id = record?.id;
|
||
onEdit(apiurl.fxya.update,values)
|
||
}
|
||
if (mode === 'save') {
|
||
onSave(apiurl.fxya.save,values)
|
||
}
|
||
}
|
||
|
||
const viewPdf = (params) => {
|
||
setIframeId(params)
|
||
setPerviewOpen(true)
|
||
}
|
||
const beforeUpload = () => {
|
||
if (fileList.length > 0) {
|
||
message.error("只能上传一个附件");
|
||
return false;
|
||
}
|
||
}
|
||
const getFileInfo = async(id) => {
|
||
try {
|
||
const res = await httpget2(`${apiurl.dataResourcesCenter.projectAndWater.fxya.getFile}/${id}`)
|
||
let obj ={
|
||
name: res.data.fileName,
|
||
response: {
|
||
data: {
|
||
filePath: res.data.filePath,
|
||
fileId:res.data.fileId
|
||
}
|
||
},
|
||
}
|
||
setFileList([obj])
|
||
} catch (error) {
|
||
console.log(error);
|
||
|
||
}
|
||
}
|
||
|
||
const download = (params) => {
|
||
let downloadLink = document.createElement("a");
|
||
downloadLink.href = `${process.env.REACT_APP_API_URL}/gunshiApp/tsg/resPlanB/file/download/${params}`;
|
||
downloadLink.download = `${params.fileName}`;
|
||
downloadLink.style.display = "none";
|
||
// 将链接添加到页面中
|
||
document.body.appendChild(downloadLink);
|
||
|
||
// 模拟点击事件,开始下载
|
||
downloadLink.click();
|
||
}
|
||
|
||
useEffect(() => {
|
||
if (record && mode != "save") {
|
||
getFileInfo(record?.files[0]?.fileId)
|
||
}
|
||
}, [record,mode])
|
||
|
||
return (
|
||
<>
|
||
<Form form={form} {...formItemLayout} onFinish={onFinish} initialValues={record}>
|
||
<Row>
|
||
<Col span={24}>
|
||
<Form.Item
|
||
label="调度规程名称"
|
||
name="planName"
|
||
labelCol={{ span: 3, offset: 0 }}
|
||
wrapperCol={{span:21,offset:0}}
|
||
rules={[{ required: true }]}
|
||
>
|
||
<Input
|
||
style={{ width: '100%' }}
|
||
allowClear
|
||
disabled={mode==='view'}
|
||
/>
|
||
</Form.Item>
|
||
</Col>
|
||
|
||
</Row>
|
||
|
||
<Row>
|
||
<Col span={12}>
|
||
<Form.Item
|
||
label="编制单位"
|
||
name="prepOrg"
|
||
rules={[{ required: true }]}
|
||
>
|
||
<Input
|
||
style={{ width: '100%' }}
|
||
allowClear
|
||
disabled={mode==='view'}
|
||
/>
|
||
</Form.Item>
|
||
</Col>
|
||
<Col span={12}>
|
||
<Form.Item
|
||
label="编制日期"
|
||
name="prepTime"
|
||
getValueFromEvent={(e, dateString) => dateString}
|
||
getValueProps={value => ({
|
||
value: value ? moment(value) : undefined
|
||
})}
|
||
rules={[{ required: true }]}
|
||
>
|
||
<DatePicker allowClear style={{width:'280px'}} disabled={mode==='view'}/>
|
||
</Form.Item>
|
||
</Col>
|
||
</Row>
|
||
<Row>
|
||
<Col span={12}>
|
||
<Form.Item
|
||
label="批复部门"
|
||
name="apprOrg"
|
||
rules={[{ required: true }]}
|
||
>
|
||
<Input
|
||
style={{ width: '100%' }}
|
||
allowClear
|
||
disabled={mode==='view'}
|
||
/>
|
||
</Form.Item>
|
||
</Col>
|
||
<Col span={12}>
|
||
<Form.Item
|
||
label="批复日期"
|
||
name="apprTime"
|
||
getValueFromEvent={(e, dateString) => dateString}
|
||
getValueProps={value => ({
|
||
value: value ? moment(value) : undefined
|
||
})}
|
||
rules={[{ required: true }]}
|
||
>
|
||
<DatePicker allowClear style={{width:'280px'}} disabled={mode==='view'}/>
|
||
</Form.Item>
|
||
</Col>
|
||
</Row>
|
||
<Row>
|
||
<Col span={24}>
|
||
<Form.Item
|
||
label="预案文件"
|
||
name="files"
|
||
labelCol={{ span: 3, offset: 0 }}
|
||
wrapperCol={{span:21,offset:0}}
|
||
rules={[{ required: true }]}
|
||
>
|
||
<Upload
|
||
name='file'
|
||
action="/gunshiApp/tsg/resPlanB/file/upload/singleSimple"
|
||
onChange={fileChange}
|
||
fileList={fileList}
|
||
maxCount={1}
|
||
disabled={loading}
|
||
showUploadList={false}
|
||
beforeUpload={beforeUpload}
|
||
>
|
||
{mode == "view" ? null :
|
||
<div style={{display:"flex",alignItems:"center",columnGap:10,color:"#4f85ec",cursor:"pointer"}}>
|
||
<PaperClipOutlined />
|
||
<a style={{ cursor: "pointer" }}>上传附件
|
||
<span style={{ marginLeft:10,color:"#dfdfdf" }}>(支持扩展名:.xls .xlsx .doc .docx .pdf .jpg .png)</span></a>
|
||
</div>
|
||
}
|
||
</Upload>
|
||
</Form.Item>
|
||
</Col>
|
||
|
||
</Row>
|
||
<Row gutter={[16]} style={{margin:"-25px 0 0 14px"}}>
|
||
{
|
||
// loading ? <span>文件正在上传中,请等待</span> :
|
||
fileList.length > 0 && fileList.map(file => {
|
||
return (
|
||
<Col span={12}>
|
||
<div className={mode == "view" ? 'file-item' : 'file-item'}>
|
||
<div className='file-description'>
|
||
{file.name.indexOf('.docx') > -1 ?
|
||
<div
|
||
onClick={() => { download(file.response?.data?.fileId) }}
|
||
style={{ cursor: 'pointer' }}
|
||
>
|
||
<FileWordOutlined
|
||
style={{ fontSize: 40 }}
|
||
/>
|
||
</div>
|
||
:
|
||
file.name.indexOf('.pdf') > -1 ?
|
||
<div
|
||
onClick={() => { viewPdf(file.response?.data?.fileId) }}
|
||
style={{ cursor: 'pointer' }}
|
||
>
|
||
<FilePdfOutlined style={{ fontSize: 40 }} />
|
||
</div>
|
||
:
|
||
file.name.indexOf('.zip') > -1 ?
|
||
<div
|
||
onClick={() => { download(file.response?.data?.fileId) }}
|
||
style={{ cursor: 'pointer' }}
|
||
>
|
||
<FileZipOutlined style={{ fontSize: 40 }} />
|
||
</div>
|
||
:
|
||
file.name.indexOf('.ppt') > -1 ?
|
||
<div
|
||
onClick={() => { download(file.response?.data?.fileId) }}
|
||
style={{ cursor: 'pointer' }}
|
||
>
|
||
<FilePptOutlined style={{ fontSize: 40 }} />
|
||
</div> :
|
||
file.name.indexOf('.xlsx') > -1 ?
|
||
<div
|
||
onClick={() => { download(file.response?.data?.fileId) }}
|
||
style={{ cursor: 'pointer' }}
|
||
>
|
||
<FileExcelOutlined style={{ fontSize: 40 }} />
|
||
</div>
|
||
:
|
||
<Image width={60} src={url +file.response?.data?.filePath} alt='' />
|
||
}
|
||
<span>{file.name}</span>
|
||
</div>
|
||
{mode !== "view" &&
|
||
<div
|
||
className="delete-icon"
|
||
onClick={() => deleteFile(file.response?.data?.fileId)}
|
||
>
|
||
<DeleteOutlined />
|
||
</div>
|
||
}
|
||
</div>
|
||
</Col>
|
||
)
|
||
})
|
||
}
|
||
</Row>
|
||
|
||
{
|
||
mode==='view'?null:(
|
||
<>
|
||
<Form.Item {...btnItemLayout}>
|
||
<Button type="primary" htmlType="submit">
|
||
{mode === 'save' ? '提交' : '修改'}
|
||
</Button>
|
||
</Form.Item>
|
||
</>
|
||
)
|
||
}
|
||
</Form>
|
||
<Modal
|
||
open={perviewOpen}
|
||
width={1000}
|
||
title=""
|
||
footer={null}
|
||
style={{marginTop:"-5%"}}
|
||
onCancel={() => {
|
||
setPerviewOpen(false)
|
||
}}
|
||
>
|
||
<iframe
|
||
style={{
|
||
height: '80vh',
|
||
width: '100%',
|
||
border: 0,
|
||
marginTop: 20,
|
||
}}
|
||
src={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`/gunshiApp/tsg/resPlanB/file/download/${iframeId}`)}`}
|
||
/>
|
||
</Modal>
|
||
</>
|
||
);
|
||
}
|
||
|
||
export default ModalForm;
|