|
@@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react';
|
|
|
import { useNavigate } from 'react-router-dom';
|
|
import { useNavigate } from 'react-router-dom';
|
|
|
import { Eye, Search, RotateCcw } from 'lucide-react';
|
|
import { Eye, Search, RotateCcw } from 'lucide-react';
|
|
|
import { Button, Space, Table as AntdTable, Input, message, Modal, Form as AntdForm, Card, Alert, Select, DatePicker, InputNumber, Switch, Radio, Checkbox, Cascader, Upload } from 'antd';
|
|
import { Button, Space, Table as AntdTable, Input, message, Modal, Form as AntdForm, Card, Alert, Select, DatePicker, InputNumber, Switch, Radio, Checkbox, Cascader, Upload } from 'antd';
|
|
|
-import { UploadOutlined, LockOutlined, KeyOutlined, WarningOutlined } from '@ant-design/icons';
|
|
|
|
|
|
|
+import { UploadOutlined, LockOutlined, KeyOutlined, WarningOutlined, CheckCircleOutlined } from '@ant-design/icons';
|
|
|
import type { ColumnsType } from 'antd/es/table';
|
|
import type { ColumnsType } from 'antd/es/table';
|
|
|
import { toast } from 'sonner';
|
|
import { toast } from 'sonner';
|
|
|
import dayjs, { Dayjs } from 'dayjs';
|
|
import dayjs, { Dayjs } from 'dayjs';
|
|
@@ -2001,7 +2001,49 @@ export default function TaskManagement() {
|
|
|
})()}
|
|
})()}
|
|
|
</div>
|
|
</div>
|
|
|
) : (
|
|
) : (
|
|
|
- <div className="py-4 text-center text-gray-400 text-sm">{t('form.noFormContent')}</div>
|
|
|
|
|
|
|
+ <div
|
|
|
|
|
+ style={{
|
|
|
|
|
+ display: 'flex',
|
|
|
|
|
+ justifyContent: 'center',
|
|
|
|
|
+ alignItems: 'center',
|
|
|
|
|
+ minHeight: '400px',
|
|
|
|
|
+ padding: '40px 20px'
|
|
|
|
|
+ }}
|
|
|
|
|
+ >
|
|
|
|
|
+ <Card
|
|
|
|
|
+ style={{
|
|
|
|
|
+ width: '100%',
|
|
|
|
|
+ maxWidth: '500px',
|
|
|
|
|
+ textAlign: 'center',
|
|
|
|
|
+ borderRadius: '12px',
|
|
|
|
|
+ boxShadow: '0 4px 12px rgba(0, 0, 0, 0.1)',
|
|
|
|
|
+ border: '1px solid #e8e8e8'
|
|
|
|
|
+ }}
|
|
|
|
|
+ bodyStyle={{
|
|
|
|
|
+ padding: '40px 30px'
|
|
|
|
|
+ }}
|
|
|
|
|
+ >
|
|
|
|
|
+ <div style={{ marginBottom: '24px' }}>
|
|
|
|
|
+ <CheckCircleOutlined
|
|
|
|
|
+ style={{
|
|
|
|
|
+ fontSize: '64px',
|
|
|
|
|
+ color: '#1890ff',
|
|
|
|
|
+ display: 'block'
|
|
|
|
|
+ }}
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div
|
|
|
|
|
+ style={{
|
|
|
|
|
+ fontSize: '20px',
|
|
|
|
|
+ fontWeight: 500,
|
|
|
|
|
+ color: '#333',
|
|
|
|
|
+ lineHeight: '1.6'
|
|
|
|
|
+ }}
|
|
|
|
|
+ >
|
|
|
|
|
+ 无需填写表单,直接点击底部按钮提交即可
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </Card>
|
|
|
|
|
+ </div>
|
|
|
)}
|
|
)}
|
|
|
|
|
|
|
|
{/* 审核意见 - label 和 textarea 同一行 */}
|
|
{/* 审核意见 - label 和 textarea 同一行 */}
|
|
@@ -2074,10 +2116,56 @@ export default function TaskManagement() {
|
|
|
|
|
|
|
|
setApprovalLoading(true);
|
|
setApprovalLoading(true);
|
|
|
try {
|
|
try {
|
|
|
|
|
+ // 如果有自定义表单,获取表单数据
|
|
|
|
|
+ let formDataString: string | undefined = undefined;
|
|
|
|
|
+ if (formData.rule && formData.rule.length > 0 && originalFields.length > 0) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 获取表单值
|
|
|
|
|
+ const values = detailForm.getFieldsValue();
|
|
|
|
|
+
|
|
|
|
|
+ // 将填写值添加到原始 fields 数组的每个 JSON 字符串中
|
|
|
|
|
+ const fieldsWithValues = originalFields.map((fieldString: string) => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 解析字段 JSON 字符串
|
|
|
|
|
+ const fieldObj = JSON.parse(fieldString);
|
|
|
|
|
+
|
|
|
|
|
+ // 获取字段名:优先使用 name(表单实际使用的字段名),其次使用 field
|
|
|
|
|
+ const fieldName = fieldObj.name || fieldObj.field;
|
|
|
|
|
+
|
|
|
|
|
+ // 获取填写值
|
|
|
|
|
+ const fieldValue = values[fieldName];
|
|
|
|
|
+
|
|
|
|
|
+ // 添加或更新 value 字段
|
|
|
|
|
+ fieldObj.value = fieldValue !== undefined && fieldValue !== null ? fieldValue : '';
|
|
|
|
|
+
|
|
|
|
|
+ // 转回 JSON 字符串
|
|
|
|
|
+ return JSON.stringify(fieldObj);
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('TaskManagement: 解析字段 JSON 失败', e, fieldString);
|
|
|
|
|
+ return fieldString; // 如果解析失败,返回原始字符串
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // 构建完整的表单数据对象
|
|
|
|
|
+ const submitData = {
|
|
|
|
|
+ id: detailData.formId || detailData.id,
|
|
|
|
|
+ name: detailData.nodeName || '未知',
|
|
|
|
|
+ conf: originalConf,
|
|
|
|
|
+ fields: fieldsWithValues
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ // 将表单数据转换为 JSON 字符串
|
|
|
|
|
+ formDataString = JSON.stringify(submitData);
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.error('TaskManagement: 获取表单数据失败', error);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
const params: UpdateNodeApprovalParam = {
|
|
const params: UpdateNodeApprovalParam = {
|
|
|
nodeId: nodeId,
|
|
nodeId: nodeId,
|
|
|
approvalStatus: 'rejected',
|
|
approvalStatus: 'rejected',
|
|
|
approvalOpinion: approvalComment || undefined,
|
|
approvalOpinion: approvalComment || undefined,
|
|
|
|
|
+ formData: formDataString,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
console.log('TaskManagement: 调用审核不通过接口', params);
|
|
console.log('TaskManagement: 调用审核不通过接口', params);
|
|
@@ -2140,10 +2228,56 @@ export default function TaskManagement() {
|
|
|
|
|
|
|
|
setApprovalLoading(true);
|
|
setApprovalLoading(true);
|
|
|
try {
|
|
try {
|
|
|
|
|
+ // 如果有自定义表单,获取表单数据
|
|
|
|
|
+ let formDataString: string | undefined = undefined;
|
|
|
|
|
+ if (formData.rule && formData.rule.length > 0 && originalFields.length > 0) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 获取表单值
|
|
|
|
|
+ const values = detailForm.getFieldsValue();
|
|
|
|
|
+
|
|
|
|
|
+ // 将填写值添加到原始 fields 数组的每个 JSON 字符串中
|
|
|
|
|
+ const fieldsWithValues = originalFields.map((fieldString: string) => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 解析字段 JSON 字符串
|
|
|
|
|
+ const fieldObj = JSON.parse(fieldString);
|
|
|
|
|
+
|
|
|
|
|
+ // 获取字段名:优先使用 name(表单实际使用的字段名),其次使用 field
|
|
|
|
|
+ const fieldName = fieldObj.name || fieldObj.field;
|
|
|
|
|
+
|
|
|
|
|
+ // 获取填写值
|
|
|
|
|
+ const fieldValue = values[fieldName];
|
|
|
|
|
+
|
|
|
|
|
+ // 添加或更新 value 字段
|
|
|
|
|
+ fieldObj.value = fieldValue !== undefined && fieldValue !== null ? fieldValue : '';
|
|
|
|
|
+
|
|
|
|
|
+ // 转回 JSON 字符串
|
|
|
|
|
+ return JSON.stringify(fieldObj);
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('TaskManagement: 解析字段 JSON 失败', e, fieldString);
|
|
|
|
|
+ return fieldString; // 如果解析失败,返回原始字符串
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // 构建完整的表单数据对象
|
|
|
|
|
+ const submitData = {
|
|
|
|
|
+ id: detailData.formId || detailData.id,
|
|
|
|
|
+ name: detailData.nodeName || '未知',
|
|
|
|
|
+ conf: originalConf,
|
|
|
|
|
+ fields: fieldsWithValues
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ // 将表单数据转换为 JSON 字符串
|
|
|
|
|
+ formDataString = JSON.stringify(submitData);
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.error('TaskManagement: 获取表单数据失败', error);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
const params: UpdateNodeApprovalParam = {
|
|
const params: UpdateNodeApprovalParam = {
|
|
|
nodeId: nodeId,
|
|
nodeId: nodeId,
|
|
|
approvalStatus: 'approved',
|
|
approvalStatus: 'approved',
|
|
|
approvalOpinion: approvalComment || undefined,
|
|
approvalOpinion: approvalComment || undefined,
|
|
|
|
|
+ formData: formDataString,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
console.log('TaskManagement: 调用审核通过接口', params);
|
|
console.log('TaskManagement: 调用审核通过接口', params);
|
|
@@ -2229,7 +2363,49 @@ export default function TaskManagement() {
|
|
|
})()}
|
|
})()}
|
|
|
</div>
|
|
</div>
|
|
|
) : (
|
|
) : (
|
|
|
- <div className="py-4 text-center text-gray-400 text-sm">{t('form.noFormContent')}</div>
|
|
|
|
|
|
|
+ <div
|
|
|
|
|
+ style={{
|
|
|
|
|
+ display: 'flex',
|
|
|
|
|
+ justifyContent: 'center',
|
|
|
|
|
+ alignItems: 'center',
|
|
|
|
|
+ minHeight: '400px',
|
|
|
|
|
+ padding: '40px 20px'
|
|
|
|
|
+ }}
|
|
|
|
|
+ >
|
|
|
|
|
+ <Card
|
|
|
|
|
+ style={{
|
|
|
|
|
+ width: '100%',
|
|
|
|
|
+ maxWidth: '500px',
|
|
|
|
|
+ textAlign: 'center',
|
|
|
|
|
+ borderRadius: '12px',
|
|
|
|
|
+ boxShadow: '0 4px 12px rgba(0, 0, 0, 0.1)',
|
|
|
|
|
+ border: '1px solid #e8e8e8'
|
|
|
|
|
+ }}
|
|
|
|
|
+ bodyStyle={{
|
|
|
|
|
+ padding: '40px 30px'
|
|
|
|
|
+ }}
|
|
|
|
|
+ >
|
|
|
|
|
+ <div style={{ marginBottom: '24px' }}>
|
|
|
|
|
+ <CheckCircleOutlined
|
|
|
|
|
+ style={{
|
|
|
|
|
+ fontSize: '64px',
|
|
|
|
|
+ color: '#1890ff',
|
|
|
|
|
+ display: 'block'
|
|
|
|
|
+ }}
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div
|
|
|
|
|
+ style={{
|
|
|
|
|
+ fontSize: '20px',
|
|
|
|
|
+ fontWeight: 500,
|
|
|
|
|
+ color: '#333',
|
|
|
|
|
+ lineHeight: '1.6'
|
|
|
|
|
+ }}
|
|
|
|
|
+ >
|
|
|
|
|
+ 无需填写表单,直接点击底部按钮提交即可
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </Card>
|
|
|
|
|
+ </div>
|
|
|
)}
|
|
)}
|
|
|
|
|
|
|
|
</div>
|
|
</div>
|