Commit 99f56bdf authored by jiangyz's avatar jiangyz

cicd

parent f60a1007
Pipeline #25113 failed with stages
in 6 minutes and 57 seconds
image: docker:stable
variables:
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: "/certs"
services:
- docker:19.03.5-dind
stages:
- build
- deploy
build:
image: maven:3.8.5-openjdk-17
# 指定阶段
stage: build
script:
- echo "build"
#- mvn clean package -Dmaven.test.skip=true
- mvn clean install -DskipTests
#复制jar包
- cp target/*.jar /root/pms-agent.jar
#- cp target/classes/jars/webgate-agent.tar /root/webgate-agent.tar
only:
- develop
tags:
- dev
# - shared
deploy:
image: infoepoch/docker-and-compose:18.09.2-1.23.2
stage: deploy
before_script:
- docker info
script:
- echo "deploying..."
#jar包复制到Dockerfile所在的路径
- cp /root/pms-agent.jar .
#- cp /root/webgate-agent.tar .
#发布启动项目
- docker-compose down
- docker-compose build
- docker-compose up -d
#删除none镜像
- docker image prune -f
#- docker save pms-agent |gzip > /root/master-pms-agent.tar
# 只作用在develop
only:
- develop
tags:
- dev
# - shared
FROM maven:3.8.5-openjdk-17
ENV BASE_DIR="/home/pms-agent" \
DATA_DIR="/data/pms-agent"
WORKDIR $BASE_DIR
#################
# PASS平台不能用Root用户使用文件夹,需要创建普通用户
# 日志路径需要和配置相同
RUN mkdir -p $DATA_DIR/{log, upload, tmp}
RUN adduser -u 1000 --disabled-password gx \
&& chown -R gx:gx $BASE_DIR \
&& chmod -R 777 $BASE_DIR \
&& chown -R gx:gx $DATA_DIR \
&& chmod -R 777 $DATA_DIR
USER 1000
#################
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Djasypt.encryptor.password=INFO_epoch1","-jar","pms-agent.jar"]
# yaml 配置
version: '3'
services:
union-js:
build: ./
image: pms-agent:latest
restart: always
ports:
- 8406:8406
network_mode: "host"
environment:
- SPRING_PROFILES_ACTIVE
\ No newline at end of file
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.13</version> <version>3.2.5</version>
<relativePath/> <relativePath/>
</parent> </parent>
<groupId>com.infoepoch.pms</groupId> <groupId>com.infoepoch.pms</groupId>
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<description>pms-agent</description> <description>pms-agent</description>
<properties> <properties>
<java.version>21</java.version> <java.version>17</java.version>
<lombok.version>1.18.38</lombok.version> <lombok.version>1.18.38</lombok.version>
<redisson.version>3.45.0</redisson.version> <redisson.version>3.45.0</redisson.version>
</properties> </properties>
......
package com.infoepoch.pms.agent.common.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class ApplicationContextTool implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ApplicationContextTool.applicationContext = applicationContext;
}
public static Object getBean(String beanName) {
return applicationContext.getBean(beanName);
}
}
package com.infoepoch.pms.agent.common.utils;
import com.infoepoch.pms.agent.domain.baisc.user.User;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CommonTool {
/**
* 获取职位
*
* @param duty
* @return
*/
public static String getPosition(String duty) {
if (StringUtils.isBlank(duty))
return null;
if (duty.contains("-")) {
String[] arr = duty.split("-");
return arr[arr.length - 1];
} else {
return duty;
}
}
/**
* 部门名称裁剪
*
* @param departmentName
* @return
*/
public static String departmentNameCutOut(String departmentName) {
return departmentNameCutOut(departmentName, "江苏\\");
}
/**
* 部门名称裁剪
*
* @param departmentName
* @param cutOutStr
* @return
*/
public static String departmentNameCutOut(String departmentName, String cutOutStr) {
return departmentNameCutOut(departmentName, cutOutStr, "");
}
/**
* 部门名称裁剪
*
* @param departmentName
* @param cutOutStr
* @param defaultStr
* @return
*/
public static String departmentNameCutOut(String departmentName, String cutOutStr, String defaultStr) {
if (StringUtils.isBlank(departmentName))
return defaultStr;
if (StringUtils.isBlank(cutOutStr))
return departmentName;
if (departmentName.startsWith(cutOutStr)) {
return departmentName.substring(cutOutStr.length());
}
return departmentName.replace(cutOutStr, "");
}
/**
* 过滤掉管理员
*
* @param userList
*/
public static void adminFilter(List<User> userList) {
if(CollectionUtils.isEmpty(userList))
return;
userList.removeIf(user -> StringUtils.isNotBlank(user.getUsername()) && user.getUsername().equals("admin"));
}
}
package com.infoepoch.pms.agent.common.utils;
import org.apache.commons.collections4.CollectionUtils;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
public class LambdaTool {
public static <T> List<T> pagingList(List<T> list, int pageIndex, int pageSize) {
if(CollectionUtils.isEmpty(list))
return Collections.EMPTY_LIST;
if(pageSize <= 0)
return Collections.EMPTY_LIST;
if(pageIndex <= 0) {
pageIndex = 1;
}
return list.stream().skip((long) pageSize * (pageIndex - 1)).limit(pageSize).collect(Collectors.toList());
}
/**
* 截取字符串
*
* @param list
* @param fromIndex
* @param toIndex
* @param function
* @param <T>
* @param <R>
* @return
*/
public static <T, R> List<R> subList(List<T> list, int fromIndex, int toIndex, Function<T, R> function) {
List<R> resultList = new ArrayList<>();
if (CollectionUtils.isEmpty(list)) {
return resultList;
}
list = list.subList(fromIndex, toIndex);
for (T t : list) {
resultList.add(function.apply(t));
}
return resultList;
}
/**
* 将列表转换成map
* 备注:key不要存在重复的,否则会丢失部分数据
*
* @param collection
* @param keyFunction
* @param <T>
* @param <R>
* @return
*/
public static <T, R> Map<T, R> changeCollectionToHashMap(Collection<R> collection, Function<R, T> keyFunction) {
Map<T, R> resultMap = new HashMap<>();
if (collection != null) {
for (R r : collection) {
resultMap.put(keyFunction.apply(r), r);
}
}
return resultMap;
}
/**
* 将列表转换成map
*
* @param collection
* @param keyFunction
* @param valueFunction
* @param <T>
* @param <K>
* @param <V>
* @return
*/
public static <T, K, V> Map<K, V> changeCollectionToHashMap(Collection<T> collection, Function<T, K> keyFunction, Function<T, V> valueFunction) {
Map<K, V> resultMap = new HashMap<>();
if (collection != null) {
for (T t : collection) {
resultMap.put(keyFunction.apply(t), valueFunction.apply(t));
}
}
return resultMap;
}
/**
* 将列表根据key分成多个list并存入map中
*
* @param collection
* @param keyFunction
* @param <T>
* @param <R>
* @return
*/
public static <T, R> Map<T, List<R>> changeCollectionToHashListMap(Collection<R> collection, Function<R, T> keyFunction) {
Map<T, List<R>> resultMap = new HashMap<>();
if (collection != null) {
for (R r : collection) {
List<R> rList = resultMap.get(keyFunction.apply(r));
if (rList == null) {
rList = new ArrayList<>();
}
rList.add(r);
resultMap.put(keyFunction.apply(r), rList);
}
}
return resultMap;
}
public static <T, K, V> Map<K, List<V>> changeCollectionToHashListMap(Collection<T> collection, Function<T, K> keyFunction, Function<T, List<V>> valueFunction) {
Map<K, List<V>> resultMap = new HashMap<>();
if (collection != null) {
for (T t : collection) {
List<V> rList = resultMap.get(keyFunction.apply(t));
if (rList == null) {
rList = new ArrayList<>();
}
rList.addAll(valueFunction.apply(t));
resultMap.put(keyFunction.apply(t), rList);
}
}
return resultMap;
}
public static <T, K, V> Map<K, List<V>> changeCollectionToHashListMapTwo(Collection<T> collection, Function<T, K> keyFunction, Function<T, V> valueFunction) {
Map<K, List<V>> resultMap = new HashMap<>();
if (collection != null) {
for (T t : collection) {
List<V> rList = resultMap.get(keyFunction.apply(t));
if (rList == null) {
rList = new ArrayList<>();
}
rList.add(valueFunction.apply(t));
resultMap.put(keyFunction.apply(t), rList);
}
}
return resultMap;
}
/**
* 将列表转换成另一个列表
*
* @param collection
* @param function
* @param <T>
* @param <R>
* @return
*/
public static <T, R> List<R> transformCollectionToArrayList(Collection<T> collection, Function<T, R> function) {
List<R> resultList = new ArrayList<>();
if (collection != null) {
for (T t : collection) {
resultList.add(function.apply(t));
}
}
return resultList;
}
/**
* 将map转换成list
*
* @param map
* @param function
* @param <K>
* @param <V>
* @param <R>
* @return
*/
public static <K, V, R> List<R> transformMapToArrayList(Map<K, V> map, Function<V, R> function) {
List<R> resultList = new ArrayList<>();
if (map != null) {
for (Map.Entry<K, V> entry : map.entrySet()) {
resultList.add(function.apply(entry.getValue()));
}
}
return resultList;
}
}
package com.infoepoch.pms.agent.common.utils;
import com.infoepoch.pms.agent.domain.baisc.organization.Organization;
import com.infoepoch.pms.agent.domain.baisc.user.User;
import org.apache.commons.collections4.CollectionUtils;
import java.util.*;
import java.util.stream.Collectors;
public class OrganizationTool {
/**
* 组织排序
* 排序规则:先根据级别排序,再根据displayOrder排序,最后根据ID排序
*
* @param organizationList
* @return
*/
public static List<Organization> organizationSort(List<Organization> organizationList) {
if (CollectionUtils.isEmpty(organizationList))
return new ArrayList<>();
return organizationList.stream().sorted(Comparator.comparing(Organization::getLevel)
.thenComparing(Organization::getDisplayOrderValue)
.thenComparing(Organization::getOaOrgCodeNotNull))
.collect(Collectors.toList());
}
/**
* 组织列表转换成树形结构
*
* @param organizationList
* @return
*/
public static List<Organization> changeOrganizationListToTree(List<Organization> organizationList) {
if (CollectionUtils.isEmpty(organizationList))
return new ArrayList<>();
// 组织排序
organizationList = organizationSort(organizationList);
Integer topLevel = null;
Map<String, List<Organization>> organizationListMap = new HashMap<>();
for (Organization organization : organizationList) {
List<Organization> children = organizationListMap.get(organization.getpId());
if (children == null) {
children = new ArrayList<>();
}
children.add(organization);
organizationListMap.put(organization.getpId(), children);
if (topLevel == null) {
topLevel = organization.getLevel();
} else {
if (topLevel > organization.getLevel()) {
topLevel = organization.getLevel();
}
}
}
List<Organization> topLevelOrganizationList = new ArrayList<>();
for (Organization organization : organizationList) {
if (Objects.equals(organization.getLevel(), topLevel)) {
topLevelOrganizationList.add(organization);
}
}
// 将组织列表转换为树形结构
fillTreeOrganizationData(topLevelOrganizationList, organizationListMap);
return topLevelOrganizationList;
}
/**
* 将组织列表转换为树形结构
*
* @param organizationList 组织列表
* @param userList 用户列表
* @return
*/
public static List<Organization> changeOrganizationListToTree(List<Organization> organizationList, List<User> userList) {
if (CollectionUtils.isEmpty(organizationList))
return new ArrayList<>();
if (userList == null) {
userList = new ArrayList<>();
}
// 组织排序
organizationList = organizationSort(organizationList);
Map<String, List<User>> userListMap = LambdaTool.changeCollectionToHashListMap(userList, User::getOrganizationId);
Integer topLevel = null;
Map<String, List<Organization>> organizationListMap = new HashMap<>();
for (Organization organization : organizationList) {
List<Organization> children = organizationListMap.get(organization.getpId());
if (children == null) {
children = new ArrayList<>();
}
children.add(organization);
organizationListMap.put(organization.getpId(), children);
organization.setUserList(userListMap.get(organization.getId()));
if (topLevel == null) {
topLevel = organization.getLevel();
} else {
if (topLevel > organization.getLevel()) {
topLevel = organization.getLevel();
}
}
}
List<Organization> topLevelOrganizationList = new ArrayList<>();
for (Organization organization : organizationList) {
if (Objects.equals(organization.getLevel(), topLevel)) {
topLevelOrganizationList.add(organization);
}
}
// 将组织列表转换为树形结构
fillTreeOrganizationData(topLevelOrganizationList, organizationListMap);
return topLevelOrganizationList;
}
/**
* 将组织列表转换为树形结构
*
* @param organizationList
* @param organizationListMap
*/
public static void fillTreeOrganizationData(List<Organization> organizationList, Map<String, List<Organization>> organizationListMap) {
if (CollectionUtils.isEmpty(organizationList))
return;
for (Organization organization : organizationList) {
// 防止无限循环
if(organization.getpId().equals(organization.getId())) {
continue;
}
List<Organization> children = organizationListMap.get(organization.getId());
if (CollectionUtils.isNotEmpty(children)) {
fillTreeOrganizationData(children, organizationListMap);
organization.addChildren(children);
}
}
}
}
package com.infoepoch.pms.agent.common.utils;
public class RedisKeys {
/**
* 组织机构缓存KEY
*/
public final static String ROOT_ORGANIZATION_LIST = "PMSAGENT-ORGANIZATION-ROOT-LIST";
/**
* 组织机构缓存KEY
*/
public final static String ORGANIZATION_LIST = "PMSAGENT-ORGANIZATION-LIST";
/**
* 组织MAP缓存key
*/
public final static String ROOT_ORGANIZATION_MAP = "PMSAGENT-ORGANIZATION-MAP";
}
package com.infoepoch.pms.agent.common.utils.component;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.concurrent.TimeUnit;
@Component
public class RedisTool {
@Autowired
private RedisTemplate redisTemplate;
/**
* 缓存基本对象:Integer、String、实体类等
*
* @param key 缓存KEY
* @param value 缓存内容
* @param <T>
*/
public <T> void put(String key, T value) {
redisTemplate.opsForValue().set(key, value);
}
/**
* 缓存基本对象:Integer、String、实体类等
*
* @param key 缓存KEY
* @param value 缓存内容
* @param timeout 失效时间
* @param timeUnit 失效时间单位
* @param <T>
*/
public <T> void put(String key, T value, long timeout, TimeUnit timeUnit) {
redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
}
/**
* 原子设置缓存,key不存在时才写入
*
* @param key 缓存KEY
* @param value 缓存内容
* @param timeout 失效时间
* @param timeUnit 失效时间单位
* @param <T>
* @return true-写入成功 false-key已存在
*/
public <T> boolean putIfAbsent(String key, T value, long timeout, TimeUnit timeUnit) {
Boolean result = redisTemplate.opsForValue().setIfAbsent(key, value, timeout, timeUnit);
return result != null && result;
}
/**
* 设置缓存有效时间
*
* @param key 缓存KEY
* @param timeout 失效时间(单位:秒)
* @return
*/
public boolean expire(String key, long timeout) {
return expire(key, timeout, TimeUnit.SECONDS);
}
/**
* 设置缓存有效时间
*
* @param key 缓存KEY
* @param timeout 失效时间
* @param timeUnit 失效时间单位
* @return
*/
public boolean expire(String key, long timeout, TimeUnit timeUnit) {
return redisTemplate.expire(key, timeout, timeUnit);
}
/**
* 获取缓存
*
* @param key 缓存KEY
* @param <T>
* @return
*/
public <T> T get(String key) {
ValueOperations<String, T> operations = redisTemplate.opsForValue();
return operations.get(key);
}
/**
* 删除缓存
*
* @param key 缓存KEY
* @return
*/
public boolean remove(String key) {
return redisTemplate.delete(key);
}
/**
* 删除集合对象
*
* @param collection
* @return
*/
public long removeCollection(Collection collection) {
return redisTemplate.delete(collection);
}
/**
* 设置LIST类型缓存数据
*
* @param key 缓存KEY
* @param dataList LIST对象
* @param <T>
* @return
*/
public <T> long putList(String key, List<T> dataList) {
Long count = redisTemplate.opsForList().rightPushAll(key, dataList);
return count == null ? 0 : count;
}
/**
* 获取缓存的LIST对象
*
* @param key 缓存KEY
* @param <T>
* @return
*/
public <T> List<T> getList(String key) {
return redisTemplate.opsForList().range(key, 0, -1);
}
/**
* 缓存SET
*
* @param key 缓存KEY
* @param set SET对象
* @param <T>
* @return
*/
public <T> BoundSetOperations<String, T> putSet(String key, Set<T> set) {
BoundSetOperations<String, T> setOperations = redisTemplate.boundSetOps(key);
Iterator<T> it = set.iterator();
while (it.hasNext()) {
setOperations.add(it.next());
}
return setOperations;
}
/**
* 获取缓存SET
*
* @param key 缓存KEY
* @param <T>
* @return
*/
public <T> Set<T> getSet(String key) {
return redisTemplate.opsForSet().members(key);
}
/**
* 缓存值到MAP中
*
* @param key
* @param mapKey
* @param value
* @param <T>
*/
public <T> void putMap(String key, String mapKey, T value) {
if (value != null)
redisTemplate.opsForHash().put(key, mapKey, value);
}
/**
* 缓存MAP
*
* @param key 缓存KEY
* @param map MAP对象
* @param <T>
*/
public <T> void putMap(String key, Map<String, T> map) {
if (map != null)
redisTemplate.opsForHash().putAll(key, map);
}
/**
* 获取MAP中的值
*
* @param key 缓存KEY
* @param mapKey MAP的key
* @param <T>
* @return
*/
public <T> T getMapValue(String key, String mapKey) {
HashOperations<String, String, T> operations = redisTemplate.opsForHash();
return operations.get(key, mapKey);
}
/**
* 获取多个MAP中的值
*
* @param key 缓存KEY
* @param mapKeys MAP的key集合
* @param <T>
* @return
*/
public <T> List<T> getMultiMapValue(String key, Collection<Object> mapKeys) {
return redisTemplate.opsForHash().multiGet(key, mapKeys);
}
/**
*
* @param key
* @param mapKey
* @return
*/
public boolean removeMapValue(String key, String mapKey) {
return redisTemplate.opsForHash().delete(key, mapKey) > 0;
}
/**
* 获取缓存的KEY列表
*
* @param pattern 正则表达式
* @return
*/
public Collection<String> keys(String pattern) {
return redisTemplate.keys(pattern);
}
public boolean hasKey(String key){return redisTemplate.hasKey(key);}
}
package com.infoepoch.pms.agent.common.utils.enums;
import org.apache.commons.lang3.StringUtils;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import javax.sql.rowset.serial.SerialClob;
import javax.sql.rowset.serial.SerialException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;
/**
* 数据库工具类
*/
public class DatabaseUtils {
public static String getBigField(ResultSet rs, String columnName) {
try {
String text = ClobToString(rs.getObject(columnName));
if (StringUtils.isBlank(text))
return "";
return text;
} catch (Exception e) {
return "";
}
}
/**
* 取Oracle nclob字段
*/
public static String getBigField(SqlRowSet sqlRowSet, String columnName) {
try {
String text = ClobToString(sqlRowSet.getObject(columnName));
if (StringUtils.isBlank(text))
return "";
return text;
} catch (Exception e) {
return "";
}
}
/**
* 将字Clob转成String类型
*/
private static String ClobToString(Object obj) {
Reader is = null;
BufferedReader br = null;
try {
SerialClob sc = (SerialClob) obj;
String reString = "";
// 得到流
is = sc.getCharacterStream();
br = new BufferedReader(is);
String s = br.readLine();
StringBuffer sb = new StringBuffer();
while (s != null) {
// 执行循环将字符串全部取出付值给StringBuffer由StringBuffer转成STRING
sb.append(s);
s = br.readLine();
}
reString = sb.toString();
return reString;
} catch (SerialException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return "";
}
/**
* 取Mysql TIMESTAMP字段,有异常抛出
*/
public static Date getTimestampReq(SqlRowSet sqlRowSet, String columnName) throws SQLException {
Object obj = sqlRowSet.getObject(columnName);
if (!(obj instanceof Timestamp))
throw new SQLException("无法解析TIMESTAMP字段:" + columnName);
Timestamp ts = (Timestamp) obj;
Date date = ts;
return date;
}
/**
* 取Mysql TIMESTAMP字段,有异常返回null
*/
public static Date getTimestamp(SqlRowSet sqlRowSet, String columnName) {
Object obj = sqlRowSet.getObject(columnName);
if (!(obj instanceof Timestamp))
return null;
Timestamp ts = (Timestamp) obj;
try {
return new Date(ts.getTime());
} catch (Exception e) {
return null;
}
}
/**
* java.util.Date转为java.sql.Date
*/
public static java.sql.Date toSqlDate(Date date) {
if (date == null)
return null;
return new java.sql.Date(date.getTime());
}
/**
* Mysql.sql.TIMESTAMP转为java.sql.Timestamp
*/
public static Timestamp toSqlTimestamp(Object obj) {
if (!(obj instanceof Timestamp))
return null;
try {
return (Timestamp) obj;
} catch (Exception e) {
throw new RuntimeException("转换java.sql.Timestamp时发生异常。");
}
}
/**
* java.util时间类型转换为java.sql.Timestamp
*/
public static <T extends Date> Timestamp toSqlTimestamp(T date) {
if (null == date) {
return null;
}
return new Timestamp(date.getTime());
}
}
package com.infoepoch.pms.agent.common.utils.enums;
/**
* 枚举接口
*/
public interface EnumBase {
/**
* 枚举值
*/
int getValue();
/**
* 枚举文本
*/
String getText();
}
package com.infoepoch.pms.agent.common.utils.enums;
public interface EnumStringBase {
/**
* 枚举值
*/
String getValue();
/**
* 枚举文本
*/
String getText();
}
package com.infoepoch.pms.agent.common.utils.enums;
import java.util.Collections;
import java.util.List;
/**
* 枚举树结构
*
* @author liudx
*/
public class EnumTree {
private Integer value;
private String text;
private List<EnumTree> children;
public EnumTree() {
// 无参构造
}
public EnumTree(Integer value, String text) {
this.value = value;
this.text = text;
}
public EnumTree addChildren(List<EnumTree> children){
this.children = children;
return this;
}
public Integer getValue() {
return value;
}
public String getText() {
return text;
}
public List<EnumTree> getChildren() {
return null == children ? Collections.emptyList() : children;
}
}
package com.infoepoch.pms.agent.common.utils.enums;
import com.infoepoch.pms.agent.platform.shared.exception.ValidationException;
import java.util.*;
/**
* 枚举工具类
*/
public class EnumUtils {
/**
* 取枚举的值/文本对
* 示例:
* {
* "0" : "text0",
* "1" : "text1",
* "2" : "text2"
* }
* 前端vue绑定方式:
* <div v-for="(item, index) in Object.keys(enumData)">{{item}} : {{enumData[item]}}</div>
*/
public static <T extends EnumBase> Map<Integer, String> getMap(Class<T> enumType) {
Map<Integer, String> map = new HashMap<>();
for (T t : enumType.getEnumConstants()) {
map.put(t.getValue(), t.getText());
}
return map;
}
public static <T extends EnumBase> List<Map<String, Object>> getList(Class<T> enumType) {
List<Map<String, Object>> mapList = new ArrayList<>();
for (T t : enumType.getEnumConstants()) {
HashMap<String, Object> map = new HashMap<>(4);
map.put("value", t.getValue());
map.put("text", t.getText());
mapList.add(map);
}
return mapList;
}
public static <T extends EnumBase> List<Integer> getValueList(Class<T> enumType) {
List<Integer> values = new ArrayList<>();
for (T t : enumType.getEnumConstants()) {
values.add(t.getValue());
}
return values;
}
public static <T extends EnumBase> String getTextByValues(Class<T> enumType, List<String> values) {
StringBuilder sb = new StringBuilder();
for (T t : enumType.getEnumConstants()) {
if (values.stream().anyMatch(s -> s.equals(String.valueOf(t.getValue())))) {
sb.append(t.getText());
sb.append(",");
}
}
return sb.toString();
}
public static <T extends EnumBase> List<EnumTree> getEnumTreeList(Class<T> enumType) {
List<EnumTree> map = new ArrayList<EnumTree>();
for (T t : enumType.getEnumConstants()) {
map.add(new EnumTree(t.getValue(), t.getText()));
}
return map;
}
/**
* 取枚举项值/文本集合
* 示例:
* [
* { "value" : "0", "text" : "text0" },
* { "value" : "1", "text" : "text1" },
* { "value" : "2", "text" : "text2" }
* ]
* 前端vue绑定方式:
* <div v-for="(item, index) in Object.keys(enumData)">{{item.value}} : {{item.text}}</div>
*/
public static <T extends EnumBase> List<Map<String, Object>> getItems(Class<T> enumType) {
List<Map<String, Object>> list = new ArrayList();
for (T t : enumType.getEnumConstants()) {
Map<String, Object> map = new HashMap<>();
map.put("value", t.getValue());
map.put("text", t.getText());
list.add(map);
}
return list;
}
public static <T extends EnumStringBase> Map<String, String> getEnumMap(Class<T> enumType) {
Map<String, String> resultMap = new HashMap<>();
for (T t : enumType.getEnumConstants()) {
resultMap.put(t.getValue(), t.getText());
}
return resultMap;
}
/**
* 解析枚举值,值非法时返回null
*/
public static <T extends EnumBase> T getByValue(Class<T> enumType, int value) {
for (T t : enumType.getEnumConstants()) {
if (t.getValue() == value)
return t;
}
return null;
}
/**
* 解析枚举值,值非法时抛出异常
*/
public static <T extends EnumBase> T getByValueReq(Class<T> enumType, int value)
throws ValidationException {
for (T t : enumType.getEnumConstants()) {
if (t.getValue() == value)
return t;
}
throw new ValidationException("枚举“" + enumType + "”中没有找到值为“" + value + "”的项。");
}
/**
* 解析枚举值,值非法时返回默认值
*/
public static <T extends EnumBase> T getByValue(Class<T> enumType, int value, T defaultValue) {
for (T t : enumType.getEnumConstants()) {
if (t.getValue() == value)
return t;
}
return defaultValue;
}
/**
* 解析枚举值,值非法时返回null
*/
public static <T extends EnumBase> T getByValue(Class<T> enumType, String value) {
for (T t : enumType.getEnumConstants()) {
if (String.valueOf(t.getValue()).equals(value))
return t;
}
return null;
}
/**
* 解析枚举值,值非法时返回null
*/
public static <T extends EnumStringBase> T getByKey(Class<T> enumType, String key) {
for (T t : enumType.getEnumConstants()) {
if (String.valueOf(t.getValue()).equals(key))
return t;
}
return null;
}
/**
* 解析枚举值,值非法时抛出异常
*/
public static <T extends EnumBase> T getByValueReq(Class<T> enumType, String value)
throws ValidationException {
for (T t : enumType.getEnumConstants()) {
if (String.valueOf(t.getValue()).equals(value))
return t;
}
throw new ValidationException("枚举“" + enumType + "”中没有找到值为“" + value + "”的项。");
}
/**
* 解析枚举值,值非法时返回默认值
*/
public static <T extends EnumBase> T getByValue(Class<T> enumType, String value, T defaultValue) {
for (T t : enumType.getEnumConstants()) {
if (String.valueOf(t.getValue()).equals(value))
return t;
}
return defaultValue;
}
/**
* 解析枚举值,值非法时返回null
*/
public static <T extends EnumStringBase> T getByStringValue(Class<T> enumType, String value) {
for (T t : enumType.getEnumConstants()) {
if (String.valueOf(t.getValue()).equals(value))
return t;
}
return null;
}
/**
* 解析枚举值,值非法时抛出异常
*/
public static <T extends EnumStringBase> T getByStringValueReq(Class<T> enumType, String value)
throws ValidationException {
for (T t : enumType.getEnumConstants()) {
if (String.valueOf(t.getValue()).equals(value))
return t;
}
throw new ValidationException("枚举“" + enumType + "”中没有找到值为“" + value + "”的项。");
}
/**
* 解析枚举值,值非法时返回默认值
*/
public static <T extends EnumStringBase> T getByStringValue(Class<T> enumType, String value, T defaultValue) {
for (T t : enumType.getEnumConstants()) {
if (String.valueOf(t.getValue()).equals(value))
return t;
}
return defaultValue;
}
/**
* 根据文本解析枚举值,值非法时返回null
*/
public static <T extends EnumBase> T getByText(Class<T> enumType, String text) {
for (T t : enumType.getEnumConstants()) {
if (t.getText().equals(text))
return t;
}
return null;
}
public static <T extends EnumBase> List<Integer> getByTexts(Class<T> enumType, List<String> texts) {
List<Integer> values = new ArrayList<>();
for (T t : enumType.getEnumConstants()) {
texts.forEach(s -> {
if (t.getText().equals(s)) {
values.add(t.getValue());
}
});
}
return values;
}
public static <T extends EnumBase> List<String> getTextList(Class<T> enumType) {
List<String> texts = new ArrayList<>();
for (T t : enumType.getEnumConstants()) {
texts.add(t.getText());
}
return texts;
}
/**
* 根据value返回 text值,如不存在返回默认值
*
* @param value value值
* @param defaultText 默认text
*/
public static <T extends EnumBase> String getTextByValue(Class<T> enumType, Integer value, String defaultText) {
if (Objects.isNull(value)) {
return defaultText;
}
for (T t : enumType.getEnumConstants()) {
if (t.getValue() == value) {
return t.getText();
}
}
return defaultText;
}
}
package com.infoepoch.pms.agent.domain.baisc.organization;
import java.util.List;
import java.util.Map;
/**
* @Description 组织机构仓储
* @Author lxd
**/
public interface IOrganizationRepository {
/**
* @param criteria
* @param pageIndex
* @param pageSize
* @return
*/
List<Organization> selectByCriteriaPage(OrganizationCriteria criteria, int pageIndex, int pageSize);
/**
* @param criteria
* @param pageIndex
* @param pageSize
* @return
*/
List<Organization> selectByCriteriaPage(OrganizationCriteria criteria, int pageIndex, int pageSize, String orderBy, boolean isDesc);
/**
* @param criteria
* @return
*/
int selectCountByCriteria(OrganizationCriteria criteria);
/**
* @param criteria
* @return
*/
List<Organization> selectByCriteria(OrganizationCriteria criteria);
/**
* @Description: 根据父id查询
* @Param: [parentId]
* @Author: zhangyd
*/
List<Organization> selectByParentId(String parentId);
/**
* 根据父id列表查询
*
* @param parentIdList
* @return
*/
List<Organization> selectByParentIdList(List<String> parentIdList);
/**
* @Description: 获取所有组织Map
* @Param: []
* @Author: zhangyd
*/
Map<String, Organization> selectMapAll();
/**
* @return
*/
List<Organization> selectAll();
/**
* @param id
* @return
*/
Organization selectById(String id);
/**
* @param ids
* @return
*/
List<Organization> selectByIds(List<String> ids);
/**
* @param name
* @return
*/
Organization selectByName(String name);
/**
* @param shortName
* @return
*/
Organization selectByShortName(String shortName);
/**
* @param organization
*/
void insert(Organization organization);
/**
* 批量插入组织机构信息
*
* @param organizationList
*/
void batchInsert(List<Organization> organizationList);
/**
* @param organization
*/
void update(Organization organization);
/**
* 批量更新组织机构信息
*
* @param organizationList
*/
void batchUpdate(List<Organization> organizationList);
/**
* 批量更新层级
*
* @param organizationList
*/
void batchUpdateLevel(List<Organization> organizationList);
/**
* 根据ID删除
*
* @param id
*/
void deleteById(String id);
/**
* 根据oaOrgCode查询组织
*
* @param oaOrgCode
* @return
*/
Organization selectByOaOrgCode(String oaOrgCode);
}
package com.infoepoch.pms.agent.domain.baisc.organization;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.infoepoch.pms.agent.common.utils.SnowFlake;
import com.infoepoch.pms.agent.domain.baisc.user.User;
import org.apache.commons.lang3.StringUtils;
import javax.validation.ValidationException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 组织
*/
public class Organization {
// region
public void setName(String name) {
this.name = name;
}
public void setPId(String pId) {
this.pId = pId;
}
public void setParentOrgCode(String parentOrgCode) {
this.parentOrgCode = parentOrgCode;
}
public void setLevel(Integer level) {
this.level = level;
}
public void setFrontDisabled(Boolean frontDisabled) {
this.frontDisabled = frontDisabled;
}
// endregion
// region
public Organization() {
}
/**
* 新增室经理组织
*/
public Organization(String id, String name, String shortName, String oaOrgCode, String displayOrder, String pId, String parentOrgCode,
Integer level) {
this.id = id;
this.name = name;
this.shortName = shortName;
this.oaOrgCode = oaOrgCode;
this.displayOrder = displayOrder;
this.pId = pId;
this.parentOrgCode = parentOrgCode;
this.level = level;
this.disabled = false;
}
/**
*
*/
public Organization(String id, String name, String shortName, boolean disabled, String description, String oaOrgCode,
String hrOrgCode, String pId, String displayOrder, String parentOrgCode, Integer level) {
this.id = id;
this.name = name;
this.shortName = shortName;
this.disabled = disabled;
this.description = description;
this.oaOrgCode = oaOrgCode;
this.hrOrgCode = hrOrgCode;
this.pId = pId;
this.displayOrder = displayOrder;
this.parentOrgCode = parentOrgCode;
this.level = level;
}
/**
* 构造函数,新建
*/
public Organization(String name, String shortName, boolean disabled, String description
, String oaOrgCode, String hrOrgCode, String pId, String displayOrder, String parentOrgCode, Integer level) {
name = StringUtils.trim(name);
if (StringUtils.isEmpty(name))
throw new ValidationException("名称不能为空。");
this.id = SnowFlake.instant().nextId().toString();
this.name = name;
this.shortName = shortName;
this.disabled = disabled;
this.description = description;
this.oaOrgCode = oaOrgCode;
this.hrOrgCode = hrOrgCode;
this.pId = pId;
this.displayOrder = displayOrder;
this.parentOrgCode = parentOrgCode;
this.level = level;
}
/**
* OA同步修改
*
* @param name
* @param shortName
* @param oaOrgCode
* @param hrOrgCode
* @param displayOrder
*/
public void modify(String name, String shortName, String oaOrgCode, String hrOrgCode, String displayOrder, boolean disabled) {
this.name = name;
this.shortName = shortName;
this.oaOrgCode = oaOrgCode;
this.hrOrgCode = hrOrgCode;
this.displayOrder = displayOrder;
this.disabled = disabled;
}
/**
* 修改
*/
public void modify(String name, String shortName, boolean disabled, String description
, String oaOrgCode, String hrOrgCode, String displayOrder, String parentOrgCode, Integer level) {
name = StringUtils.trim(name);
if (StringUtils.isEmpty(name))
throw new ValidationException("名称不能为空。");
this.name = name;
this.shortName = shortName;
this.disabled = disabled;
this.description = description;
this.oaOrgCode = oaOrgCode;
this.hrOrgCode = hrOrgCode;
this.displayOrder = displayOrder;
this.parentOrgCode = parentOrgCode;
this.level = level;
}
// endregion
//region 属性
private String id; //id (组织机构code)
private String name; //全称
private String shortName; //简称 (❌)
private boolean disabled; //是否禁用
private String description; //描述 (❌)
private String oaOrgCode; //OA组织编码 (组织机构编码)
private String hrOrgCode; //HR组织编码 (❌)
private String displayOrder; //显示顺序
private String pId; //父组织机构id
private String parentOrgCode; // 父组织机构编码
private Integer level;
private Boolean frontDisabled;//前端组件禁用选择
public String getId() {
return id;
}
public String getName() {
return name;
}
public String getShortName() {
return shortName;
}
public boolean isDisabled() {
return disabled;
}
public String getDescription() {
return description;
}
public String getOaOrgCode() {
return oaOrgCode;
}
public String getOaOrgCodeNotNull() {
return oaOrgCode == null ? "999999" : oaOrgCode;
}
public String getHrOrgCode() {
return hrOrgCode;
}
public String getDisplayOrder() {
return displayOrder;
}
public String getpId() {
return pId;
}
public String getParentOrgCode() {
return parentOrgCode;
}
/**
* 获取排序值
*/
public Integer getDisplayOrderValue() {
if (displayOrder == null)
return 999999;
return Integer.parseInt(displayOrder);
}
public Integer getLevel() {
return level == null ? 1 : level;
}
public Boolean getFrontDisabled() {
return frontDisabled;
}
//endregion
//region 下级组织
//下级组织
private List<Organization> children = new ArrayList<>();
/**
* 下级组织
*/
public List<Organization> getChildren() {
return children.stream().sorted(Comparator.comparing(Organization::getDisplayOrderValue)).collect(Collectors.toList());
}
/**
* 是否有下级组织,此属性需参与Json序列化
*/
@JsonProperty
public boolean hasChildren() {
return children.size() > 0;
}
/**
* 取所有下级组织id
*
* @param includeSelf 是否包含自身
* @return
*/
public List<String> getAllChildrenId(boolean includeSelf) {
List<String> list = new ArrayList<>();
if (includeSelf)
list.add(id);
if (children != null && children.size() > 0) {
for (Organization child : children) {
list.addAll(child.getAllChildrenId(true));
}
}
return list;
}
//endregion
/**
* 添加子组织集合
*/
public void addChildren(List<Organization> organizations) {
children.addAll(organizations);
}
public void setChildren(List<Organization> value) {
children = value;
}
@JsonIgnore
private List<User> userList;
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Organization organization = (Organization) o;
return disabled == organization.disabled &&
Objects.equals(id, organization.id) &&
Objects.equals(name, organization.name) &&
Objects.equals(shortName, organization.shortName) &&
Objects.equals(description, organization.description) &&
Objects.equals(oaOrgCode, organization.oaOrgCode) &&
Objects.equals(hrOrgCode, organization.hrOrgCode) &&
Objects.equals(pId, organization.pId) &&
Objects.equals(displayOrder, organization.displayOrder);
}
@Override
public int hashCode() {
return Objects.hash(id, name, shortName, disabled, description, oaOrgCode, hrOrgCode, pId, displayOrder);
}
}
package com.infoepoch.pms.agent.domain.baisc.organization;
import com.infoepoch.pms.agent.common.utils.AbstractCriteria;
import java.util.List;
public class OrganizationCriteria extends AbstractCriteria {
/**
* 组织ID列表
*/
private List<String> orgIdList;
public List<String> getOrgIdList() {
return orgIdList;
}
public void setOrgIdList(List<String> orgIdList) {
this.orgIdList = orgIdList;
}
// region 组织简称
public boolean byShortName() {
return this.andMap.containsKey("ShortName");
}
private String shortName;
public String getShortName() {
if (byShortName())
return shortName;
return null;
}
public void setShortName(String shortName) {
this.shortName = shortName;
this.andMap.put("ShortName", shortName);
}
// endregion 组织简称
// region 组织简称模糊查询
public boolean byShortNameContain() {
return this.andMap.containsKey("ShortNameContain");
}
private String shortNameContain;
public String getShortNameContain() {
if (byShortNameContain())
return shortNameContain;
return null;
}
public void setShortNameContain(String shortNameContain) {
this.shortNameContain = shortNameContain;
this.andMap.put("ShortNameContain", shortNameContain);
}
// endregion 组织简称模糊查询
// region 组织名称
private String nameContain;
public String getNameContain() {
return nameContain;
}
public void setNameContain(String nameContain) {
this.nameContain = nameContain;
}
// endregion 组织名称
// region 只查询到第三层组织
private Boolean searchThreeFlag;
public Boolean getSearchThreeFlag() {
return searchThreeFlag != null && searchThreeFlag;
}
public void setSearchThreeFlag(Boolean searchThreeFlag) {
this.searchThreeFlag = searchThreeFlag;
}
// endregion 只查询到第三层组织
// region 是否禁用
private Boolean disabledFlag;
public Boolean getDisabledFlag() {
return disabledFlag;
}
public void setDisabledFlag(Boolean disabledFlag) {
this.disabledFlag = disabledFlag;
}
// endregion 是否禁用
// region 树形父节点,查询之下所有
private String treeParentId;
public String getTreeParentId() {
return treeParentId;
}
public void setTreeParentId(String treeParentId) {
this.treeParentId = treeParentId;
}
private List<String> treeParentIds;
public List<String> getTreeParentIds() {
return treeParentIds;
}
public void setTreeParentIds(List<String> treeParentIds) {
this.treeParentIds = treeParentIds;
}
// endregion 树形父节点,查询之下所有
// region oa组织编码列表
private List<String> oaOrgCodeList;
public List<String> getOaOrgCodeList() {
return oaOrgCodeList;
}
public void setOaOrgCodeList(List<String> oaOrgCodeList) {
this.oaOrgCodeList = oaOrgCodeList;
}
// endregion oa组织编码列表
// region 组织级别
private Integer level;
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
// endregion 组织级别
// region 组织级别列表
private List<Integer> levelList;
public List<Integer> getLevelList() {
return levelList;
}
public void setLevelList(List<Integer> levelList) {
this.levelList = levelList;
}
// endregion 组织级别列表
// region 父组织ID列表
private List<String> parentIdList;
public List<String> getParentIdList() {
return parentIdList;
}
public void setParentIdList(List<String> parentIdList) {
this.parentIdList = parentIdList;
}
private String parentId;
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
// endregion 父组织ID列表
// region 组织名称列表
private List<String> nameList;
public List<String> getNameList() {
return nameList;
}
public void setNameList(List<String> nameList) {
this.nameList = nameList;
this.andMap.put("NameList", nameList);
}
// endregion 组织名称列表
// region 分公司ID
private String companyId;
public String getCompanyId() {
return companyId;
}
public void setCompanyId(String companyId) {
this.companyId = companyId;
this.andMap.put("CompanyId", companyId);
}
// endregion 分公司ID
}
package com.infoepoch.pms.agent.domain.baisc.user;
import java.util.List;
/**
* @author jiangyz
* @date 2026/4/10 10:06
* 合作单位用户仓储接口
*/
public interface ISupplierEmployeeRepository {
/**
* 新增
* @param: [entity]
*/
boolean insert(SupplierEmployee entity);
/**
* 更新
* @param: [entity]
*/
boolean update(SupplierEmployee entity);
/**
* 批量新增
* @param: [entitys]
*/
int[] batchInsert(List<SupplierEmployee> entitys);
/**
* 批量更新
* @param: [entitys]
*/
int[] batchUpdate(List<SupplierEmployee> entitys);
/**
* 删除
* @param: [id]
*/
boolean delete(String id);
// region select
/**
* 根据Id查询
* @param: [id]
*/
SupplierEmployee selectById(String id);
/**
* 根据查询条件查询单个对象
* @param: [criteria]
*/
SupplierEmployee selectOneByCriteria(SupplierEmployeeCriteria criteria);
/**
* 根据查询条件查询对象集合
* @param: [criteria]
*/
List<SupplierEmployee> selectByCriteria(SupplierEmployeeCriteria criteria);
/**
* 根据查询条件分页查询对象结合
* @param: [criteria, pageNum, pageSize]
*/
List<SupplierEmployee> selectCriteriaByPage(SupplierEmployeeCriteria criteria, int pageNum, int pageSize);
/**
* 根据条件查询对象总记录数
* @param: [criteria]
*/
Integer selectCountByCriteria(SupplierEmployeeCriteria criteria);
// endregion
}
package com.infoepoch.pms.agent.domain.baisc.user;
import java.util.List;
public interface IUserQueryRepository {
/**
* 根据条件查询用户列表
*
* @param criteria
* @return
*/
List<User> selectByCriteria(UserCriteria criteria);
List<User> selectByCriteriaProp(UserCriteria criteria);
/**
* 根据条件查询用户列表(分页)
*
* @param criteria
* @param pageIndex
* @param pageSize
* @return
*/
List<User> selectByCriteriaByPage(UserCriteria criteria, int pageIndex, int pageSize);
List<User> selectByCriteriaByPageProp(UserCriteria criteria, int pageIndex, int pageSize);
List<User> selectByCriteriaByPageNotRela(UserCriteria criteria, int pageIndex, int pageSize);
List<User> selectByCriteriaNotRela(UserCriteria criteria);
Integer selectCountByCriteriaByPageNotRela(UserCriteria criteria);
/**
* 根据条件查询用户列表总数量
*
* @param criteria
* @return
*/
int selectCountByCriteria(UserCriteria criteria);
int selectCountByCriteriaProp(UserCriteria criteria);
}
package com.infoepoch.pms.agent.domain.baisc.user;
import java.util.List;
/**
* 用户Repository接口
*/
public interface IUserRepository {
/**
* 根据ID查询用户
*
* @param id
* @return
*/
User selectById(String id);
/*
* 根据id集合查询
*/
List<User> selectByIds(List<String> ids);
/**
* 根据工号查询用户
*
* @param number
* @return
*/
User selectByNumber(String number);
/**
* 根据用户名称查询用户信息
*
* @param username
* @return
*/
User selectByUsername(String username);
User selectByFullName(String fullName) ;
/**
* 查询密码
*
* @param id
* @return
*/
String selectPassword(String id);
/**
* 查询所有用户
*
* @return
*/
List<User> selectAll();
/**
* @param jobNumber
* @return
*/
User selectOneByJobNumber(String jobNumber);
/**
* 根据工号查询用户列表
*
* @param jobNumber
* @return
*/
List<User> selectByJobNumber(String jobNumber);
/**
* 根据工号查询用户
*
* @param jobNumber
* @param disabledFlag
* @return
*/
User selectUserByJobNumber(String jobNumber, Boolean disabledFlag);
/**
* 根据条件查询用户列表
*
* @param criteria
* @return
*/
List<User> selectByCriteria(UserCriteria criteria);
/**
* 根据条件分页查询
*
* @param criteria
* @param pageIndex
* @param pageSize
* @return
*/
List<User> selectByCriteriaPage(UserCriteria criteria, int pageIndex, int pageSize);
/**
* 根据条件查询用户列表总数量
*
* @param criteria
* @return
*/
int selectByCriteriaCount(UserCriteria criteria);
/**
* 插入
*
* @param user
*/
void insert(User user);
/**
* @param userList
*/
void batchInsert(List<User> userList);
/**
* 更新
*
* @param user
*/
void update(User user);
/**
* @param userList
*/
void batchUpdate(List<User> userList);
/**
* 修改密码
*/
void updatePassword(String id, String password);
/**
* 设置默认密码
*/
void setDefaultPassword(String password);
/**
* 根据ID删除用户
*
* @param id
*/
void deleteById(String id);
/**
* 删除所有用户
*/
void truncate();
/**
* 根据组织ID列表查询用户
*
* @param organizationIdList
* @return
*/
List<User> selectByOrganizationIdList(List<String> organizationIdList);
/**
* 根据组织ID和角色名称查询用户列表
*
* @param organizationIdList
* @param roleId
* @return
*/
List<User> selectByOrganizationIdAndRole(List<String> organizationIdList, String roleId);
/**
* 根据组织ID列表表和职位列表查询用户列表
*
* @param organizationIdList
* @param positionList
* @return
*/
List<User> selectByOrganizationIdAndPosition(List<String> organizationIdList, List<String> positionList);
}
package com.infoepoch.pms.agent.domain.baisc.user;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
/**
* @author jiangyz
* @date 2026/4/10 10:05
* 合作单位用户
*/
@Getter
@Setter
public class SupplierEmployee {
/**
* 主键Id
*/
private String id;
/**
* 姓名
*/
private String name;
/**
* 单位名称
*/
private String supplier;
/**
* 手机号
*/
private String phone;
/**
* 登录用户名
*/
private String userName;
/**
* 登录密码
*/
private String passWord;
/**
* 记录时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date recordTime;
/**
* 是否禁用
*/
private Boolean disabled;
/**
* 私有无参构造
*/
private SupplierEmployee() {
}
/**
* 仓储还原
*/
public SupplierEmployee(String id, String name, String supplier, String phone, String userName, String passWord, Date recordTime, Boolean disabled) {
this.id = id;
this.name = name;
this.supplier = supplier;
this.phone = phone;
this.userName = userName;
this.passWord = passWord;
this.recordTime = recordTime;
this.disabled = disabled;
}
}
\ No newline at end of file
package com.infoepoch.pms.agent.domain.baisc.user;
import com.infoepoch.pms.agent.common.utils.AbstractCriteria;
/**
* @author jiangyz
* @date 2026/4/10 10:05
* 合作单位用户查询条件类
*/
public class SupplierEmployeeCriteria extends AbstractCriteria {
//region 姓名
public boolean byName() {
return this.andMap.containsKey("Name");
}
private String name;
public String getName() {
if (byName())
return name;
return null;
}
public void setName(String value) {
this.name = value;
this.andMap.put("Name", value);
}
//endregion
//region 姓名模糊查询
public boolean byNameContain() {
return this.andMap.containsKey("NameContain");
}
private String nameContain;
public String getNameContain() {
if (byNameContain())
return nameContain;
return null;
}
public void setNameContain(String value) {
this.nameContain = value;
this.andMap.put("NameContain", value);
}
//endregion
//region 单位名称
public boolean bySupplier() {
return this.andMap.containsKey("Supplier");
}
private String supplier;
public String getSupplier() {
if (bySupplier())
return supplier;
return null;
}
public void setSupplier(String value) {
this.supplier = value;
this.andMap.put("Supplier", value);
}
//endregion
//region 单位名称模糊查询
public boolean bySupplierContain() {
return this.andMap.containsKey("SupplierContain");
}
private String supplierContain;
public String getSupplierContain() {
if (bySupplierContain())
return supplierContain;
return null;
}
public void setSupplierContain(String value) {
this.supplierContain = value;
this.andMap.put("SupplierContain", value);
}
//endregion
//region 手机号
public boolean byPhone() {
return this.andMap.containsKey("Phone");
}
private String phone;
public String getPhone() {
if (byPhone())
return phone;
return null;
}
public void setPhone(String value) {
this.phone = value;
this.andMap.put("Phone", value);
}
//endregion
//region 手机号模糊查询
public boolean byPhoneContain() {
return this.andMap.containsKey("PhoneContain");
}
private String phoneContain;
public String getPhoneContain() {
if (byPhoneContain())
return phoneContain;
return null;
}
public void setPhoneContain(String value) {
this.phoneContain = value;
this.andMap.put("PhoneContain", value);
}
//endregion
//region 登录用户名
public boolean byUserName() {
return this.andMap.containsKey("UserName");
}
private String userName;
public String getUserName() {
if (byUserName())
return userName;
return null;
}
public void setUserName(String value) {
this.userName = value;
this.andMap.put("UserName", value);
}
//endregion
//region 登录用户名模糊查询
public boolean byUserNameContain() {
return this.andMap.containsKey("UserNameContain");
}
private String userNameContain;
public String getUserNameContain() {
if (byUserNameContain())
return userNameContain;
return null;
}
public void setUserNameContain(String value) {
this.userNameContain = value;
this.andMap.put("UserNameContain", value);
}
//endregion
}
\ No newline at end of file
package com.infoepoch.pms.agent.domain.baisc.user;
import com.infoepoch.pms.agent.common.utils.SnowFlake;
import com.infoepoch.pms.agent.platform.shared.exception.ValidationException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author jiangyz
* @date 2026/4/10 10:09
* 合作单位用户Service
*/
@Service
public class SupplierEmployeeService {
@Autowired
private ISupplierEmployeeRepository supplierEmployeeRepository;
/**
* 根据登录用户名查询合作单位用户
*
* @param username 登录用户名
* @return 合作单位用户,不存在返回null
*/
public SupplierEmployee getByUsername(String username) {
String userName = StringUtils.trimToEmpty(username);
if (StringUtils.isBlank(userName)) {
throw new ValidationException("登录账号不可为空");
}
SupplierEmployeeCriteria criteria = new SupplierEmployeeCriteria();
criteria.setUserName(userName);
return supplierEmployeeRepository.selectOneByCriteria(criteria);
}
/**
* 分页查询合作单位用户列表
*
* @param criteria 查询条件
* @return 包含 totalCount 和 entityList 的结果集
*/
public Map<String, Object> queryList(SupplierEmployeeCriteria criteria) {
criteria.removeMapNullOrEmpty();
if (criteria.byPage()){
List<SupplierEmployee> entityList = supplierEmployeeRepository.selectCriteriaByPage(
criteria, criteria.getPageIndex(), criteria.getPageSize());
int totalCount = supplierEmployeeRepository.selectCountByCriteria(criteria);
Map<String, Object> map = new HashMap<>();
map.put("totalCount", totalCount);
map.put("entityList", entityList);
return map;
}
return null;
}
/**
* 根据ID查询合作单位用户
*
* @param id 唯一标识
* @return 合作单位用户
*/
public SupplierEmployee getById(String id) {
if (StringUtils.isBlank(id)) {
throw new ValidationException("唯一标识不能为空");
}
return supplierEmployeeRepository.selectById(id);
}
}
package com.infoepoch.pms.agent.domain.baisc.user;
/**
* 当前登录用户来源类型
*/
public enum UserLoginType {
CMCC,
SUPPLIER;
/**
* 解析登录用户类型,无法识别时默认内部用户。
*
* @param value 枚举文本
* @return 登录用户类型
*/
public static UserLoginType parse(String value) {
for (UserLoginType type : values()) {
if (type.name().equalsIgnoreCase(value)) {
return type;
}
}
return CMCC;
}
}
package com.infoepoch.pms.agent.domain.baisc.user;
import com.infoepoch.pms.agent.common.utils.enums.EnumStringBase;
public enum UserOaPosition implements EnumStringBase {
JS0003("JS0003", "总经理"),
JS0005("JS0005", "副总经理"),
JS0053("JS0053", "部门经理"),
JS0052("JS0052", "部门副经理"),
JS0055("JS0055", "中心经理"),
JS0056("JS0056", "中心副经理"),
JS0054("JS0054", "职员");
UserOaPosition(String value, String text) {
this.value = value;
this.text = text;
}
private String value;
private String text;
@Override
public String getValue() {
return value;
}
@Override
public String getText() {
return text;
}
}
package com.infoepoch.pms.agent.domain.baisc.user;
import com.infoepoch.pms.agent.common.utils.enums.EnumBase;
/**
* 用户职位枚举
* @author jiangyz
* @date 2025/3/17 15:45
*/
public enum UserPosition implements EnumBase {
GENERAL(1, "总经理", "公司领导"),
VICEGENERAL(2, "副总经理", "公司领导"),
DEPARTMENT(3, "部门经理", "部门领导"),
VICEDEPARTMENT(4, "部门副经理", "部门领导"),
CENTRE(5, "中心经理", "中心经理"),
VICECENTRE(6, "中心副经理", "中心经理"),
STAFF(7, "职员", "员工");
private int value;
private String text;
/**
* 业务名称
*/
private String businessName;
@Override
public int getValue() { return value; }
@Override
public String getText() { return text; }
public String getBusinessName() {
return businessName;
}
UserPosition(int value, String name, String businessName) {
this.value = value;
this.text = name;
this.businessName = businessName;
}
}
package com.infoepoch.pms.agent.domain.baisc.user;
import com.infoepoch.pms.agent.common.utils.AbstractCriteria;
import java.util.List;
public class UserQueryCriteria extends AbstractCriteria {
// region 部门ID列表
private List<String> departmentIdList;
public List<String> getDepartmentIdList() {
return departmentIdList;
}
public void setDepartmentIdList(List<String> departmentIdList) {
this.departmentIdList = departmentIdList;
this.andMap.put("DepartmentIdList", departmentIdList);
}
// endregion 部门ID列表
// region 禁用标识
private Boolean disabledFlag;
public Boolean getDisabledFlag() {
return disabledFlag;
}
public void setDisabledFlag(Boolean disabledFlag) {
this.disabledFlag = disabledFlag;
}
// endregion 禁用标识
// region 组织树父节点ID
private String treeParentId;
public String getTreeParentId() {
return treeParentId;
}
public void setTreeParentId(String treeParentId) {
this.treeParentId = treeParentId;
}
// endregion 组织树父节点ID
// region 组织ID
private String organizationId;
public String getOrganizationId() {
return organizationId;
}
public void setOrganizationId(String organizationId) {
this.organizationId = organizationId;
}
// endregion 组织ID
// region 组织ID列表
private List<String> organizationIdList;
public List<String> getOrganizationIdList() {
return organizationIdList;
}
public void setOrganizationIdList(List<String> organizationIdList) {
this.organizationIdList = organizationIdList;
}
// endregion 组织ID列表
// region 员工编号列表
private List<String> jobNumberList;
public List<String> getJobNumberList() {
return jobNumberList;
}
public void setJobNumberList(List<String> jobNumberList) {
this.jobNumberList = jobNumberList;
this.andMap.put("JobNumberList", jobNumberList);
}
// endregion 员工编号列表
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
private String userId;
}
package com.infoepoch.pms.agent.domain.baisc.user;
import com.infoepoch.pms.agent.common.utils.enums.EnumBase;
/**
* 用户类型
*/
public enum UserType implements EnumBase {
NORMAL(0, "普通员工"),
LEADER(1, "领导");
private int value;
private String text;
@Override
public int getValue() { return value; }
@Override
public String getText() { return text; }
UserType(int value, String text) {
this.value = value;
this.text = text;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment