集成wflow

This commit is contained in:
pengjie 2024-03-15 16:42:52 +08:00
parent 6b95e70402
commit 15a9cc43d0
10 changed files with 458 additions and 19 deletions

109
pom.xml
View File

@ -6,7 +6,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<version>2.2.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zhgd</groupId>
@ -27,7 +27,7 @@
<jwt.version>0.9.1</jwt.version>
<commons.version>2.6</commons.version>
<!-- <swagger.ui.version>1.8.7</swagger.ui.version>-->
<tomcat.version>9.0.12</tomcat.version>
<tomcat.version>9.0.30</tomcat.version>
<djl.version>0.17.0</djl.version>
</properties>
@ -122,10 +122,10 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<!-- <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependency>-->
<dependency>
<!-- Starter for using Spring Security -->
<groupId>org.springframework.boot</groupId>
@ -234,7 +234,7 @@
</dependency>
<!-- druid -->
<!--<dependency>
<!-- <dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
@ -252,16 +252,16 @@
</dependency>
<!--mysql-->
<!-- <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
<version>5.1.48</version>
</dependency>
<!-- <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>-->
<!-- Swagger API文档 -->
<dependency>
@ -304,6 +304,12 @@
<groupId>com.qiwenshare</groupId>
<artifactId>ufop-spring-boot-starter</artifactId>
<version>1.2.3</version>
<exclusions>
<exclusion>
<artifactId>hutool-core</artifactId>
<groupId>cn.hutool</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
@ -457,13 +463,13 @@
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.5</version>
<version>5.8.16</version>
</dependency>
<dependency>
<!--<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>5.8.5</version>
</dependency>
<version>5.3.5</version>
</dependency>-->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15to18</artifactId>
@ -484,6 +490,12 @@
<groupId>cn.xuyanwu</groupId>
<artifactId>spring-file-storage</artifactId>
<version>0.5.0</version>
<exclusions>
<exclusion>
<artifactId>hutool-core</artifactId>
<groupId>cn.hutool</groupId>
</exclusion>
</exclusions>
</dependency>
<!--minio服务-->
<dependency>
@ -855,6 +867,73 @@
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>wflow-server</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/resources/lib/wflow-server-1.0-SNAPSHOT.jar</systemPath>
</dependency>
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter-actuator</artifactId>
<version>6.7.2</version>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.40</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.30.0</version>
</dependency>
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>5.3.1</version>
</dependency>
<dependency>
<groupId>org.javadelight</groupId>
<artifactId>delight-nashorn-sandbox</artifactId>
<version>0.3.2</version>
</dependency>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.12.0</version>
</dependency>
</dependencies>
<build>

View File

@ -3,7 +3,6 @@ package com;
import cn.xuyanwu.spring.file.storage.EnableFileStorage;
import org.apache.catalina.connector.Connector;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@ -23,7 +22,7 @@ import org.springframework.security.web.firewall.StrictHttpFirewall;
* @author: Mr.Peng
* @create: 2020-08-03 14:50
**/
@MapperScan({"com.zhgd.*.*.*.mapper","com.zhwl.*.*.*.mapper","com.zhgd.*.*.*.*.mapper"})
//@MapperScan(basePackages = {"com.zhgd.*.*.*.mapper","com.zhwl.*.*.*.mapper","com.zhgd.*.*.*.*.mapper", "com.wflow.mapper"})
@EnableAsync //开启异步调用
@EnableScheduling
@EnableFileStorage

View File

