From 2124f180870958abfdba12658c4ebcc514953f11 Mon Sep 17 00:00:00 2001 From: dminyi <1301963064@qq.com> Date: Fri, 30 Aug 2024 17:49:47 +0800 Subject: [PATCH] 流转办理 --- gz-customerSystem/src/views/register/visit/component/FileUpLoad.jsx | 134 ++++++++++++++++ gz-customerSystem/src/assets/images/down.png | 0 gz-customerSystem/src/assets/images/fold.png | 0 gz-customerSystem/src/components/WantUserTag/Handling.jsx | 10 gz-customerSystem/src/views/register/index.less | 62 +++++++ gz-customerSystem/src/assets/images/index.js | 6 gz-customerSystem/src/views/register/visit/component/MattersInfo.jsx | 4 gz-customerSystem/src/components/WantUserTag/index.less | 8 + gz-customerSystem/src/views/register/visit/component/handle.jsx | 223 ++++++++++++++++++++++++--- 9 files changed, 405 insertions(+), 42 deletions(-) diff --git a/gz-customerSystem/src/assets/images/down.png b/gz-customerSystem/src/assets/images/down.png new file mode 100644 index 0000000..e8c9143 --- /dev/null +++ b/gz-customerSystem/src/assets/images/down.png Binary files differ diff --git a/gz-customerSystem/src/assets/images/fold.png b/gz-customerSystem/src/assets/images/fold.png new file mode 100644 index 0000000..3ec8012 --- /dev/null +++ b/gz-customerSystem/src/assets/images/fold.png Binary files differ diff --git a/gz-customerSystem/src/assets/images/index.js b/gz-customerSystem/src/assets/images/index.js index f0249c0..af2d092 100644 --- a/gz-customerSystem/src/assets/images/index.js +++ b/gz-customerSystem/src/assets/images/index.js @@ -2,7 +2,7 @@ * @Company: hugeInfo * @Author: lwh * @Date: 2023-04-24 16:12:00 - * @LastEditTime: 2024-08-28 10:47:07 + * @LastEditTime: 2024-08-30 10:47:30 * @LastEditors: dminyi 1301963064@qq.com * @Version: 1.0.0 * @Description: @@ -49,6 +49,8 @@ import transfer from "./transfer.png"; import empty from "./empty.png"; import feedback from "./feedback.png"; +import fold from "./fold.png"; +import down from "./down.png" export { ledger_1, @@ -93,4 +95,6 @@ transfer, empty, feedback, + fold, + down }; diff --git a/gz-customerSystem/src/components/WantUserTag/Handling.jsx b/gz-customerSystem/src/components/WantUserTag/Handling.jsx index 6aeb09b..49352d3 100644 --- a/gz-customerSystem/src/components/WantUserTag/Handling.jsx +++ b/gz-customerSystem/src/components/WantUserTag/Handling.jsx @@ -2,7 +2,7 @@ * @Author: dminyi 1301963064@qq.com * @Date: 2024-08-29 20:43:25 * @LastEditors: dminyi 1301963064@qq.com - * @LastEditTime: 2024-08-29 20:55:24 + * @LastEditTime: 2024-08-30 10:27:25 * @FilePath: \gzDyh\gz-customerSystem\src\components\WantUserTag\Handling.jsx * @Description: 经办人 */ @@ -16,10 +16,10 @@ return ( <div className="wantUserTag"> <div className="wantUserTag-wantHandleUser"> - <div className="wantUserTag-wantUser-right">{name}</div> - <Typography.Link className="wantUserTag-wantHandleUser-close" onClick={() => onClose(value)}> - <CloseOutlined style={{width:'11px',height:'13px'}}/> - </Typography.Link> + <div className="wantUserTag-wantHandleUser-right">{name}</div> + <div onClick={() => onClose(value)} className="wantUserTag-wantHandleUser-icon"> + <CloseOutlined /> + </div> </div> </div> ); diff --git a/gz-customerSystem/src/components/WantUserTag/index.less b/gz-customerSystem/src/components/WantUserTag/index.less index b394f4c..a53f77e 100644 --- a/gz-customerSystem/src/components/WantUserTag/index.less +++ b/gz-customerSystem/src/components/WantUserTag/index.less @@ -34,8 +34,16 @@ display:flex; padding: 5px 8px; border: 1px solid rgba(229,230,235,1); + align-items: center; + border-radius: 2px; + &-right { + margin-left: 8px; + } + &-icon{ + color: #1D2129; + } } &-green { diff --git a/gz-customerSystem/src/views/register/index.less b/gz-customerSystem/src/views/register/index.less index 633e838..3dfa84b 100644 --- a/gz-customerSystem/src/views/register/index.less +++ b/gz-customerSystem/src/views/register/index.less @@ -282,15 +282,64 @@ display: flex; flex-direction: row; column-gap: 8px; - /* margin: 8px 16px 22px; */ margin: 0px 8px 22px 16px; - // height: 100vh; &-left { flex: 3 1 0%; background-color: rgb(255, 255, 255); padding: 12px 0px 12px 16px; + margin-bottom: -25px; + + &-record { + border: 1px solid #D9D9D9; + border-radius: 8px; + margin-right: 16px; + margin-top: 8px; + + &-top { + padding: 12px; + display: flex; + align-items: center; + background-color: #FAFAFA; + border-radius: 8px; + + + &-icon { + width: 12px; + height: 12px; + margin-right: 12px; + } + + &-remark { + border: 1px solid #FFD591; + padding: 0px 8px; + color: #FA8C16; + background-color: #FFF7E6; + border-radius: 4px; + margin-left: 8px; + } + + &-hostOrg{ + border: 1px solid #89C2E3; + padding: 0px 8px; + color: #1A6FB8; + background-color: #E8F8FF; + border-radius: 4px; + margin-left: 8px; + + } + } + + &-bottom { + margin: 16px 12px; + + &-table { + border: 1px solid #d9d9d9; + width: 100%; + } + } + } } &-right { @@ -298,6 +347,13 @@ background-color: rgb(255, 255, 255); } } +} + +.Form{ + padding: 12px 16px 16px 16px; + border: 1px dashed #1a6fb8; + border-radius: 10px; + margin-top: 16px; } .tabs-container .arco-tabs-header { @@ -317,6 +373,6 @@ width: 82px; } -.progress{ +.progress { margin: 16px 0px 0px 16px; } \ No newline at end of file diff --git a/gz-customerSystem/src/views/register/visit/component/FileUpLoad.jsx b/gz-customerSystem/src/views/register/visit/component/FileUpLoad.jsx new file mode 100644 index 0000000..f136c12 --- /dev/null +++ b/gz-customerSystem/src/views/register/visit/component/FileUpLoad.jsx @@ -0,0 +1,134 @@ +import React, { useState, useEffect } from 'react'; +import { Typography, Button } from 'antd'; +import { CheckOutlined, } from '@ant-design/icons'; +import { Form, Input, Modal,Upload } from '@arco-design/web-react'; +import { IconLink } from '@arco-design/web-react/icon'; + + +const { TextArea } = Input; +const { Text } = Typography; + +const DocumentScanner = ({ + visible, + onCancel, + onConfirm, + formRef, +}) => { + const [scanImage, setScanImage] = useState(false); + const [scaned, setScaned] = useState(false); + const [fileView, setFileView] = useState(null); + + useEffect(() => { + if (!visible) { + setScanImage(false); + setScaned(false); + setFileView(null); + } + }, [visible]); + + const handleUploadChange = (info) => { + if (info.fileList.length > 0) { + setScanImage(true); + } + setFileView({ + ...info.fileList[0], + url: URL.createObjectURL(info.fileList[0].originFile), + }); + }; + + const handleStartRecognition = () => { + setScaned(true); + setScanImage(false); + }; + + const handleUseText = (text) => { + onConfirm(text); + onCancel(); // 关闭弹窗 + }; + + return ( + <> + <Modal + style={{ width: '1200px' }} + visible={visible && !scanImage && !scaned} + onCancel={onCancel} + title='识别上传材料' + centered + footer={null} + > + <Form + ref={formRef} + layout='vertical' + requiredSymbol={false} + style={{ marginTop: '4px' }} + > + <Form.Item label='选择图片' name='file'> + <Upload + drag + limit={1} + accept='image/*' + onDrop={() => {}} + tip='支持png、jpg、pdf等格式文件上传,每次上传大小不超过10M' + showUploadList={{ + fileIcon: <IconLink style={{ color: '#1D2129' }} />, + }} + onChange={handleUploadChange} + > + <Text>点击或者拖拽文件到这里</Text> + </Upload> + </Form.Item> + </Form> + </Modal> + <Modal + style={{ width: '944px' }} + visible={visible && scanImage} + onCancel={() => setScanImage(false)} + footer={null} + title='选择识别范围' + centered + > + <img + src={fileView?.url} + alt="" + style={{ + display: 'block', + margin: 'auto', + maxWidth: '100%', + maxHeight: '100%', + objectFit: 'contain', + }} + /> + <div style={{ marginTop: '20px' }}> + <Button type="primary" onClick={handleStartRecognition}> + 开始识别 + </Button> + </div> + </Modal> + <Modal + style={{ width: '1200px' }} + visible={visible && scaned} + onCancel={() => setScaned(false)} + footer={null} + title='识别上传材料' + centered + > + <div style={{ marginTop: '20px', marginBottom: '8px' }}>识别内容</div> + <TextArea + showWordLimit + rows={5} + placeholder='' + wrapperStyle={{ width: '100%' }} + defaultValue='识别内容' + onChange={(e) => handleUseText(e.target.value)} + /> + <div style={{ marginTop: '24px' }}> + <Button type="primary" onClick={() => handleUseText('识别内容')}> + 使用文字 + </Button> + </div> + </Modal> + </> + ); +}; + +export default DocumentScanner; \ No newline at end of file diff --git a/gz-customerSystem/src/views/register/visit/component/MattersInfo.jsx b/gz-customerSystem/src/views/register/visit/component/MattersInfo.jsx index 4e346eb..552af2f 100644 --- a/gz-customerSystem/src/views/register/visit/component/MattersInfo.jsx +++ b/gz-customerSystem/src/views/register/visit/component/MattersInfo.jsx @@ -13,11 +13,9 @@ import TableView from '@/components/TableView' import { question, register, Matter, transfer } from '../../../../assets/images' import * as $$ from '@/utils/utility'; -import { Tabs, Typography, Steps } from '@arco-design/web-react'; +import { Typography, Steps } from '@arco-design/web-react'; import "@arco-themes/react-gzzz/css/arco.css"; -import { IconCalendar, IconClockCircle, IconUser } from '@arco-design/web-react/icon'; import Handle from './handle' -const TabPane = Tabs.TabPane; const style = { // textAlign: 'center', diff --git a/gz-customerSystem/src/views/register/visit/component/handle.jsx b/gz-customerSystem/src/views/register/visit/component/handle.jsx index 620a5fc..bcced75 100644 --- a/gz-customerSystem/src/views/register/visit/component/handle.jsx +++ b/gz-customerSystem/src/views/register/visit/component/handle.jsx @@ -1,12 +1,14 @@ -import React, { useState } from 'react'; -import { Steps } from '@arco-design/web-react'; +import React, { useState, useRef } from 'react'; import { Col, Space, Row, Tooltip, Button } from 'antd'; -import { register, empty } from '../../../../assets/images' -import { Form, Input, Empty, Tabs, Typography, Modal } from '@arco-design/web-react'; +import { register, fold, down, empty, link } from '../../../../assets/images'; +import { Form, Input, Tabs, Typography, Empty } from '@arco-design/web-react'; import { question1, } from '@/assets/images'; -import ProgressStep from '../../../../components/ProgressStep/VisitStep' -import SelectObjModal from '../../../../components/SelectObjModal/selectPerson' -import WantUserTag from '../../../../components/WantUserTag/Handling' +import ProgressStep from '../../../../components/ProgressStep/VisitStep'; +import SelectObjModal from '../../../../components/SelectObjModal/selectPerson'; +import WantUserTag from '../../../../components/WantUserTag/Handling'; +import { scan } from '@/assets/images/icon' +import DocumentScanner from './FileUpLoad' + const InputSearch = Input.Search; const FormItem = Form.Item; @@ -22,24 +24,120 @@ const Handle = () => { const [selectedTab, setSelectedTab] = useState('1'); // 默认选中第一个 tab const [wantUser, setWantUser] = useState({}); + // const [scanFile, setScanFile] = useState(false); + const tabs = [ { index: '1', label: '承办部门' }, { index: '2', label: '配合部门' }, ]; const [isModalVisible, setIsModalVisible] = useState(false); - - const showModal = () => { - setIsModalVisible(true); - }; - - const hideModal = () => { - setIsModalVisible(false); - }; + const formRef = useRef(null); const handleTabChange = (newTabIndex) => { setSelectedTab(newTabIndex); }; + + const [records, setRecords] = useState([ + { + id: 1, + date: '2024 - 7 - 1 10:00', + location: '天河区棠下街综治中心', + remark: '配合部门', + showView: false, + details: [ + { + title: '操作人', + content: ( + <div style={{ display: 'flex' }}> + <div>李晓明</div> + <img src={register} alt='' style={{ width: '14px', height: '14px', marginLeft: '8px', marginTop: '4px' }} /> + </div> + ), + }, + { + title: '办理意见', + content: ( + <div> + 调解开始,我首先安抚双方情绪,确保对话在一个平和的氛围中展开。随后,我引导王先生详细说明了他的财务困境及还款意愿,同时让银行代表理解其处境,强调长期合作的重要性。经过反复沟通,银行同意调整还款计划,降低利率,并给予王先生一定的宽限期。王先生则承诺按新计划履行还款义务,双方最终达成一致,签署了调解协议。 + </div> + ), + }, + { + title: '办理附件', + content: ( + <a href="your-link-here.html" target="_blank"> + <img src={link} alt="" className="title-file" />江照月法人身份证明.pdf + </a> + ), + }, + ], + }, + { + id: 2, + date: '2024 - 7 - 2 14:00', + location: '天河区天河南街道办事处', + remark: '承办部门', + showView: false, + details: [ + { + title: '操作人', + content: ( + <div style={{ display: 'flex' }}> + <div>张伟</div> + <img src={register} alt='' style={{ width: '14px', height: '14px', marginLeft: '8px', marginTop: '4px' }} /> + </div> + ), + }, + { + title: '办理意见', + content: ( + <div> + 在本次协调会议中,我们成功解决了双方之间的纠纷,确保了所有参与方的利益得到了妥善处理。通过深入交流,各方达成了共识,同意采取一系列措施来解决现存的问题。 + </div> + ), + }, + { + title: '办理附件', + content: '广州市天河区天河南路200号', + }, + ], + }, + ]); + + + + const toggleView = (id) => { + setRecords(records.map(record => { + if (record.id === id) { + return { + ...record, + showView: !record.showView, + }; + } + return record; + })); + }; + + + const [scannerVisible, setScannerVisible] = useState(false); + + const handleConfirm = (text) => { + console.log('识别完成:', text); + setScannerVisible(false); + }; + + const openScanner = () => { + setScannerVisible(true); + formRef.current?.resetFields(); + formRef.current?.setFieldsValue({}); + }; + + const onCancel = () => { + setScannerVisible(false); + }; + + return ( <> @@ -110,23 +208,81 @@ </Col> <Col span={24}> <div style={{ color: 'rgb(134, 144, 156)' }}>办理记录</div> - <Empty - icon={ - <div - style={{ - display: 'flex', - // width: 160, - justifyContent: 'center', - }} + {records.length > 0 ? + <div> + {records.map(record => ( + <div key={record.id} className='container-bottom-left-record'> + <div className='container-bottom-left-record-top'> + { + record.showView ? ( + <img src={down} alt='' style={{ width: '18px', marginRight: '6px' }} onClick={() => toggleView(record.id)} /> + ) : ( + <img src={fold} alt='' className='container-bottom-left-record-top-icon' onClick={() => toggleView(record.id)} /> + ) + } + <div>{`${record.date} ${record.location}`}</div> + <div className={`container-bottom-left-record-top-${record.remark === '配合部门' ? 'remark' : 'hostOrg'}`}>{record.remark}</div> + </div> + <div className='container-bottom-left-record-bottom' style={{ display: record.showView ? 'block' : 'none' }}> + <table border="1" cellpadding="8" className='container-bottom-left-record-bottom-table'> + {record.details.map(detail => ( + <tr key={detail.title}> + <th bgcolor="#F7F8FA" className="table-title" width="120">{detail.title}</th> + <td>{detail.content}</td> + </tr> + ))} + </table> + </div> + </div> + ))} + </div> + : + <Empty + icon={ + <div + style={{ + display: 'flex', + justifyContent: 'center', + marginBottom: '100px' + }} + > + <img src={empty} alt='' style={{ width: '160px', height: '160px' }} /> + </div> + } + description='暂无数据' + /> + } + <div className='Form'> + <Col span={24} style={{ marginBottom: '8px' }}> + <Space size='small'> + <div className='MediationInfo-subTitle' style={{ marginTop: '-9px' }}></div><h5>添加办理记录</h5> + </Space> + </Col> + <Col span={24}> + <FormItem + label={<div style={{ display: 'flex' }}> + 办理意见 + <img src={scan} alt="" style={{ marginRight: '-2px', marginLeft: '8px' }} /> + <div style={{ marginLeft: '8px', color: '#1A6FB8', fontSize: '14px', cursor: 'pointer' }} onClick={openScanner}>识别材料</div> + </div> + } + field='caseDes' + rules={[{ message: '请填写事项概况', required: true }]} > - <img src={empty} alt='' style={{ width: '160px', height: '160px' }} /> - </div> - } - description='暂无数据' - /> + <Input.TextArea + maxLength={2000} + showWordLimit + rows={5} + placeholder='请完整描述事项概况,应具备5要素:发生时间+发生地点+人物情况+事项起因+事项经过' + wrapperStyle={{ width: '100%' }} + /> + </FormItem> + </Col> + + </div> </Col> </Form> - <Space> + <Space style={{ marginTop: '38px', position: 'absolute', bottom: '4px' }}> <Button type="primary" style={{ backgroundColor: '#1A6FB8' }}>添加办理记录</Button> <Button type='outline' style={{ color: '#1A6FB8', border: '1px solid #1A6FB8' }} >结案申请</Button> <Button type='outline' style={{ color: '#1A6FB8', border: '1px solid #1A6FB8' }}>联合处置申请</Button> @@ -193,7 +349,14 @@ }} onClose={() => setIsModalVisible(false)} /> - </div> + + <DocumentScanner + visible={scannerVisible} + onCancel={onCancel} + onConfirm={handleConfirm} + formRef={formRef} + /> + </div > </> ) -- Gitblit v1.8.0