From 5aa4a814ab8d4aa194a9683ebefaefdfc6d92c3a Mon Sep 17 00:00:00 2001 From: liuwh <964324856@qq.com> Date: Tue, 17 Sep 2024 17:18:05 +0800 Subject: [PATCH] Merge branch 'master' of http://120.79.193.119:9090/r/gzzfw/frontEnd/gzDyh into master --- gz-customerSystem/src/views/register/matterDetail/RateModule.jsx | 4 gz-customerSystem/src/views/register/visit/component/SelfVisitorRegister.jsx | 451 ++++++++++++++++++ gz-customerSystem/src/components/personCard/DetailDialog.jsx | 5 gz-customerSystem/src/views/comprehensive/index.jsx | 2 gz-customerSystem/src/views/register/eventFlow/component/EventFlow.jsx | 2 gz-customerSystem/src/api/appUrl.js | 6 gz-customerSystem/src/views/register/index.jsx | 12 gz-customerSystem/src/components/ProgressStep/index.less | 26 gz-customerSystem/src/views/register/visit/SelfPreview.jsx | 240 ++++++++++ gz-customerSystem/src/views/register/handleFeedback/component/AuditView.jsx | 3 gz-customerSystem/src/router/router.js | 3 gz-customerSystem/src/views/register/handleFeedback/component/CaseResult.jsx | 124 ++-- gz-customerSystem/src/components/ProgressStep/VisitStep.jsx | 95 +++ gz-customerSystem/src/views/register/matterDetail/index.jsx | 2 gz-customerSystem/src/components/Layout/index.jsx | 21 gz-customerSystem/src/components/ArcoUpload/index.jsx | 2 gz-customerSystem/src/views/register/index.less | 15 gz-customerSystem/src/views/register/matterDetail/UniteHandle.jsx | 2 gz-customerSystem/src/views/register/visit/preview.jsx | 35 gz-customerSystem/src/views/register/visit/SelfInspection.jsx | 264 +++++++++++ gz-customerSystem/public/locationSelect.js | 10 gz-customerSystem/src/views/register/visit/index.jsx | 45 + gz-customerSystem/src/components/Layout/Header.jsx | 16 gz-customerSystem/src/views/register/eventFlow/component/EscalationModel.jsx | 30 24 files changed, 1,240 insertions(+), 175 deletions(-) diff --git a/gz-customerSystem/public/locationSelect.js b/gz-customerSystem/public/locationSelect.js index f95c58f..de6b9be 100644 --- a/gz-customerSystem/public/locationSelect.js +++ b/gz-customerSystem/public/locationSelect.js @@ -7,6 +7,11 @@ 'parentId': '1601', 'children': [ { + 'label': '新市街道', + 'value': '62857', + 'parentId': '50258', + }, + { 'label': '云城街道', 'value': '129164', 'parentId': '50258', @@ -104,11 +109,6 @@ { 'label': '同德街道', 'value': '62856', - 'parentId': '50258', - }, - { - 'label': '新市街道', - 'value': '62857', 'parentId': '50258', }, { diff --git a/gz-customerSystem/src/api/appUrl.js b/gz-customerSystem/src/api/appUrl.js index 9a37c3e..ff9a0c3 100644 --- a/gz-customerSystem/src/api/appUrl.js +++ b/gz-customerSystem/src/api/appUrl.js @@ -9,12 +9,12 @@ */ export const debug = { // web服务 - baseUrl: 'http://gz.hugeinfo.com.cn', - // baseUrl: "http://4gg4nv.natappfree.cc", + // baseUrl: 'http://gz.hugeinfo.com.cn', + baseUrl: "http://fv633e.natappfree.cc", // baseUrl: 'http://mdqgnh.natappfree.cc', // 附件服务 - fileUrl: "http://4gg4nv.natappfree.cc", + fileUrl: "http://fv633e.natappfree.cc", // fileUrl: 'http://gz.hugeinfo.com.cn', // 文件查看url 后面接附件编号 diff --git a/gz-customerSystem/src/components/ArcoUpload/index.jsx b/gz-customerSystem/src/components/ArcoUpload/index.jsx index 7f87aa1..034b40c 100644 --- a/gz-customerSystem/src/components/ArcoUpload/index.jsx +++ b/gz-customerSystem/src/components/ArcoUpload/index.jsx @@ -24,6 +24,7 @@ * editData *, // 编辑回显数据 * handleDelFile *,//删除文件接口 * ownerType,//用于回显文件 + * formItemParams, formItem的参数 */ export default function ArcoUpload(props) { @@ -62,6 +63,7 @@ label={props.label} field={props.field} triggerPropName='fileList' + {...props.formItemParams} > <Upload drag diff --git a/gz-customerSystem/src/components/Layout/Header.jsx b/gz-customerSystem/src/components/Layout/Header.jsx index a91e32c..bb24e9b 100644 --- a/gz-customerSystem/src/components/Layout/Header.jsx +++ b/gz-customerSystem/src/components/Layout/Header.jsx @@ -37,10 +37,9 @@ * handleClickMenu: function 头部导航点击 * handleChangeRole: function 切换角色 */ -const Header = ({ roleActive, headerMenu, headerMenuActive, headerUserChange, handleClickMenu, handleChangeRole }) => { - let navigate = useNavigate(); +const Header = ({ roleActive, headerMenu, headerMenuActive, headerUserChange, handleClickMenu, handleChangeRole,userData }) => { - const [data, setData] = useState([]); + let navigate = useNavigate(); // 修改密码窗口显示隐藏 const [visible, setVisible] = useState(false); @@ -73,7 +72,7 @@ const userMenu = ( <Menu> - {data?.ctUseroleList?.length > 1 && ( + {userData?.ctUseroleList?.length > 1 && ( <> <Menu.Item key="changeRole" onClick={() => setRoleModal({ visible: true, value: roleActive.id })}> <UserSwitchOutlined style={{ marginRight: '8px' }} /> @@ -110,9 +109,6 @@ } } - useEffect(() => { - setData($$.getLocal('customerSystemUser') || {}); - }, [headerUserChange]); return ( <header className="header"> @@ -155,9 +151,9 @@ <div className="header-user-avatar"> <Avatar icon={<UserOutlined />} /> <div> - <div className="header-user-name">{data?.trueName || '-'}</div> + <div className="header-user-name">{userData?.trueName || '-'}</div> <div className="header-user-unit"> - <span>{data?.unit || '-'}</span> + <span>{userData?.unit || '-'}</span> <span className="public-rightBorder">{roleActive.roleName || '-'}</span> <DownCircleFilled style={{ fontSize: '10px', marginLeft: '8px', color: '#ffffff' }} /> </div> @@ -173,7 +169,7 @@ value={roleModal.value} onChange={(e) => setRoleModal({ visible: true, value: e.target.value, name: e.target.label, roleCode: e.target.roleCode })} > - {data?.ctUseroleList?.map((x) => ( + {userData?.ctUseroleList?.map((x) => ( <Radio key={x.roleId} value={x.roleId} label={x.roleName} roleCode={x.roleCode}> {x.roleName} </Radio> diff --git a/gz-customerSystem/src/components/Layout/index.jsx b/gz-customerSystem/src/components/Layout/index.jsx index 36eca5f..1b04597 100644 --- a/gz-customerSystem/src/components/Layout/index.jsx +++ b/gz-customerSystem/src/components/Layout/index.jsx @@ -7,8 +7,8 @@ * @Version: 1.0.0 * @Description: 外层layout */ -import React, { useState, useRef, useEffect } from 'react'; -import { useLocation, Outlet, useNavigate } from 'react-router-dom'; +import React, { useState, useRef, useEffect } from 'react'; +import { useLocation, Outlet, useNavigate,useSearchParams } from 'react-router-dom'; import './index.less'; import Header from './Header'; import Navigation from './Navigation'; @@ -54,6 +54,9 @@ //网格跳转请求状态 const [gridStatus, setGridStatus] = useState(false) + const [searchParams] = useSearchParams(); + const [userData, setUserData] = useState({}); + // 切换头部menu function handleClickHeaderMenu(values) { @@ -120,6 +123,8 @@ $$.clearSessionStorage(); $$.setSessionStorage('customerSystemToken', res.data?.token); $$.setLocal('customerSystemUser', res.data || {}); + console.log('getGridToken', res.data); + setUserData(res.data || {}) let ctUseroleList = res.data?.ctUseroleList || []; console.log(ctUseroleList); const roleId = ctUseroleList[0]?.roleId @@ -134,11 +139,15 @@ } } } + // 初始化 格式化数据适应菜单栏 useEffect(() => { //单点登录,网格传一个token在session,如果有就请求接口 - const gridToken = $$.getSessionStorage('gridToken'); + // const gridToken = $$.getSessionStorage('gridToken'); + + const gridToken = searchParams.get('gridToken'); // 获取名为 'gridToken' 的参数 + console.log(gridToken,'gridToken') if (gridToken) { getGridToken(gridToken) } else { @@ -149,6 +158,7 @@ return; } let customerSystemUser = $$.getLocal('customerSystemUser'); + setUserData(customerSystemUser || {}) let ctUseroleList = customerSystemUser?.ctUseroleList || []; if (ctUseroleList[0]?.roleId) { setRoleActive({ id: ctUseroleList[0]?.roleId, roleName: ctUseroleList[0]?.roleName, powerMap: {} }); @@ -207,6 +217,10 @@ getRolePower(roleActive.id, roleActive.roleName); } }, [roleActive.id]); + useEffect(() => { + let customerSystemUser = $$.getLocal('customerSystemUser'); + setUserData(customerSystemUser || {}); + }, [headerUserChange]); console.log(gridStatus); return ( <> @@ -217,6 +231,7 @@ handleClickMenu={handleClickHeaderMenu} headerUserChange={headerUserChange} handleChangeRole={handleChangeRole} + userData={userData} /> {gridStatus && isNotNav ? ( <main className="layout-main" id="layoutMain"> diff --git a/gz-customerSystem/src/components/ProgressStep/VisitStep.jsx b/gz-customerSystem/src/components/ProgressStep/VisitStep.jsx index 0dfa948..be73cf0 100644 --- a/gz-customerSystem/src/components/ProgressStep/VisitStep.jsx +++ b/gz-customerSystem/src/components/ProgressStep/VisitStep.jsx @@ -22,6 +22,8 @@ */ const ProgressStep = ({ progressData, hasTab }) => { const [proType, setProType] = useState('handleCaseFlowList') + const [assistType, setAssistType] = useState(progressData.assistCaseFlowList && progressData.assistCaseFlowList[0]?.unitId || '') + const [progressList, setProgressList] = useState([]); const iconMap = { 1: ledger_7,//完成 2: ledger_12,//回退 @@ -40,38 +42,87 @@ useEffect(() => { setProType('handleCaseFlowList') + setProgressList(progressData.handleCaseFlowList) }, [progressData]) + + //详细结果的处理 + const typeDom = (data) => { + //审核结果同意 + if (data.auditResult && data.auditResult == '24_00004-1') { + return <span>审核结果:<span style={{ color: '#00B42A' }}>{data.auditResultName}</span></span> + } + //审核结果不同意 + if (data.auditResult && data.auditResult == '24_00004-2') { + return <span>审核结果:<span style={{ color: '#FF4D4F' }}>{data.auditResultName}</span></span> + } + //化解结果成功 + if (data.mediResult && data.mediResult == '22_00025-1') { + return <span>审核结果:<span style={{ color: '#00B42A' }}>{data.mediResultName}</span></span> + } + //化解结果不成功 + if (data.mediResult && data.mediResult == '22_00025-2') { + return <span>审核结果:<span style={{ color: '#FF4D4F' }}>{data.mediResultName}</span></span> + } + return <span>{data.handleNotes || '-'}</span> + } return ( <Fragment> {hasTab && - <div className='tabBtn'> - {btnList.map((item, index) => { - return <div - className={`tabBtn-btn ${proType === item.value ? 'tabBtn-active' : ''}`} - key={item.value} - onClick={() => { setProType(item.value) }} - style={{ marginRight: (index + 1) !== btnList.length ? '20px' : '0' }} - >{item.label}</div> - })} - - </div> + <> + <div className='tabBtn'> + {btnList.map((item, index) => { + return <div + className={`tabBtn-btn ${proType === item.value ? 'tabBtn-active' : ''}`} + key={item.value} + onClick={() => { + setProType(item.value) + if(item.value == 'handleCaseFlowList') { + setProgressList(progressData.handleCaseFlowList) + } else { + const findData = progressData.assistCaseFlowList?.find(res => res.unitId == assistType) || {} + setProgressList(findData.caseFlowList || []) + } + }} + style={{ marginRight: (index + 1) !== btnList.length ? '20px' : '0' }} + >{item.label}</div> + })} + </div> + { + proType == 'assistCaseFlowList' && <div className='tabBtn'> + {progressData.assistCaseFlowList?.map(item => { + return <div + key={item.unitId} + className={`tabBtn-unit ${assistType === item.unitId ? 'tabBtn-unitActive' : ''}`} + onClick={() => { + setAssistType(item.unitId) + setProgressList(item.caseFlowList) + }} + > + {item.unitName} + </div> + })} + </div> + } + </> } - {progressData[proType] && progressData[proType].length !== 0 - ? progressData[proType].map((x, t) => { + {progressList && progressList.length !== 0 + ? progressList.map((x, t) => { return ( <div key={t + 1}> <div className="myStep-item"> - {t === progressData[proType].length - 1 ? null : <div className={`${!x.handleContent ? 'myStep-item-divider' : x.fileInfoList?.length > 0 ? 'myStep-item-divider2' : "myStep-item-divider1"} ${x.status === '2' && 'myStep-item-divider-success'}`} />} - <div className={`myStep-item-icon1 myStep-item-${x.status === 1 ? 'noStarted1' : 'success1'}`}> - <div className="myStep-item-title">{x.nodeShowName || '事件流转'}</div> - <img className='myStep-item-img' src={x.status === 1 ? ledger_8 : iconMap[x.taskType]} alt="" /> + <div> + <div className={`myStep-item-icon1 myStep-item-${x.status === 1 ? 'noStarted1' : 'success1'}`}> + <div className="myStep-item-title">{x.nodeShowName || '事件流转'}</div> + <img className='myStep-item-img' src={x.status === 1 ? ledger_8 : iconMap[x.taskType]} alt="" /> + </div> + {t === progressList.length - 1 ? null : <div className='myStep-item-divider' />} </div> <div className="myStep-item-right"> - {t === progressData[proType].length - 1 ? + {x.status === 1 ? <div> <div className="myStep-item-p" style={{ color: 'rgba(0,0,0,0.50)' }}> - {x.processName} + {x.processName || '-'} </div> <div className="myStep-item-p"> <span>{x.handleUnitName || '-'}</span> @@ -96,7 +147,11 @@ x.handleNotes && <div className='myStep-item-p-yy' style={{ width: '200px' }}> <span className='myStep-item-p-yy-l'> - <span><Tooltip placement="top" title={x.handleNotes || ''}><span>{x.handleNotes || '-'}</span></Tooltip></span> + <span> + <Tooltip placement="top" title={x.handleNotes || ''}> + {typeDom(x)} + </Tooltip> + </span> </span> </div> } diff --git a/gz-customerSystem/src/components/ProgressStep/index.less b/gz-customerSystem/src/components/ProgressStep/index.less index e574fab..93245ce 100644 --- a/gz-customerSystem/src/components/ProgressStep/index.less +++ b/gz-customerSystem/src/components/ProgressStep/index.less @@ -3,7 +3,7 @@ .myStep { &-item { position: relative; - padding-bottom: 32px; + padding-bottom: 34px; &-success { background-color: @main-color; @@ -74,16 +74,15 @@ &-divider { position: absolute; - top: 0; + top: 56px;//52+4 left: 24px; - width: 3px; - height: 32px+52px; - padding-top: 22px; + width: 2px; + bottom: 4px; &::after { content: ''; display: inline-block; - height: 32px+52px; + height: 100%; border-left: 2px solid; border-color: @divider-color; } @@ -213,7 +212,7 @@ border: 1px solid #e5e6eb; border-radius: 4px; color: #e5e6eb; - padding: 4px 8px; + padding: 3px 8px 4px 8px; cursor: pointer; } @@ -221,4 +220,17 @@ color: #1a6fb8; border-color: #1a6fb8; } + + &-unit { + height: 32px; + border-radius: 21px; + color: #1D2129; + padding: 3px 12px 4px 12px; + cursor: pointer; + } + + &-unitActive { + background: #f3f2f7; + color: #1a6fb8; + } } \ No newline at end of file diff --git a/gz-customerSystem/src/components/personCard/DetailDialog.jsx b/gz-customerSystem/src/components/personCard/DetailDialog.jsx index 9038fef..2a94e1c 100644 --- a/gz-customerSystem/src/components/personCard/DetailDialog.jsx +++ b/gz-customerSystem/src/components/personCard/DetailDialog.jsx @@ -357,6 +357,11 @@ ...res, value: filterValue } + } else if (res.field === 'extreme') { + return { + ...res, + value: data[res.field] === 0 ? '否' : '是' + } } else { return { ...res, diff --git a/gz-customerSystem/src/router/router.js b/gz-customerSystem/src/router/router.js index a482be0..0195b1a 100644 --- a/gz-customerSystem/src/router/router.js +++ b/gz-customerSystem/src/router/router.js @@ -147,6 +147,8 @@ import ClosingReview from '../views/register/closingReview'; //工作台 import VisitWorkBench from '../views/register'; +//自行排查 +import SelfInspection from '../views/register/visit/SelfInspection'; import Test from '../views/test'; @@ -225,6 +227,7 @@ <Route path="visit/fileMessage" element={<FileMessage />} /> <Route path="visit/closingReview" element={<ClosingReview />} /> <Route path="visit/visitWorkBench" element={<VisitWorkBench />} /> + <Route path="selfInspection/:id?" element={<SelfInspection />} /> {/* 工作流模块 */} <Route path="workflowTemplate" element={<WorkflowTemplate />} /> diff --git a/gz-customerSystem/src/views/comprehensive/index.jsx b/gz-customerSystem/src/views/comprehensive/index.jsx index f1bd214..dd193a3 100644 --- a/gz-customerSystem/src/views/comprehensive/index.jsx +++ b/gz-customerSystem/src/views/comprehensive/index.jsx @@ -46,7 +46,7 @@ { title: '事项来源', width: 100, dataIndex: 'canalName' }, { title: '事项等级', width: 100, dataIndex: 'caseLevel' }, { title: '纠纷类型', width: 150, dataIndex: 'caseTypeName' }, - { title: '承办部门', width: 150, dataIndex: 'mediateDeptName' }, + { title: '承办部门', width: 150, dataIndex: 'mediateUnitName' }, { title: '配合部门', width: 150, dataIndex: 'assistUnitName' }, // 22_00025-1 成功 22_00025-2 化解不成功 { title: '化解结果', width: 100, dataIndex: 'mediResult', render: (text) => <div className={text === '22_00025-1' ? 'comprehensive-green' : text === '22_00025-2' ? 'comprehensive-red' : '-'} >{text === '22_00025-1' ? '化解成功' : text === '22_00025-2' ? '化解不成功' : '-'}</div> }, diff --git a/gz-customerSystem/src/views/register/eventFlow/component/EscalationModel.jsx b/gz-customerSystem/src/views/register/eventFlow/component/EscalationModel.jsx index b76c6a2..1bb57d2 100644 --- a/gz-customerSystem/src/views/register/eventFlow/component/EscalationModel.jsx +++ b/gz-customerSystem/src/views/register/eventFlow/component/EscalationModel.jsx @@ -58,21 +58,19 @@ } const handleSubmit = () => { - formRef.current.validate(undefined, (errors, values) => { - if (formRef.current) { - formRef.current.validate(undefined, (errors, values) => { - if (!errors) { - handleEscala({ - id, - caseId: props.caseId, - caseTaskId: props.caseTaskId, - returnContent: values.returnContent, - ...unitData - }) - } - }) - } - }) + if (formRef.current) { + formRef.current.validate(undefined, (errors, values) => { + if (!errors) { + handleEscala({ + id, + caseId: props.caseId, + caseTaskId: props.caseTaskId, + appearContent: values.appearContent, + ...unitData + }) + } + }) + } } const handleTemplate = (type) => { @@ -130,7 +128,7 @@ </div> <FormItem label={(<div style={{ display: 'flex' }}>上报意见<div className="must">必填</div></div>)} - field='returnContent' + field='appearContent' rules={[{ required: true, message: '请选择回退理由' }]} > <TextArea diff --git a/gz-customerSystem/src/views/register/eventFlow/component/EventFlow.jsx b/gz-customerSystem/src/views/register/eventFlow/component/EventFlow.jsx index 47faac2..c87f76f 100644 --- a/gz-customerSystem/src/views/register/eventFlow/component/EventFlow.jsx +++ b/gz-customerSystem/src/views/register/eventFlow/component/EventFlow.jsx @@ -38,7 +38,7 @@ }) if (res.type) { $$.infoSuccess({ content: '受理成功!' }); - navigate(`/mediate/visit/handleFeedback?caseTaskId=${props.caseTaskId}&caseId=${props.caseId}`) + navigate(`/mediate/visit/handleFeedback?caseTaskId=${res.data}&caseId=${props.caseId}`) } }, }); diff --git a/gz-customerSystem/src/views/register/handleFeedback/component/AuditView.jsx b/gz-customerSystem/src/views/register/handleFeedback/component/AuditView.jsx index 32121ac..d409482 100644 --- a/gz-customerSystem/src/views/register/handleFeedback/component/AuditView.jsx +++ b/gz-customerSystem/src/views/register/handleFeedback/component/AuditView.jsx @@ -7,6 +7,7 @@ import * as $$ from '@/utils/utility'; import { Scrollbars } from "react-custom-scrollbars"; import { getOffset, getSize } from '@/utils/utility'; +import { useNavigate } from 'react-router-dom'; const FormItem = Form.Item; const appUrl = $$.appUrl; @@ -26,6 +27,7 @@ } const AuditView = (props) => { + const navigate = useNavigate(); const formRef = useRef(); const scrollRef = useRef(null); const [id, setId] = useState(); @@ -89,6 +91,7 @@ const res = await submit(data) if (res.type) { $$.infoSuccess({ content: '提交成功!' }); + navigate('/mediate/visit/visitWorkBench') } } diff --git a/gz-customerSystem/src/views/register/handleFeedback/component/CaseResult.jsx b/gz-customerSystem/src/views/register/handleFeedback/component/CaseResult.jsx index a2a9fd8..66eba3e 100644 --- a/gz-customerSystem/src/views/register/handleFeedback/component/CaseResult.jsx +++ b/gz-customerSystem/src/views/register/handleFeedback/component/CaseResult.jsx @@ -40,22 +40,14 @@ const failRef = useRef(); const [selectedTab, setSelectedTab] = useState('1'); // 默认选中第一个 tab const [scanFile, setScanFile] = useState(false); - const [selectedTab1, setSelectedTab1] = useState('1'); // 默认选中第一个 tab - const [fileTip, setFileTip] = useState('0'); - const [value, setValue] = useState(1) + const [value, setValue] = useState(2) const [noHandleReason, setNoHandleReason] = useState(false); - const [radioValue, setRadioValue] = useState(1); const [mode, setMode] = useState(false) const tabs = [ { index: '1', label: '化解成功' }, { index: '2', label: '化解不成功' }, ]; - - const tabs1 = [ - { index: '1', label: '公共模板1:化解成功结案意见范本' }, - { index: '2', label: '个人模板1:化解成功结案意见范本(完整版)' } - ] const agreement = [ { value: 1, label: '口头协议' }, @@ -65,10 +57,6 @@ const handleTabChange = (newTabIndex) => { setSelectedTab(newTabIndex); - }; - - const handleTabChange1 = (newTabIndex) => { - setSelectedTab1(newTabIndex); }; const handleConfirm = (scanContent) => { @@ -116,53 +104,57 @@ } } + //化解成功的提交处理 const handleSubmit = () => { + //口头协议 if (value === 1) { - const data = formRef?.current.getFields() - console.log(data, 'handleSubmit') - windupApply(data) + formRef?.current.validate(undefined, (errors, values) => { + if (!errors) { + const data = formRef?.current.getFields() + windupApply({ + agreeType: '24_00003-1', + agreeTypeName: '口头协议', + ...data + }) + } + }) } + //书面协议 if (value === 2) { - const data = formRefWrite?.current.getFields() - console.log(data, 'handleSubmit') - windupApply(data) + formRefWrite?.current.validate(undefined, (errors, values) => { + if (!errors) { + const { file, ...rest } = formRefWrite?.current.getFields() + windupApply({ + agreeType: '24_00003-2', + agreeTypeName: '书面协议', + ...rest + }) + } + }) } - if (selectedTab === '2') { - const data = failRef?.current.getFields() - console.log(data, 'handleSubmit') - // windupApply(data) - - - } - } + + //化解不成功的提交处理 const handleSubmit1 = () => { - if (selectedTab === '2') { - const data = failRef?.current.getFields() - console.log(data, 'handleSubmit') - windupApply(data) - } + failRef?.current.validate(undefined, (errors, values) => { + if (!errors) { + const { failReason1, failReason2, failReason3, ...rest } = failRef?.current.getFields() + const failReason = `1、${failReason1};2、${failReason2};3、${failReason3}。` + windupApply({ + failReason: failReason, + ...rest + }) + } + }) } + //结案申请请求 const windupApply = async (submitData) => { - console.log( - { - mediResultName: selectedTab === '1' ? '化解成功' : '化解不成功', - mediResult: selectedTab === '1' ? '22_00025-1' : '22_00025-2', - agreeType: selectedTab === '1' ? '24_00003-1' : '24_00003-2', - agreeTypeName: value === 1 ? '口头协议' : '书面协议', - caseTaskId: caseTaskId, - caseId: caseId, - caseResultId: caseResultId, - ...submitData - }, 'windupApplyData' - ) + console.log(submitData); const res = await windupApplyApi({ mediResultName: selectedTab === '1' ? '化解成功' : '化解不成功', mediResult: selectedTab === '1' ? '22_00025-1' : '22_00025-2', - agreeType: selectedTab === '1' ? '24_00003-1' : '24_00003-2', - agreeTypeName: value === 1 ? '口头协议' : '书面协议', caseTaskId: caseTaskId, caseId: caseId, caseResultId: caseResultId, @@ -213,7 +205,7 @@ scrollToFirstError={true} requiredSymbol={false} initialValues={{ - agreeType: 2, + agreeType: value, }} //默认值 > <Col span={8}> @@ -224,7 +216,7 @@ } field='agreeType' > - <Select options={agreement} onChange={(v) => { setValue(v); console.log(typeof v, 'vvv') }}> + <Select options={agreement} onChange={(v) => { setValue(v); }}> </Select> </FormItem> </Col> @@ -247,7 +239,7 @@ <div className="must">必填</div> </div> <div className='caseResult-tips'> - <img src={tip} alt='' style={{ width: '16px', marginRight: '8px',marginTop: '-5px' }} /> + <img src={tip} alt='' style={{ width: '16px', marginRight: '8px', marginTop: '-5px' }} /> <span>协议要点应尽量简洁,当事人大厅来访或小程序线上反映问题时,可在小程序中查看到填写的协议要点内容</span> </div> <div style={{ position: 'absolute', display: 'flex ', top: '79px', zIndex: 1 }}> @@ -262,6 +254,7 @@ </> )} field='agreeContent' + rules={[{ message: '请填写协议要点', required: true }]} > <TextArea autoSize={{ minRows: 4, maxRows: 8 }} @@ -289,6 +282,7 @@ <FormItem label={(<div style={{ display: 'flex' }}>结案意见<div className="must">必填</div></div>)} field='windupContent' + rules={[{ message: '请填写结案意见', required: true }]} > <TextArea autoSize={{ minRows: 4, maxRows: 8 }} @@ -312,7 +306,14 @@ > <Row> <Col span={24}> - <FormItem + <ArcoUpload + params={{ + action: `${appUrl.fileUrl}/${appUrl.sys}/api/web/fileInfo/upload?mainId=${caseId}&ownerId=${caseResultId}&ownerType=22_00018-302`, + }} + formItemParams={{ + rules: [{ message: '请上传协议文书', required: true }] + }} + field='file' label={ <> <div style={{ display: 'flex' }}> @@ -325,19 +326,8 @@ </div> </> } - field='caseDes' - rules={[{ message: '请填写事项概况', required: true }]} - > - <ArcoUpload - params={{ - action: `${appUrl.fileUrl}/${appUrl.sys}/api/web/fileInfo/upload?mainId=${caseId}&ownerId=${caseResultId}&ownerType=22_00018-302`, - }} - field='file' - label='' - // editData={props.editData} - ownerType='22_00018-302' - /> - </FormItem> + ownerType='22_00018-302' + /> </Col> <Col span={24} style={{ position: 'relative' }}> <div style={{ position: 'absolute', display: 'flex', top: '28px', zIndex: 1 }}> @@ -359,6 +349,7 @@ <FormItem label={(<div style={{ display: 'flex' }}>结案意见<div className="must">必填</div></div>)} field='windupContent' + rules={[{ message: '请填写结案意见', required: true }]} > <TextArea autoSize={{ minRows: 4, maxRows: 8 }} @@ -370,7 +361,6 @@ </Row> </Form> </> - } <Space style={{ marginBottom: '16px' }}> <Button type='primary' onClick={handleSubmit}>提交</Button> @@ -409,6 +399,7 @@ <FormItem label='' field='failReason1' + rules={[{ message: '请填写调解过程中提供的解决方案', required: true }]} > <Input.TextArea showWordLimit @@ -425,6 +416,7 @@ <FormItem label='' field='failReason2' + rules={[{ message: '请填写调解过程中的主要分歧点', required: true }]} > <Input.TextArea showWordLimit @@ -441,6 +433,7 @@ <FormItem label='' field='failReason3' + rules={[{ message: '请填写最终难以调和的原因', required: true }]} > <Input.TextArea showWordLimit @@ -460,6 +453,7 @@ <FormItem label={(<div style={{ display: 'flex' }}>结案意见<div className="must">必填</div></div>)} field='windupContent' + rules={[{ message: '请填写结案意见', required: true }]} > <TextArea autoSize={{ minRows: 4, maxRows: 8 }} @@ -470,7 +464,7 @@ </Col> <Space style={{ marginBottom: '16px' }}> <Button type='primary' onClick={handleSubmit1}>提交</Button> - <Button type='outline' style={{ color: '#1A6FB8', border: '1px solid #1A6FB8' }}>保存</Button> + {/* <Button type='outline' style={{ color: '#1A6FB8', border: '1px solid #1A6FB8' }}>保存</Button> */} </Space> </Form> } diff --git a/gz-customerSystem/src/views/register/index.jsx b/gz-customerSystem/src/views/register/index.jsx index 8f5a353..31fb16e 100644 --- a/gz-customerSystem/src/views/register/index.jsx +++ b/gz-customerSystem/src/views/register/index.jsx @@ -1188,6 +1188,10 @@ //改变tab const handleColumnType = (type) => { + setPageData({ + page: 1, + size: 10, + }) setSearchData({ ...searchData, status: type @@ -1196,6 +1200,10 @@ //改变工作总览 const tabActive = (key, data) => { + setPageData({ + page: 1, + size: 10, + }) //默认第一个tab if (key == '5') { setSearchData({ @@ -1402,7 +1410,7 @@ setPageData({ ...pageData, page, - pageSize + size: pageSize }) }, }} @@ -1464,7 +1472,7 @@ <div className='VisitWorkBench-bottom-title' style={{ color: '#206BCD' }}>大厅来访</div> {/* <img src={visitInto} alt='' className='VisitWorkBench-bottom-img' /> */} </div> - <div className='bottomTab2'> + <div className='bottomTab2' onClick={() => navigate(`/mediate/selfInspection`)}> <div className='VisitWorkBench-bottom-title' style={{ color: '#D46B08' }}>自行排查</div> {/* <img src={checkInto} alt='' className='VisitWorkBench-bottom-img' /> */} </div> diff --git a/gz-customerSystem/src/views/register/index.less b/gz-customerSystem/src/views/register/index.less index 35027f2..d016546 100644 --- a/gz-customerSystem/src/views/register/index.less +++ b/gz-customerSystem/src/views/register/index.less @@ -523,12 +523,13 @@ } .reviewLine { - height: calc(100% - 19px); - width: 14px; - display: flex; - align-items: center; - justify-content: center; - position: relative; + height: calc(100% - 23px); + width: 14px; + display: flex; + align-items: center; + justify-content: center; + position: relative; + margin-top: 4px; &::before { content: ''; @@ -934,7 +935,7 @@ padding: 12px 16px 16px 16px; flex: 1; justify-content: center; - + cursor: pointer; } .timeTip { diff --git a/gz-customerSystem/src/views/register/matterDetail/RateModule.jsx b/gz-customerSystem/src/views/register/matterDetail/RateModule.jsx index 5233d61..e0639e9 100644 --- a/gz-customerSystem/src/views/register/matterDetail/RateModule.jsx +++ b/gz-customerSystem/src/views/register/matterDetail/RateModule.jsx @@ -1,7 +1,7 @@ import React, { Fragment } from 'react' import { Row, Col, Space } from 'antd'; import { Rate } from '@arco-design/web-react'; - +import * as $$ from '../../../utils/utility'; export default function RateModule(props) { return ( <Fragment> @@ -21,7 +21,7 @@ <div className="title"> <div className="title-text">评价时间</div> </div> - <div>{props.grade?.createTime || '-'}</div> + <div>{$$.minuteFormat(props.grade?.createTime) || '-'}</div> </Col> <Col span={8}> <div className="title"> diff --git a/gz-customerSystem/src/views/register/matterDetail/UniteHandle.jsx b/gz-customerSystem/src/views/register/matterDetail/UniteHandle.jsx index 3bac15e..2dac1a5 100644 --- a/gz-customerSystem/src/views/register/matterDetail/UniteHandle.jsx +++ b/gz-customerSystem/src/views/register/matterDetail/UniteHandle.jsx @@ -139,13 +139,13 @@ visible={isModalVisible} checkKeys={wantUser} onOk={(value) => { - console.log(value); setWantUser(value.items) setSelectOptions(value.items.map(item => ({ label: item.name, value: item.value }))) formRef.current.setFieldValue('unit', value.items.map(item => item.value)) + setIsModalVisible(false) }} onClose={() => setIsModalVisible(false)} type='dept' diff --git a/gz-customerSystem/src/views/register/matterDetail/index.jsx b/gz-customerSystem/src/views/register/matterDetail/index.jsx index 84efe13..08c5efb 100644 --- a/gz-customerSystem/src/views/register/matterDetail/index.jsx +++ b/gz-customerSystem/src/views/register/matterDetail/index.jsx @@ -29,7 +29,7 @@ const partyList = data.personList.concat(data.agentList) setInfoData({ ...data, - questionName: data.queProvName === null ? '-' : data.queCityName + '/' + data.queAreaName + '/' + data.queRoadName, + questionName: data.queAreaName === null ? '-' : data.queAreaName + '/' + data.queRoadName, caseType: data.caseTypeFirstName === null ? '-' : data.caseTypeFirstName + '/' + data.caseTypeName }) setFakeData(partyList.map(item => { diff --git a/gz-customerSystem/src/views/register/visit/SelfInspection.jsx b/gz-customerSystem/src/views/register/visit/SelfInspection.jsx new file mode 100644 index 0000000..5d3bf4e --- /dev/null +++ b/gz-customerSystem/src/views/register/visit/SelfInspection.jsx @@ -0,0 +1,264 @@ +import React, { useState, useRef, Fragment, useEffect } from "react"; +import { useParams, useNavigate } from 'react-router-dom'; +import NewPage from '@/components/NewPage'; +import * as $$ from '@/utils/utility'; +import "@arco-themes/react-gzzz/css/arco.css"; +import '../index.less'; +import { Space } from 'antd'; +import { Button, Steps, Message } from '@arco-design/web-react'; +import VisitorRegister from './component/SelfVisitorRegister'; +import Preview from './preview'; + +const Step = Steps.Step; + +function saveDispute(data) { + return $$.ax.request({ url: `casedraftInfo/caseDraftRegister`, type: 'post', service: 'mediate', data }); +} + +function getId() { + return $$.ax.request({ url: `caseUtils/getNewTimeCaseId`, type: 'get', service: 'utils' }); +} + +function submitDispute(data) { + return $$.ax.request({ url: `caseInfo/caseRegister`, type: 'post', service: 'mediate', data }); +} + +function getDetailData(id) { + return $$.ax.request({ url: `casedraftInfo/getCasedraftInfo?id=${id}`, type: 'get', service: 'mediate' }); +} + + +const Organization = (props) => { + const formRef = useRef(); + const routeData = useParams(); + const navigate = useNavigate(); + const [isReview, setIsReview] = useState(false);//预览页面控制 + const [current, setCurrent] = useState(1); + const [id, setId] = useState(); + const [editData, setEditData] = useState({});//回显数据 + + useEffect(() => { + if (routeData.id) { + getDeatil(routeData.id) + setId(routeData.id) + } else { + getAppId() + } + + }, []) + + //编辑 + const getDeatil = async (id) => { + const res = await getDetailData(id) + if (res.type) { + const { agentList, personList, ...rest } = res.data + const parList = agentList.concat(personList) + const newParList = parList?.map(item => { + const fileInfoList = item.fileInfoList + let file = [];//身份证明材料、企业登记材料 + let file1 = [];//法人、机构身份证明材料、代理人授权委托书 + if (fileInfoList && fileInfoList.length != 0) { + fileInfoList.forEach(item => { + if (item.ownerType == '22_00018-202' || item.ownerType == '22_00018-203') { + item.fileList.forEach(res => { + file.push({ + ...res, + uid: res.id, + }) + }) + } + if (item.ownerType == '22_00018-204' || item.ownerType == '22_00018-207') { + item.fileList.forEach(res => { + file1.push({ + ...res, + uid: res.id, + }) + }) + } + }) + } + return { + ...item, + file, + file1 + } + }) || [] + const obj = { + ...rest, + fakeData: newParList, + myCaseType: [rest.caseTypeFirst, rest.caseType], + myQuesAddress: rest.queRoad ? [rest.queProv, rest.queCity, rest.queArea, rest.queRoad] : undefined + } + formRef.current.setFieldsValue(obj) + setEditData(obj) + } + } + + //获取id + const getAppId = async () => { + const res = await getId() + if (res.type) { + setId(res.data) + } + } + + //提交信息,需要校验规则 + const handleSubmit = async () => { + if (formRef.current) { + formRef.current.validate(undefined, (errors, values) => { + if (!errors) { + const { myCaseType, myQuesAddress, ...rest } = formRef.current.getFields() + const params = handleData(rest) + $$.modalInfo({ + title: '提醒', + content: '确定提交吗?', + cancelText: '我再想想', + onOk: () => { + reauestSubmit({ + ...params, + isSelfAccept: 0, + isDraft: 0, + operateType: 0, + }) + }, + }); + } + }); + } + } + + //保存草稿信息,不需要校验规则 + const handleSave = () => { + if (formRef.current) { + const { myCaseType, myQuesAddress, ...rest } = formRef.current.getFields() + const params = handleData(rest) + requestSave(params) + } + } + + //数据处理 + const handleData = (data) => { + const { fakeData, ...newObj } = data + if (data.id) { + return { + ...newObj, + personList: fakeData?.filter(item => item.perType === "15_020008-1" || item.perType === "15_020008-2"), + agentList: fakeData?.filter(item => item.perType === "24_00006-1" || item.perType === "24_00006-2").map(item => { + return { + ...item, + personId: item.personId.join(',') + } + }), + } + } else { + return { + ...newObj, + personList: fakeData?.filter(item => item.perType === "15_020008-1" || item.perType === "15_020008-2"), + agentList: fakeData?.filter(item => item.perType === "24_00006-1" || item.perType === "24_00006-2").map(item => { + return { + ...item, + personId: item.personId.join(',') + } + }), + id: id + } + } + } + + //预览信息 + const handleReview = () => { + setIsReview(!isReview) + } + + function selfAcceptance() { + if (formRef.current) { + formRef.current.validate(undefined, (errors, values) => { + if (!errors) { + const { myCaseType, myQuesAddress, ...rest } = formRef.current.getFields() + const params = handleData(rest) + $$.modalInfo({ + title: '自行受理确认', + content: '确定自行受理吗?', + okText: '确定受理', + cancelText: '我再想想', + onOk: async () => { + reauestSubmit({ + ...params, + isSelfAccept: 1, + isDraft: 0, + operateType: 0, + }, true) + }, + }); + } + }); + } + } + + //保存请求 + const requestSave = async (data) => { + const response = await saveDispute(data) + if (response.type) { + Message.success('保存草稿成功!') + } + } + + //提交请求 + const reauestSubmit = async (data, isSelfAccept) => { + const response = await submitDispute(data) + if (response.type) { + if(isSelfAccept) { + //自行受理 + navigate(`/mediate/visit/handleFeedback?caseTaskId=${response.data}&caseId=${id}`) + } else { + Message.success('提交成功!') + navigate(`/mediate/visit/visitWorkBench`, { replace: true }) + setCurrent(2) + } + } + } + + return ( + <div style={{ position: 'relative' }}> + <NewPage + pageHead={ + { breadcrumbData: [{ title: '工作台' }, { title: '来访登记' }], title: '自行排查' } + } + > + <Fragment> + <div style={{ backgroundColor: '#fff', margin: '12px 16px 0px 16px', paddingTop: '16px', paddingLeft: '91px' }}> + <Steps type='navigation' current={current}> + <Step title='排查登记' disabled /> + <Step title='事件流转' disabled /> + <Step title='办理反馈' disabled /> + <Step title='结案审核' disabled /> + <Step title='当事人评价' disabled /> + <Step title='结案归档' disabled /> + </Steps> + </div> + <div style={{ backgroundColor: '#ffff', margin: '8px 8px 0px 16px', padding: '12px 18px 82px 16px', height: 'calc(100vh - 231px)', overflowY: 'scroll', display: isReview ? '' : 'none' }}> + <Preview style={{ display: isReview ? '' : 'none' }} data={formRef?.current?.getFields()} mainId={id} /> + </div> + <VisitorRegister + formRef={formRef} + style={{ display: isReview ? 'none' : '' }} + mainId={id} + partyList={editData.fakeData} + fileInfoList={editData.fileInfoList} + /> + <div className="dataSync-excel"> + <Space size="middle" style={{ margin: '4px 14px' }}> + <Button type="primary" style={{ backgroundColor: '#1A6FB8' }} onClick={handleSave} >保存</Button> + <Button type='outline' style={{ color: '#1A6FB8', border: '1px solid #1A6FB8' }} onClick={handleReview}>{isReview ? '修改' : '预览'}</Button> + <Button type='outline' style={{ color: '#1A6FB8', border: '1px solid #1A6FB8' }} onClick={handleSubmit}>提交</Button> + <Button type='outline' style={{ color: '#1A6FB8', border: '1px solid #1A6FB8' }} onClick={() => selfAcceptance()}>自行受理</Button> + <Button type='secondary' onClick={() => { navigate(-1) }}>返回上级页面</Button> + </Space> + </div> + </Fragment> + </NewPage> + </div> + ) +} + +export default Organization; \ No newline at end of file diff --git a/gz-customerSystem/src/views/register/visit/SelfPreview.jsx b/gz-customerSystem/src/views/register/visit/SelfPreview.jsx new file mode 100644 index 0000000..ec84936 --- /dev/null +++ b/gz-customerSystem/src/views/register/visit/SelfPreview.jsx @@ -0,0 +1,240 @@ +import React, { useState, useEffect } from "react"; +import { Row, Col, Space } from 'antd'; +import * as $$ from '../../../utils/utility'; +import { ApplyDialog, AgentDialog, Respondent, Company } from './component/previewTable' +import FileTable from "../matterDetail/FileTable"; +import { link } from '@/assets/images'; +import PreviewImage from '@/components/PreviewImage'; + +const Preview = (props) => { + const [data, setData] = useState({}); + const levelColorMap = { + 1: '#F53F3F', + 2: '#EF6C24', + 3: '#00B42A', + } + + useEffect(() => { + console.log(props.data); + const applyData = props.data?.fakeData?.filter(item => item.perTypeName === "申请方当事人" && item.perClassName === "自然人"); + const agentData = props.data?.fakeData?.filter(item => item.perTypeName === "申请方代理人"); + const company = props.data?.fakeData?.filter(item => item.perTypeName === "申请方当事人" && item.perClassName === "非法人组织"); + const respondentData = props.data?.fakeData?.filter(item => item.perTypeName === "申请方当事人" && item.perClassName === "法人"); + + const applyData1 = props.data?.fakeData?.filter(item => item.perTypeName === "被申请方当事人" && item.perClassName === "自然人"); + const agentData1 = props.data?.fakeData?.filter(item => item.perTypeName === "被申请方代理人"); + const company1 = props.data?.fakeData?.filter(item => item.perTypeName === "被申请方当事人" && item.perClassName === "非法人组织"); + const respondentData1 = props.data?.fakeData?.filter(item => item.perTypeName === "被申请方当事人" && item.perClassName === "法人"); + + setData({ + applyData, + agentData, + company, + respondentData, + applyData1, + agentData1, + company1, + respondentData1 + }) + }, [props.data]) + + return ( + <div style={{ ...props.style }}> + <Col span={24} style={{ display: 'flex', alignItems: 'center', marginBottom: '8px' }}> + <Space size='small'> + <div className='MediationInfo-subTitle' style={{ marginTop: '-7px' }}></div><h4>当事人信息</h4> + </Space> + </Col> + <div style={{ marginBottom: '8px' }}>申请方</div> + <div className="line-container" style={{ marginBottom: '20px' }}> + <div className="line left-line"></div> + <div className="line middle-line"></div> + <div className="line right-line"></div> + </div> + {/* ApplyDialog 只有在 applyData 存在且不为空时才渲染 */} + {data.applyData && data.applyData.length > 0 ? ( + <ApplyDialog applyDialog={data.applyData} /> + ) : null} + + {/* AgentDialog 只有在 agentData 存在且不为空时才渲染 */} + {data.agentData && data.agentData.length > 0 ? ( + <AgentDialog agentDialog={data.agentData} /> + ) : null} + + {/* Respondent 只有在 respondentData 存在且不为空时才渲染 */} + {data.respondentData && data.respondentData.length > 0 ? ( + <Respondent respondent={data.respondentData} /> + ) : null} + + {data.company && data.company.length > 0 ? ( + <Company company={data.company} /> + ) : null} + + <div style={{ marginBottom: '8px' }}>被申请方</div> + <div className="line-container" style={{ marginBottom: '20px' }}> + <div className="line left-line"></div> + <div className="line middle-line"></div> + <div className="line right-line"></div> + </div> + {data.applyData1 && data.applyData1.length > 0 ? ( + <ApplyDialog applyDialog={data.applyData1} /> + ) : null} + + {data.agentData1 && data.agentData1.length > 0 ? ( + <AgentDialog agentDialog={data.agentData1} /> + ) : null} + + {data.respondentData1 && data.respondentData1.length > 0 ? ( + <Respondent respondent={data.respondentData1} /> + ) : null} + + {data.company1 && data.company1.length > 0 ? ( + <Company company={data.company1} /> + ) : null} + <Col span={24} style={{ display: 'flex', alignItems: 'center', marginBottom: '8px' }}> + <Space size='small'> + <div className='MediationInfo-subTitle' style={{ marginTop: '-7px' }}></div><h4>纠纷基本情况</h4> + </Space> + </Col> + <Row gutter={[16, 16]}> + {props.isDoc && + <> + <Col span={8}> + <div><div className="title-text">事项状态</div></div> + <div style={{ color: '#1A6FB8' }}>{props.data?.statusName || '-'}</div> + </Col> + <Col span={16}> + <div><div className="title-text">事项编号</div></div> + <div>{props.data?.caseRef || '-'}</div> + </Col> + </> + } + <Col span={8}> + <div className="title"> + <div className="title-text">事项等级</div> + </div> + <div style={{ display: 'flex' }}><div style={{ backgroundColor: levelColorMap[props.data?.caseLevel], marginRight: '4px', borderRadius: '4px' }}><div style={{ color: '#FFFFFF', padding: '0px 6px' }}>{props.data?.caseLevel || '-'}</div></div>级</div> + </Col> + <Col span={8}> + <div><div className="title-text">来访时间</div></div> + <div>{props.data?.visitTime || '-'}</div> + </Col> + <Col span={8}> + <div ><div className="title-text">来访人数(人)</div></div> + <div>{props.data?.visitPeopleNum || '-'}</div> + </Col> + <Col span={8}> + <div ><div className="title-text">纠纷类型</div></div> + <div> + {props.data?.caseTypeFirstName ? + `${props.data.caseTypeFirstName}/${props.data.caseTypeName}` + : '-' + } + </div> + </Col> + <Col span={8}> + <div ><div className="title-text">纠纷发生时间</div></div> + <div>{props.data?.occurTime || '-'}</div> + </Col> + <Col span={8}> + <div ><div className="title-text">纠纷发生地点</div></div> + <div>{props.data?.addr || '-'}</div> + </Col> + <Col span={8}> + <div ><div className="title-text">问题属地</div></div> + <div> + {props.data?.queAreaName ? `${props.data.queAreaName}/${props.data.queRoadName}` : '-' + } + </div> + </Col> + <Col span={8}> + <div ><div className="title-text">涉及人数(人)</div></div> + <div>{props.data?.peopleNum || '-'}</div> + </Col> + <Col span={8}> + <div ><div className="title-text">涉及金额(元)</div></div> + <div>{$$.thousands(props.data?.amount) || '-'}</div> + </Col> + <Col span={8}> + <div ><div className="title-text">事项来源</div></div> + <div>{props.data?.canalName}</div> + </Col> + <Col span={16}> + <div ><div className="title-text">来访形式</div></div> + <div>来访</div> + </Col> + <Col span={24}> + <div className="title"><div className="title-text">事项概况</div></div> + <div>{props.data?.caseDes || '-'} </div> + </Col> + <Col span={24}> + <div className="title"><div className="title-text">事项申请</div></div> + <div>{props.data?.caseClaim || '-'}</div> + </Col> + <Col span={16}> + <div className="title"><div className="title-text">是否重大矛盾纠纷</div></div> + <div>{props.data?.majorStatus === 1 ? '是' : '否'}</div> + </Col> + </Row> + {props.transactResult && <> + <Col span={24} style={{ display: 'flex', alignItems: 'center', marginBottom: '16px', marginTop: '20px' }}> + <Space size='small'> + <div className='MediationInfo-subTitle' style={{ marginTop: '-7px' }}></div><h4>办理结果</h4> + </Space> + </Col> + <table border="1" align="center" cellpadding="8" className="table" > + <tr> + <th bgcolor="#F7F8FA" className="table-title" width="120">化解结果</th> + <td width='380'>{props.transactResult.mediResultName || '-'}</td> + <th bgcolor="#F7F8FA" className="table-title" width="120">经办人</th> + <td width='380'>{props.transactResult.mediator || '-'}</td> + </tr> + <tr> + <th bgcolor="#F7F8FA" className="table-title">承办部门</th> + <td>{props.transactResult.mediateUnitName || '-'}</td> + <th bgcolor="#F7F8FA" className="table-title">配合部门</th> + <td>{props.transactResult.applyAssistUnitName || '-'}</td> + </tr> + <tr> + <th bgcolor="#F7F8FA" className="table-title" width="120">受理时间</th> + <td width='380'>{$$.minuteFormat(props.transactResult?.acceptTime) || '-'}</td> + <th bgcolor="#F7F8FA" className="table-title" width="120">办结时间</th> + <td width='380'>{$$.minuteFormat(props.transactResult?.closeTime) || '-'}</td> + </tr> + <tr> + <th bgcolor="#F7F8FA" className="table-title" width="120">办理意见</th> + <td width='380' colspan='3'>{props.transactResult?.windupContent || '-'}</td> + </tr> + <tr> + <th bgcolor="#F7F8FA" className="table-title" width="120">协议要点</th> + <td width='380' colspan='3'>{props.transactResult?.agreeContent || '-'}</td> + </tr> + <tr> + <th bgcolor="#F7F8FA" className="table-title" width="120">结案意见</th> + <td width='380' colspan='3'>{props.transactResult?.windupContent || '-'}</td> + </tr> + <tr> + <th bgcolor="#F7F8FA" className="table-title" width="120">协议文书</th> + <td colspan='3'> + {props.transactResult?.fileInfoBaseDTOList?.map((item, index) => { + console.log(item); + return <div style={{ display: 'inline-block' }}> + <PreviewImage name={item.name} src={item.showUrl} /> + {index !== props.transactResult?.fileInfoBaseDTOList.length - 1 && <>,</>} + </div> + })} + </td> + </tr> + </table> + </>} + <Col span={24} style={{ display: 'flex', alignItems: 'center', marginBottom: '8px', marginTop: '20px' }}> + <Space size='small'> + <div className='MediationInfo-subTitle' style={{ marginTop: '-7px' }}></div><h4>事件材料</h4> + </Space> + </Col> + <FileTable mainId={props.mainId} fileInfoList={props.data?.fileInfoList} isReview={true} /> + </div> + ) +} + +export default Preview \ No newline at end of file diff --git a/gz-customerSystem/src/views/register/visit/component/SelfVisitorRegister.jsx b/gz-customerSystem/src/views/register/visit/component/SelfVisitorRegister.jsx new file mode 100644 index 0000000..4bc0b21 --- /dev/null +++ b/gz-customerSystem/src/views/register/visit/component/SelfVisitorRegister.jsx @@ -0,0 +1,451 @@ +import React, { useState, useEffect, useRef } from "react"; +import { Row, Col, Space, Tooltip, Button } from 'antd'; +import { Form, Input, Radio, Select, DatePicker, Cascader, Modal, Upload, InputNumber } from '@arco-design/web-react'; +import PersonCard from '@/components/personCard'; +import * as $$ from '@/utils/utility'; +import { + question1, +} from '@/assets/images'; +import '../../index.less'; +import ApplyDialog from "./applyDialog"; +import AgentDialog from "./agentDialog"; +import MapView from './map'; +import { scan } from '@/assets/images/icon'; +import { EventLevelDrawer, MattersDetail } from './levelDetail'; +import DocumentScanner from '../../matterDetail/FileUpLoad'; +import FileTable from "../../matterDetail/FileTable"; + + +const RadioGroup = Radio.Group;// 根据调解案号获取纠纷登记信息 +const FormItem = Form.Item; +const InputSearch = Input.Search; + + +const VisitorRegister = (props) => { + const [dialogType, setDialogType] = useState();//添加当事人的类型 + const [addVisabled, setAddVisabled] = useState(false);//添加当事人弹窗控制 + const [fakeData, setFakeData] = useState([]);//当事人信息数据 + const [scanFile, setScanFile] = useState(false); + const [ocrText, setOcrText] = useState(''); + + const [mapView, setMapView] = useState(false); + const [visible, setVisible] = useState(false); + const [apply, setApply] = useState(false); + const [editData, setEditData] = useState(null); + const [agentVisible, setAgentVisible] = useState(false); + + const peopleMap = { + '15_020008-1': '申请方', + '15_020008-2': '被申请方', + '24_00006-1': '申请方代理人', + '24_00006-2': '被申请方代理人' + } + + useEffect(() => { + if (props.formRef.current) { + //引入当事人数据 + props.formRef.current.setFieldValue('fakeData', fakeData) + } + }, [fakeData]) + + useEffect(() => { + setFakeData(props.partyList || []) + }, [props.partyList]) + + //获取当前时间 + const getFormattedDateTime = () => { + let now = new Date(); + let year = now.getFullYear(); + let month = (now.getMonth() + 1).toString().padStart(2, '0'); // 月份是从0开始的,所以要+1 + let day = now.getDate().toString().padStart(2, '0'); + let hours = now.getHours().toString().padStart(2, '0'); + let minutes = now.getMinutes().toString().padStart(2, '0'); + + return `${year}-${month}-${day} ${hours}:${minutes}`; + } + + //添加当事人 + const handleAdd = (type) => { + if (type === '24_00006-1' || type === '24_00006-2') { + setAgentVisible(true) + } else { + setAddVisabled(true) + } + setDialogType(type) + } + + const handleConfirm = (scanContent) => { + // 处理确认逻辑 + props.formRef.current.setFieldValue(ocrText, scanContent) + setScanFile(false); + console.log(scanContent, 'scanContent') + + }; + + const handleCancel = () => { + // 处理取消逻辑 + setScanFile(false); + }; + + //添加当事人 + const handleAddParty = (value, isEdit) => { + console.log(value); + if (isEdit) { + //编辑 + const newList = fakeData.map(item => { + if (item.id === value.id) { + return value + } else { + return item + } + }) + setFakeData(newList) + setEditData(null) + } else { + setFakeData([...fakeData, { + ...value + }]) + } + } + + //删除当事人 + const handleDeleteParty = (event, value) => { + event.stopPropagation(); + const filterData = fakeData.filter(item => item.id !== value.id) + setFakeData(filterData) + } + + //编辑 + const handleEdit = (value) => { + if (value.perType === '15_020008-1' || value.perType === '15_020008-2') { + //当事人 + setAddVisabled(true) + } else { + //代理人 + setAgentVisible(true) + } + setDialogType(value.perType) + setEditData(value) + } + + return ( + <div className='dataSync-page' style={{ ...props.style, marginTop: '8px' }}> + <Col span={24} style={{ display: 'flex', alignItems: 'center' }}> + <Space size='small'> + <div className='MediationInfo-subTitle' style={{ marginTop: '-9px', }}></div><h4>当事人信息</h4> + </Space> + </Col> + <div style={{ margin: '16px 0' }}> + <PersonCard + isCheck={true} + data={fakeData} + handleAdd={handleAdd} + handleDeleteParty={handleDeleteParty} + handleEdit={handleEdit} + /> + </div> + <Col span={24} style={{ display: 'flex', alignItems: 'center', marginBottom: '8px' }}> + <Space size='small'> + <div className='MediationInfo-subTitle' style={{ marginTop: '-9px' }}></div><h4>纠纷基本情况</h4> + </Space> + </Col> + <Form + ref={props.formRef} + layout='vertical' + requiredSymbol={false} + scrollToFirstError={true} + initialValues={{ + caseLevel: 3, + occurTime: getFormattedDateTime(), + majorStatus: 0, + }}//默认值 + > + <Row gutter={[32, 0]}> + <Col span={8}> + <FormItem + label={<div style={{ display: 'flex' }}> + 事项等级 + <Tooltip onClick={() => setApply(true)}> + <img src={question1} alt="" style={{ width: '13px', height: '13px', margin: '4px 4px 0px 4px' }} /> + </Tooltip> + </div> + } + field='caseLevel' + > + <Select placeholder='请选择事项等级' allowClear options={$$.options.caseLevelList}> + </Select> + </FormItem> + </Col> + <Col span={8}> + <FormItem label='涉及人数(人)' field='peopleNum'> + <InputNumber placeholder='请填写' /> + </FormItem> + </Col> + <Col span={8}> + <FormItem label='涉及金额(元)' field='amount'> + <InputNumber placeholder='请填写' /> + </FormItem> + </Col> + <Col span={8}> + <FormItem + label={(<div style={{ display: 'flex' }}>纠纷类型<div className="must">必填</div></div>)} + rules={[{ message: '请选择纠纷类型', required: true }]} + field='myCaseType' + > + <Cascader + placeholder='请选择' + options={$$.caseTypeSelect.caseTypeSelect} + onChange={(value, option) => { + if (option) { + props.formRef.current.setFieldsValue({ + caseTypeFirst: option[0].value, + caseTypeFirstName: option[0].label, + caseType: option[1].value, + caseTypeName: option[1].label, + }) + } else { + //清除数据 + props.formRef.current.setFieldsValue({ + caseTypeFirst: undefined, + caseTypeFirstName: undefined, + caseType: undefined, + caseTypeName: undefined, + }) + } + }} + allowClear + /> + </FormItem> + </Col> + <Col span={8}> + <FormItem + label={(<div style={{ display: 'flex' }}>纠纷发生时间<div className="must">必填</div></div>)} + rules={[{ message: '请选择纠纷发生时间', required: true }]} + field='occurTime' + > + <DatePicker + style={{ width: '100%' }} + placeholder='请选择' + format='YYYY-MM-DD HH:mm' + showTime={true} + /> + </FormItem> + </Col> + <Col span={8}> + <FormItem + label={(<div style={{ display: 'flex' }}>纠纷发生地点<div className="must">必填</div></div>)} + rules={[{ message: '请选择纠纷发生地点', required: true }]} + field='addr' + > + <InputSearch + placeholder='选择纠纷发生地的详细地址' + searchButton='选择' + readOnly={true} // 设置为只读,防止直接编辑 + onSearch={() => setMapView(true)} + /> + </FormItem> + </Col> + <Col span={8}> + <FormItem + label={(<div style={{ display: 'flex' }}>问题属地<div className="must">必填</div></div>)} + field='myQuesAddress' + rules={[{ message: '请选择问题属地', required: true }]} + > + <Cascader + placeholder='请选择' + options={$$.locationOption()} + showSearch + onChange={(value, option) => { + if (option) { + console.log(option) + props.formRef.current.setFieldsValue({ + // queProv: option[0].value, + // queProvName: option[0].label, + // queCity: option[1].value, + // queCityName: option[1].label, + queArea: option[0].value, + queAreaName: option[0].label, + queRoad: option[1] && option[1].value || '', + queRoadName: option[1] && option[1].label || '', + }) + } else { + //清除数据 + props.formRef.current.setFieldsValue({ + queProv: undefined, + queProvName: undefined, + queCity: undefined, + queCityName: undefined, + queArea: undefined, + queAreaName: undefined, + queRoad: undefined, + queRoadName: undefined, + }) + } + }} + allowClear + /> + </FormItem> + </Col> + <Col span={24}> + <FormItem + label={<div style={{ display: 'flex' }}> + 事项概况 + <Tooltip onClick={() => setVisible(true)}> + <img src={question1} alt="" style={{ width: '13px', height: '13px', margin: '4px 4px 0px 4px' }} /> + </Tooltip> + <div className="must" style={{ marginLeft: '4px' }}>必填</div> + <img src={scan} alt="" style={{ marginRight: '-2px', marginLeft: '8px' }} /> + <div style={{ marginLeft: '8px', color: '#1A6FB8', fontSize: '14px', cursor: 'pointer' }} onClick={() => { setScanFile(true); setOcrText('caseDes') }}>识别材料</div> + </div> + } + field='caseDes' + rules={[{ message: '请填写事项概况', required: true }]} + > + <Input.TextArea + maxLength={2000} + showWordLimit + rows={5} + placeholder='请完整描述事项概况,应具备5要素:发生时间+发生地点+人物情况+事项起因+事项经过' + wrapperStyle={{ width: '100%' }} + /> + </FormItem> + </Col> + <Col span={24}> + <FormItem + label={<div style={{ display: 'flex' }}> + 申请请求 + {/* <Tooltip onClick={() => setApply(true)}> + <img src={question1} alt="" style={{ width: '13px', height: '13px', margin:'4px 4px 0px 4px' }} /> + </Tooltip> */} + <div className="must">必填</div> + <img src={scan} alt="" style={{ marginRight: '-2px', marginLeft: '8px' }} /> + <div style={{ marginLeft: '8px', color: '#1A6FB8', fontSize: '14px', cursor: 'pointer' }} onClick={() => { setScanFile(true); setOcrText('caseClaim') }}>识别材料</div> + </div> + } + field='caseClaim' + rules={[{ message: '请填写申请请求', required: true }]} + + > + <Input.TextArea + maxLength={2000} + showWordLimit + rows={5} + placeholder='希望相关部门如何处理,建议分条描述,如请求1,请求2...' + wrapperStyle={{ width: '100%' }} + /> + </FormItem> + </Col> + <div style={{ marginLeft: '16px', padding: '12px 16px', backgroundColor: '#F2F3F5', borderRadius: '2px', marginTop: '4px', display: 'flex', alignItems: 'center' }}> + <FormItem + label='是否重大矛盾纠纷' + style={{ width: '300px', marginBottom: 0 }} + field='majorStatus' + layout='horizontal' + labelCol={{ span: 11 }} + wrapperCol={{ span: 13 }} + > + <RadioGroup options={[{ value: 0, label: '否' }, { value: 1, label: '是' }]} /> + </FormItem> + </div> + </Row> + + </Form > + <Col span={24} style={{ display: 'flex', alignItems: 'center', marginBottom: '8px', marginTop: '20px' }}> + <Space size='small'> + <div className='MediationInfo-subTitle' style={{ marginTop: '-9px' }}></div><h4>事件材料</h4> + </Space> + </Col> + <div style={{ marginBottom: '65px' }}> + <FileTable + mainId={props.mainId} + fileInfoList={props.fileInfoList} + isReview={false} + handleSaveList={(list) => { + props.formRef.current.setFieldValue('fileInfoList', list) + }} + /> + </div> + <DocumentScanner + visible={scanFile} + onConfirm={handleConfirm} + onCancel={handleCancel} + /> + <Modal + title={(editData ? '修改' : '添加') + peopleMap[dialogType]} + visible={addVisabled} + onOk={() => setAddVisabled(false)} + onCancel={() => { + setAddVisabled(false) + setEditData(null) + }} + autoFocus={false} + focusLock={true} + footer={null} + unmountOnExit={true} + maskClosable={false} + > + <ApplyDialog + dialogType={dialogType} + onClose={() => setAddVisabled(false)} + handleAddParty={handleAddParty} + editData={editData} + mainId={props.mainId} + /> + </Modal> + <Modal + title={(editData ? '修改' : '添加') + peopleMap[dialogType]} + visible={agentVisible} + onOk={() => setAgentVisible(false)} + onCancel={() => { + setAgentVisible(false) + setEditData(null) + }} + autoFocus={false} + focusLock={true} + footer={null} + unmountOnExit={true} + maskClosable={false} + > + <AgentDialog + handleAddParty={handleAddParty} + onClose={() => setAgentVisible(false)} + fakeData={fakeData} + dialogType={dialogType} + editData={editData} + mainId={props.mainId} + /> + </Modal> + <Modal + style={{ width: '1200px' }} + visible={mapView} + onCancel={() => setMapView(false)} + footer={null} + title='选择纠纷发生地' + centered + unmountOnExit={true} + maskClosable={false} + > + <MapView + selectAdd={(data) => { + props.formRef.current.setFieldsValue({ + addr: data.addName, + lng: data.pt.lng, + lat: data.pt.lat, + }) + setMapView(false) + }} + /> + </Modal> + <MattersDetail + visible={visible} + onClose={() => setVisible(false)} + /> + <EventLevelDrawer + visible={apply} + onClose={() => setApply(false)} + /> + </div > + ) +} + +export default VisitorRegister; \ No newline at end of file diff --git a/gz-customerSystem/src/views/register/visit/index.jsx b/gz-customerSystem/src/views/register/visit/index.jsx index 0002a87..6783643 100644 --- a/gz-customerSystem/src/views/register/visit/index.jsx +++ b/gz-customerSystem/src/views/register/visit/index.jsx @@ -180,16 +180,28 @@ } function selfAcceptance() { - $$.modalInfo({ - title: '自行受理确认', - content: '确定自行受理吗?', - okText: '确定受理', - cancelText: '我再想想', - onOk: async () => { - setCurrent(3); - navigate(`mediate/visit/handleFeedback`, { replace: true }) - }, - }); + if (formRef.current) { + formRef.current.validate(undefined, (errors, values) => { + if (!errors) { + const { myCaseType, myQuesAddress, ...rest } = formRef.current.getFields() + const params = handleData(rest) + $$.modalInfo({ + title: '自行受理确认', + content: '确定自行受理吗?', + okText: '确定受理', + cancelText: '我再想想', + onOk: async () => { + reauestSubmit({ + ...params, + isSelfAccept: 1, + isDraft: 0, + operateType: 0, + }, true) + }, + }); + } + }); + } } //保存请求 @@ -201,12 +213,17 @@ } //提交请求 - const reauestSubmit = async (data) => { + const reauestSubmit = async (data, isSelfAccept) => { const response = await submitDispute(data) if (response.type) { - Message.success('提交成功!') - navigate(`/mediate/visit/visitWorkBench`, { replace: true }) - setCurrent(2) + if(isSelfAccept) { + //自行受理 + navigate(`/mediate/visit/handleFeedback?caseTaskId=${response.data}&caseId=${id}`) + } else { + Message.success('提交成功!') + navigate(`/mediate/visit/visitWorkBench`, { replace: true }) + setCurrent(2) + } } } diff --git a/gz-customerSystem/src/views/register/visit/preview.jsx b/gz-customerSystem/src/views/register/visit/preview.jsx index d908672..ff662fa 100644 --- a/gz-customerSystem/src/views/register/visit/preview.jsx +++ b/gz-customerSystem/src/views/register/visit/preview.jsx @@ -15,7 +15,12 @@ import PreviewImage from '@/components/PreviewImage'; const Preview = (props) => { - const [data, setData] = useState({}) + const [data, setData] = useState({}); + const levelColorMap = { + 1: '#F53F3F', + 2: '#EF6C24', + 3: '#00B42A', + } useEffect(() => { console.log(props.data); @@ -116,15 +121,21 @@ <div className="title"> <div className="title-text">事项等级</div> </div> - <div style={{ display: 'flex' }}><div style={{ backgroundColor: '#00B42A', marginRight: '4px', borderRadius: '4px' }}><div style={{ color: '#FFFFFF', padding: '0px 6px' }}>{props.data?.caseLevel || '-'}</div></div>级</div> + <div style={{ display: 'flex' }}> + <div style={{ backgroundColor: levelColorMap[props.data?.caseLevel], marginRight: '4px', borderRadius: '4px' }}> + <div style={{ color: '#FFFFFF', padding: '0px 6px' }}> + {props.data?.caseLevel || '-'} + </div> + </div>级 + </div> </Col> <Col span={8}> - <div><div className="title-text">来访时间</div></div> - <div>{props.data?.visitTime || '-'}</div> + <div><div className="title-text">事项来源</div></div> + <div>自行排查</div> </Col> <Col span={8}> - <div ><div className="title-text">来访人数(人)</div></div> - <div>{props.data?.visitPeopleNum || '-'}</div> + <div ><div className="title-text">来访形式</div></div> + <div>排查</div> </Col> <Col span={8}> <div ><div className="title-text">纠纷类型</div></div> @@ -146,9 +157,7 @@ <Col span={8}> <div ><div className="title-text">问题属地</div></div> <div> - {props.data?.queProvName ? - `${props.data.queCityName}/${props.data.queAreaName}/${props.data.queRoadName}` - : '-' + {props.data?.queAreaName ? `${props.data.queAreaName}/${props.data.queRoadName}` : '-' } </div> </Col> @@ -159,14 +168,6 @@ <Col span={8}> <div ><div className="title-text">涉及金额(元)</div></div> <div>{$$.thousands(props.data?.amount) || '-'}</div> - </Col> - <Col span={8}> - <div ><div className="title-text">事项来源</div></div> - <div>{props.data?.canalName}</div> - </Col> - <Col span={16}> - <div ><div className="title-text">来访形式</div></div> - <div>来访</div> </Col> <Col span={24}> <div className="title"><div className="title-text">事项概况</div></div> -- Gitblit v1.8.0