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