/*
|
* @Company: hugeInfo
|
* @Author: lwh
|
* @Date: 2025-04-10 18:40:00
|
* @LastEditTime: 2025-04-11 15:10:46
|
* @LastEditors: lwh
|
* @Version: 1.0.0
|
* @Description: 结案申请
|
*/
|
import React, { useState, useEffect } from 'react';
|
import { useHistory, useLocation } from 'react-router-dom';
|
import { Button, TextareaItem } from 'dingtalk-design-mobile';
|
import { Scrollbars } from 'react-custom-scrollbars';
|
import * as $$ from '../../../utils/utility';
|
|
import { applyClose_1 } from '../../../assets/img';
|
|
import NavBarPage from '../../../components/NavBarPage';
|
import DingUpload from '../../../components/DingUpload';
|
import './index.less';
|
|
// 事项节点组件
|
const TaskNode = ({ title, items }) => {
|
return (
|
<div className="task-node-container">
|
<div className="task-node-title">{title}</div>
|
<div className="task-node-content">
|
{items.map((item, index) => (
|
<div key={index} className="task-node-item">
|
<div className="task-node-item-dot"></div>
|
<div className="task-node-item-info">
|
<div className="task-node-item-title">{item.title}</div>
|
<div className="task-node-item-desc">{item.desc}</div>
|
<div className="task-node-item-time">{item.time}</div>
|
</div>
|
</div>
|
))}
|
</div>
|
</div>
|
);
|
};
|
|
// 获取新ID接口
|
function getNewTimeIdApi() {
|
return $$.ax.request({ url: `caseUtils/getNewTimeId`, type: 'get', service: 'utils' });
|
}
|
|
function windupApplyApi(data) {
|
return $$.ax.request({ url: `caseTask/windupApply`, type: 'post', service: 'mediate', data });
|
}
|
|
function saveVideoApi(data) {
|
return $$.ax.request({ url: `meetInfo/saveVideo`, type: 'post', service: 'mediate', data });
|
}
|
|
// ai分析是否为风险/重点案件
|
function getRiskResultApi(data) {
|
return $$.ax.request({ urlAi: `case-law/getRiskResult`, data, typeAi: 'post', service: 'open' });
|
}
|
|
const ApplyClose = () => {
|
const history = useHistory();
|
const location = useLocation();
|
const query = new URLSearchParams(location.search);
|
const caseId = query.get('caseId');
|
const caseTaskId = query.get('caseTaskId');
|
|
const [formData, setFormData] = useState({
|
resolveResult: '1', // 默认选择化解成功(1:成功 2:不成功)
|
agreementType: '1', // 默认选择书面协议(1:书面 2:口头)
|
windupContent: '', // 结案意见
|
solutionMeasures: '', // 调解过程中采取的措施及解决方案
|
failReason1: '', // 最终难以调和的原因
|
agreeContent: '', // 口头协议要点
|
});
|
const [fileList, setFileList] = useState([]); // 协议文书文件列表
|
const [newId, setNewId] = useState(''); // 用于文件上传的ID
|
|
async function fetchNewId() {
|
global.setSpinning(true);
|
const res = await getNewTimeIdApi();
|
global.setSpinning(false);
|
if (res.type) {
|
setNewId(res.data);
|
}
|
}
|
// 获取新ID
|
useEffect(() => {
|
fetchNewId();
|
}, []);
|
|
// 处理表单数据变化
|
const handleFormChange = (key, value) => {
|
setFormData({
|
...formData,
|
[key]: value,
|
});
|
};
|
|
// 处理文件变化
|
const handleFileChange = (info) => {
|
setFileList(info.fileList);
|
};
|
|
// 提交申请
|
const handleSubmit = async () => {
|
// 化解成功时的验证
|
if (formData.resolveResult === '1') {
|
// 书面协议需要上传文书
|
if (formData.agreementType === '1' && fileList.length === 0) {
|
$$.showToast({ content: '请上传协议文书' });
|
return;
|
}
|
// 口头协议需要填写协议要点
|
else if (formData.agreementType === '2' && !formData.agreeContent) {
|
$$.showToast({ content: '请填写协议要点' });
|
return;
|
}
|
}
|
// 化解不成功时的额外验证
|
if (formData.resolveResult === '2') {
|
if (!formData.solutionMeasures) {
|
$$.showToast({ content: '请填写调解过程中采取的措施及解决方案' });
|
return;
|
}
|
if (!formData.failReason1) {
|
$$.showToast({ content: '请填写最终难以调和的原因' });
|
return;
|
}
|
formData.failReason = `1、${formData.solutionMeasures};2、${formData.failReason1}。`;
|
}
|
|
// 表单验证
|
if (!formData.windupContent) {
|
$$.showToast({ content: '请填写结案意见' });
|
return;
|
}
|
|
// 如果化解不成功,则需要调用ai分析是否为风险/重点案件
|
if (formData.resolveResult === '2') {
|
const submitData = {
|
...formData,
|
mediResultName: '化解不成功',
|
mediResult: '22_00025-2',
|
caseTaskId: caseTaskId,
|
id: newId,
|
caseId,
|
fileIds: fileList
|
.map((file) => file.response?.data?.id || file.id)
|
.filter(Boolean)
|
.join(','),
|
};
|
|
windupApply(submitData);
|
} else {
|
// 提交数据
|
const submitData = {
|
...formData,
|
mediResultName: '化解成功',
|
mediResult: '22_00025-1',
|
agreeTypeName: formData.agreementType === '1' ? '书面协议' : '口头协议',
|
agreeType: formData.agreementType === '1' ? '24_00003-2' : '24_00003-1',
|
caseTaskId: caseTaskId,
|
id: newId,
|
caseId,
|
fileIds: fileList
|
.map((file) => file.response?.data?.id || file.id)
|
.filter(Boolean)
|
.join(','),
|
};
|
windupApply(submitData);
|
}
|
};
|
|
//结案申请请求
|
const windupApply = async (submitData) => {
|
const res = await windupApplyApi({
|
...submitData,
|
});
|
if (res.type) {
|
$$.showToast({ type: 'success', content: '提交成功' });
|
setTimeout(() => {
|
//返回两层这里可能需要修改
|
history.go(-2);
|
}, 1500);
|
|
saveVideo(caseId);
|
// getRiskResult({ caseId, caseText: submitData.windupContent || '' });
|
}
|
};
|
|
async function saveVideo(caseId) {
|
const res = await saveVideoApi({ caseId });
|
if (res.type) {
|
}
|
}
|
|
// ai分析是否为风险/重点案件
|
async function getRiskResult(data) {
|
const res = await getRiskResultApi(data);
|
if (res.type) {
|
}
|
}
|
|
return (
|
<NavBarPage title="结案申请">
|
<Scrollbars style={{ height: 'calc(100vh - 46px)' }}>
|
<div className="apply-close-container">
|
<div className="apply-close-section">
|
<div className="apply-close-title">化解结果</div>
|
<div className="apply-close-options">
|
<div className="rect-radio-group">
|
<div
|
className={`rect-radio-item ${formData.resolveResult === '1' ? 'active' : ''}`}
|
onClick={() => handleFormChange('resolveResult', '1')}
|
>
|
<span>化解成功</span>
|
{formData.resolveResult === '1' ? (
|
<img src={applyClose_1} className="rect-radio-check" alt="" />
|
) : (
|
<div className="rect-radio-check empty-circle"></div>
|
)}
|
</div>
|
<div
|
className={`rect-radio-item ${formData.resolveResult === '2' ? 'active' : ''}`}
|
onClick={() => handleFormChange('resolveResult', '2')}
|
>
|
<span>化解不成功</span>
|
{formData.resolveResult === '2' ? (
|
<img src={applyClose_1} className="rect-radio-check circle-check" alt="" />
|
) : (
|
<div className="rect-radio-check empty-circle"></div>
|
)}
|
</div>
|
</div>
|
</div>
|
|
{formData.resolveResult === '1' && (
|
<>
|
<div style={{ marginTop: '12px' }} className="apply-close-title">
|
达成的协议类型
|
</div>
|
<div className="apply-close-options">
|
<div className="rect-radio-group">
|
<div
|
className={`rect-radio-item ${formData.agreementType === '1' ? 'active' : ''}`}
|
onClick={() => handleFormChange('agreementType', '1')}
|
>
|
<span>书面协议</span>
|
{formData.agreementType === '1' ? (
|
<img src={applyClose_1} className="rect-radio-check" alt="" />
|
) : (
|
<div className="rect-radio-check empty-circle"></div>
|
)}
|
</div>
|
<div
|
className={`rect-radio-item ${formData.agreementType === '2' ? 'active' : ''}`}
|
onClick={() => handleFormChange('agreementType', '2')}
|
>
|
<span>口头协议</span>
|
{formData.agreementType === '2' ? (
|
<img src={applyClose_1} className="rect-radio-check circle-check" alt="" />
|
) : (
|
<div className="rect-radio-check empty-circle"></div>
|
)}
|
</div>
|
</div>
|
</div>
|
</>
|
)}
|
</div>
|
|
{formData.resolveResult === '1' && (
|
<div className="apply-close-section">
|
{formData.agreementType === '1' ? (
|
<DingUpload
|
title="协议文书"
|
fileList={fileList}
|
onChange={handleFileChange}
|
ownerId={newId}
|
mainId={caseId || ''}
|
ownerType="22_00018-302" // 文件业务类型,代表结案协议
|
tipText="支持扩展名:.doc .docx .pdf .jpg,30M以内"
|
btnText="上传文件"
|
/>
|
) : (
|
<>
|
<div className="apply-close-title required-field">协议要点</div>
|
<div className="apply-close-textarea-wrapper">
|
<TextareaItem
|
placeholder="请填写口头协议的主要内容和要点"
|
value={formData.agreeContent}
|
onChange={(value) => handleFormChange('agreeContent', value)}
|
rows={4}
|
/>
|
</div>
|
</>
|
)}
|
</div>
|
)}
|
|
{formData.resolveResult === '2' && (
|
<>
|
<div className="apply-close-section">
|
<div className="apply-close-title required-field">调解过程中采取的措施及解决方案</div>
|
<div className="apply-close-textarea-wrapper">
|
<TextareaItem
|
placeholder="如提出的纠纷化解建议、思路等"
|
value={formData.solutionMeasures}
|
onChange={(value) => handleFormChange('solutionMeasures', value)}
|
rows={4}
|
/>
|
</div>
|
</div>
|
|
<div className="apply-close-section">
|
<div className="apply-close-title required-field">最终难以调和的原因</div>
|
<div className="apply-close-textarea-wrapper">
|
<TextareaItem
|
placeholder="如说明利益分配不均、信任缺失、土地或立场不一致等具体情况"
|
value={formData.failReason1}
|
onChange={(value) => handleFormChange('failReason1', value)}
|
rows={4}
|
/>
|
</div>
|
</div>
|
</>
|
)}
|
|
<div className="apply-close-section">
|
<div className="apply-close-title required-field">结案意见</div>
|
<div className="apply-close-textarea-wrapper">
|
<TextareaItem
|
placeholder="请填写"
|
value={formData.windupContent}
|
onChange={(value) => handleFormChange('windupContent', value)}
|
rows={4}
|
/>
|
</div>
|
</div>
|
</div>
|
</Scrollbars>
|
|
{/* 添加事项节点 */}
|
<div className="apply-close-section task-node-section">
|
<TaskNode
|
title="事项节点"
|
items={[
|
{
|
title: "当事人沟通",
|
desc: "已完成",
|
time: "2025-04-08 10:30"
|
},
|
{
|
title: "材料收集",
|
desc: "已完成",
|
time: "2025-04-09 14:15"
|
},
|
{
|
title: "现场调查",
|
desc: "已完成",
|
time: "2025-04-10 09:45"
|
},
|
{
|
title: "调解会议",
|
desc: "进行中",
|
time: "2025-04-11 11:00"
|
}
|
]}
|
/>
|
</div>
|
|
<div className="apply-close-bottom">
|
<Button type="primary" block onClick={handleSubmit}>
|
提交
|
</Button>
|
</div>
|
</NavBarPage>
|
);
|
};
|
|
export default ApplyClose;
|