tsg-web/src/views/sz/pxjlgl/form.js

653 lines
22 KiB
JavaScript
Raw Normal View History

2024-09-24 16:52:53 +08:00
import React,{useEffect,useState,useMemo,useRef} from 'react';
2024-09-26 17:45:57 +08:00
import { Form, Button, Input, Row,Upload, Col, TimePicker, DatePicker, InputNumber,message,Image,Modal,Typography ,Popconfirm } from 'antd';
2024-09-24 16:52:53 +08:00
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';
2024-09-26 17:45:57 +08:00
import dayjs from "dayjs"
2024-09-24 16:52:53 +08:00
import { createCrudService } from '../../../components/crud/_';
2024-09-26 17:45:57 +08:00
import { httpget2, httppost2 } from '../../../utils/request';
2024-09-24 16:52:53 +08:00
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)
const [fileList1, setFileList1] = useState([]) //上传文件列表
const [fileIds1, setFileIds1] = useState([])
const [iframeSrc1, setIframeSrc1] = useState('')
const [pdfViewOPen1, setPdfViewOPen1] = useState(false)
const [loading1, setLoading1] = useState(false)
/**
* @description 获取查看时文件
* @param {*} type
* @returns
*/
2024-09-26 17:45:57 +08:00
const getFileInfo = async (params) => {
try {
const res = await httpget2(apiurl.pxjl.getFile + `/${params.id}`)
2024-09-24 16:52:53 +08:00
if (res.code === 200) {
2024-09-26 17:45:57 +08:00
if (res.data?.files1) {
let fileArr1 = res.data?.files1.map(item => {
return {
name: item.fileName,
response: {
data: {
filePath: item.filePath,
fileId: item.fileId
}
},
}
})
setFileList1(fileArr1)
}
if (res.data?.files2) {
let fileArr = res.data?.files2.map(item => {
return {
name: item.fileName,
response: {
data: {
filePath: item.filePath,
fileId: item.fileId
2024-09-24 16:52:53 +08:00
}
2024-09-26 17:45:57 +08:00
},
}
})
setFileList(fileArr)
}
2024-09-24 16:52:53 +08:00
}
2024-09-26 17:45:57 +08:00
} catch (error) {
console.log(error);
}
2024-09-24 16:52:53 +08:00
}
/**
* @description 文件下载
* @param {String} params 文件fileId
*/
const download = (params) => {
let downloadLink = document.createElement("a");
2024-09-26 17:45:57 +08:00
downloadLink.href = `http://local.gunshiiot.com:18083/gunshiApp/tsg/personnelPlanLog/file/download/${params}`;
2024-09-24 16:52:53 +08:00
downloadLink.download = `${params.fileName}`;
downloadLink.style.display = "none";
// 将链接添加到页面中
document.body.appendChild(downloadLink);
// 模拟点击事件,开始下载
downloadLink.click();
}
const download1 = (params) => {
let downloadLink = document.createElement("a");
2024-09-26 17:45:57 +08:00
downloadLink.href = `http://local.gunshiiot.com:18083/gunshiApp/tsg/personnelPlanLog/file/download/${params}`;
2024-09-24 16:52:53 +08:00
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)
}
const fileChange1 = (info) => {
if (info.file.status === "done") {
setLoading1(false);
}
if (info.file.status === "uploading") {
setLoading1(true);
}
if (info.file.status === "error") {
message.error("文件上传失败")
setLoading1(false);
}
let fileIds = info.fileList.map(file => {
return file.response?.data?.fileId
})
setFileIds1(fileIds)
setFileList1(info.fileList)
2024-09-26 17:45:57 +08:00
console.log(info.fileList);
2024-09-24 16:52:53 +08:00
}
/**
* @description pdf文件预览
* @param {String} params 文件预览url
*/
const viewPdf = (params) => {
setIframeSrc(params)
setPdfViewOPen(true)
}
const viewPdf1 = (params) => {
setIframeSrc1(params)
setPdfViewOPen1(true)
}
2024-09-26 17:45:57 +08:00
const onfinish = (values) => {
values.stm = values.tm ? values.tm[0].format("HH:mm:ss") : ''
values.etm = values.tm ? values.tm[1].format("HH:mm:ss") : ''
values.regDate = moment(values.regDate).format('YYYY-MM-DD')
const files1 = fileList1.map(item => ({fileId:item.response?.data?.fileId }));
const files = fileList.map(item => ({ fileId: item.response?.data?.fileId }));
values.files1 = files1;
values.files2 = files;
2024-09-24 16:52:53 +08:00
if (mode === 'edit') {
2024-09-26 17:45:57 +08:00
onEdit(apiurl.pxjl.edit,{...record,...values});
2024-09-24 16:52:53 +08:00
}
if (mode === 'save') {
2024-09-26 17:45:57 +08:00
onSave(apiurl.pxjl.save,values)
2024-09-24 16:52:53 +08:00
}
}
/**
* @description 删除上传的图片
* @param {string} id 删除的id
*/
const deleteFile = (fileId) => {
console.log(fileId);
let filterFile = fileList.filter(item => item.response?.data?.fileId !== fileId);
setFileList(filterFile)
}
const deleteFile1 = (fileId) => {
console.log(fileId);
let filterFile = fileList1.filter(item => item.response?.data?.fileId !== fileId);
setFileList1(filterFile)
}
2024-09-26 17:45:57 +08:00
const [jh, setJh] = useState([])
const getJhList = async () => {
try {
const res = await httppost2(apiurl.pxjl.list)
if (res.code == 200) {
setJh(res.data.map(item => ({label:item.name,value:item.id})))
2024-09-24 16:52:53 +08:00
}
2024-09-26 17:45:57 +08:00
} catch (error) {
console.log(error);
}
}
2024-09-24 16:52:53 +08:00
2024-09-26 17:45:57 +08:00
const imgbeforeUpload = (file) => {
const isJpgOrPng =
file.type === 'image/jpeg' ||
file.type === 'image/jpg' ||
file.type === 'image/png';
2024-09-24 16:52:53 +08:00
2024-09-26 17:45:57 +08:00
if (!isJpgOrPng) {
message.error('请上传图片格式的文件!');
}
const isLt2M = file.size / 1024 / 1024 < 5;
if (!isLt2M) {
message.error('图片大小需小于5M!');
2024-09-24 16:52:53 +08:00
}
2024-09-26 17:45:57 +08:00
return isJpgOrPng && isLt2M ? true : Upload.LIST_IGNORE;
};
useEffect(()=>{
if (mode !== "save") {
getFileInfo(record)
const momentArr = (record?.stm && record.etm) ? [dayjs("2024-05-06" + record.stm), dayjs("2024-05-06" +record.etm)] : ''
form.setFieldValue("tm",momentArr)
}
}, [record,mode])
useEffect(() => {
const userName = localStorage.getItem('userName')
form.setFieldValue("regDate", moment())
form.setFieldValue("applicant",userName)
getJhList()
}, [])
2024-09-24 16:52:53 +08:00
return (
<div style={{height:"65vh",overflowY:"auto"}}>
<div className='basic-info'>基本信息</div>
{/* <Divider /> */}
<Form
form={form}
{...formItemLayout}
2024-09-26 17:45:57 +08:00
initialValues={record}
onFinish={onfinish}
2024-09-24 16:52:53 +08:00
>
<Row>
<Col span={12}>
<Form.Item
label="培训计划"
2024-09-26 17:45:57 +08:00
name="planId"
2024-09-24 16:52:53 +08:00
>
<NormalSelect disabled={mode==='view'} style={{width:'100%'}} allowClear options={jh}/>
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="培训分类"
2024-09-26 17:45:57 +08:00
name="type"
2024-09-24 16:52:53 +08:00
>
<NormalSelect disabled={mode === 'view'} style={{ width: '100%' }} allowClear options={types} />
</Form.Item>
</Col>
</Row>
<Row>
<Col span={12}>
<Form.Item
label="培训日期"
2024-09-26 17:45:57 +08:00
name="planDate"
2024-09-24 16:52:53 +08:00
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="标题名称"
2024-09-26 17:45:57 +08:00
name="name"
2024-09-24 16:52:53 +08:00
rules={[{ required: true }]}
>
<Input disabled={mode === 'view'} style={{width:'100%'}} allowClear />
</Form.Item>
</Col>
</Row>
<Row>
<Col span={12}>
<Form.Item
label="培训时段"
2024-09-26 17:45:57 +08:00
name="tm"
2024-09-24 16:52:53 +08:00
>
2024-09-26 17:45:57 +08:00
<TimePicker.RangePicker
disabled={mode === 'view'}
style={{ width: '100%' }}
allowClear
format={"HH:mm:ss"}
// value={timeValue}
// onChange={(e) => setTimeValue(e)}
/>
2024-09-24 16:52:53 +08:00
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="培训时长(小时)"
2024-09-26 17:45:57 +08:00
name="hour"
2024-09-24 16:52:53 +08:00
>
<InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item>
</Col>
</Row>
<Row>
<Col span={12}>
<Form.Item
label="培训地点"
2024-09-26 17:45:57 +08:00
name="addr"
2024-09-24 16:52:53 +08:00
rules={[{ required: true }]}
>
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="主办单位"
rules={[{ required: true }]}
2024-09-26 17:45:57 +08:00
name="unit"
2024-09-24 16:52:53 +08:00
>
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item>
</Col>
</Row>
<Row>
<Col span={24}>
<Form.Item
label="培训内容"
2024-09-26 17:45:57 +08:00
name="content"
2024-09-24 16:52:53 +08:00
labelCol={{ span: 3 }}
wrapperCol={{ span: 19 }}
rules={[{ required: true }]}
>
<Input.TextArea disabled={mode==='view'} style={{width:'100%',minHeight:'50px'}} allowClear />
</Form.Item>
</Col>
</Row>
<Row>
2024-11-15 14:04:53 +08:00
<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>
2024-09-24 16:52:53 +08:00
</Row>
<Row>
<Col span={12}>
<Form.Item
label="参训人员"
2024-09-26 17:45:57 +08:00
name="trainees"
2024-09-24 16:52:53 +08:00
>
2024-10-11 17:54:29 +08:00
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
2024-09-24 16:52:53 +08:00
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
2024-09-26 17:45:57 +08:00
label="参训人数"
name="numPeople"
rules={[{ required: true }]}
2024-09-24 16:52:53 +08:00
>
<InputNumber min={0} disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item>
</Col>
</Row>
<Row>
<Col span={12}>
<Form.Item
label="填报人"
rules={[{ required: true }]}
2024-09-26 17:45:57 +08:00
name="applicant"
2024-09-24 16:52:53 +08:00
>
2024-09-26 17:45:57 +08:00
<Input disabled={true} style={{width:'100%'}} allowClear />
2024-09-24 16:52:53 +08:00
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="登记日期"
2024-09-26 17:45:57 +08:00
name="regDate"
2024-09-24 16:52:53 +08:00
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>
<Row>
<Col span={24}>
<Form.Item
label="培训签到表"
2024-09-26 17:45:57 +08:00
name="fieldId1"
2024-09-24 16:52:53 +08:00
labelCol={{ span: 3 }}
wrapperCol={{ span: 19 }}
>
{mode !== "view" &&
<Dragger
name='file'
2024-11-15 14:04:53 +08:00
// beforeUpload={imgbeforeUpload}
2024-09-26 17:45:57 +08:00
action="/gunshiApp/tsg/personnelPlanLog/file/upload/singleSimple"
2024-09-24 16:52:53 +08:00
onChange={fileChange1}
onDrop={(info) => { console.log(info.dataTransfer.files); }}
fileList={fileList1}
disabled={loading1}
2024-09-26 17:45:57 +08:00
maxCount={1}
2024-09-24 16:52:53 +08:00
// onSuccess={handleSuccess}
>
2024-09-26 17:45:57 +08:00
<p className="ant-upload-text">点击或拖拽文件到此区域上传</p>
2024-09-24 16:52:53 +08:00
<p className="ant-upload-hint">
2024-11-15 14:04:53 +08:00
支持扩展名.rar .zip .doc .docx .pdf .jpg .png .ppt
2024-09-24 16:52:53 +08:00
</p>
</Dragger>
}
<Row gutter={[16]}>
{
fileList1.length > 0 && fileList1.map(file => {
return (
<Col span={12}>
<div className="file-item" style={{width:"75%"}}>
<div className='file-description'>
{file.name.indexOf('.docx') > -1 ?
<div
onClick={() => { download1(file.response?.data?.fileId) }}
style={{ cursor: 'pointer' }}
>
<FileWordOutlined
style={{ fontSize: 40 }}
/>
</div>
:
file.name.indexOf('.pdf') > -1 ?
<div
onClick={() => { viewPdf1(file.response?.data?.fileId) }}
style={{ cursor: 'pointer' }}
>
<FilePdfOutlined style={{ fontSize: 40 }} />
</div>
:
file.name.indexOf('.zip') > -1 ?
<div
onClick={() => { download1(file.response?.data?.fileId) }}
style={{ cursor: 'pointer' }}
>
<FileZipOutlined style={{ fontSize: 40 }} />
</div>
:
file.name.indexOf('.xlsx') > -1 ?
<div
onClick={() => { download1(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>
2024-09-26 17:45:57 +08:00
<div className={mode == "view" ? 'delete-icon disable-icon' : 'delete-icon'} onClick={() => deleteFile1(file.response?.data?.fileId)}>
2024-09-24 16:52:53 +08:00
<DeleteOutlined />
</div>
</div>
</Col>
)
})
}
</Row>
</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
2024-09-26 17:45:57 +08:00
action="/gunshiApp/tsg/personnelPlanLog/file/upload/singleSimple"
2024-09-24 16:52:53 +08:00
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,
}}
2024-09-26 17:45:57 +08:00
src={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`/gunshiApp/tsg/personnelPlanLog/file/download/${iframeSrc}`)}`}
2024-09-24 16:52:53 +08:00
/>
</Modal>
<Modal
open={pdfViewOPen1}
width={1000}
title=""
footer={null}
style={{marginTop:"-5%"}}
onCancel={() => {
setPdfViewOPen1(false)
}}
>
<iframe
style={{
height: '80vh',
width: '100%',
border: 0,
marginTop: 20,
}}
2024-09-26 17:45:57 +08:00
src={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`/gunshiApp/tsg/personnelPlanLog/file/download/${iframeSrc1}`)}`}
2024-09-24 16:52:53 +08:00
/>
</Modal>
</div>
);
}
export default ModalForm;