forked from gzzfw/frontEnd/gzDyh

dminyi
2024-08-13 5985afbb3372881cf867ed32eed5bec8434e8182
来访登记
15 files added
12 files modified
1974 ■■■■ changed files
gz-customerSystem/package-lock.json 23 ●●●●● patch | view | raw | blame | history
gz-customerSystem/package.json 3 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/api/appUrl.js 10 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/assets/images/add.png patch | view | raw | blame | history
gz-customerSystem/src/assets/images/del.png patch | view | raw | blame | history
gz-customerSystem/src/assets/images/index.js 15 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/assets/images/process.png patch | view | raw | blame | history
gz-customerSystem/src/assets/images/question.png patch | view | raw | blame | history
gz-customerSystem/src/assets/images/question1.png patch | view | raw | blame | history
gz-customerSystem/src/components/MyTabs/index.jsx 4 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/components/NewPage/PageHead.jsx 85 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/components/NewPage/index.jsx 38 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/components/NewPage/index.less 45 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/components/Search/index.jsx 160 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/components/Search/index.less 16 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/components/personCard/index.jsx 85 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/components/registerTab/index.jsx 47 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/components/registerTab/index.less 72 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/router/router.js 8 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/styles/public.less 166 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/basicInformation/organization/index copy.jsx 386 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/basicInformation/organization/index.jsx 722 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/basicInformation/organization/index.less 36 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/dispatch/mediateList/index.jsx 4 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/mediate/judicialExamine/index.jsx 4 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/visit/index.jsx 18 ●●●●● patch | view | raw | blame | history
gz-customerSystem/yarn.lock 27 ●●●● patch | view | raw | blame | history
gz-customerSystem/package-lock.json
@@ -33,6 +33,9 @@
        "react-scripts": "5.0.0",
        "react-virtual": "^2.10.4",
        "web-vitals": "^2.1.4"
      },
      "devDependencies": {
        "@arco-plugins/vite-react": "^1.3.3"
      }
    },
    "node_modules/@adobe/css-tools": {
@@ -1194,6 +1197,26 @@
      "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.11.tgz",
      "integrity": "sha512-uUnglJowSe0IPmWOdDtrlHXof5CTIJitfJEyITHBW6zDVOGu9Pjk5puaLM73SLcwak0L4hEjO7Td88/a6P5i7A=="
    },
    "node_modules/@arco-plugins/vite-react": {
      "version": "1.3.3",
      "resolved": "https://registry.npmmirror.com/@arco-plugins/vite-react/-/vite-react-1.3.3.tgz",
      "integrity": "sha512-fcGh/69xKGqIjMdIw6NCqst4uWME/WTYjiC6AxHbKBmeYSONazBYd+KtEDx9Be2N0pF4+sk+MGUDy3mrF13EdA==",
      "dev": true,
      "dependencies": {
        "@babel/generator": "^7.12.11",
        "@babel/helper-module-imports": "^7.12.5",
        "@babel/parser": "^7.12.11",
        "@babel/traverse": "^7.12.12",
        "@babel/types": "^7.12.12",
        "@types/node": "^16.11.10"
      }
    },
    "node_modules/@arco-plugins/vite-react/node_modules/@types/node": {
      "version": "16.18.105",
      "resolved": "https://registry.npmmirror.com/@types/node/-/node-16.18.105.tgz",
      "integrity": "sha512-w2d0Z9yMk07uH3+Cx0N8lqFyi3yjXZxlbYappPj+AsOlT02OyxyiuNoNHdGt6EuiSm8Wtgp2YV7vWg+GMFrvFA==",
      "dev": true
    },
    "node_modules/@babel/code-frame": {
      "version": "7.24.7",
      "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.24.7.tgz",
gz-customerSystem/package.json
@@ -53,5 +53,8 @@
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "devDependencies": {
    "@arco-plugins/vite-react": "^1.3.3"
  }
}
gz-customerSystem/src/api/appUrl.js
@@ -2,19 +2,21 @@
 * @Company: hugeInfo
 * @Author: ldh
 * @Date: 2022-02-16 11:25:57
 * @LastEditTime: 2024-08-09 14:57:35
 * @LastEditTime: 2024-08-12 09:26:56
 * @LastEditors: dminyi 1301963064@qq.com
 * @Version: 1.0.0
 * @Description: api地址
 */
