Browse Source

发起流程

home 2 years ago
parent
commit
5cdf45d04d
22 changed files with 783 additions and 479 deletions
  1. 420 410
      bladex-tool/blade-starter-auth/src/main/java/org/springblade/core/secure/utils/AuthUtil.java
  2. 1 0
      hx-common/common-tool/src/main/java/com/fjhx/utils/BigDecimalUtil.java
  3. 56 0
      hx-common/service-flow/src/main/java/com/fjhx/controller/example/ExampleDetailsController.java
  4. 36 5
      hx-common/service-flow/src/main/java/com/fjhx/feign/FlowClient.java
  5. 16 0
      hx-common/service-flow/src/main/java/com/fjhx/mapper/example/ExampleDetailsMapper.java
  6. 5 0
      hx-common/service-flow/src/main/java/com/fjhx/mapper/example/ExampleDetailsMapper.xml
  7. 28 0
      hx-common/service-flow/src/main/java/com/fjhx/service/example/ExampleDetailsService.java
  8. 54 0
      hx-common/service-flow/src/main/java/com/fjhx/service/example/impl/ExampleDetailsServiceImpl.java
  9. 0 6
      hx-common/service-flow/src/main/java/com/fjhx/service/process/impl/ProcessInfoServiceImpl.java
  10. 5 0
      hx-service-api/service-flow-api/src/main/java/com/fjhx/constants/FlowConstant.java
  11. 74 0
      hx-service-api/service-flow-api/src/main/java/com/fjhx/entity/example/ExampleDetails.java
  12. 0 10
      hx-service-api/service-flow-api/src/main/java/com/fjhx/entity/process/ProcessInfo.java
  13. 0 6
      hx-service-api/service-flow-api/src/main/java/com/fjhx/entity/process/ProcessNodeButton.java
  14. 10 9
      hx-service-api/service-flow-api/src/main/java/com/fjhx/enums/ButtonNameEnum.java
  15. 0 24
      hx-service-api/service-flow-api/src/main/java/com/fjhx/enums/ProcessInfoParallelRulesEnum.java
  16. 6 4
      hx-service-api/service-flow-api/src/main/java/com/fjhx/feign/IFlowClient.java
  17. 14 0
      hx-service-api/service-flow-api/src/main/java/com/fjhx/params/ExampleInfoEx.java
  18. 4 0
      hx-service-api/service-flow-api/src/main/java/com/fjhx/params/FlowInfo.java
  19. 17 0
      hx-service-api/service-flow-api/src/main/java/com/fjhx/params/example/ExampleDetailsEx.java
  20. 17 0
      hx-service-api/service-flow-api/src/main/java/com/fjhx/params/example/ExampleDetailsVo.java
  21. 19 4
      hx-service-api/service-flow-api/src/main/java/com/fjhx/utils/FlowConstructor.java
  22. 1 1
      hx-service/storage-restructure/src/main/java/com/fjhx/controller/common/CommonFileController.java

+ 420 - 410
bladex-tool/blade-starter-auth/src/main/java/org/springblade/core/secure/utils/AuthUtil.java

@@ -19,8 +19,10 @@ package org.springblade.core.secure.utils;
 import io.jsonwebtoken.Claims;
 import io.jsonwebtoken.Claims;
 import org.springblade.core.jwt.JwtUtil;
 import org.springblade.core.jwt.JwtUtil;
 import org.springblade.core.jwt.props.JwtProperties;
 import org.springblade.core.jwt.props.JwtProperties;
+import org.springblade.core.launch.BladeApplication;
 import org.springblade.core.launch.constant.TokenConstant;
 import org.springblade.core.launch.constant.TokenConstant;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.BladeUser;
+import org.springblade.core.tool.constant.BladeConstant;
 import org.springblade.core.tool.constant.RoleConstant;
 import org.springblade.core.tool.constant.RoleConstant;
 import org.springblade.core.tool.support.Kv;
 import org.springblade.core.tool.support.Kv;
 import org.springblade.core.tool.utils.*;
 import org.springblade.core.tool.utils.*;
@@ -35,415 +37,423 @@ import java.util.Objects;
  * @author Chill
  * @author Chill
  */
  */
 public class AuthUtil {
 public class AuthUtil {
-	private static final String BLADE_USER_REQUEST_ATTR = "_BLADE_USER_REQUEST_ATTR_";
-
-	private final static String HEADER = TokenConstant.HEADER;
-	private final static String ACCOUNT = TokenConstant.ACCOUNT;
-	private final static String USER_NAME = TokenConstant.USER_NAME;
-	private final static String NICK_NAME = TokenConstant.NICK_NAME;
-	private final static String USER_ID = TokenConstant.USER_ID;
-	private final static String DEPT_ID = TokenConstant.DEPT_ID;
-	private final static String POST_ID = TokenConstant.POST_ID;
-	private final static String ROLE_ID = TokenConstant.ROLE_ID;
-	private final static String ROLE_NAME = TokenConstant.ROLE_NAME;
-	private final static String TENANT_ID = TokenConstant.TENANT_ID;
-	private final static String OAUTH_ID = TokenConstant.OAUTH_ID;
-	private final static String CLIENT_ID = TokenConstant.CLIENT_ID;
-	private final static String DETAIL = TokenConstant.DETAIL;
-
-	private static JwtProperties jwtProperties;
-
-	/**
-	 * 获取配置类
-	 *
-	 * @return jwtProperties
-	 */
-	private static JwtProperties getJwtProperties() {
-		if (jwtProperties == null) {
-			jwtProperties = SpringUtil.getBean(JwtProperties.class);
-		}
-		return jwtProperties;
-	}
-
-	/**
-	 * 获取用户信息
-	 *
-	 * @return BladeUser
-	 */
-	public static BladeUser getUser() {
-		HttpServletRequest request = WebUtil.getRequest();
-		if (request == null) {
-			return null;
-		}
-		// 优先从 request 中获取
-		Object bladeUser = request.getAttribute(BLADE_USER_REQUEST_ATTR);
-		if (bladeUser == null) {
-			bladeUser = getUser(request);
-			if (bladeUser != null) {
-				// 设置到 request 中
-				request.setAttribute(BLADE_USER_REQUEST_ATTR, bladeUser);
-			}
-		}
-		return (BladeUser) bladeUser;
-	}
-
-	/**
-	 * 获取用户信息
-	 *
-	 * @param request request
-	 * @return BladeUser
-	 */
-	@SuppressWarnings("unchecked")
-	public static BladeUser getUser(HttpServletRequest request) {
-		Claims claims = getClaims(request);
-		if (claims == null) {
-			return null;
-		}
-		String clientId = Func.toStr(claims.get(AuthUtil.CLIENT_ID));
-		Long userId = Func.toLong(claims.get(AuthUtil.USER_ID));
-		String tenantId = Func.toStr(claims.get(AuthUtil.TENANT_ID));
-		String oauthId = Func.toStr(claims.get(AuthUtil.OAUTH_ID));
-		String deptId = Func.toStrWithEmpty(claims.get(AuthUtil.DEPT_ID), StringPool.MINUS_ONE);
-		String postId = Func.toStrWithEmpty(claims.get(AuthUtil.POST_ID), StringPool.MINUS_ONE);
-		String roleId = Func.toStrWithEmpty(claims.get(AuthUtil.ROLE_ID), StringPool.MINUS_ONE);
-		String account = Func.toStr(claims.get(AuthUtil.ACCOUNT));
-		String roleName = Func.toStr(claims.get(AuthUtil.ROLE_NAME));
-		String userName = Func.toStr(claims.get(AuthUtil.USER_NAME));
-		String nickName = Func.toStr(claims.get(AuthUtil.NICK_NAME));
-		Kv detail = Kv.create().setAll((Map<? extends String, ?>) claims.get(AuthUtil.DETAIL));
-		BladeUser bladeUser = new BladeUser();
-		bladeUser.setClientId(clientId);
-		bladeUser.setUserId(userId);
-		bladeUser.setTenantId(tenantId);
-		bladeUser.setOauthId(oauthId);
-		bladeUser.setAccount(account);
-		bladeUser.setDeptId(deptId);
-		bladeUser.setPostId(postId);
-		bladeUser.setRoleId(roleId);
-		bladeUser.setRoleName(roleName);
-		bladeUser.setUserName(userName);
-		bladeUser.setNickName(nickName);
-		bladeUser.setDetail(detail);
-		return bladeUser;
-	}
-
-	/**
-	 * 是否为超管
-	 *
-	 * @return boolean
-	 */
-	public static boolean isAdministrator() {
-		return StringUtil.containsAny(getUserRole(), RoleConstant.ADMINISTRATOR);
-	}
-
-	/**
-	 * 是否为管理员
-	 *
-	 * @return boolean
-	 */
-	public static boolean isAdmin() {
-		return StringUtil.containsAny(getUserRole(), RoleConstant.ADMIN);
-	}
-
-	/**
-	 * 获取用户id
-	 *
-	 * @return userId
-	 */
-	public static Long getUserId() {
-		BladeUser user = getUser();
-		return (null == user) ? -1 : user.getUserId();
-	}
-	/**
-	 * 获取用户id
-	 *
-	 * @return
-	 */
-	public static String getUserIdStr() {
-		BladeUser user = getUser();
-		return (null == user || user.getUserId() == null) ? null : user.getUserId().toString();
-	}
-	/**
-	 * 获取用户id
-	 *
-	 * @param request request
-	 * @return userId
-	 */
-	public static Long getUserId(HttpServletRequest request) {
-		BladeUser user = getUser(request);
-		return (null == user) ? -1 : user.getUserId();
-	}
-
-	/**
-	 * 获取用户账号
-	 *
-	 * @return userAccount
-	 */
-	public static String getUserAccount() {
-		BladeUser user = getUser();
-		return (null == user) ? StringPool.EMPTY : user.getAccount();
-	}
-
-	/**
-	 * 获取用户账号
-	 *
-	 * @param request request
-	 * @return userAccount
-	 */
-	public static String getUserAccount(HttpServletRequest request) {
-		BladeUser user = getUser(request);
-		return (null == user) ? StringPool.EMPTY : user.getAccount();
-	}
-
-	/**
-	 * 获取用户名
-	 *
-	 * @return userName
-	 */
-	public static String getUserName() {
-		BladeUser user = getUser();
-		return (null == user) ? StringPool.EMPTY : user.getUserName();
-	}
-
-	/**
-	 * 获取用户名
-	 *
-	 * @param request request
-	 * @return userName
-	 */
-	public static String getUserName(HttpServletRequest request) {
-		BladeUser user = getUser(request);
-		return (null == user) ? StringPool.EMPTY : user.getUserName();
-	}
-
-	/**
-	 * 获取昵称
-	 *
-	 * @return userName
-	 */
-	public static String getNickName() {
-		BladeUser user = getUser();
-		return (null == user) ? StringPool.EMPTY : user.getNickName();
-	}
-
-	/**
-	 * 获取昵称
-	 *
-	 * @param request request
-	 * @return userName
-	 */
-	public static String getNickName(HttpServletRequest request) {
-		BladeUser user = getUser(request);
-		return (null == user) ? StringPool.EMPTY : user.getNickName();
-	}
-
-	/**
-	 * 获取用户部门
-	 *
-	 * @return userName
-	 */
-	public static String getDeptId() {
-		BladeUser user = getUser();
-		return (null == user) ? StringPool.EMPTY : user.getDeptId();
-	}
-
-	/**
-	 * 获取用户部门
-	 *
-	 * @param request request
-	 * @return userName
-	 */
-	public static String getDeptId(HttpServletRequest request) {
-		BladeUser user = getUser(request);
-		return (null == user) ? StringPool.EMPTY : user.getDeptId();
-	}
-
-	/**
-	 * 获取用户岗位
-	 *
-	 * @return userName
-	 */
-	public static String getPostId() {
-		BladeUser user = getUser();
-		return (null == user) ? StringPool.EMPTY : user.getPostId();
-	}
-
-	/**
-	 * 获取用户岗位
-	 *
-	 * @param request request
-	 * @return userName
-	 */
-	public static String getPostId(HttpServletRequest request) {
-		BladeUser user = getUser(request);
-		return (null == user) ? StringPool.EMPTY : user.getPostId();
-	}
-
-	/**
-	 * 获取用户角色
-	 *
-	 * @return userName
-	 */
-	public static String getUserRole() {
-		BladeUser user = getUser();
-		return (null == user) ? StringPool.EMPTY : user.getRoleName();
-	}
-
-	/**
-	 * 获取用角色
-	 *
-	 * @param request request
-	 * @return userName
-	 */
-	public static String getUserRole(HttpServletRequest request) {
-		BladeUser user = getUser(request);
-		return (null == user) ? StringPool.EMPTY : user.getRoleName();
-	}
-
-	/**
-	 * 获取租户ID
-	 *
-	 * @return tenantId
-	 */
-	public static String getTenantId() {
-		BladeUser user = getUser();
-		return (null == user) ? StringPool.EMPTY : user.getTenantId();
-	}
-
-	/**
-	 * 获取租户ID
-	 *
-	 * @param request request
-	 * @return tenantId
-	 */
-	public static String getTenantId(HttpServletRequest request) {
-		BladeUser user = getUser(request);
-		return (null == user) ? StringPool.EMPTY : user.getTenantId();
-	}
-
-	/**
-	 * 获取第三方认证ID
-	 *
-	 * @return tenantId
-	 */
-	public static String getOauthId() {
-		BladeUser user = getUser();
-		return (null == user) ? StringPool.EMPTY : user.getOauthId();
-	}
-
-	/**
-	 * 获取第三方认证ID
-	 *
-	 * @param request request
-	 * @return tenantId
-	 */
-	public static String getOauthId(HttpServletRequest request) {
-		BladeUser user = getUser(request);
-		return (null == user) ? StringPool.EMPTY : user.getOauthId();
-	}
-
-	/**
-	 * 获取客户端id
-	 *
-	 * @return clientId
-	 */
-	public static String getClientId() {
-		BladeUser user = getUser();
-		return (null == user) ? StringPool.EMPTY : user.getClientId();
-	}
-
-	/**
-	 * 获取客户端id
-	 *
-	 * @param request request
-	 * @return clientId
-	 */
-	public static String getClientId(HttpServletRequest request) {
-		BladeUser user = getUser(request);
-		return (null == user) ? StringPool.EMPTY : user.getClientId();
-	}
-
-	/**
-	 * 获取用户详情
-	 *
-	 * @return clientId
-	 */
-	public static Kv getDetail() {
-		BladeUser user = getUser();
-		return (null == user) ? Kv.create() : user.getDetail();
-	}
-
-	/**
-	 * 获取用户详情
-	 *
-	 * @param request request
-	 * @return clientId
-	 */
-	public static Kv getDetail(HttpServletRequest request) {
-		BladeUser user = getUser(request);
-		return (null == user) ? Kv.create() : user.getDetail();
-	}
-
-	/**
-	 * 获取Claims
-	 *
-	 * @param request request
-	 * @return Claims
-	 */
-	public static Claims getClaims(HttpServletRequest request) {
-		String auth = request.getHeader(AuthUtil.HEADER);
-		Claims claims = null;
-		String token;
-		// 获取 Token 参数
-		if (StringUtil.isNotBlank(auth)) {
-			token = JwtUtil.getToken(auth);
-		} else {
-			String parameter = request.getParameter(AuthUtil.HEADER);
-			token = JwtUtil.getToken(parameter);
-		}
-		// 获取 Token 值
-		if (StringUtil.isNotBlank(token)) {
-			claims = AuthUtil.parseJWT(token);
-		}
-		// 判断 Token 状态
-		if (ObjectUtil.isNotEmpty(claims) && getJwtProperties().getState()) {
-			String tenantId = Func.toStr(claims.get(AuthUtil.TENANT_ID));
-			String userId = Func.toStr(claims.get(AuthUtil.USER_ID));
-			String accessToken = JwtUtil.getAccessToken(tenantId, userId, token);
-			if (!token.equalsIgnoreCase(accessToken)) {
-				return null;
-			}
-		}
-		return claims;
-	}
-
-	/**
-	 * 获取请求头
-	 *
-	 * @return header
-	 */
-	public static String getHeader() {
-		return getHeader(Objects.requireNonNull(WebUtil.getRequest()));
-	}
-
-	/**
-	 * 获取请求头
-	 *
-	 * @param request request
-	 * @return header
-	 */
-	public static String getHeader(HttpServletRequest request) {
-		return request.getHeader(HEADER);
-	}
-
-	/**
-	 * 解析jsonWebToken
-	 *
-	 * @param jsonWebToken jsonWebToken
-	 * @return Claims
-	 */
-	public static Claims parseJWT(String jsonWebToken) {
-		return JwtUtil.parseJWT(jsonWebToken);
-	}
+    private static final String BLADE_USER_REQUEST_ATTR = "_BLADE_USER_REQUEST_ATTR_";
+
+    private final static String HEADER = TokenConstant.HEADER;
+    private final static String ACCOUNT = TokenConstant.ACCOUNT;
+    private final static String USER_NAME = TokenConstant.USER_NAME;
+    private final static String NICK_NAME = TokenConstant.NICK_NAME;
+    private final static String USER_ID = TokenConstant.USER_ID;
+    private final static String DEPT_ID = TokenConstant.DEPT_ID;
+    private final static String POST_ID = TokenConstant.POST_ID;
+    private final static String ROLE_ID = TokenConstant.ROLE_ID;
+    private final static String ROLE_NAME = TokenConstant.ROLE_NAME;
+    private final static String TENANT_ID = TokenConstant.TENANT_ID;
+    private final static String OAUTH_ID = TokenConstant.OAUTH_ID;
+    private final static String CLIENT_ID = TokenConstant.CLIENT_ID;
+    private final static String DETAIL = TokenConstant.DETAIL;
+
+    private static JwtProperties jwtProperties;
+
+    /**
+     * 获取配置类
+     *
+     * @return jwtProperties
+     */
+    private static JwtProperties getJwtProperties() {
+        if (jwtProperties == null) {
+            jwtProperties = SpringUtil.getBean(JwtProperties.class);
+        }
+        return jwtProperties;
+    }
+
+    /**
+     * 获取用户信息
+     *
+     * @return BladeUser
+     */
+    public static BladeUser getUser() {
+        HttpServletRequest request = WebUtil.getRequest();
+        if (request == null) {
+            return null;
+        }
+        // 优先从 request 中获取
+        Object bladeUser = request.getAttribute(BLADE_USER_REQUEST_ATTR);
+        if (bladeUser == null) {
+            bladeUser = getUser(request);
+            if (bladeUser != null) {
+                // 设置到 request 中
+                request.setAttribute(BLADE_USER_REQUEST_ATTR, bladeUser);
+            }
+        }
+        return (BladeUser) bladeUser;
+    }
+
+    /**
+     * 获取用户信息
+     *
+     * @param request request
+     * @return BladeUser
+     */
+    @SuppressWarnings("unchecked")
+    public static BladeUser getUser(HttpServletRequest request) {
+        Claims claims = getClaims(request);
+        if (claims == null) {
+            return null;
+        }
+        String clientId = Func.toStr(claims.get(AuthUtil.CLIENT_ID));
+        Long userId = Func.toLong(claims.get(AuthUtil.USER_ID));
+        String tenantId = Func.toStr(claims.get(AuthUtil.TENANT_ID));
+        String oauthId = Func.toStr(claims.get(AuthUtil.OAUTH_ID));
+        String deptId = Func.toStrWithEmpty(claims.get(AuthUtil.DEPT_ID), StringPool.MINUS_ONE);
+        String postId = Func.toStrWithEmpty(claims.get(AuthUtil.POST_ID), StringPool.MINUS_ONE);
+        String roleId = Func.toStrWithEmpty(claims.get(AuthUtil.ROLE_ID), StringPool.MINUS_ONE);
+        String account = Func.toStr(claims.get(AuthUtil.ACCOUNT));
+        String roleName = Func.toStr(claims.get(AuthUtil.ROLE_NAME));
+        String userName = Func.toStr(claims.get(AuthUtil.USER_NAME));
+        String nickName = Func.toStr(claims.get(AuthUtil.NICK_NAME));
+        Kv detail = Kv.create().setAll((Map<? extends String, ?>) claims.get(AuthUtil.DETAIL));
+        BladeUser bladeUser = new BladeUser();
+        bladeUser.setClientId(clientId);
+        bladeUser.setUserId(userId);
+        bladeUser.setTenantId(tenantId);
+        bladeUser.setOauthId(oauthId);
+        bladeUser.setAccount(account);
+        bladeUser.setDeptId(deptId);
+        bladeUser.setPostId(postId);
+        bladeUser.setRoleId(roleId);
+        bladeUser.setRoleName(roleName);
+        bladeUser.setUserName(userName);
+        bladeUser.setNickName(nickName);
+        bladeUser.setDetail(detail);
+        return bladeUser;
+    }
+
+    /**
+     * 是否为超管
+     *
+     * @return boolean
+     */
+    public static boolean isAdministrator() {
+        return StringUtil.containsAny(getUserRole(), RoleConstant.ADMINISTRATOR);
+    }
+
+    /**
+     * 是否为管理员
+     *
+     * @return boolean
+     */
+    public static boolean isAdmin() {
+        return StringUtil.containsAny(getUserRole(), RoleConstant.ADMIN);
+    }
+
+    /**
+     * 获取用户id
+     *
+     * @return userId
+     */
+    public static Long getUserId() {
+        BladeUser user = getUser();
+        return (null == user) ? -1 : user.getUserId();
+    }
+
+    /**
+     * 获取用户id
+     *
+     * @return
+     */
+    public static String getUserIdStr() {
+        BladeUser user = getUser();
+        return (null == user || user.getUserId() == null) ? null : user.getUserId().toString();
+    }
+
+    /**
+     * 获取用户id
+     *
+     * @param request request
+     * @return userId
+     */
+    public static Long getUserId(HttpServletRequest request) {
+        BladeUser user = getUser(request);
+        return (null == user) ? -1 : user.getUserId();
+    }
+
+    /**
+     * 获取用户账号
+     *
+     * @return userAccount
+     */
+    public static String getUserAccount() {
+        BladeUser user = getUser();
+        return (null == user) ? StringPool.EMPTY : user.getAccount();
+    }
+
+    /**
+     * 获取用户账号
+     *
+     * @param request request
+     * @return userAccount
+     */
+    public static String getUserAccount(HttpServletRequest request) {
+        BladeUser user = getUser(request);
+        return (null == user) ? StringPool.EMPTY : user.getAccount();
+    }
+
+    /**
+     * 获取用户名
+     *
+     * @return userName
+     */
+    public static String getUserName() {
+        BladeUser user = getUser();
+        return (null == user) ? StringPool.EMPTY : user.getUserName();
+    }
+
+    /**
+     * 获取用户名
+     *
+     * @param request request
+     * @return userName
+     */
+    public static String getUserName(HttpServletRequest request) {
+        BladeUser user = getUser(request);
+        return (null == user) ? StringPool.EMPTY : user.getUserName();
+    }
+
+    /**
+     * 获取昵称
+     *
+     * @return userName
+     */
+    public static String getNickName() {
+        BladeUser user = getUser();
+        return (null == user) ? StringPool.EMPTY : user.getNickName();
+    }
+
+    /**
+     * 获取昵称
+     *
+     * @param request request
+     * @return userName
+     */
+    public static String getNickName(HttpServletRequest request) {
+        BladeUser user = getUser(request);
+        return (null == user) ? StringPool.EMPTY : user.getNickName();
+    }
+
+    /**
+     * 获取用户部门
+     *
+     * @return userName
+     */
+    public static String getDeptId() {
+        BladeUser user = getUser();
+        return (null == user) ? StringPool.EMPTY : user.getDeptId();
+    }
+
+    /**
+     * 获取用户部门
+     *
+     * @param request request
+     * @return userName
+     */
+    public static String getDeptId(HttpServletRequest request) {
+        BladeUser user = getUser(request);
+        return (null == user) ? StringPool.EMPTY : user.getDeptId();
+    }
+
+    /**
+     * 获取用户岗位
+     *
+     * @return userName
+     */
+    public static String getPostId() {
+        BladeUser user = getUser();
+        return (null == user) ? StringPool.EMPTY : user.getPostId();
+    }
+
+    /**
+     * 获取用户岗位
+     *
+     * @param request request
+     * @return userName
+     */
+    public static String getPostId(HttpServletRequest request) {
+        BladeUser user = getUser(request);
+        return (null == user) ? StringPool.EMPTY : user.getPostId();
+    }
+
+    /**
+     * 获取用户角色
+     *
+     * @return userName
+     */
+    public static String getUserRole() {
+        BladeUser user = getUser();
+        return (null == user) ? StringPool.EMPTY : user.getRoleName();
+    }
+
+    /**
+     * 获取用角色
+     *
+     * @param request request
+     * @return userName
+     */
+    public static String getUserRole(HttpServletRequest request) {
+        BladeUser user = getUser(request);
+        return (null == user) ? StringPool.EMPTY : user.getRoleName();
+    }
+
+    /**
+     * 获取租户ID
+     *
+     * @return tenantId
+     */
+    public static String getTenantId() {
+        BladeUser user = getUser();
+        if (null == user) {
+            if (BladeApplication.isLocalDev()) {
+                return BladeConstant.ADMIN_TENANT_ID;
+            }
+            return StringPool.EMPTY;
+        }
+        return user.getTenantId();
+    }
+
+    /**
+     * 获取租户ID
+     *
+     * @param request request
+     * @return tenantId
+     */
+    public static String getTenantId(HttpServletRequest request) {
+        BladeUser user = getUser(request);
+        return (null == user) ? StringPool.EMPTY : user.getTenantId();
+    }
+
+    /**
+     * 获取第三方认证ID
+     *
+     * @return tenantId
+     */
+    public static String getOauthId() {
+        BladeUser user = getUser();
+        return (null == user) ? StringPool.EMPTY : user.getOauthId();
+    }
+
+    /**
+     * 获取第三方认证ID
+     *
+     * @param request request
+     * @return tenantId
+     */
+    public static String getOauthId(HttpServletRequest request) {
+        BladeUser user = getUser(request);
+        return (null == user) ? StringPool.EMPTY : user.getOauthId();
+    }
+
+    /**
+     * 获取客户端id
+     *
+     * @return clientId
+     */
+    public static String getClientId() {
+        BladeUser user = getUser();
+        return (null == user) ? StringPool.EMPTY : user.getClientId();
+    }
+
+    /**
+     * 获取客户端id
+     *
+     * @param request request
+     * @return clientId
+     */
+    public static String getClientId(HttpServletRequest request) {
+        BladeUser user = getUser(request);
+        return (null == user) ? StringPool.EMPTY : user.getClientId();
+    }
+
+    /**
+     * 获取用户详情
+     *
+     * @return clientId
+     */
+    public static Kv getDetail() {
+        BladeUser user = getUser();
+        return (null == user) ? Kv.create() : user.getDetail();
+    }
+
+    /**
+     * 获取用户详情
+     *
+     * @param request request
+     * @return clientId
+     */
+    public static Kv getDetail(HttpServletRequest request) {
+        BladeUser user = getUser(request);
+        return (null == user) ? Kv.create() : user.getDetail();
+    }
+
+    /**
+     * 获取Claims
+     *
+     * @param request request
+     * @return Claims
+     */
+    public static Claims getClaims(HttpServletRequest request) {
+        String auth = request.getHeader(AuthUtil.HEADER);
+        Claims claims = null;
+        String token;
+        // 获取 Token 参数
+        if (StringUtil.isNotBlank(auth)) {
+            token = JwtUtil.getToken(auth);
+        } else {
+            String parameter = request.getParameter(AuthUtil.HEADER);
+            token = JwtUtil.getToken(parameter);
+        }
+        // 获取 Token 值
+        if (StringUtil.isNotBlank(token)) {
+            claims = AuthUtil.parseJWT(token);
+        }
+        // 判断 Token 状态
+        if (ObjectUtil.isNotEmpty(claims) && getJwtProperties().getState()) {
+            String tenantId = Func.toStr(claims.get(AuthUtil.TENANT_ID));
+            String userId = Func.toStr(claims.get(AuthUtil.USER_ID));
+            String accessToken = JwtUtil.getAccessToken(tenantId, userId, token);
+            if (!token.equalsIgnoreCase(accessToken)) {
+                return null;
+            }
+        }
+        return claims;
+    }
+
+    /**
+     * 获取请求头
+     *
+     * @return header
+     */
+    public static String getHeader() {
+        return getHeader(Objects.requireNonNull(WebUtil.getRequest()));
+    }
+
+    /**
+     * 获取请求头
+     *
+     * @param request request
+     * @return header
+     */
+    public static String getHeader(HttpServletRequest request) {
+        return request.getHeader(HEADER);
+    }
+
+    /**
+     * 解析jsonWebToken
+     *
+     * @param jsonWebToken jsonWebToken
+     * @return Claims
+     */
+    public static Claims parseJWT(String jsonWebToken) {
+        return JwtUtil.parseJWT(jsonWebToken);
+    }
 
 
 }
 }

