From a77a63df31ce880468c04cee3c9c3d3fe852d879 Mon Sep 17 00:00:00 2001 From: wsm <2746563060@侵权。> Date: Thu, 23 Apr 2026 23:43:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=A0=B9=E6=8D=AE=E8=BE=93?= =?UTF-8?q?=E5=85=A5=E7=9A=84jsonData=EF=BC=8CdeptId=EF=BC=8C=E4=BB=A5?= =?UTF-8?q?=E5=8F=8AroleId=E6=9F=A5=E8=AF=A2uesrNameList?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jeecg-boot-module-bpm-flowable/pom.xml | 9 ++++ .../common/expression/FlowNodeExpression.java | 52 ++++++++++++++----- .../ExtActExpressionController.java | 43 ++++++++++++--- .../jeecg/common/system/api/ISysBaseAPI.java | 2 + .../system/constant/UserSecretLevel.java | 25 +++++++++ .../system/service/impl/SysBaseApiImpl.java | 39 ++++++++++++++ 6 files changed, 148 insertions(+), 22 deletions(-) create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/constant/UserSecretLevel.java diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/pom.xml b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/pom.xml index 6395461..4498b9c 100644 --- a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/pom.xml +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/pom.xml @@ -98,6 +98,15 @@ flowable-json-converter ${flowable.version} + + org.jeecgframework.boot + jeecg-system-local-api + + + org.flowable + flowable-json-converter + ${flowable.version} + xerces diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/common/expression/FlowNodeExpression.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/common/expression/FlowNodeExpression.java index 492f442..7eeb5ee 100644 --- a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/common/expression/FlowNodeExpression.java +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/common/expression/FlowNodeExpression.java @@ -1,6 +1,8 @@ package org.jeecg.modules.extbpm.process.common.expression; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.jeecg.common.constant.SymbolConstant; @@ -10,23 +12,29 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; -import java.util.List; -import java.util.Set; +import javax.validation.constraints.NotBlank; +import java.util.*; +import java.util.stream.Collectors; @Slf4j @Service("flowNodeExpression") +@RequiredArgsConstructor(onConstructor_ = @Autowired) public class FlowNodeExpression { - @Lazy - @Autowired - private ISysBaseAPI sysbase; + // 自动注入 + private final ISysBaseAPI ISysBaseAPI; + + // 自动注入 + 自动延迟加载(解决循环依赖) + private final @Lazy ISysBaseAPI sysbase; + /** * 查找当前部门负责人 * ${flowNodeExpression.getDepartLeaders(applyUserId)} + * * @param applyUserId * @return */ - public List getDepartLeaders(String applyUserId){ + public List getDepartLeaders(String applyUserId) { List depIds = sysbase.getDepartIdsByUsername(applyUserId); if (CollectionUtils.isEmpty(depIds)) { return null; @@ -38,11 +46,12 @@ public class FlowNodeExpression { /** * 根据字段名称取json_data查询对应业务表单的数据 * ${flowNodeExpression.getJsondatastring(jsonData,'supDeptleaderid')} + * * @param jsonData * @param codeName * @return */ - public String getJsondatastring(Object jsonData, String codeName){ + public String getJsondatastring(Object jsonData, String codeName) { if (jsonData == null || StringUtils.isBlank(codeName)) { return null; } @@ -66,13 +75,26 @@ public class FlowNodeExpression { } } + /** + * 根据字段名称取json_data查询对应业务表单的数据 + * ${flowNodeExpression.getJsondatastring(jsonData,'supDeptleaderid')} + * + * @param jsonData + * @param deptKeyName + * @return roleId + */ + public List getUsersListByJson(Object jsonData, String deptKeyName, String roleId) { + return ISysBaseAPI.getUsersListByJsonLocalAPI(jsonData,deptKeyName,roleId); + } + /** * 查找上一级部门负责人 * ${flowNodeExpression.getLevel1DepartLeaders(applyUserId)} + * * @param applyUserId * @return */ - public List getLevel1DepartLeaders(String applyUserId){ + public List getLevel1DepartLeaders(String applyUserId) { //1.获取上一级部门ID Set level1DepParentIds = sysbase.getDepartParentIdsByUsername(applyUserId); if (CollectionUtils.isEmpty(level1DepParentIds)) { @@ -85,21 +107,22 @@ public class FlowNodeExpression { /** * 查找上二级部门负责人 * ${flowNodeExpression.getLevel2DepartLeaders(applyUserId)} + * * @param applyUserId * @return */ - public List getLevel2DepartLeaders(String applyUserId){ + public List getLevel2DepartLeaders(String applyUserId) { //1.获取上一级部门ID Set level1DepParentIds = sysbase.getDepartParentIdsByUsername(applyUserId); log.info("level1DepParentIds = {}", level1DepParentIds); if (CollectionUtils.isEmpty(level1DepParentIds)) { return null; } - + //2.获取上二级部门ID Set level2DepParentIds = sysbase.getDepartParentIdsByDepIds(level1DepParentIds); log.info("level2DepParentIds = {}", level2DepParentIds); - + if (CollectionUtils.isEmpty(level2DepParentIds)) { return null; } @@ -111,24 +134,25 @@ public class FlowNodeExpression { /** * 查找上三级部门负责人 * ${flowNodeExpression.getLevel3DepartLeaders(applyUserId)} + * * @param applyUserId * @return */ - public List getLevel3DepartLeaders(String applyUserId){ + public List getLevel3DepartLeaders(String applyUserId) { //1.获取上一级部门ID Set level1DepParentIds = sysbase.getDepartParentIdsByUsername(applyUserId); log.info("level1DepParentIds = {}", level1DepParentIds); if (CollectionUtils.isEmpty(level1DepParentIds)) { return null; } - + //2.获取上二级部门ID Set level2DepParentIds = sysbase.getDepartParentIdsByDepIds(level1DepParentIds); log.info("level2DepParentIds = {}", level2DepParentIds); if (CollectionUtils.isEmpty(level2DepParentIds)) { return null; } - + //3.获取上三级部门ID Set level3DepParentIds = sysbase.getDepartParentIdsByDepIds(level2DepParentIds); log.info("level3DepParentIds = {}", level3DepParentIds); diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/controller/ExtActExpressionController.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/controller/ExtActExpressionController.java index a317968..186a79b 100644 --- a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/controller/ExtActExpressionController.java +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/controller/ExtActExpressionController.java @@ -2,6 +2,7 @@ package org.jeecg.modules.extbpm.process.controller; import java.util.Arrays; import java.util.HashSet; +import java.util.List; import java.util.Set; import javax.servlet.http.HttpServletRequest; @@ -10,9 +11,11 @@ import org.apache.shiro.authz.annotation.RequiresPermissions; import org.jeecg.common.api.vo.Result; import org.jeecg.common.util.SqlInjectionUtil; import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.extbpm.process.common.expression.FlowNodeExpression; import org.jeecg.modules.extbpm.process.entity.ExtActExpression; import org.jeecg.modules.extbpm.process.service.IExtActExpressionService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -26,6 +29,9 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; + import lombok.extern.slf4j.Slf4j; /** @@ -37,11 +43,32 @@ import lombok.extern.slf4j.Slf4j; */ @RestController("extActExpressionController") @RequestMapping("/act/process/extActExpression") +@Tag(name = "流程表达式测试接口") @Slf4j public class ExtActExpressionController { @Autowired private IExtActExpressionService extActExpressionService; - + + @Autowired + FlowNodeExpression flowNodeExpression; + @GetMapping(value = "/testQueryUsers") + @Operation(summary = "获取json内数据测试接口") // 接口说明(必填) + public Result> queryPageList( + @RequestParam(name="jsonData") String jsonData, + @RequestParam(name="deptKeyName") String deptKeyName, + @RequestParam(name="roleId") String roleId + ) { + // 1. 调用业务方法 + List usernameList = flowNodeExpression.getUsersListByJson(jsonData, deptKeyName, roleId); + + // 2. 优雅判空 + 提前返回(大厂最爱:卫语句) + if (CollectionUtils.isEmpty(usernameList)) { + return Result.error("根据 jsonData、部门字段、角色ID未查询到用户"); + } + + // 3. 成功直接返回数据(标准接口格式) + return Result.OK("查询成功", usernameList); + } /** * 分页列表查询 * @param extActExpression @@ -81,7 +108,7 @@ public class ExtActExpressionController { result.setResult(pageList); return result; } - + /** * 添加 * @param extActExpression @@ -100,7 +127,7 @@ public class ExtActExpressionController { } return result; } - + /** * 编辑 * @param extActExpression @@ -120,10 +147,10 @@ public class ExtActExpressionController { result.success("修改成功!"); } } - + return result; } - + /** * 通过id删除 * @param id @@ -142,10 +169,10 @@ public class ExtActExpressionController { result.success("删除成功!"); } } - + return result; } - + /** * 批量删除 * @param ids @@ -163,7 +190,7 @@ public class ExtActExpressionController { } return result; } - + /** * 通过id查询 * @param id diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java index 74e3fd1..4215f69 100644 --- a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java +++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java @@ -562,4 +562,6 @@ public interface ISysBaseAPI extends CommonAPI { Map queryFileMapById(String id); String updateBusinessId(String businessId, List deliverablesList); + + List getUsersListByJsonLocalAPI(Object jsonData, String deptKeyName, String roleId); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/constant/UserSecretLevel.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/constant/UserSecretLevel.java new file mode 100644 index 0000000..bfbe7b2 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/constant/UserSecretLevel.java @@ -0,0 +1,25 @@ +package org.jeecg.modules.system.constant; + +/** + * 用户密级常量 + */ +public final class UserSecretLevel { + + private UserSecretLevel() { + } + + /** + * 非密 + */ + public static final Integer SECRET_LEVEL_NONE = 3; + + /** + * 一般 + */ + public static final Integer SECRET_LEVEL_NORMAL = 4; + + /** + * 重要 + */ + public static final Integer SECRET_LEVEL_IMPORTANT = 5; +} \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java index 6664920..fdb6601 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java @@ -50,6 +50,7 @@ import org.jeecg.modules.message.handle.impl.QywxSendMsgHandle; import org.jeecg.modules.message.handle.impl.SystemSendMsgHandle; import org.jeecg.modules.message.service.ISysMessageTemplateService; import org.jeecg.modules.message.websocket.WebSocket; +import org.jeecg.modules.system.constant.UserSecretLevel; import org.jeecg.modules.system.entity.*; import org.jeecg.modules.system.mapper.*; import org.jeecg.modules.system.service.*; @@ -2099,4 +2100,42 @@ public class SysBaseApiImpl implements ISysBaseAPI { return ""; } + public List getUsersListByJsonLocalAPI(Object jsonData, String deptKeyName, String roleId) { + if (jsonData == null || StringUtils.isEmpty(deptKeyName) || StringUtils.isEmpty(roleId)) { + return Collections.emptyList(); + } + + // 统一转成 JSONObject(一步到位,不用来回转字符串) + JSONObject json; + if (jsonData instanceof String) { + json = JSON.parseObject((String) jsonData); + } else if (jsonData instanceof JSONObject) { + json = (JSONObject) jsonData; + } else { + return Collections.emptyList(); + } + + // 关键参数无效 → 直接返回空 + if (json == null) { + return Collections.emptyList(); + } + + + String deptId = json.getString(deptKeyName); + if (StringUtils.isEmpty(deptId)) { + return Collections.emptyList(); + } + + List sysUserList = sysUserService.queryUserByDeptAndROle( + deptId, + roleId, + UserSecretLevel.SECRET_LEVEL_NONE + ); + + return Optional.ofNullable(sysUserList) + .orElse(Collections.emptyList()) + .stream() + .map(SysUser::getUsername) + .collect(Collectors.toList()); + } } \ No newline at end of file