export const debug = {
    // web服务
    // baseUrl: 'http://gz.hugeinfo.com.cn',
    baseUrl: 'http://192.168.3.108:9002',
    baseUrl: 'http://gz.hugeinfo.com.cn',
    // baseUrl: 'http://192.168.3.108:9002',
    // baseUrl: 'http://mdqgnh.natappfree.cc',
    // 附件服务
    fileUrl: 'http://192.168.3.108:9002',
    // fileUrl: 'http://192.168.3.108:9002',
    fileUrl: 'http://gz.hugeinfo.com.cn',
    // 文件查看url 后面接附件编号
    fileShowUrl: '/dyh-sys/api/v1/fileInfo/show/',
gz-customerSystem/src/assets/images/add.png
gz-customerSystem/src/assets/images/del.png
gz-customerSystem/src/assets/images/index.js
@@ -2,7 +2,7 @@
 * @Company: hugeInfo
 * @Author: lwh
 * @Date: 2023-04-24 16:12:00
 * @LastEditTime: 2023-12-12 11:49:04
 * @LastEditTime: 2024-08-12 19:40:06
 * @LastEditors: dminyi 1301963064@qq.com
 * @Version: 1.0.0
 * @Description:
@@ -28,7 +28,11 @@
import mediateBigData_8 from './mediateBigData_8.png';
import caseDetail from './caseDetail.png';
import caseDetailResult from './caseDetailResult.png';
import process from './process.png';
import add from './add.png';
import del from './del.png';
import question from './question.png';
import question1 from './question1.png';
export {
    ledger_1,
@@ -51,5 +55,10 @@
    mediateBigData_7,
    mediateBigData_8,
    caseDetail,
    caseDetailResult
    caseDetailResult,
    process,
    add,
    del,
    question,
    question1
};
gz-customerSystem/src/assets/images/process.png
gz-customerSystem/src/assets/images/question.png
gz-customerSystem/src/assets/images/question1.png
gz-customerSystem/src/components/MyTabs/index.jsx
@@ -2,8 +2,8 @@
 * @Company: hugeInfo
 * @Author: ldh
 * @Date: 2022-07-08 18:27:18
 * @LastEditTime: 2022-07-21 14:21:33
 * @LastEditors: ldh
 * @LastEditTime: 2024-08-10 10:12:34
 * @LastEditors: dminyi 1301963064@qq.com
 * @Version: 1.0.0
 * @Description:
 */
gz-customerSystem/src/components/NewPage/PageHead.jsx
New file
@@ -0,0 +1,85 @@
/*
 * @Company: hugeInfo
 * @Author: ldh
 * @Date: 2022-02-16 15:23:40
 * @LastEditTime: 2024-08-10 09:53:57
 * @LastEditors: dminyi 1301963064@qq.com
 * @Version: 1.0.0
 * @Description: 面包屑
 */
import React from 'react';
import PropTypes from 'prop-types';
import { useNavigate } from 'react-router-dom';
import { Breadcrumb, Button, Tooltip, Space } from 'antd';
import { BulbOutlined, LeftCircleOutlined } from '@ant-design/icons';
import sopStatus from '../../status/sopStatus';
/*
 * fromType, // 来源页面str
 * breadcrumbData, // 面包屑数据[{url:'返回链接',click:'返回的操作',title:''}]
 * title, // 页面标题
 * subtitle, // 页面说明
 * titleButton, // 页面标题右侧功能按钮集
 * handleReturn, // 退回操作,是否有退回
 * sopVisible, // 是否展示sop
 */
const PageHead = ({ fromType, breadcrumbData = [], title, subtitle, titleButton = [], handleReturn, sopVisible, background }) => {
    const navigate = useNavigate();
    return (
        <div className="pagNewHead" style={{ backgroundColor: background === 'none' && 'transparent' }}>
            <div style={{ paddingTop: '8px' }}>
                {breadcrumbData.length !== 0 && (
                    <Breadcrumb className="pagNewHead-breadcrumb">
                        {breadcrumbData.map((x, t) => {
                            return x.url ? (
                                <Breadcrumb.Item key={x.title}>
                                    <span onClick={() => navigate(`${x.url}?isBack=true`, { replace: true })} className="pagNewHead-breadcrumb-item">
                                        {x.title}
                                    </span>
                                </Breadcrumb.Item>
                            ) : x.click ? (
                                <Breadcrumb.Item className="pagNewHead-breadcrumb-item" onClick={x.click} key={x.title}>
                                    {x.title}
                                </Breadcrumb.Item>
                            ) : (
                                <Breadcrumb.Item key={x.title}>{x.title}</Breadcrumb.Item>
                            );
                        })}
                    </Breadcrumb>
                )}
                <div className="pagNewHead-title">
                    {handleReturn && (
                        <Tooltip title="返回">
                            <LeftCircleOutlined style={{ marginRight: '8px', fontSize: '18px' }} className="public-color" onClick={handleReturn} />
                        </Tooltip>
                    )}
                    <span className={fromType === 'caseDetail' ? 'pagNewHead-title-detailH' : 'pagNewHead-title-h'}>{title}</span>
                </div>
                {!!subtitle && <div className="pagNewHead-subtitle">{subtitle}</div>}
            </div>
            <Space size="middle">
                {titleButton.map((x, t) => (
                    <div key={t}>{x}</div>
                ))}
                {/* {sopVisible && (
                    <Button onClick={sopStatus.handleVisible} icon={<BulbOutlined />}>
                        IDR助手
                    </Button>
                )} */}
            </Space>
        </div>
    );
};
PageHead.propTypes = {
    fromType: PropTypes.string,
    breadcrumbData: PropTypes.array,
    title: PropTypes.string,
    subtitle: PropTypes.any,
    titleButton: PropTypes.any,
    handleReturn: PropTypes.func,
    sopVisible: PropTypes.bool,
};
export default PageHead;
gz-customerSystem/src/components/NewPage/index.jsx
New file
@@ -0,0 +1,38 @@
/*
 * @Company: hugeInfo
 * @Author: ldh
 * @Date: 2022-03-04 14:29:11
 * @LastEditTime: 2022-08-05 09:45:54
 * @LastEditors: ldh
 * @Version: 1.0.0
 * @Description: 页面框架
 */
import React from 'react';
import PropTypes from 'prop-types';
import PageHead from './PageHead';
import './index.less';
import * as $$ from '../../utils/utility';
import RegisterChooseModal from '../RegisterChooseModal';
const NewPage = ({ children, pageHead, registerChooseModalVisible }) => {
    if (!$$.getSessionStorage('customerSystemToken')) {
        $$.catchApiError({ content: '抱歉!登录状态已失效请重新登录', loginStatus: 'lose' });
        return null;
    }
    return (
        <>
            {!!pageHead && <PageHead {...pageHead} />}
            {children}
            {/* 纠纷登录入口modal */}
            {!!registerChooseModalVisible && <RegisterChooseModal visible={registerChooseModalVisible} />}
        </>
    );
};
NewPage.propTypes = {
    pageHead: PropTypes.any,
    registerChooseModalVisible: PropTypes.any,
};
export default NewPage;
gz-customerSystem/src/components/NewPage/index.less
New file
@@ -0,0 +1,45 @@
@import '../../styles/theme.less';
.pagNewHead {
    width: 100%;
    padding: 0 16px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    .pagNewHead-breadcrumb {
        margin-bottom: 8px;
        &-item {
            cursor: pointer;
            &:hover {
                color: @main-color;
            }
        }
    }
    &-title {
        margin-bottom: 12px;
        display: flex;
        align-items: center;
        &-detailH {
            font-weight: 600;
        }
        &-h {
            font-weight: 600;
            font-size: 20px;
            line-height: 28px;
        }
    }
    &-subtitle {
        margin-bottom: 8px;
    }
    .ant-tabs-ink-bar {
        width: 28px !important;
    }
}
gz-customerSystem/src/components/Search/index.jsx
New file
@@ -0,0 +1,160 @@
/*
 * @Company: hugeInfo
 * @Author: ldh
 * @Date: 2022-03-16 11:58:56
 * @LastEditTime: 2024-08-10 16:13:06
 * @LastEditors: dminyi 1301963064@qq.com
 * @Version: 1.0.0
 * @Description: 公有页面的搜索
 */
import React, { useState } from 'react';
import PropTypes from 'prop-types';
import { Form, Button, TreeSelect, } from 'antd';
import { Grid, Input, Select, DatePicker } from '@arco-design/web-react';
import "@arco-design/web-react/dist/css/arco.css";
import { DownOutlined } from '@ant-design/icons';
import * as $$ from '../../utils/utility';
import './index.less';
const { RangePicker } = DatePicker;
// const { Option } = Select;
const Row = Grid.Row;
const Col = Grid.Col;
const Option = Select.Option;
/**
 * form, // form组件
 * itemData, // 搜索的数据数组
 * labelLength, // form的label标签字符串的长度
 * rowNum, // 一行放多少个搜索item
 * handleRest, // 重置
 * handleSearch, // 搜索
 */
const TableSearch = ({ form, itemData, labelLength = 5, rowNum = 3, handleReset, handleSearch }) => {
  const [searchMore, setSearchMore] = useState(false);
  const span = 24 / rowNum;
  let display = false;
  // 是否需要展开 or 收起
  const lineNum = rowNum * 2;
  if (itemData.length > lineNum) display = true;
  // 系统字体大小
  const fontSize = parseInt(getComputedStyle(window.document.getElementsByTagName('HTML')[0]).fontSize);
  // 输出placeholder
  function setPlaceholder(key, type) {
    let str = '';
    switch (key) {
      case 'caseNo':
        str = '输入查询案号';
        break;
      case 'judicNo':
        str = '输入查询司法确认案号';
        break;
      case 'plaintiffs':
        str = '申请方当事人/代理人姓名';
        break;
      case 'defendants':
        str = '被申请方当事人/代理人姓名';
        break;
      case 'addr':
        str = '输入纠纷发生详细地址的关键词';
        break;
      default:
        str = type === 'Select' ? '全部' : '请输入';
        break;
    }
    return str;
  }
  return (
    <Form form={form} labelAlign="right" className="tableSearch">
      <Row gutter={[24, 16]}>
        {itemData.map((x, t) => {
          let placeholder = x.placeholder || setPlaceholder(x.name, x.type);
          let allowClear = x.allowClear || true;
          let dom = null;
          let rules = {};
          if (x.type === 'Input') {
            dom = <Input placeholder={placeholder} allowClear {...x} />;
            rules = { max: x.max || 32, message: '搜索内容过长' };
          }
          if (x.type === 'Select') {
            dom = (
              <Select allowClear placeholder={placeholder} {...x}>
                {x.selectdata?.map((y) => (
                  <Option key={y.value}>{y.label}</Option>
                ))}
              </Select>
            );
          }
          if (x.type === 'RangePicker') {
            rules = { type: 'array' };
            dom = (
              <DatePicker.RangePicker
                style={{ width: '100%' }}
                ranges={{
                  '今日': [$$.myMoment(), $$.myMoment()],
                  '本月': [$$.myMoment().startOf('month'), $$.myMoment().endOf('month')],
                }}
                allowClear
                {...x}
              />
            );
          }
          if (x.type === 'TreeSelect') {
            dom = (
              <TreeSelect
                showSearch
                placeholder={placeholder}
                dropdownStyle={{ maxHeight: 500, overflow: 'auto' }}
                treeData={x.treedata}
                treeDefaultExpandAll
                allowClear
                filterTreeNode={(inputValue, treeNode) => (treeNode.label.indexOf(inputValue) !== -1 ? true : false)}
                {...x}
              />
            );
          }
          return (
            <Col span={span} style={display && { display: searchMore ? 'block' : t < lineNum ? 'block' : 'none' }} key={t + 1}>
              <Form.Item name={x.name} rules={[rules]} label={<div style={{ width: `${fontSize * labelLength}px` }}>{x.label}</div>}>
                {dom}
              </Form.Item>
            </Col>
          );
        })}
      </Row>
      <Row style={{ marginTop: '16px' }}>
        <Col span={24} style={{ textAlign: 'right' }}>
          <Button className="public-buttonMargin" onClick={handleReset}>
            重置
          </Button>
          <Button type="primary" htmlType="submit" onClick={handleSearch}>
            查询
          </Button>
          {display && (
            <span className="tableSearch-searchMore" onClick={() => setSearchMore(!searchMore)}>
              {!searchMore ? '展开' : '折叠'}
              <DownOutlined className={`tableSearch-searchMore-icon ${searchMore && 'tableSearch-searchMore-iconRotate'}`} />
            </span>
          )}
        </Col>
      </Row>
    </Form>
  );
};
TableSearch.propTypes = {
  itemData: PropTypes.array,
  labelLength: PropTypes.number,
  rowNum: PropTypes.number,
  handleReset: PropTypes.func,
  handleSearch: PropTypes.func,
};
export default TableSearch;
gz-customerSystem/src/components/Search/index.less
New file
@@ -0,0 +1,16 @@
@import '../../styles/theme.less';
// 查看更多
.tableSearch-searchMore {
    color: @main-color;
    margin-left: 16px;
    cursor: pointer;
    &-icon {
        transition: transform 0.3s;
    }
    &-iconRotate {
        transform: rotate(180deg);
    }
}
gz-customerSystem/src/components/personCard/index.jsx
New file
@@ -0,0 +1,85 @@
/*
 * @Author: dminyi 1301963064@qq.com
 * @Date: 2024-08-10 15:03:57
 * @LastEditors: dminyi 1301963064@qq.com
 * @LastEditTime: 2024-08-12 14:45:28
 * @FilePath: \gzDyh\gz-customerSystem\src\components\personCard\index.jsx
 * @Description: 来访登记当事人卡片
 */
import React from 'react';
import PropTypes from 'prop-types';
import { Typography, Row, Col, Space } from 'antd';
import { del } from '../../assets/images';
const { Link, Text } = Typography;
/**
 * isCheck, // 是否无操作
 * partyType, // applicant:申请人, respondent:被申请人
 * data, // 当事人数据
 * handleCheckParty, // 点击查看详情
 * handleDeleteParty, // 删除当事人
 */
const PersonCard = ({ isCheck, partyType, data, handleCheckParty, handleDeleteParty }) => {
    const remark = [{ label: '精神障碍', color: '#C64FBE' }, { label: '吸毒', color: '#D8A247' }, { label: '社区矫正', color: '#B82F6E' }, { label: '刑满释放', color: '#199C8F' }, { label: '流浪', color: '#3ECB7A' }, { label: '重点青少年', color: '#117AC1' }, { label: '涉稳涉访', color: '#6865D7' }, { label: '潜在风险', color: '#2661CE' }]
    return (
        <Row gutter={[24, 16]}>
            {data.map((x, t) => (
                <Col span={8} key={t}>
                    <div className="public-personCard" style={{ cursor: 'pointer' }}>
                        <div
                            className={`public-personCard-card public-personCard-card-${partyType === 'applicant' ? 'blue' : 'orange'}`}
                            onClick={() => handleCheckParty({ type: partyType, editType: 'check', values: x })}
                        >
                            {x.trueName.substr(0, 1)}
                            <div className="public-personCard-card-check">查看</div>
                            <img src={del} alt='' style={{ width: '16px', height: '16px', position: 'absolute', top: '-8px', left: '56px' }} />
                        </div>
                        <div className="public-personCard-content">
                            <div className="public-personCard-title">
                                <Text style={{ maxWidth: '80%', paddingRight: '8px' }} ellipsis={{ tooltip: x.trueName }}>
                                    {x.trueName}
                                </Text>
                                <div className={`public-personCard-tag public-personCard-tag-${partyType === 'applicant' ? 'blue' : 'orange'}`}>
                                    {x.perClassName}
                                </div>
                            </div>
                            {
                                x.person &&
                                <>
                                    <div>证件号码:{x.mobile}</div>
                                    <div>联系方式:{x.agentStatus === '2' ? '有' : '无'}</div>
                                </>
                            }
                            {x.company &&
                                <>
                                    <div>统一社会信用代码:{x.mobile}</div>
                                    <div>法定代表人:{x.agentStatus === '2' ? '有' : '无'}</div>
                                </>
                            }
                            {x.Respondent &&
                                <Space style={{ display: 'flex', flexWrap: 'wrap' }}>
                                    {remark.map((item, index) => (
                                        <div key={index} style={{ lineHeight: '22px', padding: '0px 8px', backgroundColor: `${item.color}`, width: 'fit-content', borderRadius: '4px', marginTop: '4px' }}>{item.label}</div>
                                    ))}
                                </Space>
                            }
                        </div>
                    </div>
                </Col>
            ))}
        </Row>
    );
};
PersonCard.propTypes = {
    isCheck: PropTypes.bool,
    partyType: PropTypes.string,
    data: PropTypes.array,
    handleCheckParty: PropTypes.func,
    handleDeleteParty: PropTypes.func,
};
export default PersonCard;
gz-customerSystem/src/components/registerTab/index.jsx
New file
@@ -0,0 +1,47 @@
/*
 * @Author: dminyi 1301963064@qq.com
 * @Date: 2024-08-10 10:08:15
 * @LastEditors: dminyi 1301963064@qq.com
 * @LastEditTime: 2024-08-10 12:01:33
 * @FilePath: \gzDyh\gz-customerSystem\src\components\registerTab\index.jsx
 * @Description: 来访登记tab
 */
import React from 'react';
import PropTypes from 'prop-types';
import { Space } from 'antd';
import { process } from '../../assets/images';
import './index.less';
const RegisterTab = ({ tabs, activeKey, style, onChange, keyStr = ['key', 'label'], border = false, img1 }) => {
    return (
        <div className={`registerTab ${border ? 'registerTab-border' : ''}`} style={style}>
            <div style={{ width: '100%', display: 'flex' }} >
                {tabs.map((x, t) => {
                    return (
                        <div
                            onClick={() => onChange(x[keyStr[0]])}
                            key={x[keyStr[0]]}
                            className={`registerTab-tab ${activeKey === x[keyStr[0]] ? 'registerTab-active' : ''}`}
                        >
                            <div style={{ display: 'flex' }}>
                                <div className='registerTab-tab-number' style={{ backgroundColor: activeKey === x[keyStr[0]] ? '#1A6FB8' : '#F2F3F5' }}><div className='registerTab-tab-number-inner' style={{ color: activeKey === x[keyStr[0]] ? '#ffff' : '' }}>{x[keyStr[0]]}</div></div>
                                <div style={{color:'#1D2129',fontSize:'16px'}}>{x[keyStr[1]]}</div>
                                {!x.img1 && <img src={process} alt='' className='img' />}
                            </div>
                        </div>
                    );
                })}
            </div>
        </div>
    );
};
RegisterTab.propTypes = {
    tabs: PropTypes.array,
    activeKey: PropTypes.any,
    style: PropTypes.object,
    onChange: PropTypes.func,
    keyStr: PropTypes.array,
};
export default RegisterTab;
gz-customerSystem/src/components/registerTab/index.less
New file
@@ -0,0 +1,72 @@
@import '../../styles/theme.less';
.registerTab {
    padding: 16px 0px 18px 0px;
    color: @text-color-secondary;
    margin: 0px 16px;
    &-border {
        position: relative;
        &::after {
            content: '';
            position: absolute;
            left: 0;
            right: 0;
            bottom: 10px;
            height: 1px;
            background-color: @divider-color;
        }
    }
    &-tab {
        cursor: pointer;
        display: flex;
        align-items: center;
        flex: 1 1 0%;
        display: flex;
        justify-content: center;
        position: relative;
        &:hover {
            color: @main-color;
        }
        &-number {
            border-radius: 32px;
            margin-right: 8px;
            &-inner{
                margin: 0px 9px;
                font-size: 16px;
                line-height: 24px;
            }
        }
    }
    &-active {
        position: relative;
        color: @main-color;
        flex: 1 1 0%;
        display: flex;
        justify-content: center;
        &::after {
            content: '';
            height: 2px;
            width: 116px;
            background-color: @main-color;
            position: absolute;
            left: 36%;
            margin-left: -11px;
            bottom: -18px;
        }
    }
}
.img{
    width: 20px;
    position: absolute;
    right: 0px;
    top: 3px;
}
gz-customerSystem/src/router/router.js
@@ -2,7 +2,7 @@
 * @Company: hugeInfo
 * @Author: ldh
 * @Date: 2022-03-28 11:22:41
 * @LastEditTime: 2023-12-25 16:24:22
 * @LastEditTime: 2024-08-09 15:56:47
 * @LastEditors: dminyi 1301963064@qq.com
 * @Version: 1.0.0
 * @Description: 路由
@@ -134,6 +134,9 @@
// 数据分析
import DataSearch from "../views/statistic/dataSearch";
//来访登记
import Visit from "../views/register/visit"
import Test from "../views/test";
const Routers = () => {
@@ -204,6 +207,8 @@
                        <Route path="judicialDivision/judicialDivisionDetail" element={<JudicialDivisionDetail />} />
                        <Route path="myConfirmation" element={<MyConfirmation />} />
                        <Route path="judicialOverview" element={<JudicialOverview />} />
                        {/* 来访登记*/}
                        <Route path="visit" element={<Visit />} />
                        {/* 工作流模块 */}
                        <Route path="workflowTemplate" element={<WorkflowTemplate />} />
                        <Route path="workflowTemplate/workflowTemplateEdit" element={<WorkflowTemplateEdit />} />
@@ -216,6 +221,7 @@
                        <Route path="myAdjust/mediationWindowSuccess" element={<MediationWindowSuccess />} />
                    </Route>
                    <Route path="/operation" element={<Navigate to="/operation/personnel" />} />
                    {/* 基础信息管理 */}
                    <Route path="/operation" element={<Layout headerUserChange={headerUserChange} />}>
gz-customerSystem/src/styles/public.less
@@ -505,6 +505,172 @@
    }
}
//来访登记当事人
.public-personCard {
    display: flex;
    padding: 8px;
    &-card {
        position: relative;
        width: 66px;
        height: 66px;
        border-radius: 10px;
        font-size: 30px;
        line-height: 66px;
        text-align: center;
        color: #ffffff;
        margin-right: 16px;
        &-blue {
            background: @main-color;
            .public-personCard-card-check,
            .public-personCard-card-bottomRight {
                color: #1890ff;
            }
        }
        &-orange {
            background: linear-gradient(135deg, #ff5500, rgba(255, 85, 0, 0.65) 100%);
            .public-personCard-card-check,
            .public-personCard-card-bottomRight {
                color: #ff5500;
            }
        }
        &:hover {
            .public-personCard-card-check {
                height: 32px;
            }
        }
        &-check {
            position: absolute;
            bottom: 0;
            width: 100%;
            font-size: 12px;
            height: 0;
            transition: height 0.5s;
            line-height: 32px;
            text-align: center;
            background-color: rgba(255, 255, 255, 0.9);
            overflow: hidden;
        }
        &-bottomRight {
            position: absolute;
            bottom: 0;
            right: 0;
            background-color: rgba(255, 255, 255, 0.9);
            overflow: hidden;
            height: 18px;
            font-size: 12px;
            line-height: 14px;
            border-top-left-radius: 10px;
            padding: 2px 4px;
        }
    }
    &-card-mini {
        position: relative;
        width: 24px;
        height: 24px;
        border-radius: 5px;
        font-size: 12px;
        line-height: 24px;
        text-align: center;
        color: #ffffff;
        &-blue {
            background: linear-gradient(138deg, #1890ff 0%, rgba(24, 144, 255, 0.75) 100%);
            .public-personCard-card-check,
            .public-personCard-card-bottomRight {
                color: #1890ff;
            }
        }
        &-orange {
            background: linear-gradient(135deg, #ff5500, rgba(255, 85, 0, 0.65) 100%);
            .public-personCard-card-check,
            .public-personCard-card-bottomRight {
                color: #ff5500;
            }
        }
        &:hover {
            .public-personCard-card-check {
                height: 32px;
            }
        }
        &-check {
            position: absolute;
            bottom: 0;
            width: 100%;
            font-size: 12px;
            height: 0;
            transition: height 0.5s;
            line-height: 32px;
            text-align: center;
            background-color: rgba(255, 255, 255, 0.9);
            overflow: hidden;
        }
        &-bottomRight {
            position: absolute;
            bottom: 0;
            right: 0;
            background-color: rgba(255, 255, 255, 0.9);
            overflow: hidden;
            height: 18px;
            font-size: 12px;
            line-height: 14px;
            border-top-left-radius: 10px;
            padding: 2px 4px;
        }
    }
    &-content {
        flex: 1;
        overflow: hidden;
    }
    &-title {
        display: flex;
        align-items: center;
    }
    &-tag {
        font-size: 12px;
        line-height: 20px;
        border-radius: 2px;
        padding: 0 4px;
        display: flex;
        align-items: center;
        &-blue {
            background: #e6f7ff;
            color: #1890ff;
            border: 1px solid #91d5ff;
        }
        &-grey {
            background: #fafafa;
            color: rgba(0, 0, 0, 0.85);
            border: 1px solid #d9d9d9;
        }
        &-orange {
            background: #fff2e8;
            color: #fa541c;
            border: 1px solid #ffbb96;
        }
    }
}
// 警告颜色
.public-danger {
    color: @error-color;
gz-customerSystem/src/views/basicInformation/organization/index copy.jsx
New file
@@ -0,0 +1,386 @@
/*
 * @Company: hugeInfo
 * @Author: ldh
 * @Date: 2022-02-18 15:04:13
 * @LastEditTime: 2024-08-06 15:57:16
 * @LastEditors: dminyi 1301963064@qq.com
 * @Version: 1.0.0
 * @Description: 组织架构
 */
import React, { useState, useEffect } from 'react';
import { Input, Menu, Tooltip, Space } from 'antd';
import { ReloadOutlined } from '@ant-design/icons';
import Page from '../../../components/Page';
import { AddOrEditOrganization, DepartmentTable, PersonnelModal, AddOrEditDept } from '../../../components/basicInformation/organization';
import MyTree from '../../../components/MyTree';
import * as $$ from '../../../utils/utility';
const { Search } = Input;
// 查询人员信息
function getPersonsApi(data) {
    return $$.ax.request({ url: 'ctUser/pageQuery', type: 'get', data, service: 'cust' });
}
// 获取组织结构
function getOrganizationApi() {
    return $$.ax.request({ url: 'ctUnit/listUnitTree', type: 'get', service: 'cust' });
}
// 新增 or 修改组织
function setOrganizationApi(data) {
    return $$.ax.request({ url: 'ctUnit/saveCtUnit', type: 'post', data, service: 'cust' });
}
// 删除组织
function delOrganizationApi(id) {
    return $$.ax.request({ url: `ctUnit/removeByIds?ids=${id}`, type: 'get', service: 'cust' });
}
// 获取部门详情
function getDepartmentDataApi(organizationId) {
    return $$.ax.request({ url: `ctUnit/getUnitAndDept?id=${organizationId}`, type: 'get', service: 'cust' });
}
// 新增 or 修改部门
function setDeptApi(data) {
    return $$.ax.request({ url: 'ctDept/saveCtDept', type: 'post', data, service: 'cust' });
}
// 删除部门
function delDeptApi(deptId) {
    return $$.ax.request({ url: `ctDept/removeByIds?ids=${deptId}`, type: 'get', service: 'cust' });
}
const Organization = () => {
    // 是否是新增 or 修改组织
    const [isAddOrEdit, setIsAddOrEdit] = useState(false);
    // 是否新增 or 修改部门
    const [isAddOrEditDept, setIsAddOrEditDept] = useState(false);
    // 查看人员modal
    const [modalData, setModalData] = useState({ visible: false, title: '', data: [], total: 0 });
    // 组织数据
    const [organizationData, setOrganizationData] = useState([]);
    // 当前选择组织
    const [organizationActive, setOrganizationActive] = useState({});
    // 新增 or 修改组织数据
    const [organizationEditData, setOrganizationEditData] = useState({ active: {} });
    // 新增 or 修改部门数据
    const [deptEditData, setDeptEditData] = useState({});
    // 组织查询
    const [organizationSearch, setOrganizationSearch] = useState({ value: '', searchValue: '' });
    // 当前选择组织下的部门数据
    const [departmentData, setDepartmentData] = useState([]);
    // 选择组织
    function handleOrganization(value) {
        getDepartmentData({ organizationId: value.id });
    }
    // 组织查询
    function handleSearchOrganization(value) {
        setOrganizationSearch({ ...organizationSearch, searchValue: value });
    }
    // 点击删除组织
    async function handleDelOrganization(value) {
        if (value.children && value.children.length > 0) {
            $$.info({ type: 'warning', content: '该组织下存在下级组织, 不支持删除! 请先清空下级组织' });
            return false;
        }
        let visible = false;
        const res = await getDepartmentDataApi(value.id);
        if (res.type) {
            if (res.data.countCtDept) {
                $$.info({ type: 'warning', content: '该组织下存在部门, 不支持删除! 请先清空部门' });
                visible = true;
            }
        }
        if (!visible) {
            $$.modalInfo({
                content: `确认删除${value.name}吗?`,
                onOk: () => delOrganization({ organizationId: value.id }),
            });
        }
    }
    // 查看部门人员 or 关闭modal
    function handlePersonnelModal(record, visible) {
        if (visible) {
            getPersons({ unitId: record.unitId, deptId: record.id, page: 1, size: 10 }, record.name);
        } else {
            setModalData({ visible });
        }
    }
    // 获取人员信息
    async function getPersons(submitData, title) {
        global.setSpinning(true);
        const res = await getPersonsApi(submitData);
        global.setSpinning(false);
        if (res.type) {
            let resData = res.data || {};
            setModalData({
                visible: true,
                title: title || modalData.title,
                data: resData.ctUserPage?.content,
                total: resData.ctUserPage?.totalElements,
                search: { page: submitData.page, size: submitData.size, unitId: submitData.unitId, deptId: submitData.deptId },
            });
        }
    }
    // 获取组织数据
    async function getOrganization(firstLoading, reset) {
        global.setSpinning(true);
        const res = await getOrganizationApi();
        global.setSpinning(false);
        if (res.type) {
            let data = res.data || [],
                active = {};
                console.log(data, 'data');
            if (data.length > 0 && (firstLoading || reset)) {
                active = data[0];
            }
            setOrganizationData(data);
            if (data.length > 0) {
                if (firstLoading || reset) {
                    setOrganizationSearch({ value: '', searchValue: '' });
                }
                getDepartmentData({ organizationId: active.id ? active.id : organizationActive.id });
            }
        }
    }
    // 新增 or 修改组织
    async function setOrganization(submitType, values, form) {
        global.setSpinning(true);
        let data = {
            ...organizationEditData.active,
            ...values,
            id: organizationEditData.type === 'change' ? organizationEditData.active.id : '',
            parentId:
                organizationEditData.type === 'change'
                    ? organizationEditData.active.parentId
                    : organizationEditData.type === 'upAdd'
                    ? ''
                    : organizationEditData.active.id,
            childId: organizationEditData.type === 'upAdd' ? organizationEditData.active.id : '',
        };
        let submitData = data.id ? { ...organizationActive.active, ...data } : data;
        const res = await setOrganizationApi(submitData);
        global.setSpinning(false);
        if (res.type) {
            $$.infoSuccess({ content: '操作成功' });
            if (submitType === '1') {
                setIsAddOrEdit(false);
            } else {
                form.resetFields();
            }
            getOrganization();
        }
    }
    // 删除组织
    async function delOrganization({ organizationId }) {
        global.setSpinning(true);
        const res = await delOrganizationApi(organizationId);
        global.setSpinning(false);
        if (res.type) {
            $$.infoSuccess({ content: '删除成功!' });
            if (organizationId === organizationActive.id) {
                getOrganization('', 'reset');
            } else {
                getOrganization();
            }
        }
    }
    // 获取部门详情
    async function getDepartmentData({ organizationId }) {
        global.setSpinning(true);
        const res = await getDepartmentDataApi(organizationId);
        global.setSpinning(false);
        if (res.type) {
            setOrganizationActive(res.data);
            setDepartmentData(res.data.ctDepts || []);
        }
    }
    // 新增 or 修改部门
    async function setDept(submitType, values, form) {
        let submitData = {
            ...deptEditData,
            ...values,
            unitId: organizationActive.id,
            id: deptEditData.id === 'addOneDept' || deptEditData.id === 'addSubordinateDept' ? '' : deptEditData.id,
            parentId: deptEditData.id === 'addOneDept' ? '' : deptEditData.parentId,
        };
    global.setSpinning(true);
        const res = await setDeptApi(submitData);
        global.setSpinning(false);
        if (res.type) {
            $$.infoSuccess({ content: '操作成功' });
            if (submitType === '1') {
                setIsAddOrEditDept(false);
            } else {
                form.resetFields();
            }
            getDepartmentData({ organizationId: organizationActive.id });
        }
    }
    // 删除部门
    async function delDept({ deptId }) {
        global.setSpinning(true);
        const res = await delDeptApi(deptId);
        global.setSpinning(false);
        if (res.type) {
            $$.infoSuccess({ content: '删除成功' });
            getDepartmentData({ organizationId: organizationActive.id });
        }
    }
    useEffect(() => {
        getOrganization('firstLoading');
    }, []);
    // 组织操作
    const dropdownOptions = ({ num, value }) => (
        <Menu
            onClick={({ key }) => {
                console.log(key, value,'key','value')
                if (key === 'delete') {
                    handleDelOrganization(value);
                } else {
                    setOrganizationEditData({ type: key, active: value });
                    setIsAddOrEdit(true);
                }
            }}
        >
            {num === 1 && <Menu.Item key="upAdd">新增上级组织</Menu.Item>}
            <Menu.Item key="downAdd">新增下级组织</Menu.Item>
            <Menu.Item key="change">修改</Menu.Item>
            {num !== 1 && <Menu.Item key="delete">删除</Menu.Item>}
        </Menu>
    );
    function addOrEditBreadcrumb() {
        console.log('111111')
        let obj = isAddOrEdit
            ? {
                    title: organizationEditData.type === 'change' ? '修改组织' : organizationEditData.type === 'upAdd' ? '新增上级组织' : '新增下级组织',
              }
            : {
                    title: isAddOrEditDept === 'changeDept' ? '修改部门' : isAddOrEditDept === 'addOneDept' ? '新增部门' : '新增下级部门',
              };
        return {
            breadcrumbData: [
                { title: '基础信息管理' },
                {
                    title: '组织架构',
                    click: () => {
                        setIsAddOrEdit(false);
                        setIsAddOrEditDept(false);
                    },
                },
                obj,
            ],
            title:
                isAddOrEditDept === 'addSubordinateDept' || isAddOrEditDept === 'changeDept'
                    ? deptEditData.name
                    : isAddOrEditDept
                    ? organizationActive.name
                    : organizationEditData.active.name,
            handleReturn: () => {
                setIsAddOrEdit(false);
                setIsAddOrEditDept(false);
            },
        };
    }
    return (
        <Page
            pageHead={
                isAddOrEdit || isAddOrEditDept
                    ? addOrEditBreadcrumb()
                    : { breadcrumbData: [{ title: '基础信息管理' }, { title: '组织架构' }], title: '组织架构' }
            }
        >
            <div style={{ display: isAddOrEdit || isAddOrEditDept ? 'none' : '' }} className="organization">
                <div className="organization-bg">
                    <div className="organization-side">
                        <Space size="middle" className="organization-side-search">
                            <Search
                                placeholder="请搜索组织"
                                value={organizationSearch.value}
                                onChange={(e) => setOrganizationSearch({ ...organizationSearch, value: e.target.value })}
                                onSearch={handleSearchOrganization}
                            />
                            <Tooltip title="刷新">
                                <ReloadOutlined style={{ fontSize: 16 }} className="public-a" onClick={() => getOrganization('', 'reset')} />
                            </Tooltip>
                        </Space>
                        <div className="organization-side-tree">
                            {organizationData.length > 0 ? (
                                <MyTree
                                    active={organizationActive.id}
                                    keyStr="id"
                                    nameStr="name"
                                    data={organizationData}
                                    searchValue={organizationSearch.searchValue}
                                    dropdownOption={dropdownOptions}
                                    isChildren={true}
                                    handleClickTreeNode={handleOrganization}
                                />
                            ) : (
                                $$.MyEmpty({ description: '抱歉!暂无组织数据,请先添加组织', style: { margin: '50px auto' } })
                            )}
                        </div>
                    </div>
                    <div className="organization-divider"></div>
                    {organizationData.length > 0 ? (
                        <DepartmentTable
                            organizationActive={organizationActive}
                            departmentData={departmentData}
                            handlePersonnelModal={handlePersonnelModal}
                            handleChangeIsAddOrEdit={(type, record) => {
                                setIsAddOrEditDept(type);
                                setDeptEditData(record || {});
                            }}
                            handleDelDept={delDept}
                        />
                    ) : (
                        $$.MyEmpty({ description: '抱歉!暂无组织数据,请先添加组织', style: { margin: '100px auto' } })
                    )}
                </div>
            </div>
            {/* 新增 or 修改组织page */}
            <AddOrEditOrganization
                isAddOrEdit={isAddOrEdit}
                type={organizationEditData.type}
                organizationActive={organizationEditData.active}
                handleFinishForm={setOrganization}
            />
            {/* 新增 or 修改部门page */}
            <AddOrEditDept
                isAddOrEditDept={isAddOrEditDept}
                deptActive={deptEditData}
                unMatchUsers={organizationActive.unMatchUsers || []}
                handleFinishForm={setDept}
            />
            {/*  查看人员Modal */}
            {modalData.visible && <PersonnelModal modalData={modalData} handlePersonnelModal={handlePersonnelModal} handleSearch={getPersons} />}
        </Page>
    );
};
export default Organization;
gz-customerSystem/src/views/basicInformation/organization/index.jsx
@@ -1,386 +1,400 @@
/*
 * @Company: hugeInfo
 * @Author: ldh
 * @Date: 2022-02-18 15:04:13
 * @LastEditTime: 2024-08-06 15:57:16
 * @Author: dminyi 1301963064@qq.com
 * @Date: 2024-08-09 09:59:43
 * @LastEditors: dminyi 1301963064@qq.com
 * @Version: 1.0.0
 * @Description: 组织架构
 * @LastEditTime: 2024-08-12 20:30:15
 * @FilePath: \gzDyh\gz-customerSystem\src\views\basicInformation\organization\index.jsx
 * @Description: 来访登记
 */
import React, { useState, useEffect } from 'react';
import { Input, Menu, Tooltip, Space } from 'antd';
import { ReloadOutlined } from '@ant-design/icons';
import Page from '../../../components/Page';
import { AddOrEditOrganization, DepartmentTable, PersonnelModal, AddOrEditDept } from '../../../components/basicInformation/organization';
import MyTree from '../../../components/MyTree';
import React, { useState, useEffect } from "react";
import NewPage from '../../../components/NewPage';
import RegisterTab from '../../../components/registerTab';
import PersonCard from '../../../components/personCard';
import * as $$ from '../../../utils/utility';
import { add, question1 } from '../../../assets/images';
import { Row, Col, Space, Tooltip } from 'antd';
import { Form, Input, Button, Radio, Select, DatePicker, Cascader } from '@arco-design/web-react';
import "@arco-design/web-react/dist/css/arco.css";
import TableView from '../../../components/TableView';
const { Search } = Input;
const RadioGroup = Radio.Group;// 根据调解案号获取纠纷登记信息
const FormItem = Form.Item;
const Option = Select.Option;
const InputSearch = Input.Search;
// 查询人员信息
function getPersonsApi(data) {
    return $$.ax.request({ url: 'ctUser/pageQuery', type: 'get', data, service: 'cust' });
function getCaseDataApi(submitData) {
    return $$.ax.request({ url: `caseInfo/getCaseInfo?id=${submitData}`, type: 'get', service: 'mediate' });
}
// 获取组织结构
function getOrganizationApi() {
    return $$.ax.request({ url: 'ctUnit/listUnitTree', type: 'get', service: 'cust' });
}
// 新增 or 修改组织
function setOrganizationApi(data) {
    return $$.ax.request({ url: 'ctUnit/saveCtUnit', type: 'post', data, service: 'cust' });
}
// 删除组织
function delOrganizationApi(id) {
    return $$.ax.request({ url: `ctUnit/removeByIds?ids=${id}`, type: 'get', service: 'cust' });
}
// 获取部门详情
function getDepartmentDataApi(organizationId) {
    return $$.ax.request({ url: `ctUnit/getUnitAndDept?id=${organizationId}`, type: 'get', service: 'cust' });
}
// 新增 or 修改部门
function setDeptApi(data) {
    return $$.ax.request({ url: 'ctDept/saveCtDept', type: 'post', data, service: 'cust' });
}
// 删除部门
function delDeptApi(deptId) {
    return $$.ax.request({ url: `ctDept/removeByIds?ids=${deptId}`, type: 'get', service: 'cust' });
}
const Organization = () => {
    // 是否是新增 or 修改组织
    const [isAddOrEdit, setIsAddOrEdit] = useState(false);
    // 是否新增 or 修改部门
    const [isAddOrEditDept, setIsAddOrEditDept] = useState(false);
    // 查看人员modal
    const [modalData, setModalData] = useState({ visible: false, title: '', data: [], total: 0 });
    // tabs当前选择的标签信息
    const [tabsActive, setTabsActive] = useState('1');
    const [visible, setVisible] = useState(false);
    const [selectedCity, setSelectedCity] = useState('Beijing');
    // 组织数据
    const [organizationData, setOrganizationData] = useState([]);
    const tabs = [
        { label: '事件登记', key: '1' },
        { label: '事件流转', key: '2' },
        { label: '办理反馈', key: '3' },
        { label: '申请结案', key: '4' },
        { label: '当事人评价', key: '5' },
        { label: '结案归档', key: '6', img1: true },
    // 当前选择组织
    const [organizationActive, setOrganizationActive] = useState({});
    ];
    // 新增 or 修改组织数据
    const [organizationEditData, setOrganizationEditData] = useState({ active: {} });
    // 新增 or 修改部门数据
    const [deptEditData, setDeptEditData] = useState({});
    const fakeData = [
        {
            id: 3,
            perClassName: '申请方当事人',
            trueName: '蓝海科技有限公司',
            mobile: '13800000002',
            agentStatus: '1', // 无代理人
            company: true
        },
        {
            id: 1,
            perClassName: '申请方代理人',
            trueName: '王小明',
            mobile: '13800000001',
            agentStatus: '2', // 有代理人
            person: true
        },
        {
            id: 2,
            perClassName: '被申请方当事人',
            trueName: '蓝海科技有限公司',
            mobile: '13800000002',
            agentStatus: '1', // 无代理人
            person: true,
            Respondent: true
        },
    // 组织查询
    const [organizationSearch, setOrganizationSearch] = useState({ value: '', searchValue: '' });
    ];
    // 当前选择组织下的部门数据
    const [departmentData, setDepartmentData] = useState([]);
    const fakeData1 = [
        {
            id: 1,
            caseNo: 'A20230101',
            judicNo: 'J20230101',
            perClassName: '自然人',
            inputUserName: '张三',
            mediateUserName: '李四',
            judgeName: '王五',
            mediator: '赵六',
            handlerUserName: '钱七',
            returnUserName: '孙八',
            expireTime: '2023-08-10T08:00:00.000Z',
            processName: '进行中',
            otherMediator: '周九',
            canalName: '网络',
            judicResult: '通过',
            assistName: '吴十',
            mediTypeName: '民事调解',
            serieStatus: '1', // 1 表示非系列案,2 表示系列案
            // 更多字段...
        },
        // 更多数据...
    ];
    // 选择组织
    function handleOrganization(value) {
        getDepartmentData({ organizationId: value.id });
    }
    // 列配置
    const fakeColumns = [
        {
            title: '序号',
            dataIndex: 'caseNo',
            key: 'caseNo',
        },
        {
            title: '材料类型',
            dataIndex: 'judicNo',
            key: 'judicNo',
        },
        {
            title: '材料数量',
            dataIndex: 'perClassName',
            key: 'perClassName',
        },
        {
            title: '材料名称',
            dataIndex: 'perClassName',
            key: 'perClassName',
        },
        {
            title: '上传时间',
            dataIndex: 'perClassName',
            key: 'perClassName',
        },
        {
            title: '操作',
            dataIndex: 'perClassName',
            key: 'perClassName',
            render: (text) => (
                <div style={{ display: 'flex', color: '#1A6FB8', gap: '16px' }}>
                    <div>查看</div>
                    <div>删除</div>
                    <div>下载</div>
                    <div>上传</div>
                </div>
            )
        },
        // 更多列配置...
    ];
    // 组织查询
    function handleSearchOrganization(value) {
        setOrganizationSearch({ ...organizationSearch, searchValue: value });
    }
    // 点击删除组织
    async function handleDelOrganization(value) {
        if (value.children && value.children.length > 0) {
            $$.info({ type: 'warning', content: '该组织下存在下级组织, 不支持删除! 请先清空下级组织' });
            return false;
        }
        let visible = false;
        const res = await getDepartmentDataApi(value.id);
        if (res.type) {
            if (res.data.countCtDept) {
                $$.info({ type: 'warning', content: '该组织下存在部门, 不支持删除! 请先清空部门' });
                visible = true;
            }
        }
        if (!visible) {
            $$.modalInfo({
                content: `确认删除${value.name}吗?`,
                onOk: () => delOrganization({ organizationId: value.id }),
            });
        }
    }
    // 查看部门人员 or 关闭modal
    function handlePersonnelModal(record, visible) {
        if (visible) {
            getPersons({ unitId: record.unitId, deptId: record.id, page: 1, size: 10 }, record.name);
        } else {
            setModalData({ visible });
        }
    }
    // 获取人员信息
    async function getPersons(submitData, title) {
        global.setSpinning(true);
        const res = await getPersonsApi(submitData);
        global.setSpinning(false);
        if (res.type) {
            let resData = res.data || {};
            setModalData({
                visible: true,
                title: title || modalData.title,
                data: resData.ctUserPage?.content,
                total: resData.ctUserPage?.totalElements,
                search: { page: submitData.page, size: submitData.size, unitId: submitData.unitId, deptId: submitData.deptId },
            });
        }
    }
    // 获取组织数据
    async function getOrganization(firstLoading, reset) {
        global.setSpinning(true);
        const res = await getOrganizationApi();
        global.setSpinning(false);
        if (res.type) {
            let data = res.data || [],
                active = {};
                console.log(data, 'data');
            if (data.length > 0 && (firstLoading || reset)) {
                active = data[0];
            }
            setOrganizationData(data);
            if (data.length > 0) {
                if (firstLoading || reset) {
                    setOrganizationSearch({ value: '', searchValue: '' });
                }
                getDepartmentData({ organizationId: active.id ? active.id : organizationActive.id });
            }
        }
    }
    // 新增 or 修改组织
    async function setOrganization(submitType, values, form) {
        global.setSpinning(true);
        let data = {
            ...organizationEditData.active,
            ...values,
            id: organizationEditData.type === 'change' ? organizationEditData.active.id : '',
            parentId:
                organizationEditData.type === 'change'
                    ? organizationEditData.active.parentId
                    : organizationEditData.type === 'upAdd'
                    ? ''
                    : organizationEditData.active.id,
            childId: organizationEditData.type === 'upAdd' ? organizationEditData.active.id : '',
        };
        let submitData = data.id ? { ...organizationActive.active, ...data } : data;
        const res = await setOrganizationApi(submitData);
        global.setSpinning(false);
        if (res.type) {
            $$.infoSuccess({ content: '操作成功' });
            if (submitType === '1') {
                setIsAddOrEdit(false);
            } else {
                form.resetFields();
            }
            getOrganization();
        }
    }
    // 删除组织
    async function delOrganization({ organizationId }) {
        global.setSpinning(true);
        const res = await delOrganizationApi(organizationId);
        global.setSpinning(false);
        if (res.type) {
            $$.infoSuccess({ content: '删除成功!' });
            if (organizationId === organizationActive.id) {
                getOrganization('', 'reset');
            } else {
                getOrganization();
            }
        }
    }
    // 获取部门详情
    async function getDepartmentData({ organizationId }) {
        global.setSpinning(true);
        const res = await getDepartmentDataApi(organizationId);
        global.setSpinning(false);
        if (res.type) {
            setOrganizationActive(res.data);
            setDepartmentData(res.data.ctDepts || []);
        }
    }
    // 新增 or 修改部门
    async function setDept(submitType, values, form) {
        let submitData = {
            ...deptEditData,
            ...values,
            unitId: organizationActive.id,
            id: deptEditData.id === 'addOneDept' || deptEditData.id === 'addSubordinateDept' ? '' : deptEditData.id,
            parentId: deptEditData.id === 'addOneDept' ? '' : deptEditData.parentId,
        };
    global.setSpinning(true);
        const res = await setDeptApi(submitData);
        global.setSpinning(false);
        if (res.type) {
            $$.infoSuccess({ content: '操作成功' });
            if (submitType === '1') {
                setIsAddOrEditDept(false);
            } else {
                form.resetFields();
            }
            getDepartmentData({ organizationId: organizationActive.id });
        }
    }
    // 删除部门
    async function delDept({ deptId }) {
        global.setSpinning(true);
        const res = await delDeptApi(deptId);
        global.setSpinning(false);
        if (res.type) {
            $$.infoSuccess({ content: '删除成功' });
            getDepartmentData({ organizationId: organizationActive.id });
        }
    }
    useEffect(() => {
        getOrganization('firstLoading');
    }, []);
    // 组织操作
    const dropdownOptions = ({ num, value }) => (
        <Menu
            onClick={({ key }) => {
                console.log(key, value,'key','value')
                if (key === 'delete') {
                    handleDelOrganization(value);
                } else {
                    setOrganizationEditData({ type: key, active: value });
                    setIsAddOrEdit(true);
                }
            }}
        >
            {num === 1 && <Menu.Item key="upAdd">新增上级组织</Menu.Item>}
            <Menu.Item key="downAdd">新增下级组织</Menu.Item>
            <Menu.Item key="change">修改</Menu.Item>
            {num !== 1 && <Menu.Item key="delete">删除</Menu.Item>}
        </Menu>
    );
    function addOrEditBreadcrumb() {
        console.log('111111')
        let obj = isAddOrEdit
            ? {
                    title: organizationEditData.type === 'change' ? '修改组织' : organizationEditData.type === 'upAdd' ? '新增上级组织' : '新增下级组织',
              }
            : {
                    title: isAddOrEditDept === 'changeDept' ? '修改部门' : isAddOrEditDept === 'addOneDept' ? '新增部门' : '新增下级部门',
              };
        return {
            breadcrumbData: [
                { title: '基础信息管理' },
    const options = [
        {
            value: 'beijing',
            label: 'Beijing',
            children: [
                {
                    title: '组织架构',
                    click: () => {
                        setIsAddOrEdit(false);
                        setIsAddOrEditDept(false);
                    },
                    value: 'Beijing',
                    label: 'Beijing',
                    children: [
                        {
                            value: 'chaoyang',
                            label: 'Chaoyang',
                        },
                    ],
                },
                obj,
            ],
            title:
                isAddOrEditDept === 'addSubordinateDept' || isAddOrEditDept === 'changeDept'
                    ? deptEditData.name
                    : isAddOrEditDept
                    ? organizationActive.name
                    : organizationEditData.active.name,
            handleReturn: () => {
                setIsAddOrEdit(false);
                setIsAddOrEditDept(false);
            },
        };
        },
        {
            value: 'shanghai',
            label: 'Shanghai',
            children: [
                {
                    value: 'shanghaishi',
                    label: 'Shanghai',
                    children: [
                        {
                            value: 'huangpu',
                            label: 'Huangpu',
                        },
                    ],
                },
            ],
        },
    ];
    function onSelect(dateString, date) {
        console.log('onSelect', dateString, date);
    }
    function onChange(dateString, date) {
        console.log('onChange: ', dateString, date);
    }
    function onOk(dateString, date) {
        console.log('onOk: ', dateString, date);
    }
    function handleCheckParty() {
        console.log('check party');
    }
    const onReload = () => {
        console.log('表格数据刷新');
    };
    return (
        <Page
            pageHead={
                isAddOrEdit || isAddOrEditDept
                    ? addOrEditBreadcrumb()
                    : { breadcrumbData: [{ title: '基础信息管理' }, { title: '组织架构' }], title: '组织架构' }
            }
        >
            <div style={{ display: isAddOrEdit || isAddOrEditDept ? 'none' : '' }} className="organization">
                <div className="organization-bg">
                    <div className="organization-side">
                        <Space size="middle" className="organization-side-search">
                            <Search
                                placeholder="请搜索组织"
                                value={organizationSearch.value}
                                onChange={(e) => setOrganizationSearch({ ...organizationSearch, value: e.target.value })}
                                onSearch={handleSearchOrganization}
                            />
                            <Tooltip title="刷新">
                                <ReloadOutlined style={{ fontSize: 16 }} className="public-a" onClick={() => getOrganization('', 'reset')} />
                            </Tooltip>
                        </Space>
                        <div className="organization-side-tree">
                            {organizationData.length > 0 ? (
                                <MyTree
                                    active={organizationActive.id}
                                    keyStr="id"
                                    nameStr="name"
                                    data={organizationData}
                                    searchValue={organizationSearch.searchValue}
                                    dropdownOption={dropdownOptions}
                                    isChildren={true}
                                    handleClickTreeNode={handleOrganization}
        <div style={{ position: 'relative' }}>
            <NewPage
                pageHead={
                    { breadcrumbData: [{ title: '工作台' }, { title: '来访登记' }], title: '来访登记' }
                }
            >
                <RegisterTab tabs={tabs} activeKey={tabsActive} onChange={(activeKey) => setTabsActive(activeKey)} style={{ background: '#fff' }} />
                {tabsActive === '1' &&
                    <div style={{ backgroundColor: '#fff', margin: '8px 16px 0px 16px', padding: '12px 16px 16px 16px' }}>
                        <Col span={24} style={{ display: 'flex', alignItems: 'center' }}>
                            <Space size='small'>
                                <div className='MediationInfo-subTitle' style={{ marginTop: '-6px' }}></div><h5>当事人信息</h5>
                            </Space>
                        </Col>
                        <div style={{ display: 'flex' }}>
                            <div style={{ flex: 3 }}>
                                <PersonCard
                                    isCheck={true}
                                    partyType={'applicant'} // 这里设定为申请人
                                    data={fakeData}
                                    handleCheckParty={handleCheckParty}
                                />
                            ) : (
                                $$.MyEmpty({ description: '抱歉!暂无组织数据,请先添加组织', style: { margin: '50px auto' } })
                            )}
                            </div>
                            <div style={{ flex: 1, }}>
                                <Tooltip
                                    title={(<Space direction='vertical '><div style={{ backgroundColor: '#1A6FB8', padding: '5px 12px', display: 'flex', justifyContent: 'center' }}>申请方</div><div style={{ backgroundColor: '#FA8C16', padding: '5px 12px', display: 'flex', justifyContent: 'center' }}>被申请方</div><div style={{ backgroundColor: '#3491FA', padding: '5px 12px', display: 'flex', justifyContent: 'center' }}>代理人</div></Space>)}
                                    placement="right" color='#ffff' overlayStyle={{}}>
                                    <div onClick={() => setVisible(true)} style={{ backgroundColor: '#E5E6EB', borderRadius: '50%', width: '64px', height: '64px' }}>
                                        <img src={add} alt="添加" style={{ width: '32px', margin: '16px' }} />
                                    </div>
                                </Tooltip>
                            </div>
                        </div>
                        <Col span={24} style={{ display: 'flex', alignItems: 'center', marginBottom: '8px' }}>
                            <Space size='small'>
                                <div className='MediationInfo-subTitle' style={{ marginTop: '-6px' }}></div><h5>纠纷基本情况</h5>
                            </Space>
                        </Col>
                        <Form
                            layout='vertical'
                        >
                            <Row gutter={[32, 0]}>
                                <Col span={8}>
                                    <FormItem label='事项等级' field='username' tooltip={<div className='question'>Username is required </div>} >
                                        <Select defaultValue='三级' placeholder='Select city' allowClear>
                                            {['一级', '二级', '三级', '四级'].map((option, index) => (
                                                <Option key={option} value={option}>
                                                    {option}
                                                </Option>
                                            ))}
                                        </Select>
                                    </FormItem>
                                </Col>
                                <Col span={8}>
                                    <FormItem label='来访时间' >
                                        <DatePicker
                                            style={{ width: '100%' }}
                                            format='YYYY-MM-DD HH:mm'
                                            onChange={onChange}
                                            onSelect={onSelect}
                                            onOk={onOk}
                                        />
                                    </FormItem>
                                </Col>
                                <Col span={8}>
                                    <FormItem label='来访人数(人)'>
                                        <Input placeholder='请填写' />
                                    </FormItem>
                                </Col>
                                <Col span={8}>
                                    <FormItem
                                        label={(<div style={{ display: 'flex' }}>纠纷类型<div className="must">必填</div></div>)}>
                                        <Select initialValue='Beijing' placeholder='请选择' allowClear>
                                            {['邻里纠纷', '劳动争议纠纷', '劳动纠纷', '经济纠纷'].map((option, index) => (
                                                <Option key={option} value={option}>
                                                    {option}
                                                </Option>
                                            ))}
                                        </Select>
                                    </FormItem>
                                </Col>
                                <Col span={8}>
                                    <FormItem label={(<div style={{ display: 'flex' }}>纠纷发生时间<div className="must">必填</div></div>)}>
                                        <DatePicker
                                            style={{ width: '100%' }}
                                            placeholder='请选择'
                                            format='YYYY-MM-DD HH:mm'
                                            onChange={onChange}
                                            onSelect={onSelect}
                                            onOk={onOk}
                                        />
                                    </FormItem>
                                </Col>
                                <Col span={8}>
                                    <FormItem label={(<div style={{ display: 'flex' }}>纠纷发生地点<div className="must">必填</div></div>)}>
                                        <InputSearch
                                            searchButton='选择'
                                            defaultValue='Search content'
                                            placeholder='选择纠纷发生地的详细地址'
                                        />
                                    </FormItem>
                                </Col>
                                <Col span={8}>
                                    <FormItem label='问题属地'>
                                        <Cascader
                                            placeholder='Please select ...'
                                            options={options}
                                            onChange={(value, option) => {
                                                console.log(value, option);
                                            }}
                                            defaultValue={['shanghai', 'shanghaishi', 'huangpu']}
                                            allowClear
                                        />
                                    </FormItem>
                                </Col>
                                <Col span={8}>
                                    <FormItem label='涉及人数(人)'>
                                        <Input placeholder='请填写' />
                                    </FormItem>
                                </Col>
                                <Col span={8}>
                                    <FormItem label='涉及金额(元)'>
                                        <Input placeholder='请填写' />
                                    </FormItem>
                                </Col>
                                <Col span={24}>
                                    <FormItem
                                        label={<div style={{ display: 'flex' }}>事项概况<Tooltip title='1111'><img src={question1} alt="" style={{ width: '13px', height: '13px', marginTop: '4px', marginLeft: '4px' }} /></Tooltip><div className="must">必填</div><div style={{ marginLeft: '8px', color: '#1A6FB8', fontSize: '14px' }}>识别上传材料</div></div>}
                                    >
                                        <Input.TextArea
                                            maxLength={2000}
                                            showWordLimit
                                            rows={5}
                                            placeholder='请填写问题发生的起因、过程和结果'
                                            wrapperStyle={{ width: '100%' }}
                                        />
                                    </FormItem>
                                </Col>
                                <Col span={24}>
                                    <FormItem
                                        label={<div style={{ display: 'flex' }}>申请请求<Tooltip title='1111'><img src={question1} alt="" style={{ width: '13px', height: '13px', marginTop: '4px', marginLeft: '4px' }} /></Tooltip><div className="must">必填</div><div style={{ marginLeft: '8px', color: '#1A6FB8', fontSize: '14px' }}>识别上传材料</div></div>}
                                    >
                                        <Input.TextArea
                                            maxLength={2000}
                                            showWordLimit
                                            rows={5}
                                            placeholder='希望相关部门如何处理,建议分条描述,如请求1,请求2...'
                                            wrapperStyle={{ width: '100%' }}
                                        />
                                    </FormItem>
                                </Col>
                                <div style={{ marginLeft: '16px', padding: '12px 16px', backgroundColor: '#EFF8FF', borderRadius: '2px' }}>
                                    <FormItem label='是否重大矛盾纠纷' style={{ marginBottom: '-20px' }}>
                                        <RadioGroup options={['A', 'B']} style={{ marginBottom: 20 }} />
                                    </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: '-6px' }}></div><h5>事件材料</h5>
                            </Space>
                        </Col>
                        <TableView
                            columns={fakeColumns}
                            dataSource={fakeData1}
                            size="small"
                            rowKey="id"
                            bordered={true}
                            style={{ marginBottom: '60px' }}
                        />
                        <div className="dataSync-excel">
                            <Space size="large" style={{ margin: '4px 14px' }}>
                                <Button type="primary" style={{ backgroundColor: '#1A6FB8' }}>保存信息</Button>
                                <Button type='outline' style={{ color: '#1A6FB8', border: '1px solid #1A6FB8' }}>预览信息</Button>
                                <Button type='outline' style={{ color: '#1A6FB8', border: '1px solid #1A6FB8' }}>提交信息</Button>
                                <Button type='outline' style={{ color: '#1A6FB8', border: '1px solid #1A6FB8' }}>自行受理</Button>
                                <Button type='secondary'>返回上级页面</Button>
                            </Space>
                        </div>
                    </div>
                    <div className="organization-divider"></div>
                    {organizationData.length > 0 ? (
                        <DepartmentTable
                            organizationActive={organizationActive}
                            departmentData={departmentData}
                            handlePersonnelModal={handlePersonnelModal}
                            handleChangeIsAddOrEdit={(type, record) => {
                                setIsAddOrEditDept(type);
                                setDeptEditData(record || {});
                            }}
                            handleDelDept={delDept}
                        />
                    ) : (
                        $$.MyEmpty({ description: '抱歉!暂无组织数据,请先添加组织', style: { margin: '100px auto' } })
                    )}
                </div>
            </div>
            {/* 新增 or 修改组织page */}
            <AddOrEditOrganization
                isAddOrEdit={isAddOrEdit}
                type={organizationEditData.type}
                organizationActive={organizationEditData.active}
                handleFinishForm={setOrganization}
            />
            {/* 新增 or 修改部门page */}
            <AddOrEditDept
                isAddOrEditDept={isAddOrEditDept}
                deptActive={deptEditData}
                unMatchUsers={organizationActive.unMatchUsers || []}
                handleFinishForm={setDept}
            />
            {/*  查看人员Modal */}
            {modalData.visible && <PersonnelModal modalData={modalData} handlePersonnelModal={handlePersonnelModal} handleSearch={getPersons} />}
        </Page>
    );
};
                }
            </NewPage>
        </div>
    )
}
export default Organization;
gz-customerSystem/src/views/basicInformation/organization/index.less
@@ -55,3 +55,39 @@
        }
    }
}
.dataSync {
    &-excel {
        background-color: #fff;
        position: absolute;
        left: 16px;
        right: 16px;
        bottom: 0;
        padding: 12px 16px;
        display: flex;
        align-items: center;
        justify-content: space-between;
        box-shadow: 4px 0px 5px 0px rgba(0, 0, 0, 0.25);
    }
}
.arco-form-label-item .arco-form-item-tooltip{
    color: #1A6FB8;
}
//大厅来访
.must{
    font-size: 12px;
    color: rgb(245, 63, 63);
    background-color: rgb(255, 236, 232);
    line-height: 20px;
    padding: 0px 4px;
    border-radius: 2px;
    margin-left: 8px;
}
.arco-btn-primary:not(.arco-btn-disabled){
    background-color: @main-color;
}
gz-customerSystem/src/views/dispatch/mediateList/index.jsx
@@ -2,8 +2,8 @@
 * @Company: hugeInfo
 * @Author: ldh
 * @Date: 2022-03-18 10:21:49
 * @LastEditTime: 2022-11-28 09:47:16
 * @LastEditors: ldh
 * @LastEditTime: 2024-08-09 16:57:06
 * @LastEditors: dminyi 1301963064@qq.com
 * @Version: 1.0.0
 * @Description: 调度中心
 */
