From c4b3b160a1baa5181ca77dd43fc5c5c2bd3cf252 Mon Sep 17 00:00:00 2001
From: dminyi <1301963064@qq.com>
Date: Fri, 30 Aug 2024 09:47:27 +0800
Subject: [PATCH] 自行处理-流转办理

---
 gz-customerSystem/src/components/ProgressStep/VisitStep.jsx      |  208 +++++++++++++++++
 gz-customerSystem/src/assets/images/feedback.png                 |    0 
 gz-customerSystem/src/components/WantUserTag/Handling.jsx        |   33 ++
 gz-customerSystem/src/views/register/index.less                  |    4 
 gz-customerSystem/src/assets/images/index.js                     |   28 +-
 gz-customerSystem/src/components/SelectObjModal/selectPerson.jsx |  244 ++++++++++++++++++++
 gz-customerSystem/src/api/apiHandler.js                          |    6 
 gz-customerSystem/src/components/ProgressStep/index.less         |    8 
 gz-customerSystem/src/components/WantUserTag/index.less          |    8 
 gz-customerSystem/src/views/register/visit/component/handle.jsx  |  147 ++++++++---
 10 files changed, 624 insertions(+), 62 deletions(-)

diff --git a/gz-customerSystem/src/api/apiHandler.js b/gz-customerSystem/src/api/apiHandler.js
index 8fc3402..dd29b23 100644
--- a/gz-customerSystem/src/api/apiHandler.js
+++ b/gz-customerSystem/src/api/apiHandler.js
@@ -2,7 +2,7 @@
  * @Company: hugeInfo
  * @Author: ldh
  * @Date: 2022-02-16 11:28:12
- * @LastEditTime: 2024-08-27 11:18:41
+ * @LastEditTime: 2024-08-29 14:25:03
  * @LastEditors: dminyi 1301963064@qq.com
  * @Version: 1.0.0
  * @Description: axios处理方法
@@ -57,8 +57,8 @@
 	
 	const url =
 		value.service === 'sys'
