472 lines
15 KiB
JavaScript
472 lines
15 KiB
JavaScript
import React,{useEffect,useState,useMemo,useRef} from 'react';
|
||
import { Form, Button, Input, Row,Upload, Col, Table, DatePicker, InputNumber,message,Image,Modal,Typography ,Popconfirm } from 'antd';
|
||
import { DeleteOutlined,FileWordOutlined,FilePdfOutlined,FileZipOutlined,FileExcelOutlined } from '@ant-design/icons';
|
||
import { formItemLayout, btnItemLayout } from '../../../components/crud/FormLayoutProps';
|
||
import apiurl from '../../../service/apiurl';
|
||
import NormalSelect from '../../../components/Form/NormalSelect';
|
||
import "./index.less"
|
||
import moment from 'moment';
|
||
import { createCrudService } from '../../../components/crud/_';
|
||
const { RangePicker } = DatePicker
|
||
const { Dragger } = Upload;
|
||
const url = "http://223.75.53.141:9102/test.by-lyf.tmp"
|
||
|
||
const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
|
||
|
||
const types = [
|
||
{
|
||
label: "水利",
|
||
value:1
|
||
},
|
||
{
|
||
label: "岗前培训",
|
||
value:2
|
||
},{
|
||
label: "在岗培训",
|
||
value:3
|
||
},{
|
||
label: "政治学习教育",
|
||
value:4
|
||
},{
|
||
label: "其他",
|
||
value:5
|
||
},
|
||
]
|
||
const [details, setDetails] = useState([])
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
const [form] = Form.useForm();
|
||
const [fileList, setFileList] = useState([]) //上传文件列表
|
||
const [fileIds, setFileIds] = useState([])
|
||
const [iframeSrc, setIframeSrc] = useState('')
|
||
const [pdfViewOPen, setPdfViewOPen] = useState(false)
|
||
|
||
const [loading, setLoading] = useState(false)
|
||
|
||
/**
|
||
* @description 文件下载
|
||
* @param {String} params 文件fileId
|
||
*/
|
||
const download = (params) => {
|
||
let downloadLink = document.createElement("a");
|
||
downloadLink.href = `http://local.gunshiiot.com:18083/gunshiApp/tsg/personnelPlan/file/download/${params}`;
|
||
downloadLink.download = `${params.fileName}`;
|
||
downloadLink.style.display = "none";
|
||
// 将链接添加到页面中
|
||
document.body.appendChild(downloadLink);
|
||
|
||
// 模拟点击事件,开始下载
|
||
downloadLink.click();
|
||
}
|
||
/**
|
||
* @description 上传图片
|
||
* @param {string} file 上传的文件
|
||
*/
|
||
const fileChange = (info) => {
|
||
if (info.file.status === "done") {
|
||
setLoading(false);
|
||
}
|
||
if (info.file.status === "uploading") {
|
||
setLoading(true);
|
||
}
|
||
if (info.file.status === "error") {
|
||
message.error("文件上传失败")
|
||
setLoading(false);
|
||
}
|
||
let fileIds = info.fileList.map(file => {
|
||
return file.response?.data?.fileId
|
||
})
|
||
setFileIds(fileIds)
|
||
setFileList(info.fileList)
|
||
}
|
||
/**
|
||
* @description pdf文件预览
|
||
* @param {String} params 文件预览url
|
||
*/
|
||
const viewPdf = (params) => {
|
||
setIframeSrc(params)
|
||
setPdfViewOPen(true)
|
||
}
|
||
|
||
|
||
const onfinish = (values) => {
|
||
values.regDate = moment(values.regDate).format('YYYY-MM-DD')
|
||
let oldFiles = fileList.map(item => ({fileId:item.response?.data?.fileId }))
|
||
values.files = oldFiles;
|
||
if (mode === 'edit') {
|
||
onEdit(apiurl.pxjh.edit,{...record,...values})
|
||
}
|
||
if (mode === 'save') {
|
||
onSave(apiurl.pxjh.save,values)
|
||
}
|
||
if (mode === "similarSave") {
|
||
onSave(apiurl.pxjh.save,values)
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @description 删除上传的图片
|
||
* @param {string} id 删除的id
|
||
*/
|
||
const deleteFile = (fileId) => {
|
||
console.log(fileId);
|
||
let filterFile = fileList.filter(item => item.response?.data?.fileId !== fileId);
|
||
setFileList(filterFile)
|
||
}
|
||
|
||
|
||
useEffect(() => {
|
||
if (mode!== "save") {
|
||
let fileArr = record?.files.map(item => {
|
||
return {
|
||
name: item.fileName,
|
||
response: {
|
||
data: {
|
||
filePath: item.filePath,
|
||
fileId:item.fileId
|
||
}
|
||
},
|
||
}
|
||
})
|
||
setFileList(fileArr)
|
||
}
|
||
}, [mode, record])
|
||
|
||
useEffect(() => {
|
||
const userName = localStorage.getItem('userName')
|
||
form.setFieldValue("regDate", moment())
|
||
form.setFieldValue("applicant",userName)
|
||
}, [])
|
||
|
||
|
||
return (
|
||
<div style={{height:"65vh",overflowY:"auto"}}>
|
||
<div className='basic-info'>基本信息</div>
|
||
{/* <Divider /> */}
|
||
<Form
|
||
form={form}
|
||
{...formItemLayout}
|
||
initialValues={record}
|
||
onFinish={onfinish}
|
||
>
|
||
<Row>
|
||
<Col span={12}>
|
||
<Form.Item
|
||
label="培训班名称"
|
||
name="name"
|
||
rules={[{ required: true }]}
|
||
>
|
||
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
|
||
</Form.Item>
|
||
</Col>
|
||
<Col span={12}>
|
||
<Form.Item
|
||
label="培训班分类"
|
||
name="type"
|
||
rules={[{ required: true }]}
|
||
>
|
||
<NormalSelect disabled={mode === 'view'} style={{ width: '100%' }} allowClear options={types} />
|
||
</Form.Item>
|
||
</Col>
|
||
</Row>
|
||
<Row>
|
||
<Col span={24}>
|
||
<Form.Item
|
||
label="主办单位"
|
||
name="unit"
|
||
labelCol={{ span: 3 }}
|
||
wrapperCol={{ span: 19 }}
|
||
rules={[{ required: true }]}
|
||
>
|
||
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
|
||
</Form.Item>
|
||
</Col>
|
||
</Row>
|
||
<Row>
|
||
<Col span={12}>
|
||
<Form.Item
|
||
label="开始培训日期"
|
||
name="stm"
|
||
rules={[{ required: true }]}
|
||
getValueFromEvent={(e,dateString) => dateString}
|
||
getValueProps={(value) => ({ value: value ? moment(value) : undefined })}
|
||
|
||
>
|
||
<DatePicker disabled={mode==='view'} format={'YYYY-MM-DD'} style={{width:'100%'}} allowClear />
|
||
</Form.Item>
|
||
</Col>
|
||
<Col span={12}>
|
||
<Form.Item
|
||
label="结束培训日期"
|
||
name="etm"
|
||
rules={[{ required: true }]}
|
||
getValueFromEvent={(e,dateString) => dateString}
|
||
getValueProps={(value) => ({ value: value ? moment(value) : undefined })}
|
||
|
||
>
|
||
<DatePicker disabled={mode==='view'} format={'YYYY-MM-DD'} style={{width:'100%'}} allowClear />
|
||
</Form.Item>
|
||
</Col>
|
||
</Row>
|
||
|
||
<Row>
|
||
<Col span={12}>
|
||
<Form.Item
|
||
label="培训天数(天)"
|
||
name="day"
|
||
>
|
||
<InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear />
|
||
</Form.Item>
|
||
</Col>
|
||
<Col span={12}>
|
||
<Form.Item
|
||
label="培训期数(期)"
|
||
name="num"
|
||
rules={[{ required: true }]}
|
||
>
|
||
<InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear />
|
||
</Form.Item>
|
||
</Col>
|
||
</Row>
|
||
<Row>
|
||
<Col span={24}>
|
||
<Form.Item
|
||
label="培训地点"
|
||
name="addr"
|
||
labelCol={{ span: 3 }}
|
||
wrapperCol={{ span: 19 }}
|
||
rules={[{ required: true }]}
|
||
>
|
||
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
|
||
</Form.Item>
|
||
</Col>
|
||
</Row>
|
||
<Row>
|
||
<Col span={24}>
|
||
<Form.Item
|
||
label="培训内容"
|
||
name="content"
|
||
labelCol={{ span: 3 }}
|
||
wrapperCol={{ span: 19 }}
|
||
rules={[{ required: true }]}
|
||
>
|
||
<Input.TextArea disabled={mode==='view'} style={{width:'100%',minHeight:'100px'}} allowClear />
|
||
</Form.Item>
|
||
</Col>
|
||
</Row>
|
||
<Row>
|
||
<Col span={24}>
|
||
<Form.Item
|
||
label="培训范围"
|
||
name="scope"
|
||
labelCol={{ span: 3 }}
|
||
wrapperCol={{ span: 19 }}
|
||
rules={[{ required: true }]}
|
||
>
|
||
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
|
||
</Form.Item>
|
||
</Col>
|
||
</Row>
|
||
<Row>
|
||
<Col span={24}>
|
||
<Form.Item
|
||
label="参训人员"
|
||
name="trainees"
|
||
labelCol={{ span: 3 }}
|
||
wrapperCol={{ span: 19 }}
|
||
>
|
||
<InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear />
|
||
</Form.Item>
|
||
</Col>
|
||
</Row>
|
||
<Row>
|
||
<Col span={12}>
|
||
<Form.Item
|
||
label="参训人数(人)"
|
||
name="numPeople"
|
||
rules={[{ required: true }]}
|
||
>
|
||
<InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear />
|
||
</Form.Item>
|
||
</Col>
|
||
<Col span={12}>
|
||
<Form.Item
|
||
label="联系人"
|
||
name="contacts"
|
||
>
|
||
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
|
||
</Form.Item>
|
||
</Col>
|
||
</Row>
|
||
<Row>
|
||
<Col span={12}>
|
||
<Form.Item
|
||
label="联系电话"
|
||
name="contactNumber"
|
||
>
|
||
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
|
||
</Form.Item>
|
||
</Col>
|
||
<Col span={12}>
|
||
<Form.Item
|
||
label="填报人"
|
||
name="applicant"
|
||
>
|
||
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
|
||
</Form.Item>
|
||
</Col>
|
||
</Row>
|
||
<Row>
|
||
<Col span={12}>
|
||
<Form.Item
|
||
label="状态"
|
||
name="status"
|
||
rules={[{ required: true }]}
|
||
>
|
||
<NormalSelect disabled={mode==='view'} style={{width:'100%'}} allowClear options={[{label:"有效",value:1},{label:"无效",value:2}]} />
|
||
</Form.Item>
|
||
</Col>
|
||
<Col span={12}>
|
||
<Form.Item
|
||
label="登记日期"
|
||
name="regDate"
|
||
rules={[{ required: true }]}
|
||
getValueFromEvent={(e,dateString) => dateString}
|
||
getValueProps={(value) => ({ value: value ? moment(value) : undefined })}
|
||
|
||
>
|
||
<DatePicker disabled={true} format={'YYYY-MM-DD'} style={{width:'100%'}} allowClear />
|
||
</Form.Item>
|
||
</Col>
|
||
</Row>
|
||
<div className='basic-info' style={{display:"flex",justifyContent:"space-between"}}>
|
||
<span>其他信息</span>
|
||
</div>
|
||
<Row>
|
||
<Col span={24}>
|
||
<Form.Item
|
||
label="附件"
|
||
name="fieldId"
|
||
labelCol={{ span: 3 }}
|
||
wrapperCol={{ span: 19 }}
|
||
>
|
||
{mode !== "view" &&
|
||
<Dragger
|
||
name='file'
|
||
// multiple
|
||
action="/gunshiApp/tsg/personnelPlan/file/upload/singleSimple"
|
||
onChange={fileChange}
|
||
onDrop={(info) => { console.log(info.dataTransfer.files); }}
|
||
fileList={fileList}
|
||
disabled={loading}
|
||
// onSuccess={handleSuccess}
|
||
>
|
||
<p className="ant-upload-text">点击或拖拽文件到此区域上传</p>
|
||
<p className="ant-upload-hint">
|
||
支持扩展名:.rar .zip .doc .docx .pdf .jpg .png .ppt
|
||
</p>
|
||
</Dragger>
|
||
}
|
||
<Row gutter={[16]}>
|
||
{
|
||
fileList.length > 0 && fileList.map(file => {
|
||
return (
|
||
<Col span={12}>
|
||
<div className="file-item" style={{width:"75%"}}>
|
||
<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('.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>
|
||
<div className={mode == "view" ? 'delete-icon disable-icon' : 'delete-icon'} onClick={() => deleteFile(file.response?.data?.fileId)}>
|
||
<DeleteOutlined />
|
||
</div>
|
||
</div>
|
||
</Col>
|
||
)
|
||
})
|
||
}
|
||
</Row>
|
||
</Form.Item>
|
||
</Col>
|
||
</Row>
|
||
{
|
||
mode==='view'?null:(
|
||
<>
|
||
<Form.Item {...btnItemLayout}>
|
||
<Button type="primary" htmlType="submit">
|
||
{mode === 'save' ? '保存' :
|
||
mode === "similarSave" ? "保存" :
|
||
'修改'}
|
||
</Button>
|
||
</Form.Item>
|
||
</>
|
||
)
|
||
}
|
||
</Form>
|
||
|
||
<Modal
|
||
open={pdfViewOPen}
|
||
width={1000}
|
||
title=""
|
||
footer={null}
|
||
style={{marginTop:"-5%"}}
|
||
onCancel={() => {
|
||
setPdfViewOPen(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/personnelPlan/file/download/${iframeSrc}`)}`}
|
||
/>
|
||
</Modal>
|
||
</div>
|
||
);
|
||
}
|
||
|
||
export default ModalForm;
|