gz-customerSystem/src/views/mediate/judicialExamine/index.jsx
@@ -2,8 +2,8 @@
 * @Company: hugeInfo
 * @Author: ldh
 * @Date: 2023-02-08 14:24:37
 * @LastEditTime: 2023-02-09 17:59:07
 * @LastEditors: ldh
 * @LastEditTime: 2024-08-09 16:29:11
 * @LastEditors: dminyi 1301963064@qq.com
 * @Version: 1.0.0
 * @Description: 司法局审核
 */
gz-customerSystem/src/views/register/visit/index.jsx
New file
@@ -0,0 +1,18 @@
/*
 * @Author: dminyi 1301963064@qq.com
 * @Date: 2024-08-09 15:47:38
 * @LastEditors: dminyi 1301963064@qq.com
 * @LastEditTime: 2024-08-09 15:48:16
 * @FilePath: \gzDyh\gz-customerSystem\src\views\register\visit\index.jsx
 * @Description: 大厅来访
 */
import React from 'react';
const Visit=()=>{
    return(
        <></>
    )
}
export default Visit;
gz-customerSystem/yarn.lock
@@ -856,6 +856,18 @@
    scroll-into-view-if-needed "2.2.20"
    shallowequal "^1.1.0"
"@arco-plugins/vite-react@^1.3.3":
  version "1.3.3"
  resolved "https://registry.npmmirror.com/@arco-plugins/vite-react/-/vite-react-1.3.3.tgz"
  integrity sha512-fcGh/69xKGqIjMdIw6NCqst4uWME/WTYjiC6AxHbKBmeYSONazBYd+KtEDx9Be2N0pF4+sk+MGUDy3mrF13EdA==
  dependencies:
    "@babel/generator" "^7.12.11"
    "@babel/helper-module-imports" "^7.12.5"
    "@babel/parser" "^7.12.11"
    "@babel/traverse" "^7.12.12"
    "@babel/types" "^7.12.12"
    "@types/node" "^16.11.10"
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.8.3":
  version "7.24.7"
  resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.24.7.tgz"