-			? `${appUrl.fileUrl}/${appUrl[value.service] || ''}/api/v1/${value.url}`
-			: `${appUrl.baseUrl}/${appUrl[value.service] || ''}/api/v1/${value.url}`;
+			? `${appUrl.fileUrl}/${appUrl[value.service] || ''}/api/web/${value.url}`
+			: `${appUrl.baseUrl}/${appUrl[value.service] || ''}/api/web/${value.url}`;
 
 	if (value.type === 'get') {
 		return ax
diff --git a/gz-customerSystem/src/assets/images/feedback.png b/gz-customerSystem/src/assets/images/feedback.png
new file mode 100644
index 0000000..dd426e1
--- /dev/null
+++ b/gz-customerSystem/src/assets/images/feedback.png
Binary files differ
diff --git a/gz-customerSystem/src/assets/images/index.js b/gz-customerSystem/src/assets/images/index.js
index b6345c4..f0249c0 100644
--- a/gz-customerSystem/src/assets/images/index.js
+++ b/gz-customerSystem/src/assets/images/index.js
@@ -36,18 +36,19 @@
 import person from "./person.png";
 import link from "./link.png";
 import check from "./check.png";
-import image from './image.png';
-import applyMaterials from './applyMaterials.png';
-import applyMaterials_active from './applyMaterials_active.png';
-import evidenceMaterials from './evidenceMaterials.png';
-import evidenceMaterials_active from './evidenceMaterials_active.png';
-import closeIcon from './closeIcon.png';
-import backgroundImage from './backgroundImage.jpg'
-import logo1 from './logo1.png';
-import register from './register.png';
-import Matter from './matter.png';
-import transfer from './transfer.png';
-import empty from './empty.png';
+import image from "./image.png";
+import applyMaterials from "./applyMaterials.png";
+import applyMaterials_active from "./applyMaterials_active.png";
+import evidenceMaterials from "./evidenceMaterials.png";
+import evidenceMaterials_active from "./evidenceMaterials_active.png";
+import closeIcon from "./closeIcon.png";
+import backgroundImage from "./backgroundImage.jpg";
+import logo1 from "./logo1.png";
+import register from "./register.png";
+import Matter from "./matter.png";
+import transfer from "./transfer.png";
+import empty from "./empty.png";
+import feedback from "./feedback.png";
 
 export {
   ledger_1,
@@ -90,5 +91,6 @@
   register,
   Matter,
   transfer,
-  empty
+  empty,
+  feedback,
 };
diff --git a/gz-customerSystem/src/components/ProgressStep/VisitStep.jsx b/gz-customerSystem/src/components/ProgressStep/VisitStep.jsx
new file mode 100644
index 0000000..eb4460a
--- /dev/null
+++ b/gz-customerSystem/src/components/ProgressStep/VisitStep.jsx
@@ -0,0 +1,208 @@
+/*
+ * @Author: dminyi 1301963064@qq.com
+ * @Date: 2024-08-29 14:57:06
+ * @LastEditors: dminyi 1301963064@qq.com
+ * @LastEditTime: 2024-08-29 15:58:19
+ * @FilePath: \gzDyh\gz-customerSystem\src\components\ProgressStep\VisitStep.jsx
+ * @Description: 来访登记步骤条
+ */
+
+import React, { useEffect, useState } from 'react';
+import { Tooltip, Space } from 'antd';
+import Icon, { PaperClipOutlined, RollbackOutlined, EllipsisOutlined } from '@ant-design/icons';
+import { feedback, ledger_8, ledger_7 } from '../../assets/images';
+import NameCard from '../NameCard';
+import * as $$ from '../../utils/utility';
+import FilesDrawer from '../FilesDrawer';
+import './index.less';
+
+// 获取调度处理进度数据
+function getDispProgressDataApi(caseId) {
+  return $$.ax.request({ url: 'caseTask/transferRecord?caseId=' + caseId, type: 'get', service: 'mediate' });
+}
+
+// 获取调解处理进度数据
+function getProgressDataApi(caseId) {
+  return $$.ax.request({ url: 'caseTask/transferRecord?caseId=' + caseId, type: 'get', service: 'mediate' });
+}
+// 获取司法确认处理进度数据
+function getJudicProgressDataApi(caseId) {
+  return $$.ax.request({ url: 'judicTask/getTaskProcess?caseId=' + caseId, type: 'get', service: 'mediate' });
+}
+
+/**
+ * caseId:'', // 案件id
+ * pageFrom:'', // 判断那个页面展示
+ */
+const ProgressStep = ({ caseId, pageFrom }) => {
+  const [data, setData] = useState([]);
+
+  // 提交调解  案件调度  案件签收  纠纷调解 指派网格员     
+
+  // 已处理列表第一个元素
+  const dom1 = (x) => (
+    <div>
+      <div className="myStep-item-p">
+        <span>{x.handlerUserName || '-'}</span>
+        {/* <span className={`public-nameCard-tag public-nameCard-tag-grey`}>
+          {x.canalName || '-'}
+        </span> */}
+      </div>
+      <div className="myStep-item-p" style={{ color: 'rgba(0,0,0,0.50)' }}>
+        <span>操作人:</span>
+        <span>{x.operationName}</span>
+      </div>
+      <div className="myStep-item-p" style={{ color: 'rgba(0,0,0,0.50)' }}>
+        <span>经办时间:</span>
+        <span>{$$.timeFormat(x.finishTime)}</span>
+      </div>
+    </div>
+  );
+  // 已处理列表后面 元素
+  const dom2 = (x) => (
+    <div>
+      <div className="myStep-item-p">
+        <span>{x.handlerUserName || '-'}</span>
+      </div>
+      <div className="myStep-item-p" style={{ color: 'rgba(0,0,0,0.50)' }}>
+        <span>操作人:</span>
+        <span>{x.operationName}</span>
+      </div>
+      <div className="myStep-item-p" style={{ color: 'rgba(0,0,0,0.50)' }}>
+        <span>操作时间:</span>
+        <span>{$$.timeFormat(x.finishTime)}</span>
+      </div>
+      {
+        x.handleContent &&
+        <div className='myStep-item-p-yy' style={{width:'200px'}}>
+          <span className='myStep-item-p-yy-l'>
+            {x.handleResult == '2' ?
+              <span>退回<Tooltip placement="top" title={x.handleContent || ''}><span>{`(${x.handleContent})` || '-'}</span></Tooltip></span>
+              : x.taskNode == 'F22_00019-3' && x.handleResult == '1' ?
+                // 22_00025-1:调解成功,22_00025-2:调解不成功
+                <span>调解结果:<Tooltip placement="top" title={x.mediResult == '22_00025-1' ? '调解成功' : x.mediResult == '22_00025-2' ? '调解不成功' : '-'}><span>{`${x.mediResult == '22_00025-1' ? '调解成功' : x.mediResult == '22_00025-2' ? '调解不成功' : '-'}` || '-'}</span></Tooltip></span>
+                : <Tooltip placement="top" title={x.handleContent || ''}><span>{x.handleContent || '-'}</span></Tooltip>}
+          </span>
+          {
+            x.fileInfoList?.length > 0 &&
+            <div style={{ marginTop: '4px' }}>
+              <FilesDrawer name={<>
+                <PaperClipOutlined style={{ marginRight: '4px' }} />
+                <span>{x.taskNode == 'F22_00019-3' && x.handleResult == '1' ? '调解协议书' : '处理附件'}</span>
+              </>} filesData={x.fileInfoList} title="经办附件" />
+            </div>
+          }
+        </div>
+      }
+    </div>
+  );
+
+  // 办理中
+  const dom3 = (x) => (
+    <div>
+      <div className="myStep-item-p">
+        <span style={{ color: 'rgba(0,0,0,0.50)' }}>办理中</span>
+      </div>
+      <div className="myStep-item-p">
+        <span>{x.handlerUserName}</span>
+      </div>
+    </div>
+  );
+
+  const fakeData = [
+    {
+      handlerUserName: '天河区棠下街综治中心',
+      canalName: '来访登记',
+      finishTime: new Date().getTime() - 24 * 60 * 60 * 1000, // 一天前的时间
+      handleResult: '1',
+      status: '2',
+      taskNodeName: '来访登记',
+      mediResult: '22_00025-1',
+      handleContent: '调解成功,双方达成一致意见。',
+      operationName: '李晓明'
+    },
+    {
+      handlerUserName: '天河区棠下街综治中心',
+      canalName: '事件流转',
+      finishTime: new Date().getTime() - 12 * 60 * 60 * 1000, // 半天前的时间
+      handleResult: '1',
+      status: '2',
+      taskNodeName: '案件调度',
+      mediResult: '22_00025-1',
+      handleContent: '自行受理',
+      operationName: '李晓明'
+
+    },
+    {
+      handlerUserName: '天河区棠下街综治中心',
+      canalName: '办理反馈',
+      finishTime: new Date().getTime() - 6 * 60 * 60 * 1000, // 6小时前的时间
+      handleResult: '2',
+      status: '3',
+      taskNodeName: '案件签收',
+      mediResult: '22_00025-1',
+      handleContent: '案件已被签收,准备开始调解。',
+      operationName: '李晓明'
+
+    },
+  ];
+
+  useEffect(() => {
+    if (pageFrom === 'dispatchRecord') {
+      setData(fakeData || [])
+    }
+  }, [pageFrom]);
+
+  function splitByLine(str, len = 10) {
+    let strLen = str.length,
+      num = 0,
+      multiple = Math.floor(strLen / len),
+      arrStr = str.split(''),
+      space = strLen % len > 0 ? multiple + 1 : multiple
+    for (let i = 1; i <= space; i++) {
+      arrStr.splice((len * i + num), 0, '\n')
+      num++
+    }
+    return arrStr.join('')
+  }
+
+
+  return (
+    <>
+      {data.length !== 0
+        ? data.map((x, t) => {
+          return (
+            <div key={t + 1}>
+              <div className="myStep-item">
+                {t === data.length - 1 ? null : <div className={`${!x.handleContent ? 'myStep-item-divider' : x.fileInfoList?.length > 0 ? 'myStep-item-divider2' : "myStep-item-divider1"} ${x.status === '2' && 'myStep-item-divider-success'}`} />}
+                <div className={`myStep-item-icon1 myStep-item-${x.status === '2' ? 'success1' : 'noStarted1'}`}>
+                  <div className="myStep-item-title">{splitByLine(x.taskNodeName || '', 2)}</div>
+                  <img className='myStep-item-img' src={x.status === '1' ? ledger_8 : (x.handleResult === '2' ? feedback : ledger_7)} alt="" />
+                  {/* <Icon className='myStep-item-img' component={x.handleResult === '2' ? RollbackOutlined : CheckOutlined} /> */}
+                </div>
+                <div className="myStep-item-right">
+                  {/* {dom1(x || {})} */}
+                  {
+                    t === 0 && dom1(x || {})
+                  }
+                  {
+                    t !== 0 && <>
+                      {
+                        x.status === '2' ? dom2(x || {}) : dom3(x || {})
+                      }
+                    </>
+                  }
+                  {/* <div className="myStep-item-title">{x.taskNodeName}</div> */}
+                  {/* {
+                    <StepContent x={x || {}} t={t || 0} />} */}
+                </div>
+              </div>
+            </div>
+          );
+        })
+        : <div style={{ padding: '100px 0' }}>{$$.MyEmpty()}</div>}
+    </>
+  );
+};
+
+export default ProgressStep;
diff --git a/gz-customerSystem/src/components/ProgressStep/index.less b/gz-customerSystem/src/components/ProgressStep/index.less
index 1945e31..e37d54a 100644
--- a/gz-customerSystem/src/components/ProgressStep/index.less
+++ b/gz-customerSystem/src/components/ProgressStep/index.less
@@ -28,6 +28,14 @@
 			}
 		}
 
