forked from gzzfw/frontEnd/gzDyh

liuwh
2024-09-13 9f705a54328c4b59ad9566c521bc6e0e7577acb3
Merge branch 'master' of http://120.79.193.119:9090/r/gzzfw/frontEnd/gzDyh into master
4 files added
26 files modified
1187 ■■■■■ changed files
gz-customerSystem/src/api/appUrl.js 12 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/assets/images/icon/index.js 4 ●●● patch | view | raw | blame | history
gz-customerSystem/src/assets/images/icon/person1.svg 6 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/components/PreviewImage/index.jsx 25 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/components/PreviewImage/index.less 6 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/components/SelectObjModal/selectPerson.jsx 61 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/components/personCard/DetailDialog.jsx 12 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/utils/utility.js 4 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/closingReview/component/ReviewExamine.jsx 2 ●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/closingReview/index.jsx 22 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/eventFlow/component/AssignedModel.jsx 6 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/eventFlow/component/BackModel.jsx 3 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/eventFlow/component/EscalationModel.jsx 7 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/eventFlow/component/EventFlow.jsx 12 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/eventFlow/component/Examine.jsx 46 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/eventFlow/index.jsx 17 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/handleFeedback/component/AuditView.jsx 266 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/handleFeedback/component/handle.jsx 191 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/handleFeedback/index.jsx 91 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/index.jsx 13 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/index.less 9 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/matterDetail/FileTable.jsx 12 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/matterDetail/HandleRecord.jsx 59 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/matterDetail/Supervising.jsx 12 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/matterDetail/UniteHandle.jsx 211 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/matterDetail/fileMessage.jsx 6 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/matterDetail/personCard.jsx 43 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/visit/component/previewTable.jsx 15 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/visit/component/visitorRegister.jsx 4 ●●●● patch | view | raw | blame | history
gz-customerSystem/src/views/register/visit/preview.jsx 10 ●●●●● patch | view | raw | blame | history
gz-customerSystem/src/api/appUrl.js
@@ -2,20 +2,20 @@
 * @Company: hugeInfo
 * @Author: ldh
 * @Date: 2022-02-16 11:25:57
 * @LastEditTime: 2024-09-13 09:34:31
 * @LastEditors: lwh
 * @LastEditTime: 2024-09-13 11:32:06
 * @LastEditors: dminyi 1301963064@qq.com
 * @Version: 1.0.0
 * @Description: api地址
 */