@@ -899,7 +911,7 @@
    eslint-visitor-keys "^2.1.0"
    semver "^6.3.0"
"@babel/generator@^7.25.0", "@babel/generator@^7.7.2":
"@babel/generator@^7.12.11", "@babel/generator@^7.25.0", "@babel/generator@^7.7.2":
  version "7.25.0"
  resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.25.0.tgz"
  integrity sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==
@@ -1000,7 +1012,7 @@
    "@babel/traverse" "^7.24.8"
    "@babel/types" "^7.24.8"
"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.24.7":
"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.12.5", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.24.7":
  version "7.24.7"
  resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz"
  integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==
@@ -1114,7 +1126,7 @@
    js-tokens "^4.0.0"
    picocolors "^1.0.0"
"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.25.0", "@babel/parser@^7.25.3":
"@babel/parser@^7.1.0", "@babel/parser@^7.12.11", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.25.0", "@babel/parser@^7.25.3":
  version "7.25.3"
  resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.25.3.tgz"
  integrity sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==
@@ -1868,7 +1880,7 @@
    "@babel/parser" "^7.25.0"
    "@babel/types" "^7.25.0"
"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.2", "@babel/traverse@^7.7.2":
"@babel/traverse@^7.12.12", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.2", "@babel/traverse@^7.7.2":
  version "7.25.3"
  resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.25.3.tgz"
  integrity sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==
@@ -1881,7 +1893,7 @@
    debug "^4.3.1"
    globals "^11.1.0"
"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
"@babel/types@^7.0.0", "@babel/types@^7.12.12", "@babel/types@^7.12.6", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
  version "7.25.2"
  resolved "https://registry.npmmirror.com/@babel/types/-/types-7.25.2.tgz"
  integrity sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==
@@ -3039,6 +3051,11 @@
  dependencies:
    undici-types "~6.13.0"
"@types/node@^16.11.10":
  version "16.18.105"
  resolved "https://registry.npmmirror.com/@types/node/-/node-16.18.105.tgz"
  integrity sha512-w2d0Z9yMk07uH3+Cx0N8lqFyi3yjXZxlbYappPj+AsOlT02OyxyiuNoNHdGt6EuiSm8Wtgp2YV7vWg+GMFrvFA==
"@types/parse-json@^4.0.0":
  version "4.0.0"
  resolved "https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.0.tgz"