+ 1 - 0
hx-common/common-tool/src/main/java/com/fjhx/utils/BigDecimalUtil.java

@@ -128,6 +128,7 @@ public class BigDecimalUtil {
     public BigDecimalUtil divideTry(Object value, int scale) {
     public BigDecimalUtil divideTry(Object value, int scale) {
         BigDecimal bigDecimal = objToBigDecimal(value);
         BigDecimal bigDecimal = objToBigDecimal(value);
         if (bigDecimal.compareTo(BigDecimal.ZERO) == 0) {
         if (bigDecimal.compareTo(BigDecimal.ZERO) == 0) {
+            this.bigDecimal = BigDecimal.ZERO;
             return this;
             return this;
         }
         }
 
 

+ 56 - 0
hx-common/service-flow/src/main/java/com/fjhx/controller/example/ExampleDetailsController.java

@@ -0,0 +1,56 @@
+package com.fjhx.controller.example;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springblade.core.tool.api.R;
+import com.fjhx.entity.example.ExampleDetails;
+import com.fjhx.params.example.ExampleDetailsVo;
+import com.fjhx.service.example.ExampleDetailsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 实例明细 前端控制器
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-08-23
+ */
+@RestController
+@RequestMapping("/exampleDetails")
+public class ExampleDetailsController {
+
+    @Autowired
+    private ExampleDetailsService exampleDetailsService;
+
+    @PostMapping("/page")
+    public R page(@RequestBody Map<String, String> condition){
+        Page<ExampleDetails> result = exampleDetailsService.getPage(condition);
+        return R.success(result);
+    }
+
+    @PostMapping("/add")
+    public R add(@RequestBody ExampleDetailsVo exampleDetailsVo){
+        exampleDetailsService.add(exampleDetailsVo);
+        return R.success();
+    }
+
+    @PostMapping("/edit")
+    public R edit(@RequestBody ExampleDetailsVo exampleDetailsVo){
+        exampleDetailsService.edit(exampleDetailsVo);
+        return R.success();
+    }
+
+    @PostMapping("/delete")
+    public R delete(@RequestBody ExampleDetailsVo exampleDetailsVo){
+        exampleDetailsService.delete(exampleDetailsVo);
+        return R.success();
+    }
+
+}
+

+ 36 - 5
hx-common/service-flow/src/main/java/com/fjhx/feign/FlowClient.java

@@ -2,13 +2,18 @@ package com.fjhx.feign;
 
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fjhx.constants.FlowConstant;
 import com.fjhx.constants.FlowExplainConstant;
 import com.fjhx.constants.FlowExplainConstant;
 import com.fjhx.constants.StatusConstant;
 import com.fjhx.constants.StatusConstant;
+import com.fjhx.entity.example.ExampleDetails;
 import com.fjhx.entity.example.ExampleInfo;
 import com.fjhx.entity.example.ExampleInfo;
 import com.fjhx.entity.process.ProcessInfo;
 import com.fjhx.entity.process.ProcessInfo;
 import com.fjhx.entity.process.ProcessNodeButton;
 import com.fjhx.entity.process.ProcessNodeButton;
 import com.fjhx.entity.process.ProcessTenant;
 import com.fjhx.entity.process.ProcessTenant;
+import com.fjhx.enums.ProcessNodeTypeEnum;
+import com.fjhx.params.ExampleInfoEx;
 import com.fjhx.params.FlowInfo;
 import com.fjhx.params.FlowInfo;
+import com.fjhx.service.example.ExampleDetailsService;
 import com.fjhx.service.example.ExampleInfoService;
 import com.fjhx.service.example.ExampleInfoService;
 import com.fjhx.service.process.ProcessInfoService;
 import com.fjhx.service.process.ProcessInfoService;
 import com.fjhx.service.process.ProcessNodeButtonService;
 import com.fjhx.service.process.ProcessNodeButtonService;
@@ -20,6 +25,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
+import java.util.Arrays;
+
 @RestController
 @RestController
 public class FlowClient implements IFlowClient {
 public class FlowClient implements IFlowClient {
 
 
@@ -35,6 +42,8 @@ public class FlowClient implements IFlowClient {
     @Autowired
     @Autowired
     private ProcessNodeButtonService processNodeButtonService;
     private ProcessNodeButtonService processNodeButtonService;
 
 
+    @Autowired
+    private ExampleDetailsService exampleDetailsService;
 
 
     @PostMapping(GET_FLOW_INFO)
     @PostMapping(GET_FLOW_INFO)
     @Override
     @Override
@@ -64,23 +73,45 @@ public class FlowClient implements IFlowClient {
         return R.data(flowInfo);
         return R.data(flowInfo);
     }
     }
 
 
-    @PostMapping(GET_JUMP_NODE_ID)
+    @PostMapping(GET_NODE_BUTTON)
     @Override
     @Override
-    public R<Long> getJumpNodeId(Long processTenantId, String processNodeCode) {
+    public R<ProcessNodeButton> getNodeButton(Long processTenantId, String processNodeCode) {
         ProcessNodeButton processNodeButton = processNodeButtonService.getOne(
         ProcessNodeButton processNodeButton = processNodeButtonService.getOne(
                 Wrappers.<ProcessNodeButton>lambdaQuery()
                 Wrappers.<ProcessNodeButton>lambdaQuery()
                         .eq(ProcessNodeButton::getProcessTenantId, processTenantId)
                         .eq(ProcessNodeButton::getProcessTenantId, processTenantId)
                         .eq(ProcessNodeButton::getProcessNodeCode, processNodeCode));
                         .eq(ProcessNodeButton::getProcessNodeCode, processNodeCode));
 
 
         Assert.notEmpty(processNodeButton, FlowExplainConstant.SPECIFY_BRANCH_EMPTY);
         Assert.notEmpty(processNodeButton, FlowExplainConstant.SPECIFY_BRANCH_EMPTY);
-        return R.data(processNodeButton.getJumpNodeId());
+        return R.data(processNodeButton);
     }
     }
 
 
     @PostMapping(EXAMPLE_INFO_SAVE)
     @PostMapping(EXAMPLE_INFO_SAVE)
     @Override
     @Override
-    public R<ExampleInfo> exampleInfoSave(ExampleInfo exampleInfo) {
+    public R<ExampleInfo> exampleInfoSave(ExampleInfoEx exampleInfo) {
         exampleInfoService.save(exampleInfo);
         exampleInfoService.save(exampleInfo);
-        return R.data(exampleInfo);
+
+        ExampleDetails exampleDetails = exampleInfo.getExampleDetails();
+        exampleDetails.setExampleInfoId(exampleInfo.getId());
+        exampleDetails.setProcessInfoId(exampleInfo.getProcessInfoId());
+        exampleDetails.setProcessTenantId(exampleInfo.getProcessTenantId());
+        exampleDetails.setHandleUserId(AuthUtil.getUserId());
+
+        if (exampleInfo.getComplete().equals(StatusConstant.YES)) {
+
+            ExampleDetails endExampleDetails = new ExampleDetails();
+            endExampleDetails.setExampleInfoId(exampleInfo.getId());
+            endExampleDetails.setProcessInfoId(exampleInfo.getProcessInfoId());
+            endExampleDetails.setProcessTenantId(exampleInfo.getProcessTenantId());
+            endExampleDetails.setHandleUserId(AuthUtil.getUserId());
+            endExampleDetails.setRemarks(FlowConstant.END_REMARKS);
+
+            endExampleDetails.setNameType(ProcessNodeTypeEnum.END.getType());
+            exampleDetailsService.saveBatch(Arrays.asList(exampleDetails, endExampleDetails));
+        } else {
+            exampleDetailsService.save(exampleDetails);
+        }
+
+        return R.data(BeanUtil.toBean(exampleInfo, ExampleInfo.class));
     }
     }
 
 
 }
 }

+ 16 - 0
hx-common/service-flow/src/main/java/com/fjhx/mapper/example/ExampleDetailsMapper.java

@@ -0,0 +1,16 @@
+package com.fjhx.mapper.example;
+
+import com.fjhx.entity.example.ExampleDetails;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 实例明细 Mapper 接口
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-08-23
+ */
+public interface ExampleDetailsMapper extends BaseMapper<ExampleDetails> {
+
+}

+ 5 - 0
hx-common/service-flow/src/main/java/com/fjhx/mapper/example/ExampleDetailsMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fjhx.mapper.example.ExampleDetailsMapper">
+
+</mapper>

+ 28 - 0
hx-common/service-flow/src/main/java/com/fjhx/service/example/ExampleDetailsService.java

@@ -0,0 +1,28 @@
+package com.fjhx.service.example;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.entity.example.ExampleDetails;
+import com.fjhx.params.example.ExampleDetailsVo;
+import com.fjhx.base.BaseService;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 实例明细 服务类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-08-23
+ */
+public interface ExampleDetailsService extends BaseService<ExampleDetails> {
+
+    Page<ExampleDetails> getPage(Map<String, String> condition);
+
+    void add(ExampleDetailsVo exampleDetailsVo);
+
+    void edit(ExampleDetailsVo exampleDetailsVo);
+
+    void delete(ExampleDetailsVo exampleDetailsVo);
+
+}

+ 54 - 0
hx-common/service-flow/src/main/java/com/fjhx/service/example/impl/ExampleDetailsServiceImpl.java

@@ -0,0 +1,54 @@
+package com.fjhx.service.example.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.utils.WrapperUtil;
+import com.fjhx.entity.example.ExampleDetails;
+import com.fjhx.params.example.ExampleDetailsVo;
+import com.fjhx.mapper.example.ExampleDetailsMapper;
+import com.fjhx.service.example.ExampleDetailsService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 实例明细 服务实现类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-08-23
+ */
+@Service
+public class ExampleDetailsServiceImpl extends ServiceImpl<ExampleDetailsMapper, ExampleDetails> implements ExampleDetailsService {
+
+    @Override
+    public Page<ExampleDetails> getPage(Map<String, String> condition) {
+
+        QueryWrapper<ExampleDetails> wrapper = Wrappers.query();
+
+        WrapperUtil.init(condition, wrapper)
+                .createTimeDesc();
+
+        Page<ExampleDetails> page = page(condition, wrapper);
+        return page;
+    }
+
+    @Override
+    public void add(ExampleDetailsVo exampleDetailsVo) {
+        save(exampleDetailsVo);
+    }
+
+    @Override
+    public void edit(ExampleDetailsVo exampleDetailsVo) {
+        updateById(exampleDetailsVo);
+    }
+
+    @Override
+    public void delete(ExampleDetailsVo exampleDetailsVo) {
+        removeById(exampleDetailsVo.getId());
+    }
+
+}

+ 0 - 6
hx-common/service-flow/src/main/java/com/fjhx/service/process/impl/ProcessInfoServiceImpl.java

@@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.constants.FlowExplainConstant;
 import com.fjhx.constants.FlowExplainConstant;
 import com.fjhx.entity.process.ProcessInfo;
 import com.fjhx.entity.process.ProcessInfo;
-import com.fjhx.enums.ProcessInfoParallelRulesEnum;
 import com.fjhx.mapper.process.ProcessInfoMapper;
 import com.fjhx.mapper.process.ProcessInfoMapper;
 import com.fjhx.service.process.ProcessInfoService;
 import com.fjhx.service.process.ProcessInfoService;
 import com.fjhx.utils.Assert;
 import com.fjhx.utils.Assert;
@@ -71,11 +70,6 @@ public class ProcessInfoServiceImpl extends ServiceImpl<ProcessInfoMapper, Proce
         Integer count = count(ProcessInfo::getCode, processInfo.getCode());
         Integer count = count(ProcessInfo::getCode, processInfo.getCode());
         Assert.eqZero(count, FlowExplainConstant.PROCESS_EXIST);
         Assert.eqZero(count, FlowExplainConstant.PROCESS_EXIST);
 
 
-        // 并行规则
-        if (ObjectUtil.isEmpty(processInfo.getParallelRules())) {
-            processInfo.setParallelRules(ProcessInfoParallelRulesEnum.NO.getType());
-        }
-
         // 创建流程
         // 创建流程
         save(processInfo);
         save(processInfo);
 
 

+ 5 - 0
hx-service-api/service-flow-api/src/main/java/com/fjhx/constants/FlowConstant.java

@@ -35,4 +35,9 @@ public interface FlowConstant {
      */
      */
     Long OVER_PROCESS_FLAG = -1L;
     Long OVER_PROCESS_FLAG = -1L;
 
 
+    /**
+     * 流程结束标语
+     */
+    String END_REMARKS = "流程结束";
+
 }
 }

+ 74 - 0
hx-service-api/service-flow-api/src/main/java/com/fjhx/entity/example/ExampleDetails.java

@@ -0,0 +1,74 @@
+package com.fjhx.entity.example;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.Version;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.fjhx.base.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 实例明细
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-08-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ExampleDetails extends BaseEntity {
+
+
+    /**
+     * 实例id
+     */
+    private Long exampleInfoId;
+
+    /**
+     * 流程id
+     */
+    private Long processInfoId;
+
+    /**
+     * 租户流程id
+     */
+    private Long processTenantId;
+
+    /**
+     * 所在节点id
+     */
+    private Long processNodeId;
+
+    /**
+     * 节点处理按钮id
+     */
+    private Long processNodeButtonId;
+
+    /**
+     * 按钮名称类型
+     */
+    private Integer nameType;
+
+    /**
+     * 处理用户id
+     */
+    private Long handleUserId;
+
+    /**
+     * 发起原因/处理意见
+     */
+    private String remarks;
+
+    /**
+     * 逻辑删除 0未删除 1已删除
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer delFlag;
+
+
+}

+ 0 - 10
hx-service-api/service-flow-api/src/main/java/com/fjhx/entity/process/ProcessInfo.java

@@ -40,14 +40,4 @@ public class ProcessInfo implements Serializable {
      */
      */
     private String moduleName;
     private String moduleName;
 
 
-    /**
-     * 并行规则 0无规则 1禁止业务重复提交 2禁止用户重复提交 3角色重复提交 4禁止部门重复提交
-     */
-    private Integer parallelRules;
-
-    /**
-     * 禁止并行提示
-     */
-    private String parallelProhibitTips;
-
 }
 }

+ 0 - 6
hx-service-api/service-flow-api/src/main/java/com/fjhx/entity/process/ProcessNodeButton.java

@@ -50,10 +50,4 @@ public class ProcessNodeButton implements Serializable {
      */
      */
     private Long jumpNodeId;
     private Long jumpNodeId;
 
 
-    /**
-     * 通知模板
-     */
-    private String notice;
-
-
 }
 }