export const debug = {
  // web服务
  baseUrl: 'https://zfw-dyh.by.gov.cn',
  // baseUrl: "http://6dycet.natappfree.cc",
  // baseUrl: 'http://gz.hugeinfo.com.cn',
  baseUrl: "http://933ymn.natappfree.cc",
  // baseUrl: 'http://mdqgnh.natappfree.cc',
  // 附件服务
  fileUrl: "http://6dycet.natappfree.cc",
  // fileUrl: 'https://zfw-dyh.by.gov.cn',
  fileUrl: "http://933ymn.natappfree.cc",
  // fileUrl: 'http://gz.hugeinfo.com.cn',
  // 文件查看url 后面接附件编号
  fileShowUrl: "/dyh-sys/api/v1/fileInfo/show/",
gz-customerSystem/src/assets/images/icon/index.js
@@ -147,6 +147,7 @@
import person from './person.svg'
import knock from './knock.svg'
import escalation from './escalation.svg'
import person1 from './person1.svg'
export {
  mediationCenter,
@@ -275,5 +276,6 @@
  result,
  person,
  knock,
  escalation
  escalation,
  person1
};
gz-customerSystem/src/assets/images/icon/person1.svg
New file
@@ -0,0 +1,6 @@
<svg width="64" height="94" viewBox="0 0 64 94" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.68 0H56.32C58.3569 0 60.3103 0.80914 61.7506 2.24942C63.1909 3.6897 64 5.64314 64 7.68V56.32C64 58.3569 63.1909 60.3103 61.7506 61.7506C60.3103 63.1909 58.3569 64 56.32 64H7.68C5.64314 64 3.6897 63.1909 2.24942 61.7506C0.80914 60.3103 0 58.3569 0 56.32L0 7.68C0 5.64314 0.80914 3.6897 2.24942 2.24942C3.6897 0.80914 5.64314 0 7.68 0V0Z" fill="#E7F0F9"/>
<path d="M49.6264 48.0112H13.8427C13.6635 48.0224 13.4845 47.9849 13.3249 47.9025C13.1653 47.8202 13.0311 47.6961 12.9364 47.5435C12.8417 47.3909 12.7902 47.2155 12.7872 47.0359C12.7843 46.8564 12.8301 46.6794 12.9198 46.5238L17.1707 37.1017C17.5755 36.4921 18.1248 35.992 18.7696 35.6461C19.4145 35.3002 20.1349 35.1192 20.8667 35.1192C21.5985 35.1192 22.3189 35.3002 22.9638 35.6461C23.6087 35.992 24.1579 36.4921 24.5627 37.1017L26.5313 40.2761C26.7399 40.5922 27.026 40.8494 27.3624 41.0232C27.6988 41.197 28.0742 41.2815 28.4527 41.2687C28.8311 41.2558 29.1999 41.146 29.5237 40.9498C29.8476 40.7536 30.1156 40.4776 30.3022 40.1481L36.7137 27.7321C37.001 27.2191 37.4198 26.7921 37.9271 26.4948C38.4343 26.1975 39.0116 26.0408 39.5995 26.0408C40.1874 26.0408 40.7647 26.1975 41.2719 26.4948C41.7792 26.7921 42.198 27.2191 42.4853 27.7321L50.5877 46.5968C50.6604 46.753 50.6913 46.9254 50.6775 47.0972C50.6636 47.269 50.6054 47.4342 50.5085 47.5768C50.4116 47.7193 50.2794 47.8343 50.1248 47.9104C49.9702 47.9866 49.7984 48.0213 49.6264 48.0112Z" fill="#AFD6FF"/>
<path d="M21.4794 26.0347C23.9317 26.0347 25.9197 24.0467 25.9197 21.5944C25.9197 19.1421 23.9317 17.1541 21.4794 17.1541C19.0271 17.1541 17.0391 19.1421 17.0391 21.5944C17.0391 24.0467 19.0271 26.0347 21.4794 26.0347Z" fill="#AFD6FF"/>
<path d="M11.014 81.7V82.344C10.1087 82.4373 9.38533 82.5027 8.844 82.54V83.702H8.13V82.596C7.43 82.6427 6.42667 82.7033 5.12 82.778L5.022 82.106C6.13267 82.05 7.16867 81.994 8.13 81.938V80.58H5.414L5.26 79.964C5.68 79.516 6.09533 78.9187 6.506 78.172H4.84V77.472H6.856L7.262 76.506L8.018 76.632L7.654 77.472H11.21V78.172H7.304C6.912 78.8907 6.52933 79.4833 6.156 79.95H8.13V78.956H8.844V79.95H11.14V80.58H8.844V81.882L11.014 81.7ZM12.862 80.58C12.722 81.7747 12.344 82.8153 11.728 83.702L11.196 83.156C11.8493 82.1947 12.1947 81.07 12.232 79.782V77.682C13.912 77.5233 15.256 77.2107 16.264 76.744L16.768 77.304C15.76 77.7707 14.4767 78.088 12.918 78.256V79.894H17.216V80.58H15.648V83.73H14.906V80.58H12.862ZM15.536 84.22V89.372H14.78V88.77H7.388V89.372H6.632V84.22H15.536ZM7.388 88.112H14.78V86.824H7.388V88.112ZM7.388 86.18H14.78V84.864H7.388V86.18ZM19.932 77.444H29.844V78.2H24.804V79.208C24.7947 80.0947 24.7293 80.9627 24.608 81.812H31.02V82.554H26.582V87.748C26.582 88.2053 26.8107 88.434 27.268 88.434H29.2C29.6013 88.434 29.886 88.3407 30.054 88.154C30.2687 87.9393 30.4133 87.272 30.488 86.152L31.202 86.39C31.1087 87.6687 30.9033 88.4667 30.586 88.784C30.3247 89.0267 29.914 89.148 29.354 89.148H27.044C26.232 89.148 25.826 88.7327 25.826 87.902V82.554H24.496C24.2813 83.7487 23.9267 84.808 23.432 85.732C22.5827 87.244 21.1827 88.434 19.232 89.302L18.784 88.63C20.7067 87.7807 22.074 86.614 22.886 85.13C23.2313 84.402 23.5067 83.5433 23.712 82.554H18.966V81.812H23.838C23.9593 80.9627 24.0247 80.0947 24.034 79.208V78.2H19.932V77.444ZM33.47 77.206H37.292V85.424H33.47V77.206ZM36.578 84.724V81.644H34.226V84.724H36.578ZM34.226 80.93H36.578V77.906H34.226V80.93ZM38.58 81.91H44.32V85.424H38.58V81.91ZM43.578 84.738V82.596H39.322V84.738H43.578ZM38.244 77.934V77.206H44.572C44.544 78.7273 44.4553 79.7167 44.306 80.174C44.11 80.818 43.6107 81.154 42.808 81.182C42.6493 81.182 42.3087 81.1633 41.786 81.126L41.562 80.468C42.1593 80.5053 42.5513 80.524 42.738 80.524C43.2607 80.496 43.5687 80.2393 43.662 79.754C43.7553 79.3807 43.802 78.774 43.802 77.934H41.086C40.9367 79.4833 39.9847 80.6173 38.23 81.336L37.824 80.706C39.3733 80.1367 40.218 79.2127 40.358 77.934H38.244ZM34.94 86.348C34.6413 87.4867 34.24 88.518 33.736 89.442L33.05 89.176C33.5167 88.3827 33.918 87.3793 34.254 86.166L34.94 86.348ZM37.362 86.362C37.614 87.2487 37.838 88.2053 38.034 89.232L37.292 89.414C37.124 88.322 36.914 87.356 36.662 86.516L37.362 86.362ZM40.344 86.264C40.7267 87.1693 41.0627 88.1493 41.352 89.204L40.61 89.386C40.3393 88.2567 40.0173 87.2673 39.644 86.418L40.344 86.264ZM43.242 86.04C44.054 87.16 44.67 88.14 45.09 88.98L44.488 89.414C44.0493 88.518 43.4333 87.5193 42.64 86.418L43.242 86.04ZM49.612 84.248C49.304 86.3667 48.6133 87.9907 47.54 89.12L46.966 88.63C48.3007 87.258 48.982 85.032 49.01 81.952V76.772H49.766V80.104H54.414V76.59H55.17V80.104H59.132V80.86H49.766V81.952C49.7567 82.372 49.7333 82.89 49.696 83.506H56.094V89.4H55.352V84.248H49.612Z" fill="#C9CDD4"/>
</svg>
gz-customerSystem/src/components/PreviewImage/index.jsx
New file
@@ -0,0 +1,25 @@
import React, { Fragment, useState } from 'react'
import { Image } from '@arco-design/web-react';
import { link } from '@/assets/images';
import './index.less';
import * as $$ from '@/utils/utility';
const appUrl = $$.appUrl;
export default function PreviewImage(props) {
  const [visible, setVisible] = useState(false)
  const { name, src, ...rest } = props
  return (
    <Fragment>
      <div style={{ display: 'none' }}>
        <Image.Preview
          src={`${appUrl.fileUrl}/${appUrl.sys}${src}`}
          visible={visible}
          onVisibleChange={setVisible}
          {...rest}
        />
      </div>
      <div onClick={() => { setVisible(true) }} style={{color: '#1a6fb8', cursor: 'pointer', display: 'inline-block'}}><img src={link} alt="" className="title-file" />{name}</div>
    </Fragment>
  )
}
gz-customerSystem/src/components/PreviewImage/index.less
New file
@@ -0,0 +1,6 @@
.title-file {
  width: 14px;
  height: 14px;
  margin-right: 4px;
  margin-top: -2px;
}
gz-customerSystem/src/components/SelectObjModal/selectPerson.jsx
@@ -12,9 +12,15 @@
import { CloseOutlined } from '@ant-design/icons';
import './index.less';
import * as $$ from '../../utils/utility';
import { Modal } from '@arco-design/web-react';
import { Modal, Spin } from '@arco-design/web-react';
const { Search } = Input;
const txtMap = {
    dept: '部门',
    person: '人',
    unit: '组织'
}
// 获取人员,组织,部门数据
function getDataApi(type, searchData) {
@@ -45,7 +51,7 @@
 * onOk, // 点击确定的回调
 */
const SelectObjModal = ({ visible = false, checkKeys = [], type = 'dept', isCheckbox = false, searchData = {}, onClose, onOk, }) => {
    const nameStr = type === 'person' ? '人员' : type === 'unit' ? '组织' : '部门';
    const nameStr = txtMap[type];
    // 默认调解员查询'22_00024-4'
    const searchRole = type === 'person' ? { roleCode: '22_00024-4' } : {};
    const [data, setData] = useState([]);
@@ -54,14 +60,15 @@
    const [searchValue, setSearchValue] = useState('');
    const [autoExpandParent, setAutoExpandParent] = useState(true);
    const [dataList, setDataList] = useState([]);
    const [loading, setLoading] = useState(false);
    useEffect(() => {
        if (!visible) return;
        // 获取数据
        async function getData() {
            // global.setSpinning(true);
            setLoading(true)
            const res = await getDataApi(type, { ...searchRole, ...searchData });
            // global.setSpinning(false);
            setLoading(false)
            if (res.type) {
                setData(res.data || []);
            }
@@ -194,27 +201,29 @@
                        <Search placeholder={`查询${nameStr}名称`} onChange={(e) => handleSearch(e.target.value, dataList)} />
                    </div>
                    <div className="selectObjModal-left-main">
                        {data.length > 0 ? (
                            <Tree
                                checkable
                                checkStrictly
                                defaultExpandAll
                                onExpand={(newExpandedKeys) => {
                                    setExpandedKeys(newExpandedKeys);
                                    setAutoExpandParent(false);
                                }}
                                expandedKeys={expandedKeys}
                                autoExpandParent={autoExpandParent}
                                selectable={false}
                                onCheck={(checkedKeys, e) => handleCheck(checkedKeys, e)}
                                checkedKeys={checkedKeys.keys}
                                treeData={treeData}
                                fieldNames={{ title: 'label', key: 'value' }}
                                height={400}
                            />
                        ) : (
                            $$.MyEmpty()
                        )}
                        <Spin loading={loading} style={{ width: '100%', height: '100%' }}>
                            {data.length > 0 ? (
                                <Tree
                                    checkable
                                    checkStrictly
                                    defaultExpandAll
                                    onExpand={(newExpandedKeys) => {
                                        setExpandedKeys(newExpandedKeys);
                                        setAutoExpandParent(false);
                                    }}
                                    expandedKeys={expandedKeys}
                                    autoExpandParent={autoExpandParent}
                                    selectable={false}
                                    onCheck={(checkedKeys, e) => handleCheck(checkedKeys, e)}
                                    checkedKeys={checkedKeys.keys}
                                    treeData={treeData}
                                    fieldNames={{ title: 'label', key: 'value' }}
                                    height={400}
                                />
                            ) : (
                                $$.MyEmpty()
                            )}
                        </Spin>
                    </div>
                </div>
                <div className="selectObjModal-right">
@@ -228,7 +237,7 @@
                </div>
            </div>
            <div className="selectObjModal-footer">
                <div>已选中:{checkedKeys.keys.length}人</div>
                <div>已选中:{checkedKeys.keys.length}{txtMap[type]}</div>
                <Space size="middle">
                    <Button onClick={onClose}>取消</Button>
                    <Button type="primary" onClick={() => onOk && onOk(checkedKeys)}>
gz-customerSystem/src/components/personCard/DetailDialog.jsx
@@ -2,6 +2,7 @@
import KeyVisits from "./KeyVisits";
import { link } from '@/assets/images';
import { Scrollbars } from "react-custom-scrollbars";
import PreviewImage from '../PreviewImage';
export default function DetailDialog(props) {
  const nuturalList = [
@@ -326,9 +327,14 @@
            ...res,
            value: <>
              {data[res.field]?.map(item => {
                return <a target="_blank">
                  <img src={link} alt="" className="title-file" />{item.name}
                </a>
                console.log(item);
                if(item.response) {
                  //新上传的,前端数据
                  const data = item.response.data[0]
                  return <PreviewImage name={data.name} src={data.showUrl} />
                } else {
                  return <PreviewImage name={item.name} src={item.showUrl} />
                }
              })}
            </>
          }
gz-customerSystem/src/utils/utility.js
@@ -180,8 +180,8 @@
}
// 时间格式化
export function timeFormat(value, isValue, timeFormat) {
    return !!value ? moment(value).format(timeFormat ? timeFormat : 'YYYY-MM-DD HH:mm:ss') : isValue ? '' : '-';
export function timeFormat(value, isValue) {
    return !!value ? moment(value).format('YYYY-MM-DD HH:mm:ss') : isValue ? '' : '-';
}
export function minuteFormat(value, isValue) {
gz-customerSystem/src/views/register/closingReview/component/ReviewExamine.jsx
@@ -154,7 +154,7 @@
              </Col> */}
              <Col span={24}>
                <div><div className="title-text">申请时间</div></div>
                <div>{infoData?.applyTime || '-'}</div>
                <div>{$$.myTimeFormat(infoData?.applyTime, 'YYYY-MM-DD HH:mm') || '-'}</div>
              </Col>
              <Col span={24}>
                <div><div className="title-text">申请人</div></div>
gz-customerSystem/src/views/register/closingReview/index.jsx
@@ -4,20 +4,15 @@
import "@arco-themes/react-gzzz/css/arco.css";
import '../index.less';
import { Tabs } from '@arco-design/web-react';
import { examine, Matter, transfer, applyRecord } from '@/assets/images'
import { examine, Matter, applyRecord } from '@/assets/images'
import EventFlow from '../eventFlow/component/EventFlow';
import ApplyInfo from "../matterDetail/ApplyInfo";
import { useParams } from 'react-router-dom';
import ReviewExamine from './component/ReviewExamine';
const TabPane = Tabs.TabPane;
function getTabButton(caseTaskId) {
    return $$.ax.request({ url: `caseTask/getTabButton?caseTaskId=${caseTaskId}`, type: 'get', service: 'mediate' });
}
function getCaseInfoApi(id) {
  return $$.ax.request({ url: '/caseInfo/getCaseInfo?id=' + id, type: 'get', service: 'mediate' });
}
const myTab = [
@@ -40,18 +35,13 @@
const ClosingReview = () => {
    const caseId = $$.getQueryString('caseId')
    const caseTaskId = $$.getQueryString('caseTaskId')
    const windupId = $$.getQueryString('windupId')
    const routeData = useParams();
    const [authorData, setAuthorData] = useState({});
    const [tabsList, setTabsList] = useState([]);
    const [tabsActive, setTabsActive] = useState();
    const [newId, setNewId] = useState(caseId)
    useEffect(() => {
        getAuthor();
        getCaseInfo()
        console.log(caseId,caseTaskId,'caseId','caseTaskId')
    }, [])
    //获取权限tab和按钮权限
@@ -76,14 +66,6 @@
        }
    }
    const getCaseInfo = async (id) => {
    const res = await getCaseInfoApi(caseId)
        if(res.type){
            console.log(res.data?.id,'res.data?.idres.data?.id')
            setNewId(res.data?.id)
        }
        }
    //根据id定义组件
    const getTypeDom = (key) => {
        if (key === 'dslxq' || key === 'sxxq') {
@@ -93,7 +75,7 @@
            return <ApplyInfo />
        }
        if (key === 'jash') {
            return <ReviewExamine caseTaskId={caseTaskId} caseId={caseId} id={windupId} />
            return <ReviewExamine caseTaskId={caseTaskId} caseId={caseId} />
        }
    }
gz-customerSystem/src/views/register/eventFlow/component/AssignedModel.jsx
@@ -4,7 +4,6 @@
import ArcoUpload from '@/components/ArcoUpload';
import { Scrollbars } from "react-custom-scrollbars";
import SelectObjModal from '@/components/SelectObjModal/selectPerson';
import { useParams } from 'react-router-dom';
import * as $$ from '@/utils/utility';
import { useNavigate } from 'react-router-dom';
@@ -22,7 +21,6 @@
}
export default function BackModel(props) {
  const routeData = useParams();
  const navigate = useNavigate();
  const formRef = useRef();
  const [isModalVisible, setIsModalVisible] = useState(false);
@@ -38,7 +36,7 @@
    formRef.current.validate(undefined, (errors, values) => {
      if (!errors) {
        handleAssign({
          caseTaskId: routeData.caseTaskId,
          caseTaskId: props.caseTaskId,
          assignContent: values.assignContent,
          handleUnitId: wantUser['handleUnit'][0].value,
          handleUnitName: wantUser['handleUnit'][0].name,
@@ -63,7 +61,7 @@
  //交办请求
  const handleAssign = async (data) => {
    const res = await assign({ ...data, caseTaskId: props.caseTaskId })
    const res = await assign(data)
    if (res.type) {
      $$.infoSuccess({ content: '交办成功!' });
      props.onCancel();
gz-customerSystem/src/views/register/eventFlow/component/BackModel.jsx
@@ -4,6 +4,7 @@
import ArcoUpload from '@/components/ArcoUpload';
import { Scrollbars } from "react-custom-scrollbars";
import * as $$ from '@/utils/utility';
import { useNavigate } from 'react-router-dom';
const RadioGroup = Radio.Group;
const FormItem = Form.Item;
@@ -23,6 +24,7 @@
}
export default function BackModel(props) {
  const navigate = useNavigate();
  const formRef = useRef();
  const [id, setId] = useState();
  const options = [
@@ -89,6 +91,7 @@
    if (res.type) {
      $$.infoSuccess({ content: '提交申请成功!' });
      props.onCancel()
      navigate('/mediate/visit/visitWorkBench')
    }
  }
gz-customerSystem/src/views/register/eventFlow/component/EscalationModel.jsx
@@ -5,6 +5,7 @@
import { Scrollbars } from "react-custom-scrollbars";
import { escalation } from '@/assets/images/icon';
import * as $$ from '@/utils/utility';
import { useNavigate } from 'react-router-dom';
const FormItem = Form.Item;
const TextArea = Input.TextArea;
@@ -27,6 +28,7 @@
}
export default function BackModel(props) {
  const navigate = useNavigate();
  const formRef = useRef();
  const [id, setId] = useState();
  const [unitData, setUnitData] = useState({});
@@ -87,6 +89,7 @@
    if (res.type) {
      $$.infoSuccess({ content: '提交申请成功!' });
      props.onCancel()
      navigate('/mediate/visit/visitWorkBench')
    }
  }
@@ -113,10 +116,10 @@
            <Col span={24}>
              <FormItem
                label='上报至'
                field='trueName'
                field='name'
              >
                <div className='myTag' >
                  <img src={escalation} alt="" className="title-file" />白云区综治中心
                  <img src={escalation} alt="" className="title-file" />{unitData.auditUnitName}
                </div>
              </FormItem>
            </Col>
gz-customerSystem/src/views/register/eventFlow/component/EventFlow.jsx
@@ -38,18 +38,12 @@
            })
            if (res.type) {
              $$.infoSuccess({ content: '受理成功!' });
              navigate('/mediate/visit/visitWorkBench')
              navigate(`/mediate/visit/handleFeedback?caseTaskId=${props.caseTaskId}&caseId=${props.caseId}`)
            }
          },
        });
      },
      key: 'sl',
    },
    {
      label: '提交',
      type: 'primary',
      click: () => { },
      key: 'tj',
    },
    {
      label: '自行受理',
@@ -112,10 +106,8 @@
  }, [])
  const onWindowResize = () => {
    let offsetLeft = 0;
    let offsetTop = 0;
    if (scrollRef.current.container) {
      offsetLeft = getOffset(scrollRef.current.container).left;
      offsetTop = getOffset(scrollRef.current.container).top;
    }
    setHeight(getSize().windowH - offsetTop - 16)
@@ -171,7 +163,7 @@
                title={
                  <span style={{ fontSize: '15px' }}>
                    督办信息
                    <Badge maxCount={99} count={1000} />
                    {/* <Badge maxCount={99} count={1000} /> */}
                  </span>
                }
              >
gz-customerSystem/src/views/register/eventFlow/component/Examine.jsx
@@ -5,6 +5,8 @@
import ArcoUpload from '@/components/ArcoUpload';
import { Scrollbars } from "react-custom-scrollbars";
import * as $$ from '@/utils/utility';
import { getOffset, getSize } from '@/utils/utility';
import { useNavigate } from 'react-router-dom';
const RadioGroup = Radio.Group;
const FormItem = Form.Item;
@@ -21,18 +23,17 @@
  return $$.ax.request({ url: url, type: 'post', service: 'mediate', data });
}
function getId() {
  return $$.ax.request({ url: `caseUtils/getNewTimeId`, type: 'get', service: 'utils' });
}
function delFile(id) {
  return $$.ax.request({ url: `fileInfo/deleteFileById`, type: 'get', service: 'sys', data: { id } });
}
export default function Examine(props) {
  const navigate = useNavigate();
  const formRef = useRef();
  const scrollRef = useRef(null);
  const [infoData, setInfoData] = useState({});
  const [id, setId] = useState();
  const [height, setHeight] = useState(500);
  const mainFlag = props.type == 'htsh' ? 'return' : 'appear'
  const options = [
    {
@@ -51,16 +52,25 @@
  useEffect(() => {
    getInfoData()
    getAppId()
  }, [props.type])
  //获取id
  const getAppId = async () => {
    const res = await getId()
    if (res.type) {
      setId(res.data)
  useEffect(() => {
    onWindowResize()
    window.addEventListener("resize", onWindowResize);
    // 返回一个函数,该函数会在组件卸载前执行
    return () => {
      // 组件销毁时执行
      window.removeEventListener("resize", onWindowResize);
    };
  }, [])
  const onWindowResize = () => {
    let offsetTop = 0;
    if (scrollRef.current.container) {
      offsetTop = getOffset(scrollRef.current.container).top;
    }
  }
    setHeight(getSize().windowH - offsetTop - 74)
  };
  //回显数据
  const getInfoData = async () => {
@@ -69,6 +79,7 @@
    })
    if (res.type) {
      setInfoData(res.data || {})
      setId(res.data.id)
    }
  }
@@ -92,6 +103,7 @@
    const res = await submit(props.type, data)
    if (res.type) {
      $$.infoSuccess({ content: '提交成功!' });
      navigate('/mediate/visit/visitWorkBench')
    }
  }
@@ -121,16 +133,16 @@
                {infoData?.fileInfoList?.map(res => {
                  return res.fileList.map((result, resIndex) => {
                    return <a href="your-link-here.html" target="_blank">
                      <img src={link} alt="" className="title-file" />{result.trueName}
                      <img src={link} alt="" className="title-file" />{result.name}
                      {resIndex !== res.fileList.length - 1 && <>,</>}
                    </a>
                  })
                })}
                }) || '-'}
              </div>
            </Col>
            <Col span={24}>
              <div><div className="title-text">申请时间</div></div>
              <div>{infoData[mainFlag + 'Time'] || '-'}</div>
              <div>{$$.myTimeFormat(infoData[mainFlag + 'Time'], 'YYYY-MM-DD HH:mm') || '-'}</div>
            </Col>
            <Col span={24}>
              <div><div className="title-text">申请人</div></div>
@@ -143,7 +155,7 @@
          </Row>
        </div>
        <div className='whiteBox' style={{ marginTop: '8px' }}>
          <Scrollbars style={{ height: 'calc(100vh - 577px)' }} autoHide>
          <Scrollbars style={{ height: height + 'px' }} autoHide ref={scrollRef}>
            <Space size='small'>
              <div className='MediationInfo-subTitle' style={{ marginTop: '-8px' }}></div><h5>审核</h5>
            </Space>
@@ -186,7 +198,7 @@
                      options={options}
                      onChange={(value) => {
                        const obj = options.find(item => item.value === value)
                        formRef.current.setFieldValue('audit_content', obj.label)
                        formRef.current.setFieldValue('auditContent', obj.label)
                      }}
                    >
                    </RadioGroup>
@@ -195,7 +207,7 @@
                <Col span={24}>
                  <FormItem
                    label=' '
                    field='audit_content'
                    field='auditContent'
                    rules={[{ required: true, message: '理由不能为空' }]}
                  >
                    <TextArea
gz-customerSystem/src/views/register/eventFlow/index.jsx
@@ -8,7 +8,6 @@
import EventFlow from './component/EventFlow';
import Examine from "./component/Examine";
import ApplyInfo from "../matterDetail/ApplyInfo";
import { useParams } from 'react-router-dom';
const Step = Steps.Step;
const TabPane = Tabs.TabPane;
@@ -28,11 +27,11 @@
        label: '事项详情',
        key: 'sxxq',
    },
    // {
    //     img: applyRecord,
    //     label: '申请记录',
    //     key: 'sqjl',
    // },
    {
        img: applyRecord,
        label: '申请记录',
        key: 'sqjl',
    },
    {
        img: examine,
        label: '回退审核',
@@ -45,7 +44,6 @@
    },
]
const Organization = () => {
    const routeData = useParams();
    const caseTaskId = $$.getQueryString('caseTaskId')
    const caseId = $$.getQueryString('caseId')
    const [authorData, setAuthorData] = useState({});
@@ -59,7 +57,6 @@
    //获取权限tab和按钮权限
    const getAuthor = async () => {
        console.log(caseTaskId, caseId)
        const res = await getTabButton({
            caseTaskId: caseTaskId
        })
@@ -92,11 +89,9 @@
            return <ApplyInfo />
        }
        if (key === 'htsh' || key === 'sbsh' || key === 'lhczsh') {
            return <Examine type={key} caseTaskId={routeData.caseTaskId} caseId={routeData.caseId} />
            return <Examine type={key} caseTaskId={caseTaskId} caseId={caseId} />
        }
    }
    console.log(caseId, 'caseId')
    return (
        <div style={{ position: 'relative' }}>
gz-customerSystem/src/views/register/handleFeedback/component/AuditView.jsx
@@ -1,31 +1,66 @@
import React, { useRef, useState } from 'react';
import { Row, Col, Space, Tooltip } from 'antd';
import { Form, Input, Radio, Button } from '@arco-design/web-react';
import React, { useRef, useState, useEffect } from 'react';
import { Row, Col, Space } from 'antd';
import { Form, Input, Radio, Button, Tooltip } from '@arco-design/web-react';
import { register } from '@/assets/images'
import { question1, } from '@/assets/images';
import ArcoUpload from '@/components/ArcoUpload';
import * as $$ from '@/utils/utility';
import { Scrollbars } from "react-custom-scrollbars";
import { getOffset, getSize } from '@/utils/utility';
const FormItem = Form.Item;
const appUrl = $$.appUrl;
const RadioGroup = Radio.Group;
const TextArea = Input.TextArea;
function delFile(id) {
  return $$.ax.request({ url: `fileInfo/deleteFileById`, type: 'get', service: 'sys', data: { id } });
}
function getData(data) {
  return $$.ax.request({ url: `caseAssistApply/getByCaseId`, type: 'get', service: 'mediate', data });
}
function submit(data) {
  return $$.ax.request({ url: `caseAssistApply/reviewCaseAssistApply`, type: 'post', service: 'mediate', data });
}
const AuditView = () => {
const AuditView = (props) => {
  const formRef = useRef();
  const [value, setValue] = useState(1);
  const id = 1;
  const scrollRef = useRef(null);
  const [id, setId] = useState();
  const [infoData, setInfoData] = useState({});
  const [height, setHeight] = useState(500);
  const onChange = (e) => {
    console.log('radio checked', e.target.value);
    setValue(e.target.value);
  useEffect(() => {
    getInfoData()
    onWindowResize()
    window.addEventListener("resize", onWindowResize);
    // 返回一个函数,该函数会在组件卸载前执行
    return () => {
      // 组件销毁时执行
      window.removeEventListener("resize", onWindowResize);
    };
  }, [])
  const onWindowResize = () => {
    let offsetTop = 0;
    if (scrollRef.current.container) {
      offsetTop = getOffset(scrollRef.current.container).top;
    }
    setHeight(getSize().windowH - offsetTop - 74)
  };
  //回显数据
  const getInfoData = async () => {
    const res = await getData({
      caseId: props.caseId
    })
    if (res.type) {
      setInfoData(res.data || {})
      setId(res.data.id)
    }
  }
  //删除文件
  const handleDelFile = async (id) => {
@@ -35,104 +70,137 @@
    }
  }
  return (
    <>
      <div className="auditView">
        <Col span={24} className='title'>
          <Space size='small'>
            <div className='MediationInfo-subTitle' style={{ marginTop: '-9px' }}></div><h5>联合处置申请</h5>
          </Space>
        </Col>
        <Row gutter={[16, 16]}>
          <Col span={24}>
            <div><div className="title-text">添加配合部门</div></div>
            <div>白云区新市街司法所、白云区新市街劳监大队</div>
          </Col>
          <Col span={24}>
            <div><div className="title-text">添加理由</div></div>
            <div>在调解过程中,我们发现需要白云区新市街司法所的专业司法能力支持事项办理,以促进调解工作的顺利进行。</div>
          </Col>
          {/*事项等级分为三级,颜色需要做判断*/}
          <Col span={24}>
            <div className="title"><div className="title-text">申请时间</div></div>
            <div >2024-7-21 12:00</div>
          </Col>
          <Col span={24}>
            <div><div className="title-text">申请人</div></div>
            <div>广州市白云区新市街汇桥北社区委员会 张三丰<img src={register} alt='' style={{ width: '14px', height: '14px', marginLeft: '8px', marginTop: '-1px' }}/></div>
          </Col>
        </Row>
  const handleSubmit = () => {
    if (formRef.current) {
      formRef.current.validate(undefined, (errors, values) => {
        if (!errors) {
          const { file, ...rest } = formRef.current.getFields()
          requestSubmit({
            ...rest,
            id: id
          })
        }
      })
    }
  }
      </div>
      <div className="auditView">
        <Col span={24} className='title'>
          <Space size='small'>
            <div className='MediationInfo-subTitle' style={{ marginTop: '-9px' }}></div><h5>审核</h5>
          </Space>
        </Col>
        <Form
          ref={formRef}
          layout='vertical'
          requiredSymbol={false}
          scrollToFirstError={true}
        >
          <Row style={{ marginBottom: '-16px' }}>
  const requestSubmit = async (data) => {
    const res = await submit(data)
    if (res.type) {
      $$.infoSuccess({ content: '提交成功!' });
    }
  }
  return (
    <div className='dataSync'>
      <div className='dataSync-noBackTabPage'>
        <div className="whiteBox">
          <Col span={24} className='title'>
            <Space size='small'>
              <div className='MediationInfo-subTitle' style={{ marginTop: '-9px' }}></div><h5>联合处置申请</h5>
            </Space>
          </Col>
          <Row gutter={[16, 16]}>
            <Col span={24}>
              <FormItem
                label='审核结果'
                field='majorStatus'
              >
                <RadioGroup options={[{ value: 0, label: '否' }, { value: 1, label: '是' }]} direction='vertical' />
              </FormItem>
              <div><div className="title-text">添加配合部门</div></div>
              <div>{infoData.applyAssistUnitName || '-'}</div>
            </Col>
            <Col span={24}>
              <FormItem
                label={(<div style={{ display: 'flex' }}>理由说明<div className="must">必填</div></div>)}
                field='handleContent'
                rules={[{ message: '请填写不同意联合处置申请的理由', required: true }]}
              >
                <Input.TextArea
                  maxLength={200}
                  showWordLimit
                  rows={5}
                  placeholder='请完整描述事项概况,应具备5要素:发生时间+发生地点+人物情况+事项起因+事项经过'
                  wrapperStyle={{ width: '100%' }}
                />
              </FormItem>
              <div><div className="title-text">添加理由</div></div>
              <div>{infoData.applyContent || '-'}</div>
            </Col>
            <Col span={24}>
              <FormItem
                label={<div style={{ display: 'flex' }}>
                  <span style={{ color: '#86909C' }}>附件材料</span>
                  <Tooltip>
                    <img src={question1} alt="" style={{ width: '13px', height: '13px', margin: '4px 4px 0px 4px' }} />
                  </Tooltip>
                </div>
                }
                field='caseDes'
                rules={[{ message: '请填写事项概况', required: true }]}
              >
                <ArcoUpload
                  params={{
                    action: `${appUrl.fileUrl}/${appUrl.sys}/api/web/fileInfo/upload?mainId='24083010062110001'&&ownerId=${id}&ownerType=22_00018-102`,
                  }}
                  field='file1'
                  // handleChangeFile={handleChangeFile}
                  label=''
                  // editData={props.editData}
                  handleDelFile={handleDelFile}
                />
              </FormItem>
              <div className="title"><div className="title-text">申请时间</div></div>
              <div>{$$.myTimeFormat(infoData.applyTime, 'YYYY-MM-DD HH:mm') || '-'}</div>
            </Col>
            <Col span={24}>
              <div><div className="title-text">申请人</div></div>
              <div>
                {infoData.applyUnitName}&nbsp;&nbsp;
                {infoData.applyUserName || '-'}
                <img src={register} alt="" className="title-register" />
              </div>
            </Col>
          </Row>
        </Form>
        <Space style={{}}>
          <Button type='primary' >提交</Button>
          <Button type='secondary'>返回上级页面</Button>
        </Space>
      </div>
    </>
        </div>
        <div className='whiteBox' style={{ marginTop: '8px' }}>
          <Scrollbars style={{ height: height + 'px' }} autoHide ref={scrollRef}>
            <Space size='small'>
              <div className='MediationInfo-subTitle' style={{ marginTop: '-8px' }}></div><h5>审核</h5>
            </Space>
            <Form
              ref={formRef}
              layout='vertical'
              requiredSymbol={false}
              initialValues={{
              }}//默认值
              scrollToFirstError
            >
              <Row>
                <Col span={24}>
                  <FormItem
                    label={(<div style={{ display: 'flex' }}>审核结果</div>)}
                    field='auditResult'
                  >
                    <RadioGroup
                      direction='vertical'
                      options={$$.options.auditResult}
                      onChange={(value) => {
                        if (value) {
                          const data = $$.options.auditResult.find(item => item.value === value)
                          formRef.current.setFieldValue('auditResultName', data.label)
                        } else {
                          formRef.current.setFieldValue('auditResultName', '')
                        }
                      }}
                    />
                  </FormItem>
                </Col>
                <Col span={24}>
                  <FormItem
                    label={(<div style={{ display: 'flex' }}>理由说明<div className="must">必填</div></div>)}
                    field='auditContent'
                    rules={[{ required: true, message: '请选择理由说明' }]}
                  >
                    <TextArea
                      autoSize={{ minRows: 4, maxRows: 8 }}
                      placeholder='请填写不同意联合处置申请的理由'
                    />
                  </FormItem>
                </Col>
                <Col span={24} className="doubleFile">
                  <ArcoUpload
                    params={{
                      action: `${appUrl.fileUrl}/${appUrl.sys}/api/web/fileInfo/upload?mainId=${props.caseId}&ownerId=${id}&ownerType=22_00018-509`,
                    }}
                    field='file'
                    label={
                      <div>
                        附件材料
                        <Tooltip>
                          <img src={question1} alt="" style={{ width: '13px', height: '13px', margin: '-3px 4px 0px 4px' }} />
                        </Tooltip>
                      </div>
                    }
                    handleDelFile={handleDelFile}
                  />
                </Col>
              </Row>
            </Form>
          </Scrollbars>
          <div className='dialogFooter'>
            <Button
              type="primary"
              className="dialogPrimary"
              onClick={handleSubmit}
            >
              提交
            </Button>
          </div>
        </div>
      </div>
    </div>
  )
}
gz-customerSystem/src/views/register/handleFeedback/component/handle.jsx
@@ -16,19 +16,11 @@
import SupervisingView from '../../matterDetail/Supervising'
import UniteHandle from '../../matterDetail/UniteHandle';
import { useNavigate } from 'react-router-dom';
import MyUpload from '@/components/MyUpload';
const Option = Select.Option;
const FormItem = Form.Item;
const TabPane = Tabs.TabPane;
const appUrl = $$.appUrl;
function choosePrincipalApi(caseId, userId) {
  return $$.ax.request({ url: `caseInfoUnfold/choosePrincipal?caseId=${caseId}&userId=` + userId, type: 'get', service: 'mediate' });
@@ -92,30 +84,70 @@
  const [caseResultId, setCaseResultId] = useState('');
  const [managerName, setManagerName] = useState('')
  const [progressData, setProgressData] = useState({});
  const [staticButtonList, setStaticButtonList] = useState([]);
  const [scannerVisible, setScannerVisible] = useState(false);
  const myButton = [
    {
      label: '添加办理记录',
      type: 'primary',
      click: () => addMark(),
      key: 'tjbljl',
    },
    {
      label: '联合处置申请',
      type: 'outline',
      click: () => uniteHandle(),
      key: 'lhczsq',
    },
    {
      label: '结案申请',
      type: 'outline',
      click: () => handleCaseResultApply(),
      key: 'jasq',
    },
    {
      label: '督办',
      type: 'outline',
      click: () => Supervising(),
      key: 'db',
      status: 'danger'
    },
  ]
  const tabs1 = [
    { index: '1', label: '公共模板:提醒尽快启动调解程序督办模板' },
    { index: '2', label: '个人模板:推动事件尽快办结督办模板' }
  ]
  const options = [
    { value: '1', label: '一' }, { value: '2', label: '二' }, { value: '3', label: '三' }
  ];
  const content = selectedTab1 === '1'
  ? `鉴于本事项的重要性及紧迫性,现要求你尽快启动调解程序,并确保案件能够得到及时有效的处理。请您务必于本周内完成以下事项:XX、XX、XX。请确保在事项办理的过程中,遵循公平、公正的原则,并积极促进双方达成共识`
  : '1';
  useEffect(() => {
    listFeedback(caseId);
    getData(caseId)
    getFeedbackInfo();
  }, [])
  useEffect(() => {
    if (authorData) {
      const { buttonList } = authorData;
      setStaticButtonList(myButton.filter(item => {
        const flag = buttonList.some(result => {
          if (result.id === item.key) {
            return true
          }
        })
        return flag
      }))
    }
  }, [authorData])
  const handleCheckedKeys = (userId) => {
    choosePrincipal(userId)
  }
  const [scannerVisible, setScannerVisible] = useState(false);
  const handleConfirm = () => {
    // 处理确认逻辑
@@ -132,11 +164,6 @@
    setScannerVisible(false);
  };
  const openScanner = () => {
    setScannerVisible(true);
  };
  const choosePrincipal = async (id) => {
    const res = await choosePrincipalApi(caseId, id)
    if (res.type) {
@@ -152,7 +179,6 @@
    }
  }
  //删除文件
  const handleDelFile = async (id) => {
    const res = await delFile(id)
@@ -160,8 +186,6 @@
      $$.infoSuccess({ content: '删除成功!' });
    }
  }
  //新增、编辑办理理由
  const saveFeedback = async (submitData) => {
@@ -217,8 +241,9 @@
      if (type === 'uniteHandle') {
        setUniteHandleId(res.data)
      }
      if (type === 'addMark')
      if (type === 'addMark') {
        setId(res.data)
      }
      if (type === 'caseResult') {
        setCaseResultId(res.data)
      }
@@ -229,19 +254,6 @@
    const res = await getListCaseFlow(id)
    if (res.type) {
      setProgressData(res.data)
    }
  }
  const handleSubmit = async () => {
    if (formRef.current) {
      formRef.current.validate(undefined, (errors, values) => {
        if (!errors) {
          const params = formRef.current.getFields()
        }
      });
    }
  }
@@ -282,52 +294,18 @@
    setUniteHandleView(!uniteHandleView)
  }
  const handleTabChange1 = (newTabIndex) => {
    setSelectedTab1(newTabIndex);
  };
  const content = selectedTab1 === '1'
    ? `鉴于本事项的重要性及紧迫性,现要求你尽快启动调解程序,并确保案件能够得到及时有效的处理。请您务必于本周内完成以下事项:XX、XX、XX。请确保在事项办理的过程中,遵循公平、公正的原则,并积极促进双方达成共识`
    : '1';
  const handleSupervising = () => {
    setSupervising(!supervising)
  }
  const handlePersonView = () => {
    getByIdRole();
  }
  const handleCaseResultApply = () => {
    SetCaseResult(!caseResult)
    getNewTimeId('caseResult')
  }
  useEffect(() => {
    listFeedback(caseId);
    getData(caseId)
    getFeedbackInfo();
  }, [])
  // useEffect(() => {
  //   if (authorData) {
  //     const { buttonList } = authorData;
  //     setStaticButtonList(myButton.filter(item => {
  //       const flag = buttonList.some(result => {
  //         if (result.id === item.key) {
  //           return true
  //         }
  //       })
  //       return flag
  //     }))
  //   }
  // }, [authorData])
  return (
    <>
@@ -398,12 +376,7 @@
                      <Row gutter={[32, 0]}>
                        <Col span={24}>
                          <FormItem
                            label={<div style={{ display: 'flex' }}>
                              办理意见
                              <img src={scan} alt="" style={{ marginRight: '-2px', marginLeft: '8px' }} />
                              <div style={{ marginLeft: '8px', color: '#1A6FB8', fontSize: '14px', cursor: 'pointer' }} onClick={openScanner}>识别材料</div>
                            </div>
                            }
                             label={(<div style={{ display: 'flex' }}>办理意见<div className="must">必填</div></div>)}
                            field='handleContent'
                            rules={[{ message: '请填写办理意见', required: true }]}
                          >
@@ -448,18 +421,15 @@
                {/* } */}
              </Col>
            </Form>
            {!formView &&
              <div className="dataSync-excel">
                <Space size="middle" style={{ margin: '4px 14px' }}>
                  <Button type="primary" style={{ backgroundColor: '#1A6FB8' }} onClick={() => addMark()}>添加办理记录</Button>
                  <Button type='outline' style={{ color: '#1A6FB8', border: '1px solid #1A6FB8' }} onClick={() => uniteHandle()}>联合处置申请</Button>
                  <Button type='outline' style={{ color: '#1A6FB8', border: '1px solid #1A6FB8' }} onClick={() => handleCaseResultApply()} >结案申请</Button>
                  <Button type='outline' style={{ color: '#EF6C24', border: '1px solid #EF6C24' }} onClick={() => Supervising()}>督办</Button>
                  {staticButtonList?.map(item => {
                    const { label, key, click, ...rest } = item;
                    return <Button key={key} onClick={click} {...rest} >{label}</Button>
                  })}
                  <Button type='secondary' onClick={() => navigate(-1)}>返回上级页面</Button>
                </Space>
              </div>
            }
          </div>
          <div className='container-bottom-right'>
            <Tabs defaultActiveTab='1' className='tabs-container' >
@@ -475,29 +445,6 @@
                  <div className='progress' style={{ paddingBottom: '16px', marginTop: '0px' }} >
                    <ProgressStep progressData={progressData} hasTab={true} />
                  </div>
                  {/* <div style={{ display: 'flex', marginLeft: '16px', gap: '16px' }}>
                    {tabs.map((tab) => (
                      <div
                        key={tab.index}
                        style={{
                          color: selectedTab === tab.index ? 'rgba(26,111,184,1)' : 'rgba(0,0,0,0.45)',
                          padding: '6px 12px',
                          border: `1px solid ${selectedTab === tab.index ? 'rgba(26,111,184,1)' : 'rgba(229,230,235,1)'}`,
                          borderRadius: '4px',
                          cursor: 'pointer',
                        }}
                        onClick={() => handleTabChange(tab.index)}
                      >
                        {tab.label}
                      </div>
                    ))}
                  </div>
                  {selectedTab === '1' &&
                    <div className='progress'>
                      <ProgressStep progressData={fakeData} />
                    </div>
                  } */}
                </Typography.Paragraph>
              </TabPane>
              <TabPane
@@ -536,28 +483,6 @@
          onConfirm={handleConfirm}
          onCancel={handleCancel}
        />
        <Modal visible={personView} onCancel={() => setPersonView(false)} title='工作人员信息' centered footer={null}>
          <table border="1" align="center" cellpadding="5" className="table">
            <tr>
              <th bgcolor="#F7F8FA" className="table-title" width="120">姓名</th>
              <td width='380'><div style={{ display: 'flex' }}><div>{personData?.trueName}</div></div></td>
              <th bgcolor="#F7F8FA" className="table-title" width="120">登录账号</th>
              <td width='380'>{personData?.acc}</td>
            </tr>
            <tr>
              <th bgcolor="#F7F8FA" className="table-title">手机号码</th>
              <td>{personData?.mobile}</td>
              <th bgcolor="#F7F8FA" className="table-title">工作电话</th>
              <td>-</td>
            </tr>
            <tr>
              <th bgcolor="#F7F8FA" className="table-title">所属部门</th>
              <td>{personData?.unitName}</td>
              <th bgcolor="#F7F8FA" className="table-title">职务</th>
              <td>{personData?.userRoles}</td>
            </tr>
          </table>
        </Modal>
        <Modal visible={supervising} onCancel={() => setSupervising(false)} title='督办' centered footer={null}>
          <Form
            ref={formRef}
@@ -642,7 +567,7 @@
            </Row>
          </Form>
        </Modal>
        <UniteHandle id={uniteHandleId} visible={uniteHandleView} handleOnCancel={() => setUniteHandleView(false)} />
        <UniteHandle id={uniteHandleId} visible={uniteHandleView} handleOnCancel={() => setUniteHandleView(false)} caseId={caseId} caseTaskId={caseTaskId} />
        <CaseResult visible={caseResult} handleOnCancel={() => SetCaseResult(false)} caseResultId={caseResultId} caseId={caseId} caseTaskId={caseTaskId} />
      </div>
gz-customerSystem/src/views/register/handleFeedback/index.jsx
@@ -14,13 +14,13 @@
import "@arco-themes/react-gzzz/css/arco.css";
import '../index.less';
import { Typography, Steps, Tabs } from '@arco-design/web-react';
import { Audit, Matter, applyRecord, transfer, Aimge } from '@/assets/images'
import { Audit, Matter, applyRecord, transfer, Aimge, examine } from '@/assets/images'
import MatterDetail from '../matterDetail';
import Handle from './component/handle';
import AuditView from './component/AuditView';
import { AiQuestion } from '../visit/component/levelDetail';
import * as $$ from '@/utils/utility';
import { useParams } from 'react-router-dom';
import ApplyInfo from "../matterDetail/ApplyInfo";
const Step = Steps.Step;
@@ -38,8 +38,6 @@
    return $$.ax.request({ urlAi: `case-law/get-law`, typeAi: 'post', service: 'mediate', data });
}
function getTabButton(caseTaskId) {
    return $$.ax.request({ url: `caseTask/getTabButton?caseTaskId=` + caseTaskId, type: 'get', service: 'mediate' });
}
@@ -48,10 +46,7 @@
    return $$.ax.request({ url: '/caseInfo/getCaseInfo?id=' + id, type: 'get', service: 'mediate' });
}
const Organization = () => {
    const routeData = useParams();
    const caseTaskId = $$.getQueryString('caseTaskId')
    const caseId = $$.getQueryString('caseId')
    const [current, setCurrent] = useState(3);
@@ -60,9 +55,7 @@
    const [aiData, setAiData] = useState([])
    const [aiLawData, setAiLawData] = useState([]);
    const [caseDetailAi, setCaseDetailAi] = useState({});
    const [caseDetailView, setCaseDetail] = useState({})
    const [authorData, setAuthorData] = useState({});
    const [disTab, setDisTab] = useState(true);
    const [tabsList, setTabsList] = useState([]);
    const myTab = [
        {
@@ -71,35 +64,44 @@
            key: "sxxq"
        },
        {
            img: transfer,
            img: transfer,
            label: '事项办理',
            key: "sxbl",
            isNeedStep: true,
        },
        // {
        //     img: applyRecord,
        //     label: '申请记录',
        //     key: "sqjl",
        // },
        {
            img: applyRecord,
            label: '申请记录',
            key: "sqjl",
        },
        {
            img: examine,
            label: '联合处置审核',
            key: 'lhczsh',
        },
    ]
    useEffect(() => {
        getCaseInfo(caseId)
        getAuthor();
    }, [])
    const handleAi = () => {
        setAiQuestionView(true)
    }
    const getCase = async (caseDes,caseClaim) => {
    const getCase = async (caseDes, caseClaim) => {
        const res = await getCaseApi({
            caseDes: caseDes,
            caseClaim: caseClaim,
            caseId: caseId
        })
        console.log(res.data, 'res')
        if (res.type) {
            setAiData(res.data)
        }
    }
    const getLaw = async (caseDes,caseClaim) => {
    const getLaw = async (caseDes, caseClaim) => {
        const res = await getLawApi({
            caseDes: caseDes,
            caseClaim: caseClaim,
@@ -110,17 +112,13 @@
        }
    }
    const getAuthor = async () => {
        const res = await getTabButton(caseTaskId)
        if (res.type) {
            const { tabList } = res.data
            console.log(tabList, 'tabList1')
            setAuthorData(res.data)
            if (tabList.length === 0) {
                //没有tab就不展示
                setDisTab(false)
            } else {
                setTabsList(myTab.filter(item => {
                    const flag = tabList.some(result => {
@@ -130,7 +128,6 @@
                    })
                    return flag
                }))
                console.log(tabsList, 'tabsList2')
                setTabsActive(tabList[0].id)
            }
        }
@@ -143,24 +140,26 @@
            let caseDes = res.data.caseDes;
            let caseClaim = res.data.caseClaim;
            setCaseDetailAi(caseDes)
            getCase(caseDes,caseClaim);
            getLaw(caseDes,caseClaim);
            getCase(caseDes, caseClaim);
            getLaw(caseDes, caseClaim);
        }
    }
    useEffect(() => {
        getCaseInfo(caseId)
        getAuthor();
        // getCase();
        // getLaw();
        console.log(caseDetailAi, 'caseDetailAi')
    }, [])
    //根据id定义组件
    const getTypeDom = (key) => {
        if (key === 'sxxq') {
            return <MatterDetail hasApplet={true} hasEditBtn={true} authorData={authorData} caseId={caseId} />
        }
        if (key === 'sxbl') {
            return <Handle authorData={authorData} caseId={caseId} caseTaskId={caseTaskId} />
        }
        if (key === 'sqjl') {
            return <ApplyInfo />
        }
        if (key === 'lhczsh') {
            return <AuditView authorData={authorData} caseId={caseId} caseTaskId={caseTaskId} />
        }
    }
    return (
        <div style={{ position: 'relative', height: '100vh' }}>
@@ -170,9 +169,9 @@
                }
            >
                <Tabs
                    defaultActiveTab='sxxq'
                    onChange={(v) => setTabsActive(v)}
                    className='myTabContent'
                    activeTab={tabsActive}
                >
                    {tabsList?.map(item => {
                        return <TabPane
@@ -196,19 +195,7 @@
                                    </Steps>
                                </div>
                            }
                            {tabsActive === 'sxxq' &&
                                <MatterDetail hasApplet={true} hasEditBtn={true} authorData={authorData} caseId={caseId} />
                            }
                            {
                                tabsActive === 'sxbl' && <Typography.Paragraph style={style}>
                                    <Handle authorData={authorData} caseId={caseId} caseTaskId={caseTaskId} />
                                </Typography.Paragraph>
                            }
                            {
                                tabsActive === 'sqjl' && <Typography.Paragraph style={style}>
                                    <AuditView authorData={authorData} />
                                </Typography.Paragraph>
                            }
                            {getTypeDom(item.key)}
                        </TabPane>
                    })}
                </Tabs>
gz-customerSystem/src/views/register/index.jsx
@@ -571,7 +571,7 @@
      },
      tabList: [
        {
          value: '0',
          value: '2',
          label: '办理中',
          columns: [
            {
@@ -650,7 +650,7 @@
          ]
        },
        {
          value: '1',
          value: '0',
          label: '结案申请',
          columns: [
            {
@@ -722,7 +722,7 @@
          ]
        },
        {
          value: '2',
          value: '1',
          label: '已结案',
          columns: [
            {
@@ -848,7 +848,7 @@
              render: (text, record) => (
                <Space style={{ color: '#1A6FB8' }}>
                  <div onClick={() => navigate(`/mediate/visit/fileMessage?caseTaskId=${record.ownerId}&caseId=${record.caseId}`)} style={{ cursor: 'pointer' }}>详情</div>
                  <div onClick={() => navigate(`/mediate/visit/handleFeedback?caseTaskId=${record.ownerId}&caseId=${record.caseId}`)} style={{ cursor: 'pointer' }}>审核</div>
                  <div onClick={() => navigate(`/mediate/visit/closingReview?caseTaskId=${record.ownerId}&caseId=${record.caseId}`)} style={{ cursor: 'pointer' }}>审核</div>
                </Space>
              ),
            }]),
@@ -1122,6 +1122,7 @@
      $$.infoSuccess({ content: '签收成功' });
      getCountData();
      getTableData(tabActivekey)
      navigate(`/mediate/visit/eventFlow?caseTaskId=${ownerId}&caseId=${caseId}`)
    }
  }
@@ -1150,7 +1151,7 @@
        break;
      case '4'://办理中
        const { status, ...most } = searchData
        if (status && status === '0') {
        if (status && status === '2') {
          res = await pageMyTaskBlzApi({
            ...pageData,
            ...most
@@ -1207,7 +1208,7 @@
      setSearchData({
        sortType: 1,
        sortColmn: 1,
        status: '0',
        status: '2',
      })
    } else {
      setSearchData({
gz-customerSystem/src/views/register/index.less
@@ -108,7 +108,7 @@
        background-color: #fff;
        margin: 0px 8px 0px 16px;
        padding: 12px 16px 16px 16px;
        height: calc(100vh - 228px);
        height: calc(100vh - 231px);
        overflow-y: scroll;
    }
@@ -322,6 +322,10 @@
        flex-direction: row;
        column-gap: 8px;
        margin: 0px 8px 0 16px;
        // max-height: 600px;
    // min-height: fit-content;
    // overflow-y: auto;
        &-left {
@@ -393,6 +397,7 @@
        &-right {
            flex: 1 1 0%;
            background-color: rgb(255, 255, 255);
            // height: fit-content;
        }
    }
}
@@ -587,6 +592,7 @@
        &-detail {
            color: #1A6FB8;
            cursor: pointer;
        }
    }
@@ -716,6 +722,7 @@
    position: absolute;
    right: 0;
    top: 60%;
    cursor: pointer;
}
.aiBox {
gz-customerSystem/src/views/register/matterDetail/FileTable.jsx
@@ -167,13 +167,13 @@
          return {
            ...item,
            size: applyFile.fileList.length,
            fileNames: applyFile.fileList?.map(item => item.trueName).join(','),
            fileNames: applyFile.fileList?.map(item => item.name).join(','),
            updateTime: $$.timeFormat(applyFile.fileList[applyFile.fileList.length - 1].updateTime),
            fileList: applyFile.fileList.map(item => {
              return {
                ...item,
                uid: item.id,
                name: item.trueName
                // name: item.trueName
              }
            })
          }
@@ -182,13 +182,13 @@
          return {
            ...item,
            size: evidenceFile.fileList.length,
            fileNames: evidenceFile.fileList?.map(item => item.trueName).join(','),
            fileNames: evidenceFile.fileList?.map(item => item.name).join(','),
            updateTime: $$.timeFormat(evidenceFile.fileList[evidenceFile.fileList.length - 1].updateTime),
            fileList: evidenceFile.fileList.map(item => {
              return {
                ...item,
                uid: item.id,
                name: item.trueName
                // name: item.trueName
              }
            })
          }
@@ -226,12 +226,12 @@
        return {
          ...item,
          size: data.length,
          fileNames: data.map(item => item.trueName).join(','),
          fileNames: data.map(item => item.name).join(','),
          updateTime: $$.timeFormat(data[data.length - 1].updateTime),
          fileList: data.map(item => {
            return {
              ...item,
              name: item.trueName,
              // name: item.trueName,
              uid: item.id,
            }
          }),
gz-customerSystem/src/views/register/matterDetail/HandleRecord.jsx
@@ -2,23 +2,28 @@
 * @Author: dminyi 1301963064@qq.com
 * @Date: 2024-09-06 09:40:00
 * @LastEditors: dminyi 1301963064@qq.com
 * @LastEditTime: 2024-09-12 20:55:47
 * @LastEditTime: 2024-09-13 10:29:41
 * @FilePath: \gzDyh\gz-customerSystem\src\views\register\matterDetail\HandleRecord.jsx
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 * @Description: 办理记录
 */
import React, { useState, useEffect } from 'react';
import { Empty } from '@arco-design/web-react';
import { fold, down, empty, edit } from '@/assets/images';
import { fold, down, empty, edit, register } from '@/assets/images';
import { Image } from 'antd';
import {link} from '@/assets/images';
import { link } from '@/assets/images';
import * as $$ from '@/utils/utility';
import PersonCard from './personCard';
function getByIdRoleApi(id) {
  return $$.ax.request({ url: `ctUser/getByIdRole?id=` + id, type: 'get', service: 'cust' });
}
export default function HandleRecord(props) {
  const appUrl = $$.appUrl;
  const [list, setList] = useState([]);
  const [imgVisible, setImgVisible] = useState({ visible: false, src: '' });
  const [personView, setPersonView] = useState(false)
  const [personData, setPersonData] = useState({})
  useEffect(() => {
    setList(props.data)
@@ -35,6 +40,24 @@
      return record;
    }));
  };
  const getByIdRole = async (id) => {
    const res = await getByIdRoleApi(id)
    if (res.type) {
      setPersonView(!personView)
      setPersonData(res.data)
    }
  }
  const handlePersonDetail = (id) => {
    getByIdRole(id)
  }
  const handleCancel=()=>{
    setPersonView(false)
  }
  const handleEdit = (id) => {
    props.handleEdit(id)
@@ -68,13 +91,16 @@
                }
                <div>{`${record.createTime} ${record.handleUnitName}`}</div>
                <div className={`container-bottom-left-record-top-${record.handleType === '2' ? 'remark' : 'hostOrg'}`}>{record.handleType === '2' ? '配合部门' : '承办部门'}</div>
                {!props.isReview && <div><img src={edit} alt='' className='container-bottom-left-record-top-edit' onClick={() => handleEdit(record)} /></div>}
                {!props.isReview && !props.noEdit && <div><img src={edit} alt='' className='container-bottom-left-record-top-edit' onClick={() => handleEdit(record)} /></div>}
              </div>
              <div className='container-bottom-left-record-bottom' style={{ display: record.showView ? 'block' : 'none' }}>
                <table border="1" cellpadding="8" className='container-bottom-left-record-bottom-table'>
                  <tr>
                    <th bgcolor="#F7F8FA" className="table-title" width="120">操作人</th>
                    <td>{record.handleUserName || '-'}</td>
                    <td>
                      {record.handleUserName || '-'}
                      <img src={register} alt='' onClick={() => handlePersonDetail(record.handleUserId)} style={{ width: '14px', height: '14px', marginLeft: '8px', marginTop: '-4px' }} />
                    </td>
                  </tr>
                  <tr>
                    <th bgcolor="#F7F8FA" className="table-title" width="120">办理意见</th>
@@ -92,11 +118,18 @@
                        }}
                      />
                    </div>
                    <td style={{ color: '#1A6FB8' }} onClick={() => handleOpenFiles(record?.fileInfoList?.[0])}>
                      <div style={{cursor: 'pointer',display:'flex',alignItems:'center',gap:'4px'}}>
                        <img src={link} alt='' style={{width:'14px',height:'14px'}}/>
                        <div>{record?.fileInfoList?.[0]?.name || '-'}</div>
                      </div>
                    <td>
                      {record?.fileInfoList?.length > 0 ?
                        <div style={{ display: 'flex', alignItems: 'center', gap: '4px', color: '#1A6FB8' }}>
                          <img src={link} alt='' style={{ width: '14px', height: '14px' }} />
                          <div>
                            {record?.fileInfoList?.map((item, index) =>
                              <div key={index} onClick={() => handleOpenFiles(item)} style={{ cursor: 'pointer' }}>{item.name || '-'}{index === record.fileInfoList.length - 1 ? '' : ','}</div>
                            )}
                          </div>
                        </div> : '-'
                      }
                    </td>
                  </tr>
                </table>
@@ -120,7 +153,7 @@
          description='暂无数据'
        />
      }
      <PersonCard personView={personView} handleCancel={handleCancel} personData={personData} />
    </div>
  )
}
gz-customerSystem/src/views/register/matterDetail/Supervising.jsx
@@ -2,7 +2,7 @@
 * @Author: dminyi 1301963064@qq.com
 * @Date: 2024-09-06 09:54:09
 * @LastEditors: dminyi 1301963064@qq.com
 * @LastEditTime: 2024-09-06 11:03:29
 * @LastEditTime: 2024-09-13 11:20:00
 * @FilePath: \gzDyh\gz-customerSystem\src\views\register\matterDetail\Supervising.jsx
 * @Description: 督办
 */
@@ -102,7 +102,7 @@
            <div>张三丰</div>
          </div>
          <div className='Supervising-item'>
            <div className='Supervising-item-title' style={{ width: '70px' }}>督办内容:</div>
            <div className='Supervising-item-title' style={{ width: '80px' }}>督办内容:</div>
            <div style={{ flex: 1 }}>该纠纷事件目前群众较为关注,现要求相关部门即刻启动纠纷化解工作。请负责同事务必于本周内制定出具体解决方案,并确保与当事人进行有效沟通。请各位积极响应,高效协作,争取在最短时间内妥善处理完毕。</div>
          </div>
          <div className='Supervising-item'>
@@ -125,8 +125,8 @@
            <div>张三丰</div>
          </div>
          <div className='Supervising-item'>
            <div className='Supervising-item-title'>督办内容:</div>
            <div>该纠纷事件目前群众较为关注,现要求相关部门即刻启动纠纷化解工作。请负责同事务必于本周内制定出具体解决方案,并确保与当事人进行有效沟通。请各位积极响应,高效协作,争取在最短时间内妥善处理完毕。</div>
            <div className='Supervising-item-title' style={{ width: '80px' }}>督办内容:</div>
            <div style={{ flex: 1 }}>该纠纷事件目前群众较为关注,现要求相关部门即刻启动纠纷化解工作。请负责同事务必于本周内制定出具体解决方案,并确保与当事人进行有效沟通。请各位积极响应,高效协作,争取在最短时间内妥善处理完毕。</div>
          </div>
          <div className='Supervising-item'>
            <div className='Supervising-item-title'>督办附件:</div>
@@ -161,7 +161,7 @@
            </Col>
            <Col span={24}>
              <div className="title-text">督办附件</div>
              <img src={link} alt="" className="title-file" />广东好又多贸易有限公司营业执照副本.pdf
              <img src={link} alt="" style={{ width: '14px', height: '14px' }} />广东好又多贸易有限公司营业执照副本.pdf
            </Col>
          </Row>
          <Col span={24} style={{ marginBottom: '8px' }}>
@@ -257,7 +257,7 @@
          <Col span={24}>
            <div className="title-text">督办附件</div>
            <div style={{ display: 'flex' }}>
              <img src={link} alt="" className="title-file" />
              <img src={link} alt="" style={{ width: '14px', height: '14px' }} />
              <div style={{ color: '#1A6FB8' }}>广东好又多贸易有限公司营业执照副本.pdf</div>
            </div>
gz-customerSystem/src/views/register/matterDetail/UniteHandle.jsx
@@ -1,30 +1,28 @@
import React, { useState, useRef } from 'react';
import { Form, Input, Tabs, Typography, Button, Modal, Select } from '@arco-design/web-react';
import { Col, Space, Row, Tooltip } from 'antd';
import { Form, Input, Button, Modal, Select, Tooltip } from '@arco-design/web-react';
import { Col, Row } from 'antd';
import ArcoUpload from '@/components/ArcoUpload';
import * as $$ from '@/utils/utility';
import { question1, } from '@/assets/images';
import SelectObjModal from '@/components/SelectObjModal/selectPerson';
const FormItem = Form.Item;
const Option = Select.Option;
const appUrl = $$.appUrl;
function delFile(id) {
  return $$.ax.request({ url: `fileInfo/deleteFileById`, type: 'get', service: 'sys', data: { id } });
}
function postAssistApply(data) {
  return $$.ax.request({ url: `caseAssistApply/addCaseAssistApply`, type: 'post', service: 'mediate', data });
}
const UniteHandle = ({ id, visible, handleOnCancel }) => {
const UniteHandle = ({ id, visible, handleOnCancel, caseId, caseTaskId }) => {
  const formRef = useRef();
  const [supervising, setSupervising] = useState(false);
  const [fileVisible, setFileVisible] = useState(false);
  const options = [
    { value: '1', label: '一' }, { value: '2', label: '二' }, { value: '3', label: '三' }
  ];
  const [isModalVisible, setIsModalVisible] = useState(false);
  const [wantUser, setWantUser] = useState([]);
  const [selectOptions, setSelectOptions] = useState([]);//部门选择的options
  //删除文件
  const handleDelFile = async (id) => {
@@ -35,84 +33,125 @@
  }
  const handleSupervising = () => {
    setSupervising(!supervising)
    formRef.current.validate(undefined, (errors, values) => {
      if (!errors) {
        handleJoint({
          id,
          caseId,
          applyContent: values.applyContent,
          applyAssistUnitId: wantUser?.map(item => item.value).join(',') || '',
          applyAssistUnitName: wantUser?.map(item => item.name).join(',') || '',
        })
      }
    })
  }
  //form数据同步要提交的数据
  const handleSync = (value) => {
    let newList = wantUser.filter(item => value.indexOf(item.value) != -1)
    setWantUser(newList);
  }
  //联合处置请求
  const handleJoint = async (data) => {
    const res = await postAssistApply(data)
    if (res.type) {
      $$.infoSuccess({ content: '提交申请成功!' });
      handleOnCancel();
    }
  }
  return (
    <>
      <Modal visible={visible} onCancel={handleOnCancel} title='联合处置申请' centered footer={null}>
        <Form
          ref={formRef}
          layout='vertical'
          requiredSymbol={false}
          scrollToFirstError={true}
          initialValues={{
            suggestion: ''
          }}//默认值
        >
          <Row>
            <Col span={24}>
              <FormItem
                label={<div style={{ display: 'flex' }}><div>添加配合部门</div><div style={{ color: '#86909C' }}>(可多选)</div></div>}
                field=''
    <Modal
      visible={visible}
      onCancel={handleOnCancel}
      title='联合处置申请'
      centered
      footer={null}
      unmountOnExit={true}
      maskClosable={false}
      autoFocus={false}
      focusLock={false}
    >
      <Form
        ref={formRef}
        layout='vertical'
        requiredSymbol={false}
        scrollToFirstError={true}
        initialValues={{
          applyContent: '在事项办理过程中:\n因[......业务]涉及白云区新市街司法所\n因[......业务]涉及白云区新市街劳监大队\n特申请将上述部门列为配合部门,请审批'
        }}//默认值
      >
        <Row>
          <Col span={24}>
            <FormItem
              label={<div style={{ display: 'flex' }}><div>添加配合部门</div><div style={{ color: '#86909C' }}>(可多选)</div></div>}
              field='unit'
            >
              <Select
                mode='multiple'
                placeholder='请选择配合部门'
                allowClear
                onFocus={(e) => {
                  e.stopPropagation()
                  setIsModalVisible(true)
                }}
                options={selectOptions}
                onChange={handleSync}
              >
                <Select
                  mode='multiple'
                  placeholder='请选择督办部门'
                  style={{}}
                  allowClear
                >
                  {options.map((option) => (
                    <Option key={option.value} value={option.value} onChange={(v) => console.log(v, 'vvvvvv')}>
                      {option.label}
                    </Option>
                  ))}
                </Select>
              </FormItem>
            </Col>
            <Col span={24}>
              <FormItem
                field='suggestion'
                label={(<div style={{ display: 'flex' }}>添加理由<div className="must">必填</div></div>)}
              >
                <Input.TextArea
                  rows={5}
                  wrapperStyle={{ width: '700px' }}
                  value='在事项办理过程中:因[......业务]涉及白云区新市街司法所因[......业务]涉及白云区新市街劳监大队特申请将上述部门列为配合部门,请审批'
                />
              </FormItem>
            </Col>
            <Col span={24}>
              <FormItem
                label={
                  <div>
                    附件材料
                    <Tooltip onClick={() => setFileVisible(true)}>
                      <img src={question1} alt="" style={{ width: '13px', height: '13px', margin: '-3px 4px 0px 4px' }} />
                    </Tooltip>
                  </div>
                }
                field='caseDes'
                rules={[{ message: '请填写事项概况', required: true }]}
              >
                <ArcoUpload
                  params={{
                    action: `${appUrl.fileUrl}/${appUrl.sys}/api/web/fileInfo/upload?mainId='24083010062110001'&&ownerId=${id}&ownerType=22_00018-508`,
                  }}
                  field='file1'
                  // handleChangeFile={handleChangeFile}
                  label=''
                  // editData={props.editData}
                  handleDelFile={handleDelFile}
                />
              </FormItem>
            </Col>
            <Button type='primary' style={{ marginTop: '-16px' }} onClick={() => handleSupervising()}>提交申请</Button>
          </Row>
        </Form>
      </Modal>
    </>
              </Select>
            </FormItem>
          </Col>
          <Col span={24}>
            <FormItem
              field='applyContent'
              label={(<div style={{ display: 'flex' }}>添加理由<div className="must">必填</div></div>)}
              rules={[{ required: true, message: '请输入添加理由' }]}
            >
              <Input.TextArea
                rows={5}
              />
            </FormItem>
          </Col>
          <Col span={24}>
            <ArcoUpload
              params={{
                action: `${appUrl.fileUrl}/${appUrl.sys}/api/web/fileInfo/upload?mainId=${caseId}&&ownerId=${id}&ownerType=22_00018-508`,
              }}
              field='file'
              label={
                <div>
                  附件材料
                  <Tooltip>
                    <img src={question1} alt="" style={{ width: '13px', height: '13px', margin: '-3px 4px 0px 4px' }} />
                  </Tooltip>
                </div>
              }
              handleDelFile={handleDelFile}
            />
          </Col>
          <div className='dialogFooter'>
            <Button type='primary' style={{ marginTop: '-16px' }} onClick={handleSupervising}>提交申请</Button>
          </div>
        </Row>
      </Form>
      <SelectObjModal
        visible={isModalVisible}
        checkKeys={wantUser}
        onOk={(value) => {
          console.log(value);
          setWantUser(value.items)
          setSelectOptions(value.items.map(item => ({
            label: item.name,
            value: item.value
          })))
          formRef.current.setFieldValue('unit', value.items.map(item => item.value))
        }}
        onClose={() => setIsModalVisible(false)}
        type='dept'
        isCheckbox={true}
      />
    </Modal>
  )
}
gz-customerSystem/src/views/register/matterDetail/fileMessage.jsx
@@ -82,7 +82,7 @@
    console.log(res);
    if (res.type) {
      if (res.data) {
        setTransactResult({ ...res.data, fileName: res.data.fileInfoBaseDTOList?.map(item => item.trueName) })
        setTransactResult({ ...res.data })
      } else {
        setTransactResult(null)
      }
@@ -170,7 +170,7 @@
                      <Space size='small'>
                        <div className='MediationInfo-subTitle' style={{ marginTop: '-9px' }}></div><h4>办理记录({list.length})</h4>
                      </Space>
                      <HandleRecord isReview={true} data={list} />
                      <HandleRecord isReview={true} data={list} noEdit/>
                    </div>
                  }
                  {grade &&
@@ -214,7 +214,7 @@
                    title={
                      <span style={{ fontSize: '15px' }}>
                        督办信息
                        <Badge maxCount={99} count={1000} />
                        {/* <Badge maxCount={99} count={1000} /> */}
                      </span>
                    }
                  >
gz-customerSystem/src/views/register/matterDetail/personCard.jsx
New file
@@ -0,0 +1,43 @@
/*
 * @Author: dminyi 1301963064@qq.com
 * @Date: 2024-09-13 10:37:48
 * @LastEditors: dminyi 1301963064@qq.com
 * @LastEditTime: 2024-09-13 10:46:34
 * @FilePath: \gzDyh\gz-customerSystem\src\views\register\matterDetail\personCard.jsx
 * @Description:
 */
import React from 'react';
import {  Modal } from '@arco-design/web-react';
const PersonCard = (props) => {
  return (
    <>
      <Modal visible={props.personView} onCancel={props.handleCancel} title='工作人员信息' centered footer={null}>
        <table border="1" align="center" cellpadding="5" className="table">
          <tr>
            <th bgcolor="#F7F8FA" className="table-title" width="120">姓名</th>
            <td width='380'><div style={{ display: 'flex' }}><div>{props.personData?.trueName}</div></div></td>
            <th bgcolor="#F7F8FA" className="table-title" width="120">登录账号</th>
            <td width='380'>{props.personData?.acc}</td>
          </tr>
          <tr>
            <th bgcolor="#F7F8FA" className="table-title">手机号码</th>
            <td>{props.personData?.mobile}</td>
            <th bgcolor="#F7F8FA" className="table-title">工作电话</th>
            <td>-</td>
          </tr>
          <tr>
            <th bgcolor="#F7F8FA" className="table-title">所属部门</th>
            <td>{props.personData?.unitName}</td>
            <th bgcolor="#F7F8FA" className="table-title">职务</th>
            <td>{props.personData?.userRoles}</td>
          </tr>
        </table>
      </Modal>
    </>
  )
}
export default PersonCard;
gz-customerSystem/src/views/register/visit/component/previewTable.jsx
@@ -1,5 +1,8 @@
import React, { useEffect, useState } from 'react';
import { person, link } from '@/assets/images'
import { person1 } from '@/assets/images/icon'
import PreviewImage from '@/components/PreviewImage';
const ApplyDialog = ({ applyDialog }) => {
@@ -16,10 +19,10 @@
              <th bgcolor="#F7F8FA" className="table-title" width='140'>性别</th>
              <td>{item.sexName || '-'}</td>
              <td rowspan="4" width="112" height='147' style={{ padding: '0px' }}>
                <img border="0" src={person} alt="" style={{
                <img border="0" src={person1} alt="" style={{
                  width: '100%',
                  height: '100%',
                  objectFit: 'cover', // 保持原始宽高比并填充整个容器
                  // objectFit: 'cover', // 保持原始宽高比并填充整个容器
                  objectPosition: 'center', // 图片居中显示
                }} />
              </td>
@@ -49,10 +52,10 @@
                  item.fileInfoList?.map(res => {
                    if (res.ownerType == "22_00018-202") {
                      return res.fileList.map((result, resIndex) => {
                        return <a href="your-link-here.html" target="_blank">
                          <img src={link} alt="" className="title-file" />{result.trueName}
                        return <div style={{display: 'inline-block'}}>
                          <PreviewImage name={result.name} src={result.showUrl} />
                          {resIndex !== res.fileList.length - 1 && <>,</>}
                        </a>
                        </div>
                      })
                    }
                  })
@@ -83,7 +86,7 @@
            <th bgcolor="#F7F8FA" className="table-title" width="140">性别</th>
            <td>{item.sexName || '-'}</td>
            <td rowspan="4" width="112" height='147' style={{ padding: '0px' }}>
              <img border="0" src={person} alt="" style={{ width: '100%', height: '100%' }} />
              <img border="0" src={person1} alt="" style={{ width: '100%', height: '100%' }} />
            </td>
          </tr>
          <tr>
gz-customerSystem/src/views/register/visit/component/visitorRegister.jsx
@@ -58,13 +58,13 @@
        fileInfoList.forEach(item => {
          if (item.ownerType == '22_00018-202' || item.ownerType == '22_00018-203') {
            file.push({
              name: item.fileList[0].trueName,
              ...item.fileList[0],
              uid: item.fileList[0].id,
            })
          }
          if (item.ownerType == '22_00018-204' || item.ownerType == '22_00018-207') {
            file1.push({
              name: item.fileList[0].trueName,
              ...item.fileList[0],
              uid: item.fileList[0].id,
            })
          }
gz-customerSystem/src/views/register/visit/preview.jsx
@@ -12,6 +12,7 @@
import { ApplyDialog, AgentDialog, Respondent, Company } from './component/previewTable'
import FileTable from "../matterDetail/FileTable";
import { link } from '@/assets/images';
import PreviewImage from '@/components/PreviewImage';
const Preview = (props) => {
  const [data, setData] = useState({})
@@ -221,10 +222,11 @@
            <th bgcolor="#F7F8FA" className="table-title" width="120">协议文书</th>
            <td colspan='3'>
              {props.transactResult?.fileInfoBaseDTOList?.map((item, index) => {
                return <a href="your-link-here.html" target="_blank">
                  <img src={link} alt="" className="title-file" />{item.trueName}
                  {index !== props.transactResult.fileInfoBaseDTOList.length - 1 && <>,</>}
                </a>
                console.log(item);
                return <div style={{ display: 'inline-block' }}>
                  <PreviewImage name={item.name} src={item.showUrl} />
                  {index !== props.transactResult?.fileInfoBaseDTOList.length - 1 && <>,</>}
                </div>
              })}
            </td>
          </tr>