From 6a19c21930c9fef7fe1dd3aaa35133f68375300a Mon Sep 17 00:00:00 2001
From: vincentlu <t1341870251@gmail.com>
Date: 星期四, 05 二月 2026 15:44:15 +0800
Subject: [PATCH] #
---
zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/type/NamespaceType.java | 13 +
zy-acs-flow/src/page/integrationRecord/rowSx.jsx | 40 +++++
zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/wms/OpenController.java | 2
zy-acs-flow/src/i18n/zh.js | 2
zy-acs-manager/src/main/java/com/zy/acs/manager/common/interceptor/IntegrationRecordAdvice.java | 89 ++++--------
zy-acs-flow/src/page/integrationRecord/IntegrationRecordList.jsx | 117 +++++++++------
zy-acs-flow/src/page/integrationRecord/IntegrationRecordDetail.jsx | 130 ++++++++++++++++++
7 files changed, 281 insertions(+), 112 deletions(-)
diff --git a/zy-acs-flow/src/i18n/zh.js b/zy-acs-flow/src/i18n/zh.js
index 1f421e4..43bb0ac 100644
--- a/zy-acs-flow/src/i18n/zh.js
+++ b/zy-acs-flow/src/i18n/zh.js
@@ -618,7 +618,7 @@
request: "璇锋眰鍐呭",
response: "鍝嶅簲鍐呭",
err: "寮傚父",
- result: "璇锋眰缁撴灉",
+ result: "缁撴灉",
costMs: "鑰楁椂(姣)",
},
diff --git a/zy-acs-flow/src/page/integrationRecord/IntegrationRecordDetail.jsx b/zy-acs-flow/src/page/integrationRecord/IntegrationRecordDetail.jsx
new file mode 100644
index 0000000..f091719
--- /dev/null
+++ b/zy-acs-flow/src/page/integrationRecord/IntegrationRecordDetail.jsx
@@ -0,0 +1,130 @@
+import * as React from 'react';
+import { Labeled } from 'react-admin';
+import { Box, Grid, Typography, Card, CardContent, TextField } from '@mui/material';
+import { format } from 'date-fns';
+
+const IntegrationRecordDetail = (props) => {
+ const { integration } = props;
+ if (!integration) return null;
+
+ const formatTimestamp = (timestamp) => {
+ if (!timestamp) return '';
+ try {
+ return format(new Date(Number(timestamp)), 'yyyy-MM-dd HH:mm:ss');
+ } catch (e) {
+ return timestamp;
+ }
+ };
+
+ return (
+ <Box width={{ xs: '100vw', sm: 400 }} mt={{ xs: 2, sm: 1 }}>
+ <Card>
+ <CardContent>
+ <Grid container rowSpacing={1} mb={1}>
+ <Grid item xs={6}>
+ <Labeled label="table.field.integrationRecord.uuid">
+ <Typography variant="body2" flexWrap="nowrap">
+ {integration.uuid || ''}
+ </Typography>
+ </Labeled>
+ </Grid>
+ <Grid item xs={6}>
+ <Labeled label="table.field.integrationRecord.namespace">
+ <Typography variant="body2" flexWrap="nowrap">
+ {integration.namespace || ''}
+ </Typography>
+ </Labeled>
+ </Grid>
+ <Grid item xs={6}>
+ <Labeled label="table.field.integrationRecord.url">
+ <Typography variant="body2" flexWrap="nowrap">
+ {integration.url || ''}
+ </Typography>
+ </Labeled>
+ </Grid>
+ <Grid item xs={6}>
+ <Labeled label="table.field.integrationRecord.appkey">
+ <Typography variant="body2" flexWrap="nowrap">
+ {integration.appkey || ''}
+ </Typography>
+ </Labeled>
+ </Grid>
+ <Grid item xs={6}>
+ <Labeled label="table.field.integrationRecord.caller">
+ <Typography variant="body2" flexWrap="nowrap">
+ {integration.caller || ''}
+ </Typography>
+ </Labeled>
+ </Grid>
+ <Grid item xs={6}>
+ <Labeled label="table.field.integrationRecord.direction">
+ <Typography variant="body2" flexWrap="nowrap">
+ {integration.direction$ || ''}
+ </Typography>
+ </Labeled>
+ </Grid>
+ <Grid item xs={6}>
+ <Labeled label="table.field.integrationRecord.timestamp">
+ <Typography variant="body2" flexWrap="nowrap">
+ {formatTimestamp(integration.timestamp)}
+ </Typography>
+ </Labeled>
+ </Grid>
+ <Grid item xs={6}>
+ <Labeled label="table.field.integrationRecord.clientIp">
+ <Typography variant="body2" flexWrap="nowrap">
+ {integration.clientIp || ''}
+ </Typography>
+ </Labeled>
+ </Grid>
+ <Grid item xs={6}>
+ <Labeled label="table.field.integrationRecord.result">
+ <Typography variant="body2" flexWrap="nowrap">
+ {integration.result$ || ''}
+ </Typography>
+ </Labeled>
+ </Grid>
+ <Grid item xs={6}>
+ <Labeled label="table.field.integrationRecord.costMs">
+ <Typography variant="body2" flexWrap="nowrap">
+ {integration.costMs ?? ''}
+ </Typography>
+ </Labeled>
+ </Grid>
+ <Grid item xs={6}>
+ <Labeled label="table.field.integrationRecord.err">
+ <Typography variant="body2" flexWrap="nowrap">
+ {integration.err || ''}
+ </Typography>
+ </Labeled>
+ </Grid>
+ </Grid>
+ <Grid container rowSpacing={2}>
+ <Grid item xs={12}>
+ <TextField
+ label="Request"
+ value={integration.request || ''}
+ maxRows={15}
+ multiline
+ fullWidth
+ InputProps={{ readOnly: true }}
+ />
+ </Grid>
+ <Grid item xs={12}>
+ <TextField
+ label="Response"
+ value={integration.response || ''}
+ maxRows={15}
+ multiline
+ fullWidth
+ InputProps={{ readOnly: true }}
+ />
+ </Grid>
+ </Grid>
+ </CardContent>
+ </Card>
+ </Box>
+ );
+};
+
+export default IntegrationRecordDetail;
diff --git a/zy-acs-flow/src/page/integrationRecord/IntegrationRecordList.jsx b/zy-acs-flow/src/page/integrationRecord/IntegrationRecordList.jsx
index ddd87d2..0fea315 100644
--- a/zy-acs-flow/src/page/integrationRecord/IntegrationRecordList.jsx
+++ b/zy-acs-flow/src/page/integrationRecord/IntegrationRecordList.jsx
@@ -1,48 +1,32 @@
-import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
-import { useNavigate } from 'react-router-dom';
+import React, { useState } from "react";
import {
List,
DatagridConfigurable,
SearchInput,
TopToolbar,
SelectColumnsButton,
- EditButton,
FilterButton,
- CreateButton,
- ExportButton,
- BulkDeleteButton,
- WrapperField,
useRecordContext,
- useTranslate,
- useNotify,
- useListContext,
- FunctionField,
TextField,
NumberField,
DateField,
BooleanField,
ReferenceField,
TextInput,
- DateTimeInput,
DateInput,
SelectInput,
- NumberInput,
- ReferenceInput,
- ReferenceArrayInput,
- AutocompleteInput,
- DeleteButton,
} from 'react-admin';
-import { Box, Typography, Card, Stack } from '@mui/material';
+import { Box, Chip } from '@mui/material';
import { styled } from '@mui/material/styles';
import IntegrationRecordCreate from "./IntegrationRecordCreate";
-import IntegrationRecordPanel from "./IntegrationRecordPanel";
+import IntegrationRecordDetail from "./IntegrationRecordDetail";
import EmptyDataLoader from "../components/EmptyDataLoader";
import MyCreateButton from "../components/MyCreateButton";
import MyExportButton from '../components/MyExportButton';
import PageDrawer from "../components/PageDrawer";
-import MyField from "../components/MyField";
-import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
-import * as Common from '@/utils/common';
+import { PAGE_DRAWER_WIDTH, DEFAULT_PAGE_SIZE } from '@/config/setting';
+import { format } from 'date-fns';
+import rowSx from './rowSx';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
'& .css-1vooibu-MuiSvgIcon-root': {
@@ -51,10 +35,34 @@
'& .RaDatagrid-row': {
cursor: 'auto'
},
- '& .column-name': {
+ '& .column-url': {
+ maxWidth: '16em',
+ overflow: 'hidden',
+ textOverflow: 'ellipsis',
+ whiteSpace: 'nowrap',
+ },
+ '& .column-request': {
+ maxWidth: '18em',
+ overflow: 'hidden',
+ textOverflow: 'ellipsis',
+ whiteSpace: 'nowrap',
+ },
+ '& .column-response': {
+ maxWidth: '18em',
+ overflow: 'hidden',
+ textOverflow: 'ellipsis',
+ whiteSpace: 'nowrap',
+ },
+ '& .column-costMs': {
+ maxWidth: '9em',
},
'& .opt': {
width: 200
+ },
+ '& .RaDatagrid-thead': {
+ borderLeftColor: 'transparent',
+ borderLeftWidth: 5,
+ borderLeftStyle: 'solid',
},
}));
@@ -87,8 +95,6 @@
]
const IntegrationRecordList = () => {
- const translate = useTranslate();
-
const [createDialog, setCreateDialog] = useState(false);
const [drawerVal, setDrawerVal] = useState(false);
@@ -110,7 +116,6 @@
actions={(
<TopToolbar>
<FilterButton />
- <MyCreateButton onClick={() => { setCreateDialog(true) }} />
<SelectColumnsButton preferenceKey='integrationRecord' />
<MyExportButton />
</TopToolbar>
@@ -119,11 +124,13 @@
>
<StyledDatagrid
preferenceKey='integrationRecord'
- bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
- rowClick={(id, resource, record) => false}
- expand={() => <IntegrationRecordPanel />}
- expandSingle={true}
- omit={['id', 'createTime', 'createBy', 'memo']}
+ bulkActionButtons={false}
+ rowClick={(id, resource, record) => {
+ setDrawerVal(!!drawerVal && drawerVal === record ? null : record);
+ return false;
+ }}
+ omit={['id', 'uuid', 'appkey', 'direction', 'timestamp', 'updateTime', 'memo']}
+ rowSx={rowSx(drawerVal || null)}
>
<NumberField source="id" />
<TextField source="uuid" label="table.field.integrationRecord.uuid" />
@@ -131,29 +138,19 @@
<TextField source="url" label="table.field.integrationRecord.url" />
<TextField source="appkey" label="table.field.integrationRecord.appkey" />
<TextField source="caller" label="table.field.integrationRecord.caller" />
- <TextField source="direction$" label="table.field.integrationRecord.direction" sortable={false} />
- <TextField source="timestamp" label="table.field.integrationRecord.timestamp" />
+ <TextField source="direction" label="table.field.integrationRecord.direction" sortable={false} />
+ <FormattedTimestampField source="timestamp" label="table.field.integrationRecord.timestamp" />
<TextField source="clientIp" label="table.field.integrationRecord.clientIp" />
- <TextField source="request" label="table.field.integrationRecord.request" />
- <TextField source="response" label="table.field.integrationRecord.response" />
+ <TextField source="request" label="table.field.integrationRecord.request" sortable={false} hidden={!!drawerVal} />
+ <TextField source="response" label="table.field.integrationRecord.response" sortable={false} hidden={!!drawerVal} />
+ <ResultField source="result" label="table.field.integrationRecord.result" />
<TextField source="err" label="table.field.integrationRecord.err" />
- <TextField source="result$" label="table.field.integrationRecord.result" sortable={false} />
- <NumberField source="costMs" label="table.field.integrationRecord.costMs" />
+ <NumberField source="costMs" label="table.field.integrationRecord.costMs" sx={{ fontWeight: 'bold' }} />
- <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
- <TextField source="nickname" />
- </ReferenceField>
<DateField source="updateTime" label="common.field.updateTime" showTime />
- <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
- <TextField source="nickname" />
- </ReferenceField>
<DateField source="createTime" label="common.field.createTime" showTime />
- <BooleanField source="statusBool" label="common.field.status" sortable={false} />
+ {/* <BooleanField source="statusBool" label="common.field.status" sortable={false} /> */}
<TextField source="memo" label="common.field.memo" sortable={false} />
- <WrapperField cellClassName="opt" label="common.field.opt">
- <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
- <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
- </WrapperField>
</StyledDatagrid>
</List>
<IntegrationRecordCreate
@@ -165,9 +162,33 @@
drawerVal={drawerVal}
setDrawerVal={setDrawerVal}
>
+ <IntegrationRecordDetail integration={drawerVal} />
</PageDrawer>
</Box>
)
}
+const FormattedTimestampField = ({ source }) => {
+ const record = useRecordContext();
+ if (!record) return null;
+ const val = record[source];
+ if (!val) return null;
+ const formattedDate = format(new Date(Number(val)), 'yyyy-MM-dd HH:mm:ss');
+ return <span>{formattedDate}</span>;
+};
+
+const ResultField = ({ source }) => {
+ const record = useRecordContext();
+ const val = record?.[source];
+ return (
+ <>
+ {val === 1 ? (
+ <Chip label="success" color="success" variant="outlined" size="small" />
+ ) : (
+ <Chip label="error" color="error" variant="outlined" size="small" />
+ )}
+ </>
+ );
+};
+
export default IntegrationRecordList;
diff --git a/zy-acs-flow/src/page/integrationRecord/rowSx.jsx b/zy-acs-flow/src/page/integrationRecord/rowSx.jsx
new file mode 100644
index 0000000..b346e52
--- /dev/null
+++ b/zy-acs-flow/src/page/integrationRecord/rowSx.jsx
@@ -0,0 +1,40 @@
+import green from '@mui/material/colors/green';
+import orange from '@mui/material/colors/orange';
+import red from '@mui/material/colors/red';
+
+const rowSx = (selectedRow) => (record) => {
+ let style = {};
+ if (!record) {
+ return style;
+ }
+ if (selectedRow && selectedRow.id === record.id) {
+ style = {
+ ...style,
+ backgroundColor: 'action.selected',
+ };
+ }
+ if (record.result === 1)
+ return {
+ ...style,
+ borderLeftColor: green[500],
+ borderLeftWidth: 5,
+ borderLeftStyle: 'solid',
+ };
+ if (record.result === 2)
+ return {
+ ...style,
+ borderLeftColor: orange[500],
+ borderLeftWidth: 5,
+ borderLeftStyle: 'solid',
+ };
+ if (record.result === 0)
+ return {
+ ...style,
+ borderLeftColor: red[500],
+ borderLeftWidth: 5,
+ borderLeftStyle: 'solid',
+ };
+ return style;
+};
+
+export default rowSx;
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/common/interceptor/IntegrationRecordAdvice.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/common/interceptor/IntegrationRecordAdvice.java
index 8003212..ab4da06 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/common/interceptor/IntegrationRecordAdvice.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/common/interceptor/IntegrationRecordAdvice.java
@@ -10,6 +10,7 @@
import com.zy.acs.manager.manager.enums.IntegrationDirectionType;
import com.zy.acs.manager.manager.enums.StatusType;
import com.zy.acs.manager.manager.service.IntegrationRecordService;
+import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
@@ -90,24 +91,31 @@
Exception failure) {
Date now = new Date();
RequestSnapshot payload = buildSnapshot(request);
+ String reqContent = !Cools.isEmpty(payload.getParameters())
+ ? JSON.toJSONString(payload.getParameters())
+ : payload.getJson();
- IntegrationRecord record = new IntegrationRecord();
- record.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
- record.setNamespace(context.getNamespaceType().name());
- record.setUrl(payload.getUri());
- record.setAppkey(request.getHeader(HEADER_APP_KEY));
- record.setCaller(resolveCaller(request));
- record.setDirection(IntegrationDirectionType.INBOUND.value);
- record.setTimestamp(String.valueOf(context.getStartAt()));
- record.setClientIp(IpTools.gainRealIp(request));
- record.setRequest(safeToJson(payload));
- record.setResponse(safeToJson(responseBody));
+ IntegrationRecord record = new IntegrationRecord(
+ String.valueOf(snowflakeIdWorker.nextId()).substring(3), // 缂栧彿
+ context.getNamespaceType().name(), // 鍚嶇О绌洪棿
+ payload.getUri(), // 鎺ュ彛鍦板潃
+ request.getHeader(HEADER_APP_KEY), // 骞冲彴瀵嗛挜
+ context.getNamespaceType().caller, // 璋冪敤鏂规爣璇�
+ IntegrationDirectionType.INBOUND.value, // 鏂瑰悜[闈炵┖]
+ String.valueOf(context.getStartAt()), // 鏃堕棿鎴�
+ IpTools.gainRealIp(request), // 瀹㈡埛绔疘P
+ reqContent, // 璇锋眰鍐呭
+ JSON.toJSONString(responseBody), // 鍝嶅簲鍐呭
+ null, // 寮傚父鍐呭
+ 0, // 缁撴灉
+ (int) (System.currentTimeMillis() - context.getStartAt()), // 鑰楁椂
+ StatusType.ENABLE.val, // 鐘舵��
+ now, // 娣诲姞鏃堕棿[闈炵┖]
+ now, // 淇敼鏃堕棿[闈炵┖]
+ context.getHandler() // 澶囨敞
+ );
+
applyResult(record, responseBody, failure);
- record.setCostMs(cost(context.getStartAt()));
- record.setStatus(StatusType.ENABLE.val);
- record.setCreateTime(now);
- record.setUpdateTime(now);
- record.setMemo(context.getHandler());
return record;
}
@@ -131,7 +139,7 @@
}
boolean success = code == 200;
record.setResult(success ? 1 : 0);
- record.setErr(success ? null : safeToString(response.get("msg")));
+ record.setErr(success ? null : String.valueOf(response.get("msg")));
}
private Integer parseInteger(Object codeObj) {
@@ -148,48 +156,15 @@
}
}
- private String safeToJson(Object value) {
- if (value == null) {
- return null;
- }
- try {
- return JSON.toJSONString(value);
- } catch (Exception e) {
- log.warn("Failed to serialize value for integration log: {}", value.getClass().getName(), e);
- return String.valueOf(value);
- }
- }
-
- private String resolveCaller(HttpServletRequest request) {
- String caller = request.getHeader(HEADER_CALLER);
- if (Cools.isEmpty(caller)) {
- caller = request.getHeader(HEADER_APP_KEY);
- }
- return caller;
- }
-
- private int cost(long startAt) {
- long duration = System.currentTimeMillis() - startAt;
- if (duration < 0) {
- return 0;
- }
- return (int) duration;
- }
-
- private String safeToString(Object value) {
- return value == null ? null : String.valueOf(value);
- }
-
private RequestSnapshot buildSnapshot(HttpServletRequest request) {
Map<String, Object> params = flattenParameters(request.getParameterMap());
- String body = normalizeBody(readBody(request), request.getContentType());
return new RequestSnapshot(
request.getMethod(),
request.getRequestURI(),
request.getQueryString(),
request.getContentType(),
params.isEmpty() ? null : params,
- body
+ normalizeBody(readBody(request), request.getContentType())
);
}
@@ -203,7 +178,6 @@
Object parsed = JSON.parse(body);
return JSON.toJSONString(parsed, false);
} catch (Exception ignore) {
- // fall through to compacting whitespace
}
}
return body.replaceAll("[\\n\\r\\t]", "").trim();
@@ -261,26 +235,25 @@
}
}
+
+ @Data
private static class RequestSnapshot {
private final String method;
private final String uri;
private final String query;
private final String contentType;
private final Map<String, Object> parameters;
- private final String body;
+ private final String json;
RequestSnapshot(String method, String uri, String query, String contentType,
- Map<String, Object> parameters, String body) {
+ Map<String, Object> parameters, String json) {
this.method = method;
this.uri = uri;
this.query = query;
this.contentType = contentType;
this.parameters = parameters;
- this.body = body;
+ this.json = json;
}
- public String getUri() {
- return uri;
- }
}
}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/type/NamespaceType.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/type/NamespaceType.java
index a8aa45a..a3ac45f 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/type/NamespaceType.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/type/NamespaceType.java
@@ -1,16 +1,21 @@
package com.zy.acs.manager.core.domain.type;
+import com.zy.acs.manager.common.constant.Constants;
+
public enum NamespaceType {
- NONE("鏈煡"),
- RCS_TASK_REPORT("浠诲姟瀹屾垚涓婃姤"),
-
+ NONE("鏈煡", "NONE"),
+ RCS_TASK_REPORT("浠诲姟瀹屾垚涓婃姤", Constants.RCS),
+ RCS_BUS_RECEIVE("鎺ユ敹鎵规浠诲姟", Constants.UPLINK),
;
public String name;
- NamespaceType(String name) {
+ public String caller;
+
+ NamespaceType(String name, String caller) {
this.name = name;
+ this.caller = caller;
}
}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/wms/OpenController.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/wms/OpenController.java
index 5136137..85268f6 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/wms/OpenController.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/wms/OpenController.java
@@ -45,7 +45,7 @@
@PostMapping("/bus/submit")
@OperationLog("generate task from open api")
- @IntegrationAuth(name = NamespaceType.RCS_TASK_REPORT)
+ @IntegrationAuth(name = NamespaceType.RCS_BUS_RECEIVE)
public R submit(@RequestBody OpenBusSubmitParam param, HttpServletRequest request) {
IntegrationRecord integrationRecord = new IntegrationRecord(
null, // 缂栧彿
--
Gitblit v1.9.1