+ 10 - 9
hx-service-api/service-flow-api/src/main/java/com/fjhx/enums/ButtonNameEnum.java

@@ -9,19 +9,20 @@ import java.util.HashMap;
  */
  */
 @Getter
 @Getter
 public enum ButtonNameEnum {
 public enum ButtonNameEnum {
-
+    // 发起
+    START(1, "发起"),
     // 审核
     // 审核
-    ADOPT(1, "通过"),
-    FAIL(2, "不通过"),
+    ADOPT(2, "通过"),
+    FAIL(3, "不通过"),
     // 审批
     // 审批
-    AGREE(3, "同意"),
-    REJECT(4, "驳回"),
+    AGREE(4, "同意"),
+    REJECT(5, "驳回"),
     // 办理
     // 办理
-    COMPLETE(5, "完成"),
-    // 发起
-    START(6, "开始"),
+    COMPLETE(6, "完成"),
     // 执行分支逻辑
     // 执行分支逻辑
-    BRANCH(7, "分支");
+    BRANCH(7, "分支"),
+    // 结束流程
+    END(99, "结束");
 
 
 
 
     private final Integer type;
     private final Integer type;

+ 0 - 24
hx-service-api/service-flow-api/src/main/java/com/fjhx/enums/ProcessInfoParallelRulesEnum.java

@@ -1,24 +0,0 @@
-package com.fjhx.enums;
-
-import lombok.Getter;
-
-/**
- * 流程并行规则枚举
- */
-@Getter
-public enum ProcessInfoParallelRulesEnum {
-
-    NO(1), // 无规则
-    BUSINESS(2), // 业务禁止并行
-    USER(3), // 用户禁止并行
-    ROLE(4), // 角色禁止并行
-    DEPT(5), // 部门禁止并行
-    ;
-
-    private final Integer type;
-
-    ProcessInfoParallelRulesEnum(Integer type) {
-        this.type = type;
-    }
-
-}

+ 6 - 4
hx-service-api/service-flow-api/src/main/java/com/fjhx/feign/IFlowClient.java

@@ -2,6 +2,8 @@ package com.fjhx.feign;
 
 
 import com.fjhx.constants.ClientConstant;
 import com.fjhx.constants.ClientConstant;
 import com.fjhx.entity.example.ExampleInfo;
 import com.fjhx.entity.example.ExampleInfo;
+import com.fjhx.entity.process.ProcessNodeButton;
+import com.fjhx.params.ExampleInfoEx;
 import com.fjhx.params.FlowInfo;
 import com.fjhx.params.FlowInfo;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.api.R;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.cloud.openfeign.FeignClient;
@@ -16,7 +18,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 public interface IFlowClient {
 public interface IFlowClient {
 
 
     String GET_FLOW_INFO = ClientConstant.API_PREFIX + "/getFlowInfo";
     String GET_FLOW_INFO = ClientConstant.API_PREFIX + "/getFlowInfo";
-    String GET_JUMP_NODE_ID = ClientConstant.API_PREFIX + "/getJumpNodeId";
+    String GET_NODE_BUTTON = ClientConstant.API_PREFIX + "/getNodeButton";
     String EXAMPLE_INFO_SAVE = ClientConstant.API_PREFIX + "/exampleInfoSave";
     String EXAMPLE_INFO_SAVE = ClientConstant.API_PREFIX + "/exampleInfoSave";
 
 
     /**
     /**
@@ -28,13 +30,13 @@ public interface IFlowClient {
     /**
     /**
      * 通过业务id和节点编码获取下一节点id
      * 通过业务id和节点编码获取下一节点id
      */
      */
-    @PostMapping(GET_JUMP_NODE_ID)
-    R<Long> getJumpNodeId(@RequestParam("businessId") Long businessId, @RequestParam("processNodeCode") String processNodeCode);
+    @PostMapping(GET_NODE_BUTTON)
+    R<ProcessNodeButton> getNodeButton(@RequestParam("businessId") Long businessId, @RequestParam("processNodeCode") String processNodeCode);
 
 
     /**
     /**
      * 保存流程实例
      * 保存流程实例
      */
      */
     @PostMapping(EXAMPLE_INFO_SAVE)
     @PostMapping(EXAMPLE_INFO_SAVE)
-    R<ExampleInfo> exampleInfoSave(@RequestBody ExampleInfo exampleInfo);
+    R<ExampleInfo> exampleInfoSave(@RequestBody ExampleInfoEx exampleInfo);
 
 
 }
 }

+ 14 - 0
hx-service-api/service-flow-api/src/main/java/com/fjhx/params/ExampleInfoEx.java

@@ -0,0 +1,14 @@
+package com.fjhx.params;
+
+import com.fjhx.entity.example.ExampleDetails;
+import com.fjhx.entity.example.ExampleInfo;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ExampleInfoEx extends ExampleInfo {
+
+    private ExampleDetails exampleDetails;
+
+}

+ 4 - 0
hx-service-api/service-flow-api/src/main/java/com/fjhx/params/FlowInfo.java

@@ -5,6 +5,8 @@ import com.alibaba.fastjson.JSONObject;
 import com.fjhx.entity.process.ProcessInfo;
 import com.fjhx.entity.process.ProcessInfo;
 import com.fjhx.entity.process.ProcessTenant;
 import com.fjhx.entity.process.ProcessTenant;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
 
 
 /**
 /**
  * 流程信息
  * 流程信息
@@ -15,6 +17,8 @@ public class FlowInfo extends ProcessInfo {
     /**
     /**
      * 租户流程信息
      * 租户流程信息
      */
      */
+    @Getter
+    @Setter
     private String processTenantStr;
     private String processTenantStr;
 
 
     /**
     /**

+ 17 - 0
hx-service-api/service-flow-api/src/main/java/com/fjhx/params/example/ExampleDetailsEx.java

@@ -0,0 +1,17 @@
+package com.fjhx.params.example;
+
+import com.fjhx.entity.example.ExampleDetails;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 实例明细
+ *
+ * @author ${author}
+ * @since 2022-08-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ExampleDetailsEx extends ExampleDetails {
+
+}

+ 17 - 0
hx-service-api/service-flow-api/src/main/java/com/fjhx/params/example/ExampleDetailsVo.java

@@ -0,0 +1,17 @@
+package com.fjhx.params.example;
+
+import com.fjhx.entity.example.ExampleDetails;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 实例明细
+ *
+ * @author ${author}
+ * @since 2022-08-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ExampleDetailsVo extends ExampleDetails {
+
+}

+ 19 - 4
hx-service-api/service-flow-api/src/main/java/com/fjhx/utils/FlowConstructor.java

@@ -6,9 +6,13 @@ import com.alibaba.fastjson.JSONObject;
 import com.fjhx.constants.FlowConstant;
 import com.fjhx.constants.FlowConstant;
 import com.fjhx.constants.FlowExplainConstant;
 import com.fjhx.constants.FlowExplainConstant;
 import com.fjhx.constants.StatusConstant;
 import com.fjhx.constants.StatusConstant;
+import com.fjhx.entity.example.ExampleDetails;
 import com.fjhx.entity.example.ExampleInfo;
 import com.fjhx.entity.example.ExampleInfo;
+import com.fjhx.entity.process.ProcessNodeButton;
 import com.fjhx.entity.process.ProcessTenant;
 import com.fjhx.entity.process.ProcessTenant;
+import com.fjhx.enums.ButtonNameEnum;
 import com.fjhx.feign.IFlowClient;
 import com.fjhx.feign.IFlowClient;
+import com.fjhx.params.ExampleInfoEx;
 import com.fjhx.params.FlowInfo;
 import com.fjhx.params.FlowInfo;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.api.R;
 
 
@@ -37,7 +41,7 @@ public class FlowConstructor {
      * @param businessId 给予流程关联业务id
      * @param businessId 给予流程关联业务id
      * @return 流程实例对象
      * @return 流程实例对象
      */
      */
-    public ExampleInfo create(Long businessId) {
+    public ExampleInfo create(Long businessId, String remarks) {
 
 
         // 获取流程编码
         // 获取流程编码
         String code = exampleAbstract.getCode();
         String code = exampleAbstract.getCode();
@@ -49,17 +53,22 @@ public class FlowConstructor {
         FlowInfo flowInfo = r.getData();
         FlowInfo flowInfo = r.getData();
 
 
         // 创建流程实例
         // 创建流程实例
-        ExampleInfo exampleInfo = new ExampleInfo();
+        ExampleInfoEx exampleInfo = new ExampleInfoEx();
         exampleInfo.setProcessInfoId(flowInfo.getId());
         exampleInfo.setProcessInfoId(flowInfo.getId());
         exampleInfo.setBusinessId(businessId);
         exampleInfo.setBusinessId(businessId);
         exampleInfo.setCacheData(JSONObject.toJSONString(exampleAbstract.cacheData));
         exampleInfo.setCacheData(JSONObject.toJSONString(exampleAbstract.cacheData));
 
 
+        ExampleDetails startExampleDetails = new ExampleDetails();
+        startExampleDetails.setRemarks(remarks);
+
         // 如果租户流程为空,直接完成流程
         // 如果租户流程为空,直接完成流程
         ProcessTenant processTenant = flowInfo.processTenantEntity();
         ProcessTenant processTenant = flowInfo.processTenantEntity();
         if (ObjectUtil.isEmpty(processTenant)) {
         if (ObjectUtil.isEmpty(processTenant)) {
             exampleInfo.setProcessNodeId(FlowConstant.OVER_PROCESS_FLAG);
             exampleInfo.setProcessNodeId(FlowConstant.OVER_PROCESS_FLAG);
             exampleInfo.setComplete(StatusConstant.YES);
             exampleInfo.setComplete(StatusConstant.YES);
 
 
+            startExampleDetails.setNameType(ButtonNameEnum.START.getType());
+
             // 执行流程结束方法
             // 执行流程结束方法
             exampleAbstract.end();
             exampleAbstract.end();
         }
         }
@@ -72,11 +81,16 @@ public class FlowConstructor {
 
 
             // 调用方法查看是否有指定跳转节点,没有则正常流转
             // 调用方法查看是否有指定跳转节点,没有则正常流转
             String circulation = exampleAbstract.circulation(FlowConstant.START_CODE);
             String circulation = exampleAbstract.circulation(FlowConstant.START_CODE);
-            R<Long> getJumpNodeIdResult = flowClient.getJumpNodeId(processTenantId, circulation);
+            R<ProcessNodeButton> nodeButtonResult = flowClient.getNodeButton(processTenantId, circulation);
             Assert.eqTrue(r.isSuccess(), r.getMsg());
             Assert.eqTrue(r.isSuccess(), r.getMsg());
 
 
+            ProcessNodeButton processNodeButton = nodeButtonResult.getData();
+            startExampleDetails.setProcessNodeId(processNodeButton.getProcessNodeId());
+            startExampleDetails.setProcessNodeButtonId(processNodeButton.getId());
+            startExampleDetails.setNameType(processNodeButton.getNameType());
+
             // 流转节点
             // 流转节点
-            Long jumpNodeId = getJumpNodeIdResult.getData();
+            Long jumpNodeId = processNodeButton.getJumpNodeId();
 
 
             // 流程结束
             // 流程结束
             if (jumpNodeId.equals(FlowConstant.OVER_PROCESS_FLAG)) {
             if (jumpNodeId.equals(FlowConstant.OVER_PROCESS_FLAG)) {
@@ -91,6 +105,7 @@ public class FlowConstructor {
             // 赋值跳转节点id
             // 赋值跳转节点id
             exampleInfo.setProcessNodeId(jumpNodeId);
             exampleInfo.setProcessNodeId(jumpNodeId);
         }
         }
+        exampleInfo.setExampleDetails(startExampleDetails);
 
 
         // 保存流程实例
         // 保存流程实例
         R<ExampleInfo> exampleInfoResult = flowClient.exampleInfoSave(exampleInfo);
         R<ExampleInfo> exampleInfoResult = flowClient.exampleInfoSave(exampleInfo);

+ 1 - 1
hx-service/storage-restructure/src/main/java/com/fjhx/controller/common/CommonFileController.java

@@ -67,7 +67,7 @@ public class CommonFileController {
         map.put("processTenantId", "222222222222222222222");
         map.put("processTenantId", "222222222222222222222");
         exampleAbstract.setCacheData(map);
         exampleAbstract.setCacheData(map);
 
 
-        FlowConstructor.init(exampleAbstract).create(123456L);
+        FlowConstructor.init(exampleAbstract).create(123456L, "测试发起流程");
 
 
         return R.success();
         return R.success();
     }
     }