1. 调整 e 办相关用户组织同步报文接受逻辑

2. 新增针对 e 办的接口日志记录功能

(cherry picked from commit 28aae25bef)
This commit is contained in:
chenbowen
2025-08-28 15:47:49 +08:00
committed by chenbowen
parent a53105088d
commit 4559f7268f
26 changed files with 1420 additions and 119 deletions

View File

@@ -0,0 +1,83 @@
/*
Yudao Database Transfer Tool
Source Server Type : MySQL
Target Server Type : DM8
Date: 2025-08-28 14:12:23
*/
-- ----------------------------
-- Table structure for system_sync_log
-- ----------------------------
CREATE TABLE system_sync_log (
id bigint NOT NULL PRIMARY KEY,
bim_request_id varchar(64) DEFAULT '' NULL,
service_name varchar(100) NOT NULL,
request_method varchar(16) DEFAULT 'POST' NOT NULL,
request_url varchar(500) NOT NULL,
client_ip varchar(50) NOT NULL,
user_agent varchar(512) DEFAULT NULL NULL,
request_time datetime NOT NULL,
response_time datetime DEFAULT NULL NULL,
duration bigint DEFAULT NULL NULL,
encrypted_request text NOT NULL,
decrypted_request text NULL,
status smallint DEFAULT 0 NOT NULL,
error_code varchar(100) DEFAULT NULL NULL,
error_message varchar(1000) DEFAULT NULL NULL,
exception_stack text NULL,
response_data text NULL,
encrypted_response text NULL,
auth_user varchar(100) DEFAULT NULL NULL,
decrypt_status smallint DEFAULT 0 NOT NULL,
signature_verify_status smallint DEFAULT 0 NOT NULL,
auth_status smallint DEFAULT 0 NOT NULL,
business_result varchar(100) DEFAULT NULL NULL,
extra text NULL,
creator varchar(64) DEFAULT '' NULL,
create_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
updater varchar(64) DEFAULT '' NULL,
update_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
deleted bit DEFAULT '0' NOT NULL
);
CREATE INDEX idx_system_sync_log_01 ON system_sync_log (bim_request_id);
CREATE INDEX idx_system_sync_log_02 ON system_sync_log (service_name);
CREATE INDEX idx_system_sync_log_03 ON system_sync_log (request_time);
CREATE INDEX idx_system_sync_log_04 ON system_sync_log (status);
CREATE INDEX idx_system_sync_log_05 ON system_sync_log (client_ip);
CREATE INDEX idx_system_sync_log_06 ON system_sync_log (auth_user);
COMMENT ON COLUMN system_sync_log.id IS '日志主键';
COMMENT ON COLUMN system_sync_log.bim_request_id IS '外部请求ID';
COMMENT ON COLUMN system_sync_log.service_name IS '接口名称/服务名称';
COMMENT ON COLUMN system_sync_log.request_method IS '请求方法';
COMMENT ON COLUMN system_sync_log.request_url IS '请求URL';
COMMENT ON COLUMN system_sync_log.client_ip IS '客户端IP地址';
COMMENT ON COLUMN system_sync_log.user_agent IS '用户代理字符串';
COMMENT ON COLUMN system_sync_log.request_time IS '请求开始时间';
COMMENT ON COLUMN system_sync_log.response_time IS '请求结束时间';
COMMENT ON COLUMN system_sync_log.duration IS '请求处理耗时(毫秒)';
COMMENT ON COLUMN system_sync_log.encrypted_request IS '原始加密请求体';
COMMENT ON COLUMN system_sync_log.decrypted_request IS '解密后的请求体';
COMMENT ON COLUMN system_sync_log.status IS '响应状态 0-成功 1-解密失败 2-签名验证失败 3-认证失败 4-业务处理失败 5-系统异常';
COMMENT ON COLUMN system_sync_log.error_code IS '错误码';
COMMENT ON COLUMN system_sync_log.error_message IS '错误信息';
COMMENT ON COLUMN system_sync_log.exception_stack IS '异常堆栈';
COMMENT ON COLUMN system_sync_log.response_data IS '响应数据(加密前)';
COMMENT ON COLUMN system_sync_log.encrypted_response IS '加密后的响应数据';
COMMENT ON COLUMN system_sync_log.auth_user IS '认证用户';
COMMENT ON COLUMN system_sync_log.decrypt_status IS '解密状态 0-成功 1-失败';
COMMENT ON COLUMN system_sync_log.signature_verify_status IS '签名验证状态 0-成功 1-失败';
COMMENT ON COLUMN system_sync_log.auth_status IS '认证状态 0-成功 1-失败';
COMMENT ON COLUMN system_sync_log.business_result IS '业务处理结果';
COMMENT ON COLUMN system_sync_log.extra IS '额外信息';
COMMENT ON COLUMN system_sync_log.creator IS '创建者';
COMMENT ON COLUMN system_sync_log.create_time IS '创建时间';
COMMENT ON COLUMN system_sync_log.updater IS '更新者';
COMMENT ON COLUMN system_sync_log.update_time IS '更新时间';
COMMENT ON COLUMN system_sync_log.deleted IS '是否删除';
COMMENT ON TABLE system_sync_log IS '同步接口调用日志表';