@ -0,0 +1,55 @@
package com.zhgd.config;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = {"com.zhgd.*.*.*.*.mapper", "com.zhgd.*.*.*.mapper"}, sqlSessionTemplateRef = "db1SqlSessionTemplate")
public class DataSourceOneConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.db1")
@Primary
public DataSource db1DataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@Primary
@Lazy //这个是懒加载的注解根据自己项目需要看是否添加
public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
//开启驼峰
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.setMapUnderscoreToCamelCase(true);
bean.setConfiguration(configuration);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*.xml"));
return bean.getObject();
}
@Bean
@Primary
public DataSourceTransactionManager db1TransactionManager(@Qualifier("db1DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
@Primary
@Lazy
public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}

View File

@ -0,0 +1,47 @@
package com.zhgd.config;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.wflow.mapper", sqlSessionTemplateRef = "sqlSessionTemplate2")
public class DataSourceTwoConfig {
@Bean(name = "dataSource2")
@ConfigurationProperties(prefix = "spring.datasource.db2")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "sqlSessionFactory2")
public SqlSessionFactory db1SqlSessionFactory(@Qualifier("dataSource2") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
//开启驼峰
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.setMapUnderscoreToCamelCase(true);
bean.setConfiguration(configuration);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*.xml"));
return bean.getObject();
}
@Bean(name = "transactionManager2")
public DataSourceTransactionManager transactionManager(@Qualifier("dataSource2") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "sqlSessionTemplate2")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory2") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}

View File

@ -2,6 +2,7 @@ package com.zhgd.xmgl.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
@ -32,7 +33,7 @@ public class AsyncConfig {
* 当线程池中的线程数目达到corePoolSize后就会把到达的任务放到缓存队列当中
* 当队列满了就继续创建线程当线程数量大于等于maxPoolSize后开始使用拒绝策略拒绝
*/
@Primary
@Bean("taskExecutor")
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
@ -57,7 +58,7 @@ public class AsyncConfig {
* 当线程池中的线程数目达到corePoolSize后就会把到达的任务放到缓存队列当中
* 当队列满了就继续创建线程当线程数量大于等于maxPoolSize后开始使用拒绝策略拒绝
*/
@Primary
@Bean("doubleCarbonExecutor")
public ThreadPoolTaskExecutor doubleCarbonExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

View File

@ -138,6 +138,10 @@ public class SystemUser implements Serializable {
@ApiModelProperty(value = "性别(0女;1男)")
private Integer sex;
@Excel(name = "头像", width = 15)
@ApiModelProperty(value = "头像")
private String avatar;
@Excel(name = "备注", width = 15)
@ApiModelProperty(value = "备注")
private String remark;

View File

@ -1,8 +1,13 @@
package com.zhgd.xmgl.modules.basicdata.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wflow.bean.vo.OrgTreeVo;
import com.zhgd.xmgl.modules.basicdata.entity.SystemDept;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @Description: 政府内部部门
@ -14,4 +19,12 @@ import org.apache.ibatis.annotations.Mapper;
public interface SystemDeptMapper extends BaseMapper<SystemDept> {
String getChildrenByDeptId(String deptId);
/**
* 查询某部门下的子部门列表
* @param deptId 父部门
* @return 子部门列表type字段固定返回固定值 dept
*/
@Select("SELECT dept_id id, dept_name `name`, 'dept' AS 'type' FROM system_dept WHERE parent_id=#{deptId}")
List<OrgTreeVo> selectByDept(@Param("deptId") String deptId);
}

View File

@ -4,11 +4,16 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wflow.bean.do_.DeptDo;
import com.wflow.bean.do_.UserDeptDo;
import com.wflow.bean.vo.OrgTreeVo;
import com.zhgd.xmgl.modules.basicdata.dto.SystemUserDto;
import com.zhgd.xmgl.modules.basicdata.entity.SystemUser;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.Collection;
import java.util.List;
/**
@ -25,4 +30,37 @@ public interface SystemUserMapper extends BaseMapper<SystemUser> {
Page<SystemUserDto> getPageList(Page page, @Param(Constants.WRAPPER) Wrapper<SystemUser> wrapper);
List<SystemUserDto> getPageList(@Param(Constants.WRAPPER) Wrapper<SystemUser> wrapper);
/**
* 查询该部门下的所有用户
* @param deptId 部门ID
* @return 用户列表 type为固定值user
*/
@Select("SELECT user_id id, real_name `name`, 'user' AS 'type', avatar " +
"FROM system_user" +
" WHERE department = #{deptId}")
List<OrgTreeVo> selectUsersByDept(@Param("deptId") String deptId);
/**
* 查询指定用户所在的部门一个用户可能同时在多个部门下
*
* @param userId 用户ID
* @return 用户所在的部门列表
*/
@Select("SELECT d.dept_id id, d.dept_name FROM system_user u, system_dept d WHERE u.department = d.dept_id AND u.user_id = #{userId}")
List<DeptDo> getUserDepts(@Param("userId") String userId);
/**
* 批量查询指定用户及部门信息
*
* @param udIds 用户ID_部门id 字符串拼接的集合
* @return 用户部门信息列表
*/
@Select({"<script>",
"SELECT tb.* FROM (SELECT CONCAT(wu.user_id, '_', wd.dept_id) tid, wu.user_id, wu.real_name, wd.dept_id, wu.avatar, wd.dept_name",
"FROM system_user wu, system_dept wd ",
"WHERE wu.department = wd.dept_id) tb WHERE tb.tid IN",
"<foreach item='item' index='index' collection='list' open='(' separator=',' close=')'>#{item}</foreach>",
"</script>"})
List<UserDeptDo> getUserDepInfosBatch(@Param("list") Collection<String> udIds);
}

View File

@ -0,0 +1,200 @@
package com.zhgd.xmgl.modules.basicdata.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.wflow.bean.do_.DeptDo;
import com.wflow.bean.do_.RoleDo;
import com.wflow.bean.do_.UserDeptDo;
import com.wflow.bean.do_.UserDo;
import com.wflow.bean.vo.ModelGroupVo;
import com.wflow.bean.vo.OrgTreeVo;
import com.wflow.bean.vo.UserVo;
import com.wflow.service.OrgRepositoryService;
import com.zhgd.xmgl.modules.basicdata.entity.SystemDept;
import com.zhgd.xmgl.modules.basicdata.entity.SystemUser;
import com.zhgd.xmgl.modules.basicdata.entity.SystemUserRole;
import com.zhgd.xmgl.modules.basicdata.mapper.SystemDeptMapper;
import com.zhgd.xmgl.modules.basicdata.mapper.SystemRoleMapper;
import com.zhgd.xmgl.modules.basicdata.mapper.SystemUserMapper;
import com.zhgd.xmgl.modules.basicdata.mapper.SystemUserRoleMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
@Primary
@Service
public class FlowOrgRepositoryServiceImpl implements OrgRepositoryService {
@Autowired
private SystemUserMapper systemUserMapper;
@Autowired
private SystemDeptMapper systemDeptMapper;
@Autowired
private SystemRoleMapper systemRoleMapper;
@Autowired
private SystemUserRoleMapper systemUserRoleMapper;
@Override
public List<ModelGroupVo.Form> getModelsByPerm(String userId) {
return null;
}
@Override
public UserDo getUserById(String userId) {
SystemUser systemUser = systemUserMapper.selectById(userId);
if (Objects.nonNull(systemUser)){
UserDo userDo = new UserDo();
userDo.setUserId(systemUser.getUserId());
userDo.setUserName(systemUser.getRealName());
userDo.setAvatar(systemUser.getAvatar());
return userDo;
}
return null;
}
@Override
public List<OrgTreeVo> selectUsersByPy(String py) {
return null;
}
@Override
public List<OrgTreeVo> selectUsersByDept(String deptId) {
return systemUserMapper.selectUsersByDept(deptId);
}
@Override
public List<UserDo> getUsersBatch(Collection<String> userIds) {
try {
return systemUserMapper.selectBatchIds(userIds).stream()
.map(u -> new UserDo(u.getUserId(), u.getRealName(), u.getAvatar()))
.collect(Collectors.toList());
} catch (Exception e) {
return Collections.emptyList();
}
}
@Override
public Set<String> getUsersByDepts(Collection<String> deptIds) {
try {
return systemUserMapper.selectList(
new LambdaQueryWrapper<SystemUser>()
.select(SystemUser::getUserId)
.in(SystemUser::getDepartment, deptIds))
.stream().map(SystemUser::getUserId)
.collect(Collectors.toSet());
} catch (Exception e) {
return Collections.emptySet();
}
}
@Override
public DeptDo getDeptById(String deptId) {
SystemDept departments = systemDeptMapper.selectById(deptId);
if (Objects.nonNull(departments)){
DeptDo deptDo = new DeptDo();
deptDo.setId(departments.getDeptId().toString());
deptDo.setDeptName(departments.getDeptName());
deptDo.setLeader("");
deptDo.setParentId(departments.getParentId().toString());
return deptDo;
}
return null;
}
@Override
public List<DeptDo> getDeptsByUser(String userId) {
return systemUserMapper.getUserDepts(userId);
}
@Override
public List<DeptDo> getSysAllDepts() {
try {
return systemDeptMapper.selectList(null).stream()
.map(d -> new DeptDo(d.getDeptId().toString(), d.getDeptName(), d.getLeader(), d.getParentId().toString()))
.collect(Collectors.toList());
} catch (Exception e) {
return Collections.emptyList();
}
}
@Override
public List<UserDeptDo> getSysAllUserDepts() {
try {
return systemUserMapper.selectList(null).stream()
.map(d -> new UserDeptDo(d.getUserId(), d.getDepartment()))
.collect(Collectors.toList());
} catch (Exception e) {
return Collections.emptyList();
}
}
@Override
public List<OrgTreeVo> getSubDeptById(String parentId) {
return systemDeptMapper.selectByDept(parentId);
}
@Override
public List<String> getRecursiveSubDept(String parentId) {
List<String> list = new ArrayList<>();
loadSubDept(parentId, list);
return list;
}
/**
* 递归加载所有子部门
* @param parentId 父部门ID
* @param subDepts 所有子部门缓存
*/
private void loadSubDept(String parentId, List<String> subDepts){
List<SystemDept> departments = systemDeptMapper.selectList(
new LambdaQueryWrapper<SystemDept>()
.eq(SystemDept::getParentId, parentId));
subDepts.addAll(departments.stream().map(SystemDept::getDeptId).collect(Collectors.toList()).stream().map(Object::toString).collect(Collectors.toList()));
departments.forEach(d -> loadSubDept(d.getDeptId().toString(), subDepts));
}
@Override
public List<RoleDo> getSysAllRoles() {
try {
return systemRoleMapper.selectList(null).stream()
.map(r -> new RoleDo(r.getRoleId().toString(), r.getRoleName()))
.collect(Collectors.toList());
} catch (Exception e) {
return Collections.emptyList();
}
}
@Override
public Set<String> getUsersByRoles(List<String> roles) {
return systemUserRoleMapper.selectList(new LambdaQueryWrapper<SystemUserRole>()
.select(SystemUserRole::getUserId)
.in(SystemUserRole::getRoleId, roles)).stream()
.map(SystemUserRole::getUserId).collect(Collectors.toSet());
}
@Override
public String getUserSign(String userId) {
return systemUserMapper.selectById(userId).getUserId();
}
@Override
public void updateUserSign(String userId, String signature) {
}
@Override
public UserVo getUserDetail(String userId) {
return null;
}
@Override
public Map<String, UserDeptDo> getUserDeptInfos(Collection<String> userDeptIds) {
return systemUserMapper.getUserDepInfosBatch(userDeptIds)
.stream().collect(Collectors.toMap(UserDeptDo::getUserId, v -> v));
}
}

View File

@ -92,6 +92,9 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
.antMatchers("/project/workerAttendance/add").permitAll()
.antMatchers("/jwt/sso").permitAll()
.antMatchers("/xmgl/systemUser/ssoLogin").permitAll()
.antMatchers("/wflow/**").permitAll()
.antMatchers("/oa/**").permitAll()
.antMatchers("/sys/auth/**").permitAll()
.antMatchers(HttpMethod.OPTIONS, "/**").anonymous()
.anyRequest().authenticated() // 剩下所有的验证都需要验证
.and()