|
|
@@ -5,11 +5,66 @@ import { Button, Space, Table as AntdTable, Input, message, Modal, Form as AntdF
|
|
|
import { UploadOutlined, LockOutlined, KeyOutlined } from '@ant-design/icons';
|
|
|
import type { ColumnsType } from 'antd/es/table';
|
|
|
import { toast } from 'sonner';
|
|
|
+import dayjs, { Dayjs } from 'dayjs';
|
|
|
import { myTaskApi, MyTaskVO, MyTaskPageParam, PageResponse, MyTaskNodeDetailVO, UpdateNodeApprovalParam } from '../api/mytask';
|
|
|
import { dateFormatter } from '../utils/formatTime';
|
|
|
import { DICT_TYPE, getDictLabel } from '../utils/dict';
|
|
|
import { setConfAndFields2, FormCreateData } from '../utils/formCreate';
|
|
|
|
|
|
+// 辅助函数:将表单值中的日期字符串转换为 dayjs 对象
|
|
|
+const convertDateValues = (formValues: any, fields: any[]): any => {
|
|
|
+ const fieldTypeMap: { [key: string]: string } = {};
|
|
|
+
|
|
|
+ // 建立字段名到类型的映射
|
|
|
+ fields.forEach((field: any) => {
|
|
|
+ const fieldObj = typeof field === 'string' ? JSON.parse(field) : field;
|
|
|
+ const fieldName = fieldObj.name || fieldObj.field;
|
|
|
+ if (fieldName) {
|
|
|
+ fieldTypeMap[fieldName] = fieldObj.type;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 转换日期值
|
|
|
+ const convertedValues: any = {};
|
|
|
+ Object.keys(formValues).forEach((fieldName) => {
|
|
|
+ const fieldType = fieldTypeMap[fieldName];
|
|
|
+ const value = formValues[fieldName];
|
|
|
+
|
|
|
+ if (fieldType === 'date' || fieldType === 'datetime') {
|
|
|
+ // 日期或日期时间类型
|
|
|
+ if (typeof value === 'string' && value.trim() !== '') {
|
|
|
+ const dayjsValue = dayjs(value);
|
|
|
+ convertedValues[fieldName] = dayjsValue.isValid() ? dayjsValue : undefined;
|
|
|
+ } else if (value && typeof value === 'object' && 'isValid' in value) {
|
|
|
+ // 已经是 dayjs 对象
|
|
|
+ convertedValues[fieldName] = value;
|
|
|
+ } else {
|
|
|
+ convertedValues[fieldName] = undefined;
|
|
|
+ }
|
|
|
+ } else if (fieldType === 'daterange') {
|
|
|
+ // 日期范围类型
|
|
|
+ if (Array.isArray(value) && value.length === 2) {
|
|
|
+ const [start, end] = value;
|
|
|
+ const startDayjs = typeof start === 'string' && start ? dayjs(start) : (start && typeof start === 'object' && 'isValid' in start ? start : null);
|
|
|
+ const endDayjs = typeof end === 'string' && end ? dayjs(end) : (end && typeof end === 'object' && 'isValid' in end ? end : null);
|
|
|
+ if (startDayjs && (typeof startDayjs === 'object' && 'isValid' in startDayjs ? startDayjs.isValid() : true) &&
|
|
|
+ endDayjs && (typeof endDayjs === 'object' && 'isValid' in endDayjs ? endDayjs.isValid() : true)) {
|
|
|
+ convertedValues[fieldName] = [startDayjs, endDayjs];
|
|
|
+ } else {
|
|
|
+ convertedValues[fieldName] = undefined;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ convertedValues[fieldName] = undefined;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 其他类型直接使用原值
|
|
|
+ convertedValues[fieldName] = value;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ return convertedValues;
|
|
|
+};
|
|
|
+
|
|
|
export default function MyTask() {
|
|
|
const navigate = useNavigate();
|
|
|
|
|
|
@@ -584,7 +639,10 @@ export default function MyTask() {
|
|
|
// 获取 formId(可能为 0,所以需要明确检查 undefined 和 null)
|
|
|
const formId = detailDataWithWorkInfo.formId;
|
|
|
// formId 可能是数字(包括 0)或字符串,只要不是 undefined、null 或空字符串,就认为有 formId
|
|
|
- const hasFormId = formId !== undefined && formId !== null && formId !== '' && (typeof formId === 'number' || (typeof formId === 'string' && formId.trim() !== ''));
|
|
|
+ const hasFormId = formId !== undefined && formId !== null && (
|
|
|
+ typeof formId === 'number' ||
|
|
|
+ (typeof formId === 'string' && formId !== '' && formId.trim() !== '')
|
|
|
+ );
|
|
|
|
|
|
// 检查是否有 formData(已提交的表单数据)
|
|
|
const hasFormData = detailDataWithWorkInfo.formData && (
|
|
|
@@ -645,12 +703,56 @@ export default function MyTask() {
|
|
|
|
|
|
// 解析 fields 中的每个字段,提取 value 值用于回显
|
|
|
const formValues: any = {};
|
|
|
+ const fieldTypeMap: { [key: string]: string } = {}; // 存储字段名到类型的映射
|
|
|
+
|
|
|
+ // 先解析所有字段,建立字段类型映射
|
|
|
+ fieldsStringArray.forEach((fieldString: string) => {
|
|
|
+ try {
|
|
|
+ const fieldObj = typeof fieldString === 'string' ? JSON.parse(fieldString) : fieldString;
|
|
|
+ const fieldName = fieldObj.name || fieldObj.field;
|
|
|
+ if (fieldName) {
|
|
|
+ fieldTypeMap[fieldName] = fieldObj.type;
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.error('MyTask: 解析字段 JSON 失败', e, fieldString);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 提取值并转换日期类型
|
|
|
fieldsStringArray.forEach((fieldString: string) => {
|
|
|
try {
|
|
|
const fieldObj = typeof fieldString === 'string' ? JSON.parse(fieldString) : fieldString;
|
|
|
const fieldName = fieldObj.name || fieldObj.field;
|
|
|
if (fieldName && fieldObj.value !== undefined && fieldObj.value !== null) {
|
|
|
- formValues[fieldName] = fieldObj.value;
|
|
|
+ const fieldType = fieldTypeMap[fieldName];
|
|
|
+ let value = fieldObj.value;
|
|
|
+
|
|
|
+ // 如果是日期类型,转换为 dayjs 对象
|
|
|
+ if (fieldType === 'date' || fieldType === 'datetime') {
|
|
|
+ if (typeof value === 'string' && value.trim() !== '') {
|
|
|
+ const dayjsValue = dayjs(value);
|
|
|
+ formValues[fieldName] = dayjsValue.isValid() ? dayjsValue : undefined;
|
|
|
+ } else {
|
|
|
+ formValues[fieldName] = undefined;
|
|
|
+ }
|
|
|
+ } else if (fieldType === 'daterange') {
|
|
|
+ // 日期范围类型,转换为 dayjs 数组
|
|
|
+ if (Array.isArray(value) && value.length === 2) {
|
|
|
+ const [start, end] = value;
|
|
|
+ const startDayjs = typeof start === 'string' && start ? dayjs(start) : null;
|
|
|
+ const endDayjs = typeof end === 'string' && end ? dayjs(end) : null;
|
|
|
+ if (startDayjs && startDayjs.isValid() && endDayjs && endDayjs.isValid()) {
|
|
|
+ formValues[fieldName] = [startDayjs, endDayjs];
|
|
|
+ } else {
|
|
|
+ formValues[fieldName] = undefined;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ formValues[fieldName] = undefined;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 其他类型直接使用原值
|
|
|
+ formValues[fieldName] = value;
|
|
|
+ }
|
|
|
}
|
|
|
} catch (e) {
|
|
|
console.error('MyTask: 解析字段 JSON 失败', e, fieldString);
|
|
|
@@ -663,10 +765,13 @@ export default function MyTask() {
|
|
|
setConfAndFields2(setFormData, conf, fields);
|
|
|
console.log('MyTask: 表单配置已设置(从 formData)');
|
|
|
|
|
|
+ // 转换日期值为 dayjs 对象
|
|
|
+ const convertedFormValues = convertDateValues(formValues, fieldsStringArray);
|
|
|
+
|
|
|
// 回填表单值
|
|
|
setTimeout(() => {
|
|
|
- detailForm.setFieldsValue(formValues);
|
|
|
- console.log('MyTask: 表单数据已回填(从 formData)', formValues);
|
|
|
+ detailForm.setFieldsValue(convertedFormValues);
|
|
|
+ console.log('MyTask: 表单数据已回填(从 formData)', convertedFormValues);
|
|
|
}, 100);
|
|
|
} else {
|
|
|
console.warn('MyTask: formData 中缺少 conf 或 fields', { conf: !!conf, fields: !!fields });
|
|
|
@@ -753,9 +858,14 @@ export default function MyTask() {
|
|
|
// 如果有表单数据值,回填到表单(在表单配置设置后)
|
|
|
if (detailDataWithWorkInfo.formData) {
|
|
|
try {
|
|
|
- const formValues = typeof detailDataWithWorkInfo.formData === 'string'
|
|
|
+ let formValues = typeof detailDataWithWorkInfo.formData === 'string'
|
|
|
? JSON.parse(detailDataWithWorkInfo.formData)
|
|
|
: detailDataWithWorkInfo.formData;
|
|
|
+
|
|
|
+ // 转换日期值为 dayjs 对象
|
|
|
+ const fieldsArray = Array.isArray(fields) ? fields : [];
|
|
|
+ formValues = convertDateValues(formValues, fieldsArray);
|
|
|
+
|
|
|
// 延迟一下,确保表单字段已经渲染
|
|
|
setTimeout(() => {
|
|
|
detailForm.setFieldsValue(formValues);
|