+		&-noStarted1 {
+			background-color: rgba(185,99,211,1);
+
+			&::after {
+				border-color: rgba(185,99,211,1);
+			}
+		}
+
 		&-icon {
 			float: left;
 			margin-right: 8px;
diff --git a/gz-customerSystem/src/components/SelectObjModal/selectPerson.jsx b/gz-customerSystem/src/components/SelectObjModal/selectPerson.jsx
new file mode 100644
index 0000000..a3943e4
--- /dev/null
+++ b/gz-customerSystem/src/components/SelectObjModal/selectPerson.jsx
@@ -0,0 +1,244 @@
+/*
+ * @Author: dminyi 1301963064@qq.com
+ * @Date: 2024-08-29 17:41:09
+ * @LastEditors: dminyi 1301963064@qq.com
+ * @LastEditTime: 2024-08-29 20:03:51
+ * @FilePath: \gzDyh\gz-customerSystem\src\components\SelectObjModal\selectPerson.jsx
+ * @Description: 选择经办人
+ */
+import React, { useState, useEffect, useMemo } from 'react';
+import PropTypes from 'prop-types';
+import { Button, Space, Input, Tree } from 'antd';
+import { CloseOutlined } from '@ant-design/icons';
+import './index.less';
+import MyModal from '../MyModal';
+import * as $$ from '../../utils/utility';
+
+const { Search } = Input;
+
+// 获取人员,组织,部门数据
+function getDataApi(type, searchData) {
+	const url = type === 'person' ? 'ctUser/userChoose' : type === 'unit' ? 'ctUser/unitList' : 'ctUser/deptList';
+	return $$.ax.request({ url, type: 'get', data: searchData, service: 'cust' });
+}
+
+/**
+ * visible, // 传入参数控制modal显示
+ * checkKeys, // 选中,数据格式 [{value:'',label:''}]
+ * type, // 'person': 选择人员 'unit': 选择组织 'dept': 选择部门
+ * isCheckbox, // 是否多选
+ * searchData, // 搜索条件
+ * onClose, // 关闭
+ * onOk, // 点击确定的回调
+ */
+const SelectObjModal = ({ visible = false, checkKeys = [], type = 'person', isCheckbox = false, searchData = {}, onClose, onOk }) => {
+	const [data, setData] = useState([]);
+
+	const [checkedKeys, setCheckedKeys] = useState({ keys: [], items: [] });
+
+	const [expandedKeys, setExpandedKeys] = useState([]);
+
+	const [searchValue, setSearchValue] = useState('');
+
+	const [autoExpandParent, setAutoExpandParent] = useState(true);
+
+	const [dataList, setDataList] = useState([]);
+
+	// tree复选框选择
+	function handleCheck(checkedKeys, e) {
+		if (!isCheckbox && checkedKeys.checked.length > 1) {
+			$$.info({ type: 'warning', content: '当前选择只可单选' });
+			return;
+		}
+		let checkedNodes = e.checkedNodes;
+		checkedNodes.forEach((x) => delete x.children);
+		setCheckedKeys({ keys: checkedKeys.checked, items: checkedNodes });
+	}
+
+	// 删除选项
+	function handleDelete(t) {
+		checkedKeys.keys.splice(t, 1);
+		checkedKeys.items.splice(t, 1);
+		setCheckedKeys({ ...checkedKeys });
+	}
+
+	// 搜索
+	useEffect(() => {
+		if (!visible) return;
+		const arr = [];
+		const generateList = (data) => {
+			for (let i = 0; i < data.length; i++) {
+				const node = data[i];
+				const { value, label } = node;
+				arr.push({ value, label });
+				if (node.children) {
+					generateList(node.children);
+				}
+			}
+		};
+		generateList(data);
+		setDataList(arr);
+		handleSearch('', arr);
+	}, [data]);
+
+	const getParentKey = (key, tree) => {
+		let parentKey;
+		for (let i = 0; i < tree.length; i++) {
+			const node = tree[i];
+			if (node.children) {
+				if (node.children.some((item) => item.value === key)) {
+					parentKey = node.value;
+				} else if (getParentKey(key, node.children)) {
+					parentKey = getParentKey(key, node.children);
+				}
+			}
+		}
+		return parentKey;
+	};
+
+	function handleSearch(value, dataList) {
+    
+    console.log('value, dataList', value, dataList);
+		const newExpandedKeys = dataList
+			.map((item) => {
+				if (item.label.indexOf(value) > -1) {
+					return getParentKey(item.value, data);
+				}
+				return null;
+			})
+			.filter((item, i, self) => item && self.indexOf(item) === i);
+
+      console.log('newExpandedKeys',newExpandedKeys);
+		setExpandedKeys(newExpandedKeys);
+		setSearchValue(value);
+		setAutoExpandParent(true);
+	}
+
+	const treeData = useMemo(() => {
+		const loop = (data) =>
+			data.map((item) => {
+				const strTitle = item.label;
+				const index = strTitle.indexOf(searchValue);
+				const beforeStr = strTitle.substring(0, index);
+				const afterStr = strTitle.slice(index + searchValue.length);
+				const label =
+					index > -1 ? (
+						<span>
+							{beforeStr}
+							<span className="selectObjModal-searchValue">{searchValue}</span>
+							{afterStr}
+						</span>
+					) : (
+						<span>{strTitle}</span>
+					);
+				if (item.children) {
+					return {
+						label,
+						name: strTitle,
+						value: item.value,
+						checkable: item.checkable,
+						children: loop(item.children),
+					};
+				}
+				return {
+					label,
+					name: strTitle,
+					checkable: item.checkable,
+					value: item.value,
+				};
+			});
+		return loop(data);
+	}, [searchValue, data]);
+
+  // 默认调解员查询'22_00024-4'
+	const searchRole = type === 'person' ? { roleCode: '22_00024-4' } : {};
+
+	useEffect(() => {
+		if (!visible) return;
+		// 获取数据
+		async function getData() {
+			global.setSpinning(true);
+			const res = await getDataApi(type, { ...searchRole, ...searchData });
+			global.setSpinning(false);
+			if (res.type) {
+				setData(res.data || []);
+			}
+		}
+    console.log(checkKeys,'checkKeys')
+    console.log(checkedKeys,'checkedKeys')
+		if (checkKeys.length !== 0) {
+			let keys = [];
+			checkKeys.forEach((x) => keys.push(x.value));
+			setCheckedKeys({ keys, items: checkKeys });
+		} else {
+			setCheckedKeys({ keys: [], items: [] });
+		}
+		getData();
+	}, [type, visible]);
+
+	const nameStr = type === 'person' ? '人员' : type === 'unit' ? '组织' : '部门';
+
+	return (
+		<MyModal visible={!!visible} title={`选择${nameStr}`} width={560} footer={false} onCancel={onClose}>
+			<div className="selectObjModal-main">
+				<div className="selectObjModal-left">
+					<div className="selectObjModal-left-search">
+						<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' }}
+							/>
+						) : (
+							$$.MyEmpty()
+						)}
+					</div>
+				</div>
+				<div className="selectObjModal-right">
+					{checkedKeys.items.map((x, t) => (
+						<div className="selectObjModal-right-item" key={x.value}>
+							<span className="selectObjModal-right-item-name">{x.label}</span>
+							<CloseOutlined onClick={() => handleDelete(t)} className="selectObjModal-right-item-icon" />
+						</div>
+					))}
+					{checkedKeys.items.length === 0 && <div className="selectObjModal-none">{$$.MyEmpty({ description: '尚未选择' + nameStr })}</div>}
+				</div>
+			</div>
+			<div className="selectObjModal-footer">
+				<div>已选中:{checkedKeys.keys.length}人</div>
+				<Space size="middle">
+					<Button onClick={onClose}>取消</Button>
+					<Button type="primary" onClick={() => onOk && onOk(checkedKeys)}>
+						确定
+					</Button>
+				</Space>
+			</div>
+		</MyModal>
+	);
+};
+
+SelectObjModal.propTypes = {
+	visible: PropTypes.any,
+	checkKeys: PropTypes.array,
+	type: PropTypes.string,
+	isCheckbox: PropTypes.bool,
+	searchData: PropTypes.object,
+	onClose: PropTypes.func,
+	onOk: PropTypes.func,
+};
+
+export default SelectObjModal;
diff --git a/gz-customerSystem/src/components/WantUserTag/Handling.jsx b/gz-customerSystem/src/components/WantUserTag/Handling.jsx
new file mode 100644
index 0000000..6aeb09b
--- /dev/null
+++ b/gz-customerSystem/src/components/WantUserTag/Handling.jsx
@@ -0,0 +1,33 @@
+/*
+ * @Author: dminyi 1301963064@qq.com
+ * @Date: 2024-08-29 20:43:25
+ * @LastEditors: dminyi 1301963064@qq.com
+ * @LastEditTime: 2024-08-29 20:55:24
+ * @FilePath: \gzDyh\gz-customerSystem\src\components\WantUserTag\Handling.jsx
+ * @Description: 经办人
+ */
+import React from 'react';
+import PropTypes from 'prop-types';
+import { Typography } from 'antd';
+import { CloseOutlined } from '@ant-design/icons';
+import './index.less';
+
+const WantUserTag = ({ name, value, onClose }) => {
+  return (
+    <div className="wantUserTag">
+      <div className="wantUserTag-wantHandleUser">
+        <div className="wantUserTag-wantUser-right">{name}</div>
+        <Typography.Link className="wantUserTag-wantHandleUser-close" onClick={() => onClose(value)}>
+          <CloseOutlined style={{width:'11px',height:'13px'}}/>
+        </Typography.Link>
+      </div>
+    </div>
+  );
+};
+
+WantUserTag.propTypes = {
+  name: PropTypes.string,
+  onClose: PropTypes.func,
+};
+
+export default WantUserTag;
\ No newline at end of file
diff --git a/gz-customerSystem/src/components/WantUserTag/index.less b/gz-customerSystem/src/components/WantUserTag/index.less
index a53f337..b394f4c 100644
--- a/gz-customerSystem/src/components/WantUserTag/index.less
+++ b/gz-customerSystem/src/components/WantUserTag/index.less
@@ -30,6 +30,14 @@
 		}
 	}
 
