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