forked from gzzfw/frontEnd/gzDyh

zhangyongtian
2024-09-15 ae3833a1fc16bd3c9fd13f8301397e5835a9e49c
fix: 自行排查更改、流程组件完善
1 files added
7 files modified
562 ■■■■■ changed files
gz-customerSystem/src/components/ProgressStep/VisitStep.jsx 39 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/components/ProgressStep/index.less 11 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/index.less 13 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/visit/SelfInspection.jsx 6 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/visit/SelfPreview.jsx 9 ●●●● 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 2 ●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/visit/preview.jsx 31 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/components/ProgressStep/VisitStep.jsx
@@ -42,6 +42,27 @@
    setProType('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 &&
@@ -62,16 +83,18 @@
          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 === progressData[proType].length - 1 ? null : <div className='myStep-item-divider' />}
                </div>
                <div className="myStep-item-right">
                  {t === progressData[proType].length - 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 +119,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;
            }
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: '';
gz-customerSystem/src/views/register/visit/SelfInspection.jsx
@@ -6,7 +6,7 @@
import '../index.less';
import { Space } from 'antd';
import { Button, Steps, Message } from '@arco-design/web-react';
import VisitorRegister from './component/visitorRegister';
import VisitorRegister from './component/SelfVisitorRegister';
import Preview from './preview';
const Step = Steps.Step;
@@ -222,13 +222,13 @@
        <div style={{ position: 'relative' }}>
            <NewPage
                pageHead={
                    { breadcrumbData: [{ title: '工作台' }, { title: '来访登记' }], title: '来访登记' }
                    { 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 />
gz-customerSystem/src/views/register/visit/SelfPreview.jsx
@@ -7,7 +7,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);
@@ -108,7 +113,7 @@
          <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>
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
@@ -218,7 +218,7 @@
        if (response.type) {
            if(isSelfAccept) {
                //自行受理
                navigate(`mediate/visit/handleFeedback?caseTaskId=${response.data}&caseId=${id}`)
                navigate(`/mediate/visit/handleFeedback?caseTaskId=${response.data}&caseId=${id}`)
            } else {
                Message.success('提交成功!')
                navigate(`/mediate/visit/visitWorkBench`, { replace: true })
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>
@@ -157,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>