+	&-wantHandleUser{
+		display:flex;
+		padding: 5px 8px;
+		border: 1px solid rgba(229,230,235,1);
+
+
+	}
+
 	&-green {
 		background: linear-gradient(135deg, #05aeae, rgba(5, 174, 174, 0.85) 100%);
 	}
diff --git a/gz-customerSystem/src/views/register/index.less b/gz-customerSystem/src/views/register/index.less
index 4c73c7e..633e838 100644
--- a/gz-customerSystem/src/views/register/index.less
+++ b/gz-customerSystem/src/views/register/index.less
@@ -315,4 +315,8 @@
 .tabs-container .arco-tabs-header-ink {
 	left: 83.988px;
 	width: 82px;
+}
+
+.progress{
+	margin: 16px 0px 0px 16px;
 }
\ No newline at end of file
diff --git a/gz-customerSystem/src/views/register/visit/component/handle.jsx b/gz-customerSystem/src/views/register/visit/component/handle.jsx
index 0ba90b8..620a5fc 100644
--- a/gz-customerSystem/src/views/register/visit/component/handle.jsx
+++ b/gz-customerSystem/src/views/register/visit/component/handle.jsx
@@ -1,11 +1,14 @@
 import React, { useState } from 'react';
-import { Steps, Button } from '@arco-design/web-react';
-import { Col, Space, Row, Tooltip } from 'antd';
+import { Steps } from '@arco-design/web-react';
+import { Col, Space, Row, Tooltip, Button } from 'antd';
 import { register, empty } from '../../../../assets/images'
-import { Form, Select, Empty, Tabs, Typography, } from '@arco-design/web-react';
+import { Form, Input, Empty, Tabs, Typography, Modal } from '@arco-design/web-react';
 import { question1, } from '@/assets/images';
+import ProgressStep from '../../../../components/ProgressStep/VisitStep'
+import SelectObjModal from '../../../../components/SelectObjModal/selectPerson'
+import WantUserTag from '../../../../components/WantUserTag/Handling'
 
-const Option = Select.Option;
+const InputSearch = Input.Search;
 const FormItem = Form.Item;
 const TabPane = Tabs.TabPane;
 
@@ -17,6 +20,26 @@
 
 
 const Handle = () => {
+  const [selectedTab, setSelectedTab] = useState('1'); // 默认选中第一个 tab
+  const [wantUser, setWantUser] = useState({});
+  const tabs = [
+    { index: '1', label: '承办部门' },
+    { index: '2', label: '配合部门' },
+  ];
+
+  const [isModalVisible, setIsModalVisible] = useState(false);
+
+  const showModal = () => {
+    setIsModalVisible(true);
+  };
+
+  const hideModal = () => {
+    setIsModalVisible(false);
+  };
+
+  const handleTabChange = (newTabIndex) => {
+    setSelectedTab(newTabIndex);
+  };
 
   return (
     <>
@@ -63,45 +86,45 @@
               requiredSymbol={false}
               scrollToFirstError={true}
             >
-              <Row>
-                <Col span={8}>
-                  <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>
+              <Col span={8}>
+                <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='level' >
+                  {wantUser.wantUserId ?
+                    <WantUserTag name={wantUser.wantUserName} onClose={() => setWantUser({ wantUserId: null, wantUserName: null })} />
+                    :
+                    <InputSearch
+                      searchButton='选择'
+                      placeholder='请选择'
+                      style={{ width: 350 }}
+                      onClick={() => setIsModalVisible(true)}
+                      onSearch={() => setIsModalVisible(true)}
+                    />
                   }
-                    field='level' >
-                    <Select placeholder='请选择' allowClear>
-                      {['一级', '二级', '三级', '四级'].map((option, index) => (
-                        <Option key={option} value={option}>
-                          {option}
-                        </Option>
-                      ))}
-
-                    </Select>
-                    <Button type='primary' style={{ position: 'absolute', right: 0 }}>保存</Button>
-                  </FormItem>
-                </Col>
-                <Col span={24}>
-                  <div style={{ color: 'rgb(134, 144, 156)' }}>办理记录</div>
-                  <Empty
-                    icon={
-                      <div
-                        style={{
-                          display: 'flex',
-                          // width: 160,
-                          justifyContent: 'center',
-                        }}
-                      >
-                        <img src={empty} alt='' style={{ width: '160px', height: '160px' }} />
-                      </div>
-                    }
-                    description='暂无数据'
-                  />
-                </Col>
-              </Row>
+                </FormItem>
+              </Col>
+              <Col span={24}>
+                <div style={{ color: 'rgb(134, 144, 156)' }}>办理记录</div>
+                <Empty
+                  icon={
+                    <div
+                      style={{
+                        display: 'flex',
+                        // width: 160,
+                        justifyContent: 'center',
+                      }}
+                    >
+                      <img src={empty} alt='' style={{ width: '160px', height: '160px' }} />
+                    </div>
+                  }
+                  description='暂无数据'
+                />
+              </Col>
             </Form>
             <Space>
               <Button type="primary" style={{ backgroundColor: '#1A6FB8' }}>添加办理记录</Button>
@@ -116,19 +139,40 @@
                 key='1'
                 title={
                   <span style={{ fontSize: '15px' }}>
-                    Tab 1
+                    流转进度
                   </span>
                 }
               >
-                <Typography.Paragraph style={style}>
-                  
+                <Typography.Paragraph>
+                  <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 caseId='202408291012566613' pageFrom="dispatchRecord" />
+                    </div>
+                  }
                 </Typography.Paragraph>
               </TabPane>
               <TabPane
                 key='2'
                 title={
                   <span style={{ fontSize: '15px' }}>
-                    Tab 2
+                    督办信息
                   </span>
                 }
               >
@@ -138,6 +182,17 @@
 
           </div>
         </div>
+
+        {/* 选择经办人*/}
+        <SelectObjModal
+          visible={isModalVisible}
+          checkKeys={wantUser.wantUserId ? [{ label: wantUser.wantUserName, value: wantUser.wantUserId }] : undefined}
+          onOk={(value) => {
+            setIsModalVisible(false);
+            setWantUser({ wantUserId: value.keys[0], wantUserName: value.items[0].name });
+          }}
+          onClose={() => setIsModalVisible(false)}
+        />
       </div>
     </>
   )

--
Gitblit v1.8.0