forked from gzzfw/frontEnd/gzDyh

liuwh
2024-09-17 5aa4a814ab8d4aa194a9683ebefaefdfc6d92c3a
Merge branch 'master' of http://120.79.193.119:9090/r/gzzfw/frontEnd/gzDyh into master
3 files added
21 files modified
1415 ■■■■ changed files
gz-customerSystem/public/locationSelect.js 10 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/api/appUrl.js 6 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/components/ArcoUpload/index.jsx 2 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/components/Layout/Header.jsx 16 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/components/Layout/index.jsx 21 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/components/ProgressStep/VisitStep.jsx 95 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/components/ProgressStep/index.less 26 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/components/personCard/DetailDialog.jsx 5 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/router/router.js 3 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/comprehensive/index.jsx 2 ●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/eventFlow/component/EscalationModel.jsx 30 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/eventFlow/component/EventFlow.jsx 2 ●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/handleFeedback/component/AuditView.jsx 3 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/handleFeedback/component/CaseResult.jsx 124 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/index.jsx 12 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/index.less 15 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/matterDetail/RateModule.jsx 4 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/matterDetail/UniteHandle.jsx 2 ●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/matterDetail/index.jsx 2 ●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/visit/SelfInspection.jsx 264 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/visit/SelfPreview.jsx 240 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/visit/component/SelfVisitorRegister.jsx 451 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/visit/index.jsx 45 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/visit/preview.jsx 35 ●●●● patch | view | raw | blame | history
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',
                                },
                                {
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 后面接附件编号
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
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>
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">
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>
                      }
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;
    }
}
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,
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 />} />
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> },
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
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}`)
            }
          },
        });
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')
    }
  }
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>
        }
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>
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 {
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">
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'
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 => {
gz-customerSystem/src/views/register/visit/SelfInspection.jsx
New file
@@ -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;
gz-customerSystem/src/views/register/visit/SelfPreview.jsx
New file
@@ -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
gz-customerSystem/src/views/register/visit/component/SelfVisitorRegister.jsx
New file
@@ -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;
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)
            }
        }
    }
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>