From 15a9cc43d0a68b10007eeb11e151214aedd4464b Mon Sep 17 00:00:00 2001 From: pengjie <17373303529@163.com> Date: Fri, 15 Mar 2024 16:42:52 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9B=86=E6=88=90wflow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 109 ++++++++-- src/main/java/com/WisdomSiteApplication.java | 3 +- .../com/zhgd/config/DataSourceOneConfig.java | 55 +++++ .../com/zhgd/config/DataSourceTwoConfig.java | 47 ++++ .../com/zhgd/xmgl/config/AsyncConfig.java | 5 +- .../modules/basicdata/entity/SystemUser.java | 4 + .../basicdata/mapper/SystemDeptMapper.java | 13 ++ .../basicdata/mapper/SystemUserMapper.java | 38 ++++ .../impl/FlowOrgRepositoryServiceImpl.java | 200 ++++++++++++++++++ .../zhgd/xmgl/security/WebSecurityConfig.java | 3 + 10 files changed, 458 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/zhgd/config/DataSourceOneConfig.java create mode 100644 src/main/java/com/zhgd/config/DataSourceTwoConfig.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/FlowOrgRepositoryServiceImpl.java diff --git a/pom.xml b/pom.xml index 06913e8..9673603 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 2.1.1.RELEASE + 2.2.3.RELEASE com.zhgd @@ -27,7 +27,7 @@ 0.9.1 2.6 - 9.0.12 + 9.0.30 0.17.0 @@ -122,10 +122,10 @@ org.springframework.boot spring-boot-starter-aop - + org.springframework.boot @@ -234,7 +234,7 @@ - - mysql mysql-connector-java - 8.0.33 + 5.1.48 + @@ -304,6 +304,12 @@ com.qiwenshare ufop-spring-boot-starter 1.2.3 + + + hutool-core + cn.hutool + + @@ -457,13 +463,13 @@ cn.hutool hutool-all - 5.8.5 + 5.8.16 - + org.bouncycastle bcprov-jdk15to18 @@ -484,6 +490,12 @@ cn.xuyanwu spring-file-storage 0.5.0 + + + hutool-core + cn.hutool + + @@ -855,6 +867,73 @@ org.springframework.kafka spring-kafka + + + org.example + wflow-server + 1.0-SNAPSHOT + system + ${basedir}/src/main/resources/lib/wflow-server-1.0-SNAPSHOT.jar + + + + org.flowable + flowable-spring-boot-starter-actuator + 6.7.2 + + + org.mybatis + mybatis + + + org.springframework.boot + spring-boot-starter-actuator + + + + + + org.projectlombok + lombok + 1.18.20 + + + + com.alibaba.fastjson2 + fastjson2 + 2.0.40 + + + + cn.dev33 + sa-token-spring-boot-starter + 1.30.0 + + + + com.belerweb + pinyin4j + 2.5.1 + + + + com.googlecode.aviator + aviator + 5.3.1 + + + + org.javadelight + delight-nashorn-sandbox + 0.3.2 + + + + xerces + xercesImpl + 2.12.0 + + diff --git a/src/main/java/com/WisdomSiteApplication.java b/src/main/java/com/WisdomSiteApplication.java index 91e24c9..a8fa889 100644 --- a/src/main/java/com/WisdomSiteApplication.java +++ b/src/main/java/com/WisdomSiteApplication.java @@ -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 diff --git a/src/main/java/com/zhgd/config/DataSourceOneConfig.java b/src/main/java/com/zhgd/config/DataSourceOneConfig.java new file mode 100644 index 0000000..3c1a1b0 --- /dev/null +++ b/src/main/java/com/zhgd/config/DataSourceOneConfig.java @@ -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); + } +} diff --git a/src/main/java/com/zhgd/config/DataSourceTwoConfig.java b/src/main/java/com/zhgd/config/DataSourceTwoConfig.java new file mode 100644 index 0000000..849e949 --- /dev/null +++ b/src/main/java/com/zhgd/config/DataSourceTwoConfig.java @@ -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); + } +} diff --git a/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java b/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java index cb373ea..c1ac647 100644 --- a/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java +++ b/src/main/java/com/zhgd/xmgl/config/AsyncConfig.java @@ -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(); diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/entity/SystemUser.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/entity/SystemUser.java index 3572748..7633cc6 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/entity/SystemUser.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/entity/SystemUser.java @@ -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; diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/mapper/SystemDeptMapper.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/mapper/SystemDeptMapper.java index 9219edd..afc3e55 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/mapper/SystemDeptMapper.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/mapper/SystemDeptMapper.java @@ -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 { 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 selectByDept(@Param("deptId") String deptId); } diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/mapper/SystemUserMapper.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/mapper/SystemUserMapper.java index 0023a93..1f1b46a 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/mapper/SystemUserMapper.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/mapper/SystemUserMapper.java @@ -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 { Page getPageList(Page page, @Param(Constants.WRAPPER) Wrapper wrapper); List getPageList(@Param(Constants.WRAPPER) Wrapper 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 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 getUserDepts(@Param("userId") String userId); + + /** + * 批量查询指定用户及部门信息 + * + * @param udIds 用户ID_部门id 字符串拼接的集合 + * @return 用户部门信息列表 + */ + @Select({""}) + List getUserDepInfosBatch(@Param("list") Collection udIds); } diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/FlowOrgRepositoryServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/FlowOrgRepositoryServiceImpl.java new file mode 100644 index 0000000..43a8b90 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/service/impl/FlowOrgRepositoryServiceImpl.java @@ -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 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 selectUsersByPy(String py) { + return null; + } + + @Override + public List selectUsersByDept(String deptId) { + return systemUserMapper.selectUsersByDept(deptId); + } + + @Override + public List getUsersBatch(Collection 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 getUsersByDepts(Collection deptIds) { + try { + return systemUserMapper.selectList( + new LambdaQueryWrapper() + .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 getDeptsByUser(String userId) { + return systemUserMapper.getUserDepts(userId); + } + + @Override + public List 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 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 getSubDeptById(String parentId) { + return systemDeptMapper.selectByDept(parentId); + } + + @Override + public List getRecursiveSubDept(String parentId) { + List list = new ArrayList<>(); + loadSubDept(parentId, list); + return list; + } + + /** + * 递归加载所有子部门 + * @param parentId 父部门ID + * @param subDepts 所有子部门缓存 + */ + private void loadSubDept(String parentId, List subDepts){ + List departments = systemDeptMapper.selectList( + new LambdaQueryWrapper() + .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 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 getUsersByRoles(List roles) { + return systemUserRoleMapper.selectList(new LambdaQueryWrapper() + .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 getUserDeptInfos(Collection userDeptIds) { + return systemUserMapper.getUserDepInfosBatch(userDeptIds) + .stream().collect(Collectors.toMap(UserDeptDo::getUserId, v -> v)); + } +} diff --git a/src/main/java/com/zhgd/xmgl/security/WebSecurityConfig.java b/src/main/java/com/zhgd/xmgl/security/WebSecurityConfig.java index 15e4e1b..b9afe63 100644 --- a/src/main/java/com/zhgd/xmgl/security/WebSecurityConfig.java +++ b/src/main/java/com/zhgd/xmgl/security/WebSecurityConfig.java @@ -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()