View File

@@ -0,0 +1,11 @@
-- 同步日志状态字典数据
INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted) VALUES
(999, '同步日志状态', 'sync_log_status', 0, '同步接口调用日志状态', 'admin', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', b'0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES
(9990, 1, '成功', '0', 'sync_log_status', 0, 'success', '', '同步接口调用成功', 'admin', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', b'0'),
(9991, 2, '解密失败', '1', 'sync_log_status', 0, 'danger', '', '请求解密失败', 'admin', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', b'0'),
(9992, 3, '签名验证失败', '2', 'sync_log_status', 0, 'warning', '', '签名验证失败', 'admin', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', b'0'),
(9993, 4, '认证失败', '3', 'sync_log_status', 0, 'warning', '', '用户认证失败', 'admin', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', b'0'),
(9994, 5, '业务处理失败', '4', 'sync_log_status', 0, 'danger', '', '业务逻辑处理失败', 'admin', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', b'0'),
(9995, 6, '系统异常', '5', 'sync_log_status', 0, 'danger', '', '系统内部异常', 'admin', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', b'0');

View File

@@ -0,0 +1,17 @@
-- 同步接口日志菜单权限 SQL 脚本
-- 为同步接口日志查询界面创建相应的菜单和权限
-- 在审计日志(108)下新增同步日志菜单
INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
VALUES (502, '同步日志', '', 2, 3, 108, 'sync-log', 'ep:data-line', 'system/synclog/index', 'SystemSyncLog', 0, '1', '1', '1', 'admin', '2024-08-28 00:00:00', 'admin', '2024-08-28 00:00:00', '0');
-- 同步日志查询权限按钮
INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
VALUES (5020, '同步日志查询', 'system:sync-log:query', 3, 1, 502, '', '', '', '', 0, '1', '1', '1', 'admin', '2024-08-28 00:00:00', 'admin', '2024-08-28 00:00:00', '0');
-- 为超级管理员角色分配菜单权限
INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted)
VALUES (NULL, 1, 502, 'admin', '2024-08-28 00:00:00', 'admin', '2024-08-28 00:00:00', '0');
INSERT INTO system_role_menu (id, role_id, menu_id, creator, create_time, updater, update_time, deleted)
VALUES (NULL, 1, 5020, 'admin', '2024-08-28 00:00:00', 'admin', '2024-08-28 00:00:00', '0');

View File

@@ -0,0 +1,41 @@
-- Table structure for system_sync_log
-- ----------------------------
DROP TABLE IF EXISTS `system_sync_log`;
CREATE TABLE `system_sync_log` (
`id` bigint NOT NULL COMMENT '日志主键',
`bim_request_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '外部请求ID',
`service_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '接口名称/服务名称',
`request_method` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'POST' COMMENT '请求方法',
`request_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '请求URL',
`client_ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户端IP地址',
`user_agent` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '用户代理字符串',
`request_time` datetime NOT NULL COMMENT '请求开始时间',
`response_time` datetime NULL DEFAULT NULL COMMENT '请求结束时间',
`duration` bigint NULL DEFAULT NULL COMMENT '请求处理耗时(毫秒)',
`encrypted_request` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '原始加密请求体',
`decrypted_request` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '解密后的请求体',
`status` tinyint NOT NULL DEFAULT 0 COMMENT '响应状态 0-成功 1-解密失败 2-签名验证失败 3-认证失败 4-业务处理失败 5-系统异常',
`error_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '错误码',
`error_message` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '错误信息',
`exception_stack` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '异常堆栈',
`response_data` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '响应数据(加密前)',
`encrypted_response` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '加密后的响应数据',
`auth_user` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '认证用户',
`decrypt_status` tinyint NOT NULL DEFAULT 0 COMMENT '解密状态 0-成功 1-失败',
`signature_verify_status` tinyint NOT NULL DEFAULT 0 COMMENT '签名验证状态 0-成功 1-失败',
`auth_status` tinyint NOT NULL DEFAULT 0 COMMENT '认证状态 0-成功 1-失败',
`business_result` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '业务处理结果',
`extra` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '额外信息',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_bim_request_id` (`bim_request_id`) USING BTREE COMMENT '外部请求ID索引',
INDEX `idx_service_name` (`service_name`) USING BTREE COMMENT '服务名称索引',
INDEX `idx_request_time` (`request_time`) USING BTREE COMMENT '请求时间索引',
INDEX `idx_status` (`status`) USING BTREE COMMENT '状态索引',
INDEX `idx_client_ip` (`client_ip`) USING BTREE COMMENT '客户端IP索引',
INDEX `idx_auth_user` (`auth_user`) USING BTREE COMMENT '认证用户索引'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '同步接口调用日志表';

View File

@@ -0,0 +1,63 @@
package cn.iocoder.yudao.module.system.enums.dept;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 机构类型枚举
*
* @author chenbowen
*/
@Getter
@AllArgsConstructor
public enum DeptTypeEnum {
/**
* 单位/公司
*/
COMPANY(28, "单位"),
/**
* 部门
*/
DEPARTMENT(26, "部门");
/**
* 类型编码
*/
private final Integer code;
/**
* 类型名称
*/
private final String name;
/**
* 根据编码获取枚举
*/
public static DeptTypeEnum getByCode(Integer code) {
if (code == null) {
return null;
}
for (DeptTypeEnum value : DeptTypeEnum.values()) {
if (value.getCode().equals(code)) {
return value;
}
}
return null;
}
/**
* 判断是否为公司
*/
public static boolean isCompany(Integer code) {
return COMPANY.getCode().equals(code);
}
/**
* 判断是否为部门
*/
public static boolean isDepartment(Integer code) {
return DEPARTMENT.getCode().equals(code);
}
}

View File

@@ -24,7 +24,7 @@ public class DeptSaveReqVO {
@Size(max = 30, message = "部门名称长度不能超过 30 个字符") @Size(max = 30, message = "部门名称长度不能超过 30 个字符")
private String name; private String name;
@Schema(description = "父部门 ID", example = "1024") @Schema(description = "父部门 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024(顶级部门父级 Id 为 0)")
private Long parentId; private Long parentId;
@Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@@ -43,7 +43,7 @@ public class DeptSaveReqVO {
@Size(max = 50, message = "邮箱长度不能超过 50 个字符") @Size(max = 50, message = "邮箱长度不能超过 50 个字符")
private String email; private String email;
@Schema(description = "状态,见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @Schema(description = "状态,见 CommonStatusEnum 枚举0 开启 1 关闭", requiredMode = Schema.RequiredMode.REQUIRED, example = "0 开启 1 关闭")
@InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}")
private Integer status; private Integer status;

View File

@@ -0,0 +1,52 @@
package cn.iocoder.yudao.module.system.controller.admin.sync;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.controller.admin.sync.vo.SyncLogPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.sync.vo.SyncLogRespVO;
import cn.iocoder.yudao.module.system.dal.dataobject.sync.SyncLogDO;
import cn.iocoder.yudao.module.system.service.sync.SyncLogService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
/**
* 同步接口日志 Controller
*
* @author 芋道源码
*/
@Tag(name = "管理后台 - 同步接口日志")
@RestController
@RequestMapping("/system/sync-log")
@Validated
public class SyncLogController {
@Resource
private SyncLogService syncLogService;
@GetMapping("/get")
@Operation(summary = "获得同步接口日志")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('system:sync-log:query')")
public CommonResult<SyncLogRespVO> getSyncLog(@RequestParam("id") Long id) {
SyncLogDO syncLog = syncLogService.getSyncLog(id);
return success(BeanUtils.toBean(syncLog, SyncLogRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得同步接口日志分页")
@PreAuthorize("@ss.hasPermission('system:sync-log:query')")
public CommonResult<PageResult<SyncLogRespVO>> getSyncLogPage(@Valid SyncLogPageReqVO pageReqVO) {
PageResult<SyncLogDO> pageResult = syncLogService.getSyncLogPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, SyncLogRespVO.class));
}
}

View File

@@ -0,0 +1,44 @@
package cn.iocoder.yudao.module.system.controller.admin.sync.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
/**
* 同步接口日志分页 Request VO
*
* @author 芋道源码
*/
@Schema(description = "管理后台 - 同步接口日志分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class SyncLogPageReqVO extends PageParam {
@Schema(description = "外部请求ID", example = "REQ_12345")
private String bimRequestId;
@Schema(description = "服务名称", example = "SchemaService")
private String serviceName;
@Schema(description = "响应状态", example = "0")
private Integer status;
@Schema(description = "客户端IP", example = "192.168.1.100")
private String clientIp;
@Schema(description = "认证用户", example = "admin")
private String authUser;
@Schema(description = "请求时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] requestTime;
}

View File

@@ -0,0 +1,92 @@
package cn.iocoder.yudao.module.system.controller.admin.sync.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 同步接口日志 Response VO
*
* @author 芋道源码
*/
@Schema(description = "管理后台 - 同步接口日志 Response VO")
@Data
public class SyncLogRespVO {
@Schema(description = "日志主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "外部请求ID", example = "REQ_12345")
private String bimRequestId;
@Schema(description = "服务名称", example = "SchemaService")
private String serviceName;
@Schema(description = "请求方法", example = "POST")
private String requestMethod;
@Schema(description = "请求URL", example = "/system/sync/SchemaService")
private String requestUrl;
@Schema(description = "客户端IP地址", example = "192.168.1.100")
private String clientIp;
@Schema(description = "用户代理字符串")
private String userAgent;
@Schema(description = "请求开始时间", example = "2024-01-01 12:00:00")
private LocalDateTime requestTime;
@Schema(description = "请求结束时间", example = "2024-01-01 12:00:01")
private LocalDateTime responseTime;
@Schema(description = "请求处理耗时(毫秒)", example = "1000")
private Long duration;
@Schema(description = "原始加密请求体")
private String encryptedRequest;
@Schema(description = "解密后的请求体")
private String decryptedRequest;
@Schema(description = "响应状态", example = "0")
private Integer status;
@Schema(description = "错误码", example = "SYNC_001")
private String errorCode;
@Schema(description = "错误信息", example = "解密失败")
private String errorMessage;
@Schema(description = "异常堆栈")
private String exceptionStack;
@Schema(description = "响应数据(加密前)")
private String responseData;
@Schema(description = "加密后的响应数据")
private String encryptedResponse;
@Schema(description = "认证用户", example = "admin")
private String authUser;
@Schema(description = "解密状态", example = "0")
private Integer decryptStatus;
@Schema(description = "签名验证状态", example = "0")
private Integer signatureVerifyStatus;
@Schema(description = "认证状态", example = "0")
private Integer authStatus;
@Schema(description = "业务处理结果", example = "200")
private String businessResult;
@Schema(description = "额外信息")
private String extra;
@Schema(description = "创建时间", example = "2024-01-01 12:00:00")
private LocalDateTime createTime;
}

Some files were not shown because too many files have changed in this diff Show More