diff --git a/sql/dm/e 办同步信息日志菜单_20250917.sql b/sql/dm/e 办同步信息日志菜单_20250917.sql new file mode 100644 index 00000000..12f8fcd3 --- /dev/null +++ b/sql/dm/e 办同步信息日志菜单_20250917.sql @@ -0,0 +1,10 @@ +-- 同步接口日志菜单权限 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'); diff --git a/zt-framework/zt-spring-boot-starter-security/src/main/java/com/zt/plat/framework/security/core/LoginUser.java b/zt-framework/zt-spring-boot-starter-security/src/main/java/com/zt/plat/framework/security/core/LoginUser.java index 5d483513..6cc433ca 100644 --- a/zt-framework/zt-spring-boot-starter-security/src/main/java/com/zt/plat/framework/security/core/LoginUser.java +++ b/zt-framework/zt-spring-boot-starter-security/src/main/java/com/zt/plat/framework/security/core/LoginUser.java @@ -1,8 +1,8 @@ package com.zt.plat.framework.security.core; import cn.hutool.core.map.MapUtil; -import com.zt.plat.framework.common.enums.UserTypeEnum; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.zt.plat.framework.common.enums.UserTypeEnum; import lombok.Data; import java.time.LocalDateTime; @@ -20,6 +20,8 @@ public class LoginUser { public static final String INFO_KEY_NICKNAME = "nickname"; public static final String INFO_KEY_TENANT_ID = "tenantId"; + public static final String INFO_KEY_USERNAME = "username"; + public static final String INFO_KEY_PHONE = "phone"; // 用户关联的公司 Id public static final String INFO_KEY_COMPANY_IDS = "companyIds"; // 用户关联的部门 Id diff --git a/zt-module-databus/zt-module-databus-server/src/main/java/com/zt/plat/module/databus/framework/integration/gateway/core/ApiFlowDispatcher.java b/zt-module-databus/zt-module-databus-server/src/main/java/com/zt/plat/module/databus/framework/integration/gateway/core/ApiFlowDispatcher.java index 5ff7a99a..ce07a981 100644 --- a/zt-module-databus/zt-module-databus-server/src/main/java/com/zt/plat/module/databus/framework/integration/gateway/core/ApiFlowDispatcher.java +++ b/zt-module-databus/zt-module-databus-server/src/main/java/com/zt/plat/module/databus/framework/integration/gateway/core/ApiFlowDispatcher.java @@ -24,8 +24,7 @@ public class ApiFlowDispatcher { private final MessagingTemplate messagingTemplate; public ApiInvocationContext dispatch(String apiCode, String version, ApiInvocationContext context) { - MessageChannel channel = integrationFlowManager.locateInputChannel(apiCode, version) - .orElseThrow(() -> ServiceExceptionUtil.exception(API_FLOW_NOT_FOUND, apiCode, version)); + MessageChannel channel = requireInputChannel(apiCode, version); Message message = MessageBuilder.withPayload(context) .setHeader("apiCode", apiCode) .setHeader("version", version) @@ -36,4 +35,14 @@ public class ApiFlowDispatcher { } return (ApiInvocationContext) reply.getPayload(); } + + private MessageChannel requireInputChannel(String apiCode, String version) { + // 未命中时,进行一次兜底补偿查询 + return integrationFlowManager.locateInputChannel(apiCode, version) + .or(() -> { + integrationFlowManager.refresh(apiCode, version); + return integrationFlowManager.locateInputChannel(apiCode, version); + }) + .orElseThrow(() -> ServiceExceptionUtil.exception(API_FLOW_NOT_FOUND, apiCode, version)); + } } diff --git a/zt-module-databus/zt-module-databus-server/src/test/java/com/zt/plat/module/databus/framework/integration/gateway/sample/DatabusApiInvocationExample.java b/zt-module-databus/zt-module-databus-server/src/test/java/com/zt/plat/module/databus/framework/integration/gateway/sample/DatabusApiInvocationExample.java index eba67445..aeca8692 100644 --- a/zt-module-databus/zt-module-databus-server/src/test/java/com/zt/plat/module/databus/framework/integration/gateway/sample/DatabusApiInvocationExample.java +++ b/zt-module-databus/zt-module-databus-server/src/test/java/com/zt/plat/module/databus/framework/integration/gateway/sample/DatabusApiInvocationExample.java @@ -65,7 +65,7 @@ public final class DatabusApiInvocationExample { queryParams.put("businessCode", "11"); queryParams.put("fileId", "11"); queryParams.put("null", null); - String signature = ZTJGCryptoSignatureUtils.generateSignature(queryParams, Map.of(), APP_ID, TIMESTAMP); + String signature = generateSignature(queryParams, Map.of()); URI requestUri = buildUri(TARGET_API, queryParams); String nonce = "171615676c7d4d96b9f55f3d90ad27e0"; diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/dept/dto/DeptListReqDTO.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/dept/dto/DeptListReqDTO.java index 76703c28..5f51d42e 100644 --- a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/dept/dto/DeptListReqDTO.java +++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/dept/dto/DeptListReqDTO.java @@ -3,6 +3,8 @@ package com.zt.plat.module.system.api.dept.dto; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.util.List; + /** * 部门列表 Request DTO * @@ -24,4 +26,7 @@ public class DeptListReqDTO { @Schema(description = "是否集团", example = "false") private Boolean isGroup; + @Schema(description = "部门编号集合,支持多部门查询", example = "[\"1001\", \"1002\"]") + private List ids; + } \ No newline at end of file diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java index 7d5a45ca..c52606f5 100644 --- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java +++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java @@ -3,6 +3,8 @@ package com.zt.plat.module.system.controller.admin.dept.vo.dept; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.util.List; + @Schema(description = "管理后台 - 部门列表 Request VO") @Data public class DeptListReqVO { @@ -21,4 +23,7 @@ public class DeptListReqVO { @Schema(description = "是否集团", example = "false") private Boolean isGroup; + + @Schema(description = "部门编号集合,支持多部门查询", example = "[\"1001\", \"1002\"]") + private List ids; } diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/dal/mysql/dept/DeptMapper.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/dal/mysql/dept/DeptMapper.java index 009fe39b..afe90bc9 100644 --- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/dal/mysql/dept/DeptMapper.java +++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/dal/mysql/dept/DeptMapper.java @@ -1,5 +1,7 @@ package com.zt.plat.module.system.dal.mysql.dept; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.zt.plat.framework.common.enums.CommonStatusEnum; @@ -11,6 +13,7 @@ import org.apache.ibatis.annotations.Mapper; import java.util.Collection; import java.util.List; +import java.util.stream.Collectors; /** * @author chenbowen @@ -19,12 +22,21 @@ import java.util.List; public interface DeptMapper extends BaseMapperX { default List selectList(DeptListReqVO reqVO) { - return selectList(new LambdaQueryWrapperX() - .likeIfPresent(DeptDO::getName, reqVO.getName()) - .eqIfPresent(DeptDO::getCode, reqVO.getCode()) - .eqIfPresent(DeptDO::getStatus, reqVO.getStatus()) - .eqIfPresent(DeptDO::getIsCompany, reqVO.getIsCompany()) - ); + LambdaQueryWrapperX query = new LambdaQueryWrapperX() + .likeIfPresent(DeptDO::getName, reqVO.getName()) + .eqIfPresent(DeptDO::getCode, reqVO.getCode()) + .eqIfPresent(DeptDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DeptDO::getIsCompany, reqVO.getIsCompany()) + .eqIfPresent(DeptDO::getIsGroup, reqVO.getIsGroup()); + if (CollUtil.isNotEmpty(reqVO.getIds())) { + List ids = reqVO.getIds().stream() + .filter(StrUtil::isNotBlank) + .map(String::trim) + .map(Long::valueOf) + .collect(Collectors.toList()); + query.inIfPresent(DeptDO::getId, ids); + } + return selectList(query); } default DeptDO selectByParentIdAndName(Long parentId, String name) { diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/oauth2/OAuth2TokenServiceImpl.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/oauth2/OAuth2TokenServiceImpl.java index 10e6bdbe..a5c7d47d 100644 --- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/oauth2/OAuth2TokenServiceImpl.java +++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/oauth2/OAuth2TokenServiceImpl.java @@ -201,6 +201,8 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService { AdminUserDO user = adminUserService.getUser(userId); return MapUtil.builder(LoginUser.INFO_KEY_NICKNAME, user.getNickname()) .put(LoginUser.INFO_KEY_TENANT_ID, user.getTenantId().toString()) + .put(LoginUser.INFO_KEY_USERNAME, user.getUsername()) + .put(LoginUser.INFO_KEY_PHONE, user.getMobile()) .put(LoginUser.INFO_KEY_COMPANY_IDS, CollUtil.isEmpty(user.getCompanyIds()) ? "[]" : JsonUtils.toJsonString(user.getCompanyIds())) .put(LoginUser.INFO_KEY_DEPT_IDS, CollUtil.isEmpty(user.getDeptIds()) ? "[]" : JsonUtils.toJsonString(user.getDeptIds())) .put(LoginUser.INFO_KEY_COMPANY_DEPT_SET, CollUtil.isEmpty(user.getCompanyDeptInfos()) ? "[]" : JsonUtils.toJsonString(user.getCompanyDeptInfos())) diff --git a/zt-module-system/zt-module-system-server/src/test/java/com/zt/plat/module/system/service/dept/DeptServiceImplTest.java b/zt-module-system/zt-module-system-server/src/test/java/com/zt/plat/module/system/service/dept/DeptServiceImplTest.java index e0fd57ef..b98bb736 100644 --- a/zt-module-system/zt-module-system-server/src/test/java/com/zt/plat/module/system/service/dept/DeptServiceImplTest.java +++ b/zt-module-system/zt-module-system-server/src/test/java/com/zt/plat/module/system/service/dept/DeptServiceImplTest.java @@ -257,12 +257,20 @@ public class DeptServiceImplTest extends BaseDbUnitTest { DeptDO dept = randomPojo(DeptDO.class, o -> { // 等会查询到 o.setName("开发部"); o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setParentId(DeptDO.PARENT_ID_ROOT); + o.setSort(1); }).setDeptSource(1); deptMapper.insert(dept); // 测试 name 不匹配 - deptMapper.insert(ObjectUtils.cloneIgnoreId(dept, o -> o.setName("发"))); + deptMapper.insert(ObjectUtils.cloneIgnoreId(dept, o -> { + o.setName("发"); + o.setSort(2); + })); // 测试 status 不匹配 - deptMapper.insert(ObjectUtils.cloneIgnoreId(dept, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + deptMapper.insert(ObjectUtils.cloneIgnoreId(dept, o -> { + o.setStatus(CommonStatusEnum.DISABLE.getStatus()); + o.setSort(3); + })); // 准备参数 DeptListReqVO reqVO = new DeptListReqVO(); reqVO.setName("开"); @@ -275,6 +283,41 @@ public class DeptServiceImplTest extends BaseDbUnitTest { assertPojoEquals(dept, sysDeptDOS.get(0)); } + @Test + public void testGetDeptList_reqVO_ids() { + DeptDO dept1 = randomPojo(DeptDO.class, o -> { + o.setName("集团一部"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setParentId(DeptDO.PARENT_ID_ROOT); + o.setSort(1); + }).setDeptSource(1); + deptMapper.insert(dept1); + DeptDO dept2 = randomPojo(DeptDO.class, o -> { + o.setName("集团二部"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setParentId(DeptDO.PARENT_ID_ROOT); + o.setSort(2); + }).setDeptSource(1); + deptMapper.insert(dept2); + DeptDO otherDept = randomPojo(DeptDO.class, o -> { + o.setName("其他部门"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setParentId(DeptDO.PARENT_ID_ROOT); + o.setSort(3); + }).setDeptSource(1); + deptMapper.insert(otherDept); + + DeptListReqVO reqVO = new DeptListReqVO(); + reqVO.setIds(Arrays.asList(String.valueOf(dept1.getId()), String.valueOf(dept2.getId()))); + + List result = deptService.getDeptList(reqVO); + + assertEquals(2, result.size()); + assertEquals(dept1.getId(), result.get(0).getId()); + assertEquals(dept2.getId(), result.get(1).getId()); + assertTrue(result.stream().noneMatch(item -> item.getId().equals(otherDept.getId()))); + } + @Test public void testGetChildDeptList() { // mock 数据(1 级别子节点)