提交 acddf2e5 作者: 方治民

Merge branch 'dev_lijing' of https://gitlab.yiring.com/chemical-kesai/kshg-api into merge_dev

 Conflicts:
	app-push/build.gradle
	app-push/src/main/java/com/yiring/app/push/domain/PushMessage.java
	app-push/src/main/java/com/yiring/app/push/rabbitmq/PushRabbitConfig.java
	app-push/src/main/java/com/yiring/app/push/rabbitmq/PushRabbitReceiver.java
	app-push/src/main/java/com/yiring/app/push/service/PushService.java
	app-push/src/main/java/com/yiring/app/push/service/impl/PushServiceImpl.java
	app/build.gradle
	app/src/main/java/com/yiring/app/domain/location/LocationBeacon.java
	app/src/main/java/com/yiring/app/domain/location/LocationFence.java
	app/src/main/java/com/yiring/app/domain/location/LocationFenceRule.java
	app/src/main/java/com/yiring/app/domain/location/LocationLog.java
	app/src/main/java/com/yiring/app/domain/location/LocationTag.java
	app/src/main/java/com/yiring/app/stomp/WebSocketStompConfig.java
	app/src/main/java/com/yiring/app/util/GeoUtils.java
	basic-auth/build.gradle
	basic-auth/src/main/java/com/yiring/auth/util/ZyUtil.java
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.config.zy;
import javax.annotation.Resource;
import lombok.AccessLevel;
import lombok.Data;
import lombok.experimental.FieldDefaults;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 真源配置想
*
* @author ifzm
* @version 0.1
* 2019/9/25 21:31
*/
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
@Component
@ConfigurationProperties(prefix = "zy-config")
public class ZyConfigProperties {
String host;
@Resource
ZyConfigRabbitmq rabbitmq;
@Resource
ZyConfigOpen open;
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
@Component
@ConfigurationProperties(prefix = "zy-config.rabbitmq")
public static class ZyConfigRabbitmq {
boolean enabled;
String host;
int port;
String username;
String password;
String virtualHost;
String queueName;
}
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
@Component
@ConfigurationProperties(prefix = "zy-config.open")
public static class ZyConfigOpen {
String api;
String clientId;
String grantType;
String clientSecret;
String tenant;
}
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
@Component
@ConfigurationProperties(prefix = "zy-config.proxy")
public static class ZyConfigProxy {
String api;
String tenant;
@Resource
ZyConfigProxyClient client;
@Resource
ZyConfigProxyManage manage;
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
@Component
@ConfigurationProperties(prefix = "zy-config.proxy.client")
public static class ZyConfigProxyClient {
String username;
String password;
}
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
@Component
@ConfigurationProperties(prefix = "zy-config.proxy.manage")
public static class ZyConfigProxyManage {
String username;
String password;
}
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.config.zy;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.AcknowledgeMode;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 真源 RabbitMQ 订阅配置
*
* @author Jim
* @version 0.1
* 2022/4/13 17:05
*/
@Slf4j
@Configuration
@ConditionalOnProperty(prefix = "zy-config.rabbitmq", value = "enabled", havingValue = "true")
public class ZyRabbitConfig {
@Resource
ZyConfigProperties.ZyConfigRabbitmq rabbitmq;
@Resource
ConfigurableApplicationContext context;
public static final String CONNECTION_FACTORY_NAME = "zyRabbitConnectionFactory";
public static final String LISTENER_FACTORY_NAME = "zyRabbitListenerFactory";
/**
* 消息队列名称(必须要与配置文件中的 queue-name 完全一致)
* 规则: tenant_msg_${open.client-secret}_${open.client-id}
* 参见文档: 定位平台接口规范V3.0.1 - 通用版.pdf #6
*/
public static final String MESSAGE_QUEUES_NAME = "tenant_msg_12A14FDC_sc21080400";
@Bean(CONNECTION_FACTORY_NAME)
public CachingConnectionFactory zyConnectionFactory() {
return connectionFactory(
rabbitmq.getHost(),
rabbitmq.getPort(),
rabbitmq.getUsername(),
rabbitmq.getPassword(),
rabbitmq.getVirtualHost()
);
}
@Bean(LISTENER_FACTORY_NAME)
public SimpleRabbitListenerContainerFactory secondFactory(
SimpleRabbitListenerContainerFactoryConfigurer configurer,
@Qualifier(CONNECTION_FACTORY_NAME) CachingConnectionFactory connectionFactory
) {
// 检查队列名称是否与配置文件一致,避免监听错误
if (!MESSAGE_QUEUES_NAME.equals(rabbitmq.getQueueName())) {
log.error("队列名称不一致,请检查配置文件");
context.close();
return null;
}
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
// 最小消费者数量
factory.setConcurrentConsumers(1);
// 最大消费者数量
factory.setMaxConcurrentConsumers(1);
// 预读取一条消息
factory.setPrefetchCount(1);
// 手动确认消息模式
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
configurer.configure(factory, connectionFactory);
return factory;
}
public CachingConnectionFactory connectionFactory(
String host,
int port,
String username,
String password,
String virtualHost
) {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(host);
connectionFactory.setPort(port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
connectionFactory.setVirtualHost(virtualHost);
return connectionFactory;
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.excel.dept;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.github.liaochong.myexcel.core.annotation.ExcelColumn;
import com.github.liaochong.myexcel.core.annotation.ExcelModel;
import com.yiring.auth.domain.dept.Department;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Data;
import lombok.experimental.FieldDefaults;
/**
* 部门信息控制器
*
* @author LJ-2204
* @date 2022/4/22
*/
@ExcelModel
@Data
@Builder
@FieldDefaults(level = AccessLevel.PRIVATE)
public class DepartmentExportExcel implements Serializable {
@Serial
private static final long serialVersionUID = 6268534775569565860L;
@ExcelColumn(title = "部门名称")
String name;
@ExcelColumn(title = "创建时间")
String createTime;
public static List<DepartmentExportExcel> transforms(List<Department> departments) {
return departments
.stream()
.map(department ->
DepartmentExportExcel
.builder()
.name(department.getName())
.createTime(LocalDateTimeUtil.format(department.getCreateTime(), "yyyy-MM-dd HH:mm:ss"))
.build()
)
.collect(Collectors.toList());
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.excel.location;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.github.liaochong.myexcel.core.annotation.ExcelColumn;
import com.github.liaochong.myexcel.core.annotation.ExcelModel;
import com.yiring.app.domain.location.LocationTag;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
import lombok.AccessLevel;
......@@ -27,11 +26,12 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE)
public class LocationTagExportExcel implements Serializable {
@Serial
private static final long serialVersionUID = -4549580878785078998L;
@ExcelColumn(title = "主键")
/* @ExcelColumn(title = "主键")
@JsonSerialize(using = ToStringSerializer.class)
Long id;
Long id;*/
@ExcelColumn(title = "编号")
String code;
......@@ -49,7 +49,7 @@ public class LocationTagExportExcel implements Serializable {
Integer volt;
@ExcelColumn(title = "最近更新时间")
LocalDateTime updateTime;
String updateTime;
public static List<LocationTagExportExcel> transforms(List<LocationTag> locationTags) {
return locationTags
......@@ -57,13 +57,12 @@ public class LocationTagExportExcel implements Serializable {
.map(locationTag ->
LocationTagExportExcel
.builder()
.id(locationTag.getId())
.code(locationTag.getCode())
.type(locationTag.getType())
.silent(locationTag.getSilent())
.imei(locationTag.getImei())
.volt(locationTag.getVolt())
.updateTime(locationTag.getUpdateTime())
.updateTime(LocalDateTimeUtil.format(locationTag.getUpdateTime(), "yyyy-MM-dd HH:mm:ss"))
.build()
)
.collect(Collectors.toList());
......
......@@ -3,7 +3,9 @@ package com.yiring.app.excel.location;
import com.github.liaochong.myexcel.core.annotation.ExcelColumn;
import com.yiring.app.domain.location.LocationTag;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.*;
import lombok.experimental.FieldDefaults;
......@@ -19,6 +21,7 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE)
public class LocationTagImportExcel implements Serializable {
@Serial
private static final long serialVersionUID = -8817732062049005201L;
// 编号
......@@ -34,6 +37,12 @@ public class LocationTagImportExcel implements Serializable {
String imei;
public LocationTag transform() {
return LocationTag.builder().code(this.code).type(LocationTag.Type.valueOf(this.type)).imei(this.imei).build();
return LocationTag
.builder()
.code(this.code)
.type(LocationTag.Type.valueOf(this.type))
.imei(this.imei)
.createTime(LocalDateTime.now())
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.excel.user;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.github.liaochong.myexcel.core.annotation.ExcelColumn;
import com.yiring.app.vo.user.UserVo;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;
import lombok.*;
import lombok.experimental.FieldDefaults;
/**
* 部门信息控制器
*
* @author LJ-2204
* @date 2022/4/24
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class UserExportExcel implements Serializable {
@Serial
private static final long serialVersionUID = 7104402721241163991L;
@ExcelColumn(title = "真实姓名")
String realName;
@ExcelColumn(title = "创建时间")
String createTime;
public static List<UserExportExcel> transforms(List<UserVo> userVos) {
return userVos
.stream()
.map(userVo ->
UserExportExcel
.builder()
.realName(userVo.getRealName())
.createTime(LocalDateTimeUtil.format(userVo.getCreateTime(), "yyyy-MM-dd HH:mm:ss"))
.build()
)
.collect(Collectors.toList());
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.dept;
import com.yiring.auth.domain.dept.Department;
import com.yiring.auth.domain.user.User;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import javax.validation.constraints.NotNull;
import lombok.*;
import lombok.experimental.FieldDefaults;
/**
* 部门新增入参
* @author LJ-2204
* @date 2022/4/19
*/
@ApiModel("DepartmentAddParam")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class DepartmentAddParam implements Serializable {
@Serial
private static final long serialVersionUID = -9143398676976586072L;
@ApiModelProperty(value = "上级部门", example = "1", required = true)
@NotNull
Long pid;
@ApiModelProperty(value = "名称", example = "Java", required = true)
@NotNull
String name;
@ApiModelProperty(value = "负责人", example = "1")
Long leaderId;
@ApiModelProperty(value = "部门状态", example = "1")
Boolean enable;
public Department transform() {
return Department
.builder()
.pid(this.pid)
.name(this.name)
.leader(User.builder().id(this.leaderId).build())
.enable(this.enable)
.createTime(LocalDateTime.now())
.updateTime(LocalDateTime.now())
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.dept;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import lombok.*;
import lombok.experimental.FieldDefaults;
/**
* 部门信息入参
*
* @author LJ-2204
* @date 2022/4/20
*/
@ApiModel("DepartmentFindParam")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class DepartmentFindParam implements Serializable {
@Serial
private static final long serialVersionUID = 4878741822740170271L;
@ApiModelProperty(value = "部门状态", example = "启用/禁用")
Boolean enable;
}
......@@ -4,7 +4,10 @@ package com.yiring.app.param.location;
import com.yiring.app.domain.location.LocationTag;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import javax.validation.constraints.NotNull;
import lombok.*;
import lombok.experimental.FieldDefaults;
......@@ -22,18 +25,31 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE)
public class LocationTagAddParam implements Serializable {
@Serial
private static final long serialVersionUID = -2942040230386389302L;
@ApiModelProperty(value = "编号", example = "BTT88888888", required = true)
@NotNull
String code;
@ApiModelProperty(value = "标签类型", example = "蓝牙人员定位卡", required = true)
@NotNull
LocationTag.Type type;
@ApiModelProperty(value = "imei 设备编码标识", example = "88888888")
String imei;
public LocationTag transform() {
return LocationTag.builder().code(this.code).type(this.type).imei(this.imei).build();
return LocationTag
.builder()
.code(this.code)
.type(this.type)
.imei(this.imei)
.used(false)
.silent(false)
.volt(0)
.createTime(LocalDateTime.now())
.updateTime(LocalDateTime.now())
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.location;
import com.yiring.auth.domain.user.User;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import javax.validation.constraints.NotNull;
import lombok.*;
......@@ -23,12 +23,14 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE)
public class LocationTagDeleteParam implements Serializable {
@Serial
private static final long serialVersionUID = 2404060244461070885L;
@ApiModelProperty(value = "id", example = "145235231", required = true)
@NotNull(message = "id 不能为空")
Long id;
@ApiModelProperty(value = "ids", example = "145235231,145235232", required = true)
@NotNull(message = "ids 不能为空")
Long[] ids;
@ApiModelProperty(value = "人员", example = "1")
User user;
@ApiModelProperty(value = "codes", example = "BTT99999998,BTT99999999", required = true)
@NotNull(message = "codes 不能为空")
String[] codes;
}
......@@ -4,6 +4,7 @@ package com.yiring.app.param.location;
import com.yiring.app.domain.location.LocationTag;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import lombok.*;
import lombok.experimental.FieldDefaults;
......@@ -22,6 +23,7 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE)
public class LocationTagFindParam implements Serializable {
@Serial
private static final long serialVersionUID = -5134311481372693111L;
@ApiModelProperty(value = "编号", example = "BTT88888888")
......@@ -32,10 +34,4 @@ public class LocationTagFindParam implements Serializable {
@ApiModelProperty(value = "状态", example = "true")
Boolean silent;
@ApiModelProperty(value = "每页记录数", example = "10")
Integer pageSize;
@ApiModelProperty(value = "页码", example = "1")
Integer pageNo;
}
......@@ -4,6 +4,7 @@ package com.yiring.app.param.location;
import com.yiring.app.domain.location.LocationTag;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import lombok.*;
import lombok.experimental.FieldDefaults;
......@@ -22,8 +23,12 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE)
public class LocationTagModifyParam implements Serializable {
@Serial
private static final long serialVersionUID = 7711908393372149723L;
@ApiModelProperty(value = "id", example = "7777777", required = true)
Long id;
@ApiModelProperty(value = "编号", example = "BTT88888888", required = true)
String code;
......
......@@ -3,9 +3,13 @@ package com.yiring.app.param.location.zy;
import cn.hutool.core.util.StrUtil;
import com.yiring.app.domain.location.LocationTag;
import com.yiring.app.excel.location.LocationTagImportExcel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;
import lombok.*;
import lombok.experimental.FieldDefaults;
......@@ -23,10 +27,11 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE)
public class ZyLocationTagAddParam implements Serializable {
@Serial
private static final long serialVersionUID = -8828137320896062620L;
@ApiModelProperty(value = "工厂", example = "100")
String orgId;
Integer orgId;
@ApiModelProperty(value = "标签类型", example = "蓝牙人员定位卡", required = true)
LocationTag.Type types;
......@@ -37,14 +42,33 @@ public class ZyLocationTagAddParam implements Serializable {
@ApiModelProperty(value = "实体类型", example = "car", required = true)
String entityType;
public static ZyLocationTagAddParam transform(LocationTag locationTag) {
public static ZyLocationTagAddParam transform(LocationTag locationTag, Integer orgId) {
String entityType = StrUtil.equals(locationTag.getType().name(), "BTT02") ? "car" : "staff";
return ZyLocationTagAddParam
.builder()
.orgId("100")
.orgId(orgId)
.tagId(locationTag.getCode())
.types(locationTag.getType())
.entityType(entityType)
.build();
}
public static List<ZyLocationTagAddParam> transforms(
List<LocationTagImportExcel> locationTagImportExcels,
Integer orgId
) {
return locationTagImportExcels
.stream()
.map(locationTagImportExcel -> {
String entityType = StrUtil.equals(locationTagImportExcel.getType(), "BTT02") ? "car" : "staff";
return ZyLocationTagAddParam
.builder()
.entityType(entityType)
.orgId(orgId)
.tagId(locationTagImportExcel.getCode())
.types(LocationTag.Type.valueOf(locationTagImportExcel.getType()))
.build();
})
.collect(Collectors.toList());
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.auth.param.post;
package com.yiring.app.param.post;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import lombok.*;
import lombok.experimental.FieldDefaults;
......@@ -21,6 +22,7 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE)
public class PostFindParam implements Serializable {
@Serial
private static final long serialVersionUID = 1926710333813935577L;
@ApiModelProperty(value = "名称", example = "Java")
......@@ -28,10 +30,4 @@ public class PostFindParam implements Serializable {
@ApiModelProperty(value = "是否启用", example = "true")
Boolean enable;
@ApiModelProperty(value = "每页记录数", example = "10")
Integer pageSize;
@ApiModelProperty(value = "页码", example = "1")
Integer pageNo;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.auth.param.post;
package com.yiring.app.param.post;
import com.yiring.auth.domain.post.Post;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import javax.validation.constraints.NotNull;
import lombok.*;
import lombok.experimental.FieldDefaults;
......@@ -22,9 +24,11 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE)
public class PostParam implements Serializable {
@Serial
private static final long serialVersionUID = 5247408856592333466L;
@ApiModelProperty(value = "名称", example = "Java", required = true)
@NotNull
String name;
@ApiModelProperty(value = "描述", example = "描述", required = true)
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.user;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import lombok.*;
import lombok.experimental.FieldDefaults;
/**
*
*
* @author LJ-2204
* @date 2022/4/22
*/
@ApiModel("UserByNameParam")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class UserBingTagParam implements Serializable {
@Serial
private static final long serialVersionUID = -3659387184911379861L;
@ApiModelProperty(value = "用户id", example = "8888888")
Long id;
@ApiModelProperty(value = "标签编号", example = "BTT88888888")
String code;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.user;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import lombok.*;
import lombok.experimental.FieldDefaults;
/**
* 用户表格查询
* @author LJ-2204
* @date 2022/4/20
*/
@ApiModel("UserFindParam")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class UserFindParam implements Serializable {
@Serial
private static final long serialVersionUID = -8021455509303095719L;
@ApiModelProperty(value = "真实姓名", example = "张三")
String realName;
@ApiModelProperty(value = "工号", example = "3306")
String uuid;
@ApiModelProperty(value = "标签卡", example = "BTT33333333")
String code;
@ApiModelProperty(value = "电话", example = "19999999999")
String mobile;
@ApiModelProperty(value = "部门编号", example = "0")
Long deptId;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.rabbitmq;
import org.springframework.context.annotation.Configuration;
/**
* rabbitmq配置
*
* @author ifzm
* 2019/8/21 15:44
*/
@Configuration
public class RabbitConfig {}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.rabbitmq;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
/**
* rabbitmq配置
*
* @author ifzm
* 2019/8/21 16:07
*/
@SuppressWarnings({ "unused" })
@Slf4j
@Component
@Transactional(rollbackFor = Exception.class)
public class RabbitReceiver {}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.rabbitmq.zy;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.rabbitmq.client.Channel;
import com.yiring.app.config.zy.ZyRabbitConfig;
import com.yiring.app.push.domain.PushMessage;
import com.yiring.app.push.service.PushService;
import java.io.IOException;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
/**
* 真源 RabbitMQ 消息监听(消息消费者)
*
* @author Jim
* @version 0.1
* 2022/4/13 17:13
*/
@Slf4j
@Component
@Configuration
@ConditionalOnProperty(prefix = "zy-config.rabbitmq", value = "enabled", havingValue = "true")
public class ZyRabbitmqReceiver {
// TODO
// 1. 新增消息订阅定时任务,检查是否正常订阅了真源定位系统的消息
// 2. 如果没有所需的订阅记录,则发起消息订阅(见接口文档: 6.2)
// 3. 订阅 position(定位数据)、lowPower(低电量报警)、deviceStatus(设备状态)、keyWarning(按键报警)
@Resource
PushService pushService;
/**
* 订阅真源定位系统 RabbitMQ 推送过来的消息(主动订阅的一些消息类别)
* 参见: 定位平台接口规范V3.0.1 - 通用版.pdf #6
* @param msg 消息内容
* @param channel 消息通道
* @param message 消息主体
* @throws IOException 消息确认异常
*/
@RabbitHandler
@RabbitListener(
queues = ZyRabbitConfig.MESSAGE_QUEUES_NAME,
containerFactory = ZyRabbitConfig.LISTENER_FACTORY_NAME
)
public void listen(String msg, Channel channel, Message message) throws IOException {
// 手动确认消息已收到
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
try {
// 将消息转换成 JSON 格式
JSONObject info = JSON.parseObject(msg);
log.info("Receiver Message: {}", info);
// 解构消息内容
JSONObject data = info.getJSONObject("params");
String method = info.getString("method");
switch (method) {
// 实时定位
case "position" -> processPositionMessage(data);
// 设备低电量
case "lowPower" -> processLowPowerMessage(data);
// 设备状态变更
case "deviceStatus" -> processDeviceStatusMessage(data);
// 按键报警
case "keyWarning" -> processKeyWarningMessage(data);
default -> log.warn("Unknown Message Type: {}", info);
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
/**
* 处理定位消息
* @param data 消息内容
*/
@Transactional(rollbackFor = Exception.class)
public void processPositionMessage(JSONObject data) {
// TODO
log.info("Position Message: {}", data);
// 包装消息
// TODO
// 1. 解析消息内容,进行围栏、出入标识判断等处理,将定位记录录入数据库
// 2. 创建一条需要进行消息推送的记录
// 3. 将记录推送的消息推送模块
// WebSocket 消息推送
pushService.push(PushMessage.Type.WS, data);
}
/**
* 处理低电量报警消息
* @param data 消息内容
*/
@Transactional(rollbackFor = Exception.class)
public void processLowPowerMessage(JSONObject data) {
// TODO
log.info("LowPower Message: {}", data);
}
/**
* 处理设备状态更新消息
* @param data 消息内容
*/
@Transactional(rollbackFor = Exception.class)
public void processDeviceStatusMessage(JSONObject data) {
// TODO
log.info("DeviceStatus Message: {}", data);
}
/**
* 处理按键报警消息
* @param data 消息内容
*/
@Transactional(rollbackFor = Exception.class)
public void processKeyWarningMessage(JSONObject data) {
// TODO
log.info("KeyWarning Message: {}", data);
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.dept;
import com.yiring.app.param.dept.DepartmentAddParam;
import com.yiring.app.param.dept.DepartmentFindParam;
import com.yiring.app.vo.dept.DepartmentInfoVo;
import com.yiring.app.vo.dept.DepartmentVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.vo.PageVo;
import javax.servlet.http.HttpServletResponse;
/**
* 部门管理
* @author LJ-2204
* @date 2022/4/19
*/
public interface DepartmentService {
/**
* 新增部门
* @param param DepartmentAddParam
* @return Result<String>
*/
Result<String> addDepartment(DepartmentAddParam param);
/**
* 查询树状图
* @param param DepartmentFindParam
* @return Result<PageVo<DepartmentVo>>
*/
Result<PageVo<DepartmentVo>> findDepartmentTree(DepartmentFindParam param);
/**
* 根据id查询详细信息
* @param idParam IdParam
* @return Result<DepartmentInfoVo>
*/
Result<DepartmentInfoVo> findDepartmentInfo(IdParam idParam);
/**
* 导出部门
* @param param DepartmentFindParam
* @param response HttpServletResponse
*/
void exportDepartment(DepartmentFindParam param, HttpServletResponse response);
/**
* 逻辑删除部门
* @param idParam IdParam
* @return Result<String>
*/
Result<String> deleteDepartment(IdParam idParam);
/**
* 启用/停用
* @param idParam IdParam
* @return Result<String>
*/
Result<String> stateDepartment(IdParam idParam);
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.dept.impl;
import cn.hutool.core.util.ObjectUtil;
import com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder;
import com.yiring.app.excel.dept.DepartmentExportExcel;
import com.yiring.app.param.dept.DepartmentAddParam;
import com.yiring.app.param.dept.DepartmentFindParam;
import com.yiring.app.service.dept.DepartmentService;
import com.yiring.app.service.zy.ZyHttpService;
import com.yiring.app.vo.dept.DepartmentInfoVo;
import com.yiring.app.vo.dept.DepartmentVo;
import com.yiring.auth.domain.dept.Department;
import com.yiring.auth.domain.dept.DepartmentRepository;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import com.yiring.common.param.IdParam;
import com.yiring.common.vo.PageVo;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.data.domain.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* 部门管理
* @author LJ-2204
* @date 2022/4/19
*/
@Transactional(rollbackFor = RuntimeException.class)
@Service
@Slf4j
public class DepartmentServiceImpl implements DepartmentService {
@Resource
DepartmentRepository departmentRepository;
@Resource
ZyHttpService zyHttpService;
// todo
@Override
public Result<String> addDepartment(DepartmentAddParam param) {
long pidExist = departmentRepository.count(Example.of(Department.builder().id(param.getPid()).build()));
if (pidExist == 0) return Result.no(Status.BAD_REQUEST, "上级部门不存在");
long exist = departmentRepository.count(
Example.of(Department.builder().name(param.getName()).pid(param.getPid()).build())
);
if (exist > 0) return Result.no(Status.BAD_REQUEST, "同级目录下,已存在该部门");
Department department = param.transform();
departmentRepository.save(department);
return Result.ok();
}
@Override
public Result<PageVo<DepartmentVo>> findDepartmentTree(DepartmentFindParam param) {
Department department = Department.builder().enable(param.getEnable()).build();
List<Department> departments = departmentRepository.findAll(Example.of(department));
List<DepartmentVo> departmentVos = DepartmentVo.transforms(departments);
List<DepartmentVo> departmentVoList = getChildrenList(0L, null, departmentVos);
PageVo<DepartmentVo> pageVo = PageVo.build(departmentVoList, departmentVoList.size());
return Result.ok(pageVo);
}
@Override
public Result<DepartmentInfoVo> findDepartmentInfo(IdParam idParam) {
Optional<Department> department = departmentRepository.findOne(
Example.of(Department.builder().id(idParam.getId()).build())
);
if (department.isEmpty()) return Result.no(Status.BAD_REQUEST);
String pName = null;
if (!ObjectUtil.equals(department.get().getPid(), 0L)) {
Optional<Department> department_pid = departmentRepository.findOne(
Example.of(Department.builder().id(department.get().getPid()).build())
);
if (department_pid.isEmpty()) return Result.no(Status.BAD_REQUEST);
pName = department_pid.get().getName();
}
DepartmentInfoVo departmentInfoVo = DepartmentInfoVo.transform(department.get());
departmentInfoVo.setPName(pName);
return Result.ok(departmentInfoVo);
}
@Override
public void exportDepartment(DepartmentFindParam param, HttpServletResponse response) {
List<Department> departments = departmentRepository.findAll(
Example.of(Department.builder().enable(param.getEnable()).build())
);
List<DepartmentExportExcel> departmentExportExcels = DepartmentExportExcel.transforms(departments);
try (
DefaultStreamExcelBuilder<DepartmentExportExcel> streamExcelBuilder = DefaultStreamExcelBuilder
.of(DepartmentExportExcel.class)
.threadPool(Executors.newFixedThreadPool(2))
.rowHeight(14)
.titleRowHeight(14)
.style(
"cell->vertical-align:center;text-align:center",
"title->vertical-align:center;text-align:center;font-weight:bold;font-family:等线"
)
.start()
) {
streamExcelBuilder.append(departmentExportExcels);
String fileName = URLEncoder.encode("部门信息.xlsx", StandardCharsets.UTF_8);
response.setContentType("application/octet-stream");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
OutputStream out = response.getOutputStream();
Workbook workbook = streamExcelBuilder.fixedTitles().build();
workbook.write(out);
workbook.close();
out.flush();
out.close();
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new RuntimeException("导出部门信息失败: " + e.getMessage());
}
}
@Override
public Result<String> deleteDepartment(IdParam idParam) {
departmentRepository.deleteById(idParam.getId());
return Result.ok();
}
@Override
public Result<String> stateDepartment(IdParam idParam) {
Optional<Department> departmentOptional = departmentRepository.findOne(
Example.of(Department.builder().id(idParam.getId()).build())
);
if (departmentOptional.isEmpty()) return Result.no(Status.BAD_REQUEST);
Department department = departmentOptional.get();
department.setEnable(!department.getEnable());
departmentRepository.save(department);
return Result.ok();
}
public List<DepartmentVo> getChildrenList(Long pid, String pName, List<DepartmentVo> departmentVos) {
return departmentVos
.stream()
.filter(departmentVo -> pid.equals(departmentVo.getPid()))
.peek(departmentVo -> {
departmentVo.setPName(pName);
departmentVo.setChildList(getChildrenList(departmentVo.getId(), departmentVo.getName(), departmentVos));
})
.collect(Collectors.toList());
}
}
......@@ -7,7 +7,7 @@ import com.yiring.app.param.location.LocationTagFindParam;
import com.yiring.app.param.location.LocationTagModifyParam;
import com.yiring.app.vo.location.LocationTagVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;
......@@ -30,7 +30,7 @@ public interface LocationTagService {
* @param param 入参
* @return Result<PageVo<LocationTagVo>>
*/
Result<PageVo<LocationTagVo>> findLocationTagPage(LocationTagFindParam param);
Result<PageVo<LocationTagVo>> findLocationTagPage(LocationTagFindParam param, PageParam pageParam);
/**
* 销毁定位标签
......@@ -58,5 +58,5 @@ public interface LocationTagService {
* @param param 入参
* @return Result<String>
*/
Result<String> modifyLocationTag(LocationTagModifyParam param, IdParam idParam);
Result<String> modifyLocationTag(LocationTagModifyParam param);
}
......@@ -2,6 +2,7 @@
package com.yiring.app.service.location.impl;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder;
......@@ -16,22 +17,18 @@ import com.yiring.app.param.location.LocationTagFindParam;
import com.yiring.app.param.location.LocationTagModifyParam;
import com.yiring.app.param.location.zy.ZyLocationTagAddParam;
import com.yiring.app.service.location.LocationTagService;
import com.yiring.app.service.zy.ZyHttpService;
import com.yiring.app.vo.location.LocationTagVo;
import com.yiring.auth.util.ZyUtil;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.*;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import javax.annotation.Resource;
......@@ -61,36 +58,34 @@ public class LocationTagServiceImpl implements LocationTagService {
final Integer FACTORY_ID = 100;
@Resource
ZyHttpService zyHttpService;
@Resource
LocationTagRepository locationTagRepository;
@Override
public Result<String> addLocationTag(LocationTagAddParam param) {
if (hasLocationTagInfoByCode(param.getCode())) return Result.no(Status.BAD_REQUEST, "编号已存在");
LocationTag locationTag = param.transform();
locationTagRepository.save(locationTag);
ZyLocationTagAddParam zyLocationTagAddParam = ZyLocationTagAddParam.transform(locationTag);
ZyLocationTagAddParam zyLocationTagAddParam = ZyLocationTagAddParam.transform(locationTag, FACTORY_ID);
List<ZyLocationTagAddParam> of = ListUtil.of(zyLocationTagAddParam);
new Thread(() -> {
Result<Serializable> result = ZyUtil.post("/positionApi/api/tag/saveTag", of, 3000);
if (result.getCode() != 200) throw new RuntimeException(result.getMessage());
})
.start();
zyHttpService.post("/positionApi/api/tag/saveTag", of, 3000);
locationTagRepository.save(locationTag);
return Result.ok();
}
@Override
public Result<PageVo<LocationTagVo>> findLocationTagPage(LocationTagFindParam param) {
public Result<PageVo<LocationTagVo>> findLocationTagPage(LocationTagFindParam param, PageParam pageParam) {
Specification<LocationTag> specification = getLocationTagPageSpecification(param);
Sort sort = Sort.by(Sort.Order.desc(LocationTag.Fields.createTime));
if (Objects.nonNull(param.getPageNo()) && Objects.nonNull(param.getPageSize())) {
if (ObjectUtil.isNotEmpty(pageParam.getPageNo()) && ObjectUtil.isNotEmpty(pageParam.getPageSize())) {
//分页
Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize());
Pageable pageable = PageRequest.of(pageParam.getPageNo() - 1, pageParam.getPageSize());
Page<LocationTag> locationTags = locationTagRepository.findAll(specification, pageable);
List<LocationTagVo> locationTagVos = LocationTagVo.transforms(locationTags.getContent());
PageVo<LocationTagVo> page = PageVo.build(locationTagVos, locationTagVos.size());
PageVo<LocationTagVo> page = PageVo.build(locationTagVos, locationTags.getTotalElements());
return Result.ok(page);
} else {
List<LocationTag> locationTags = locationTagRepository.findAll(specification, sort);
......@@ -102,8 +97,12 @@ public class LocationTagServiceImpl implements LocationTagService {
@Override
public Result<String> deleteLocationTag(LocationTagDeleteParam param) {
if (ObjectUtil.isNotEmpty(param.getUser())) return Result.no(Status.BAD_REQUEST, "请先解绑人员");
locationTagRepository.deleteById(param.getId());
if (ObjectUtil.isEmpty(param)) return Result.no(Status.EXPECTATION_FAILED);
Map<Object, Object> map = MapUtil.createMap(HashMap.class);
map.put("tagIds", param.getCodes());
map.put("orgId", FACTORY_ID);
zyHttpService.delete("/positionApi/api/tag/delete", map, 3000);
locationTagRepository.deleteAllById(ListUtil.toList(param.getIds()));
return Result.ok();
}
......@@ -128,6 +127,7 @@ public class LocationTagServiceImpl implements LocationTagService {
String fileName = URLEncoder.encode("定位标签信息.xlsx", StandardCharsets.UTF_8);
response.setContentType("application/octet-stream");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
OutputStream out = response.getOutputStream();
......@@ -157,32 +157,27 @@ public class LocationTagServiceImpl implements LocationTagService {
log.info(e.getMessage());
throw new RuntimeException("文件导入异常");
}
List<LocationTag> locationTags;
List<LocationTag> locationTags = locationTagImportExcels
locationTags =
locationTagImportExcels
.stream()
.filter(locationTagImportExcel -> !hasLocationTagInfoByCode(locationTagImportExcel.getCode()))
.map(LocationTagImportExcel::transform)
.collect(Collectors.toList());
locationTags.forEach(locationTag -> {
locationTagRepository
.findOne((root, cq, cb) -> {
List<Predicate> predicates = new ArrayList<>();
if (StrUtil.isNotEmpty(locationTag.getCode())) {
predicates.add(cb.equal(root.get(LocationTag.Fields.code), locationTag.getCode()));
}
return cq.where(predicates.toArray(new Predicate[0])).getRestriction();
})
.ifPresent(temp -> locationTag.setId(temp.getId()));
locationTagRepository.save(locationTag);
});
List<ZyLocationTagAddParam> zyLocationTagAddParams = ZyLocationTagAddParam.transforms(
locationTagImportExcels,
FACTORY_ID
);
zyHttpService.post("/positionApi/api/tag/saveTag", zyLocationTagAddParams, 3000);
locationTagRepository.saveAll(locationTags);
return Result.ok();
}
@Override
public Result<String> modifyLocationTag(LocationTagModifyParam param, IdParam idParam) {
Optional<LocationTag> locationTagOptional = locationTagRepository.findById(idParam.getId());
public Result<String> modifyLocationTag(LocationTagModifyParam param) {
Optional<LocationTag> locationTagOptional = locationTagRepository.findById(param.getId());
if (locationTagOptional.isEmpty()) return Result.no(Status.BAD_REQUEST, "被修改的数据不存在");
LocationTag locationTag = locationTagOptional.get();
......@@ -192,7 +187,7 @@ public class LocationTagServiceImpl implements LocationTagService {
}
locationTag = param.transform();
locationTag.setId(idParam.getId());
locationTag.setId(param.getId());
locationTagRepository.save(locationTag);
return Result.ok();
......@@ -209,15 +204,15 @@ public class LocationTagServiceImpl implements LocationTagService {
List<Predicate> predicates = ListUtil.toList();
if (StrUtil.isNotEmpty(param.getCode())) {
cb.equal(root.get(LocationTag.Fields.code), param.getCode());
predicates.add(cb.like(root.get(LocationTag.Fields.code), "%" + param.getCode() + "%"));
}
if (ObjectUtil.isNotEmpty(param.getType())) {
cb.equal(root.get(LocationTag.Fields.type), param.getType());
predicates.add(cb.equal(root.get(LocationTag.Fields.type), param.getType()));
}
if (ObjectUtil.isNotEmpty(param.getSilent())) {
cb.equal(root.get(LocationTag.Fields.silent), param.getSilent());
predicates.add(cb.equal(root.get(LocationTag.Fields.silent), param.getSilent()));
}
Order order = cb.desc(root.get(LocationTag.Fields.createTime));
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.auth.service.post;
package com.yiring.app.service.post;
import com.yiring.auth.param.post.PostFindParam;
import com.yiring.auth.param.post.PostParam;
import com.yiring.auth.vo.post.PostVo;
import com.yiring.app.param.post.PostFindParam;
import com.yiring.app.param.post.PostParam;
import com.yiring.app.vo.post.PostVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import javax.servlet.http.HttpServletResponse;
......@@ -42,7 +43,7 @@ public interface PostService {
* @param param 入参
* @return Result<PageVo<PostVo>>
*/
Result<PageVo<PostVo>> findPostPage(PostFindParam param);
Result<PageVo<PostVo>> findPostPage(PostFindParam param, PageParam pageParam);
/**
* 详细信息查询
......@@ -64,4 +65,10 @@ public interface PostService {
* @param response 响应信息
*/
void exportPostInfo(PostFindParam param, HttpServletResponse response);
/**
* 下拉菜单
* @return Result<PageVo<PostVo>>
*/
Result<PageVo<PostVo>> selectPost();
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.auth.service.post.impl;
package com.yiring.app.service.post.impl;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder;
import com.yiring.app.param.post.PostFindParam;
import com.yiring.app.param.post.PostParam;
import com.yiring.app.service.post.PostService;
import com.yiring.app.vo.post.PostVo;
import com.yiring.auth.domain.post.Post;
import com.yiring.auth.domain.post.PostRepository;
import com.yiring.auth.excel.post.PostExcel;
import com.yiring.auth.param.post.PostFindParam;
import com.yiring.auth.param.post.PostParam;
import com.yiring.auth.service.post.PostService;
import com.yiring.auth.vo.post.PostVo;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.Executors;
import javax.annotation.Resource;
import javax.persistence.criteria.Order;
import javax.persistence.criteria.Predicate;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.*;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
......@@ -52,6 +52,7 @@ public class PostServiceImpl implements PostService {
public Result<String> addPost(PostParam postParam) {
if (hasPostInfo(postParam.getName())) return Result.no(Status.BAD_REQUEST, "职位已存在");
Post post = postParam.transform();
post.setCreateTime(LocalDateTime.now());
postRepository.save(post);
return Result.ok();
}
......@@ -66,8 +67,10 @@ public class PostServiceImpl implements PostService {
if (!StrUtil.equals(post.getName(), postParam.getName())) {
if (hasPostInfo(postParam.getName())) return Result.no(Status.BAD_REQUEST, "职位已存在");
}
post = postParam.transform();
post.setName(postParam.getName());
post.setDescribe(postParam.getDescribe());
post.setEnable(postParam.getEnable());
post.setUpdateTime(LocalDateTime.now());
post.setId(idParam.getId());
postRepository.save(post);
return Result.ok();
......@@ -81,18 +84,20 @@ public class PostServiceImpl implements PostService {
}
@Override
public Result<PageVo<PostVo>> findPostPage(PostFindParam param) {
public Result<PageVo<PostVo>> findPostPage(PostFindParam param, PageParam pageParam) {
Specification<Post> specification = getPostPageSpecification(param);
if (ObjectUtil.isEmpty(param.getPageSize()) && ObjectUtil.isEmpty(param.getPageNo())) {
Sort sort = Sort.by(Sort.Order.desc(Post.Fields.createTime));
if (ObjectUtil.isNotEmpty(pageParam.getPageSize()) && ObjectUtil.isNotEmpty(pageParam.getPageNo())) {
//分页
Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize());
Pageable pageable = PageRequest.of(pageParam.getPageNo() - 1, pageParam.getPageSize());
Page<Post> page = postRepository.findAll(specification, pageable);
List<PostVo> postVos = PostVo.transforms(page.getContent());
PageVo<PostVo> pageVo = PageVo.build(postVos, postVos.size());
return Result.ok(pageVo);
} else {
List<Post> posts = postRepository.findAll(specification);
List<Post> posts = postRepository.findAll(specification, sort);
List<PostVo> postVos = PostVo.transforms(posts);
PageVo<PostVo> pageVo = PageVo.build(postVos, postVos.size());
return Result.ok(pageVo);
......@@ -133,6 +138,7 @@ public class PostServiceImpl implements PostService {
String fileName = URLEncoder.encode("职位信息.xlsx", StandardCharsets.UTF_8);
response.setContentType("application/octet-stream");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
OutputStream out = response.getOutputStream();
......@@ -147,19 +153,29 @@ public class PostServiceImpl implements PostService {
}
}
@Override
public Result<PageVo<PostVo>> selectPost() {
List<Post> posts = postRepository.findAll();
List<PostVo> postVos = PostVo.transforms(posts);
PageVo<PostVo> pageVo = PageVo.build(postVos, postVos.size());
return Result.ok(pageVo);
}
private Specification<Post> getPostPageSpecification(PostFindParam param) {
return (root, cq, cb) -> {
List<Predicate> predicates = ListUtil.toList();
if (StrUtil.isNotEmpty(param.getName())) {
predicates.add(cb.equal(root.get(Post.Fields.name), param.getName()));
predicates.add(cb.like(root.get(Post.Fields.name), "%" + param.getName() + "%"));
}
if (ObjectUtil.isNotEmpty(param.getEnable())) {
predicates.add(cb.equal(root.get(Post.Fields.enable), param.getEnable()));
}
return cq.where(predicates.toArray(new Predicate[0])).getRestriction();
Order order = cb.desc(root.get(Post.Fields.createTime));
return cq.orderBy(order).where(predicates.toArray(new Predicate[0])).getRestriction();
};
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.user;
import com.yiring.app.param.user.UserBingTagParam;
import com.yiring.app.param.user.UserFindParam;
import com.yiring.app.vo.user.UserVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import javax.servlet.http.HttpServletResponse;
/**
* 用户
* @author LJ-2204
* @date 2022/4/20
*/
public interface UserService {
/**
* 表格查询
* @param param UserByNameParam
* @param pageParam PageParam
* @return Result<PageVo<UserAutoVo>>
*/
Result<PageVo<UserVo>> findUserPage(UserFindParam param, PageParam pageParam);
/**
* 用户详细信息
* @param idParam IdParam
* @return Result<UserVo>
*/
Result<UserVo> findUserById(IdParam idParam);
/**
* 用户绑定标签
* @param param UserBingTagParam
* @return Result<String>
*/
Result<String> userBingTag(UserBingTagParam param);
/**
* 收卡
* @param idParam IdParam
* @return Result<String>
*/
Result<String> userUnBingTag(IdParam idParam);
/**
* 删除用户
* @param idParam IdParam
* @return Result<String>
*/
Result<String> deleteUser(IdParam idParam);
/**
* 下拉菜单
* @return Result<PageVo<UserVo>>
*/
Result<PageVo<UserVo>> selectUser();
/**
* 导出用户
* @param param UserFindParam
* @param response HttpServletResponse
*/
void exportUser(UserFindParam param, HttpServletResponse response);
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.user.impl;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder;
import com.yiring.app.domain.location.LocationTag;
import com.yiring.app.domain.location.LocationTagRepository;
import com.yiring.app.excel.user.UserExportExcel;
import com.yiring.app.param.user.UserBingTagParam;
import com.yiring.app.param.user.UserFindParam;
import com.yiring.app.service.user.UserService;
import com.yiring.app.vo.user.UserVo;
import com.yiring.auth.domain.dept.Department;
import com.yiring.auth.domain.dept.DepartmentRepository;
import com.yiring.auth.domain.post.Post;
import com.yiring.auth.domain.user.User;
import com.yiring.auth.domain.user.UserRepository;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import com.yiring.common.domain.BasicEntity;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.Executors;
import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.criteria.*;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.jetbrains.annotations.NotNull;
import org.springframework.data.domain.Example;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* 用户
* @author LJ-2204
* @date 2022/4/20
*/
@Transactional(rollbackFor = RuntimeException.class)
@Service
@Slf4j
public class UserServiceImpl implements UserService {
@Resource
EntityManager em;
@Resource
UserRepository userRepository;
@Resource
LocationTagRepository locationTagRepository;
@Resource
DepartmentRepository departmentRepository;
@Override
public Result<PageVo<UserVo>> findUserPage(UserFindParam param, PageParam pageParam) {
CriteriaQuery<UserVo> cq = getUserVoCriteriaQuery(param);
if (ObjectUtil.isNotEmpty(pageParam.getPageNo()) || ObjectUtil.isNotEmpty(pageParam.getPageSize())) {
List<UserVo> userVos = em
.createQuery(cq)
.setFirstResult(pageParam.getPageNo())
.setMaxResults(pageParam.getPageSize())
.getResultList();
PageVo<UserVo> page = PageVo.build(userVos, userVos.size());
return Result.ok(page);
} else {
List<UserVo> userVos = em.createQuery(cq).getResultList();
PageVo<UserVo> page = PageVo.build(userVos, userVos.size());
return Result.ok(page);
}
}
@Override
public Result<UserVo> findUserById(IdParam idParam) {
Optional<User> userOptional = userRepository.findOne(Example.of(User.builder().id(idParam.getId()).build()));
if (userOptional.isPresent()) {
UserVo userVo = UserVo.transformUserInfo(userOptional.get());
return Result.ok(userVo);
}
return Result.no(Status.BAD_REQUEST);
}
@Override
public Result<String> userBingTag(UserBingTagParam param) {
Optional<LocationTag> locationTagOptional = locationTagRepository.findOne(
Example.of(LocationTag.builder().code(param.getCode()).build())
);
if (locationTagOptional.isEmpty()) throw new RuntimeException("标签卡不存在");
LocationTag locationTag = locationTagOptional.get();
if (!ObjectUtil.isNotEmpty(locationTag.getUser())) {
throw new RuntimeException("已绑定其他用户 : " + locationTag.getUser().getRealName());
}
locationTag.setUser(User.builder().id(param.getId()).build());
locationTag.setUsed(true);
locationTagRepository.save(locationTag);
return Result.ok();
}
@Override
public Result<String> userUnBingTag(IdParam idParam) {
LocationTag build = LocationTag.builder().user(User.builder().id(idParam.getId()).build()).build();
Optional<LocationTag> locationTagOptional = locationTagRepository.findOne(Example.of(build));
if (locationTagOptional.isEmpty()) return Result.no(Status.BAD_REQUEST);
LocationTag locationTag = locationTagOptional.get();
locationTag.setUser(null);
locationTag.setUsed(false);
locationTagRepository.save(locationTag);
return Result.ok();
}
@Override
public Result<String> deleteUser(IdParam idParam) {
LocationTag locationTagBuild = LocationTag.builder().user(User.builder().id(idParam.getId()).build()).build();
long locationTagCount = locationTagRepository.count(Example.of(locationTagBuild));
if (locationTagCount > 0) return Result.no(Status.BAD_REQUEST, "已发卡,不可删除");
Department departmentBuild = Department.builder().leader(User.builder().id(idParam.getId()).build()).build();
long departmentCount = departmentRepository.count(Example.of(departmentBuild));
if (departmentCount > 0) return Result.no(Status.BAD_REQUEST, "部门负责人,请先解绑");
userRepository.deleteById(idParam.getId());
return Result.ok();
}
@Override
public Result<PageVo<UserVo>> selectUser() {
List<User> users = userRepository.findAll();
List<UserVo> userVos = UserVo.transforms(users);
PageVo<UserVo> pageVo = PageVo.build(userVos, userVos.size());
return Result.ok(pageVo);
}
@Override
public void exportUser(UserFindParam param, HttpServletResponse response) {
CriteriaQuery<UserVo> cq = getUserVoCriteriaQuery(param);
List<UserVo> userVos = em.createQuery(cq).getResultList();
List<UserExportExcel> userExportExcels = UserExportExcel.transforms(userVos);
try (
DefaultStreamExcelBuilder<UserExportExcel> streamExcelBuilder = DefaultStreamExcelBuilder
.of(UserExportExcel.class)
.threadPool(Executors.newFixedThreadPool(2))
.rowHeight(14)
.titleRowHeight(14)
.style(
"cell->vertical-align:center;text-align:center",
"title->vertical-align:center;text-align:center;font-weight:bold;font-family:等线"
)
.start()
) {
streamExcelBuilder.append(userExportExcels);
String fileName = URLEncoder.encode("用户信息.xlsx", StandardCharsets.UTF_8);
response.setContentType("application/octet-stream");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
OutputStream out = response.getOutputStream();
Workbook workbook = streamExcelBuilder.fixedTitles().build();
workbook.write(out);
workbook.close();
out.flush();
out.close();
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new RuntimeException("用户信息导出失败: " + e.getMessage());
}
}
@NotNull
private CriteriaQuery<UserVo> getUserVoCriteriaQuery(UserFindParam param) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<UserVo> cq = cb.createQuery(UserVo.class);
Root<User> root = cq.from(User.class);
Expression<String> realName = root.get(User.Fields.realName);
Expression<String> uuid = root.get(User.Fields.uuid);
Expression<User.Type> type = root.get(User.Fields.type);
Expression<Department> department = root.get(User.Fields.department).get("name");
Expression<String> mobile = root.get(User.Fields.mobile);
Expression<Post> post = root.get(User.Fields.post).get("name");
Subquery<String> query = cq.subquery(String.class);
Root<LocationTag> tagRoot = query.from(LocationTag.class);
query.select(tagRoot.get(LocationTag.Fields.code));
query.where(cb.equal(tagRoot.get(LocationTag.Fields.user), root));
cq.multiselect(realName, uuid, type, department, mobile, post, query);
List<Predicate> predicates = ListUtil.toList();
if (StrUtil.isNotEmpty(param.getRealName())) {
predicates.add(cb.like(root.get(User.Fields.realName), "%" + param.getRealName() + "%"));
}
if (StrUtil.isNotEmpty(param.getCode())) {
predicates.add(cb.like(root.get(LocationTag.Fields.code), "%" + param.getCode() + "%"));
}
if (StrUtil.isNotEmpty(param.getUuid())) {
predicates.add(cb.like(root.get(User.Fields.uuid), "%" + param.getUuid() + "%"));
}
if (StrUtil.isNotEmpty(param.getMobile())) {
predicates.add(cb.like(root.get(User.Fields.mobile), "%" + param.getMobile() + "%"));
}
if (ObjectUtil.isNotEmpty(param.getDeptId())) {
predicates.add(cb.equal(root.get(User.Fields.department).get("id"), param.getDeptId()));
}
Order order = cb.desc(root.get(BasicEntity.Fields.createTime));
cq.orderBy(order).where(predicates.toArray(new Predicate[0])).getRestriction();
return cq;
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.zy;
import com.yiring.common.core.Result;
import java.io.Serializable;
import java.util.concurrent.CompletableFuture;
/**
* ZyHttp请求
* @author LJ-2204
* @date 2022/4/18
*/
public interface ZyHttpService {
/**
* get请求
* @param urlString 路径
* @param obj 参数
* @param timeout 请求时长
* @return json
*/
CompletableFuture<Result<Serializable>> get(String urlString, Object obj, int timeout);
/**
* post请求
* @param urlString 路径
* @param obj 参数
* @param timeout 请求时长
* @return json
*/
CompletableFuture<Result<Serializable>> post(String urlString, Object obj, int timeout);
/**
* put请求
* @param urlString 路径
* @param obj 参数
* @param timeout 请求时长
* @return json
*/
CompletableFuture<Result<Serializable>> put(String urlString, Object obj, int timeout);
/**
* delete请求
* @param urlString 路径
* @param obj 参数
* @param timeout 请求时长
* @return json
*/
CompletableFuture<Result<Serializable>> delete(String urlString, Object obj, int timeout);
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.zy.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.Header;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONUtil;
import com.yiring.app.service.zy.ZyHttpService;
import com.yiring.auth.util.ZyUtil;
import com.yiring.common.core.Result;
import java.io.Serializable;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* ZyHttp请求
* @author LJ-2204
* @date 2022/4/18
*/
@Transactional(rollbackFor = RuntimeException.class)
@Service
@Slf4j
public class ZyHttpServiceImpl implements ZyHttpService {
public final String TOKEN_TYPE = "bearer ";
public final String URL_PREFIX = "http://project.yz-online.com:789";
@Override
@Async("httpThreadPool")
public CompletableFuture<Result<Serializable>> get(String urlString, Object obj, int timeout) {
String json = JSONUtil.toJsonStr(obj);
String token = ZyUtil.login();
String body = HttpRequest
.get(URL_PREFIX + urlString)
.header(Header.AUTHORIZATION, TOKEN_TYPE + token)
.header(Header.CONTENT_TYPE, "application/json")
.body(json)
.timeout(timeout)
.execute()
.body();
return CompletableFuture.completedFuture(getResult(body));
}
@Override
@Async("httpThreadPool")
public CompletableFuture<Result<Serializable>> post(String urlString, Object obj, int timeout) {
String json = JSONUtil.toJsonStr(obj);
String token = ZyUtil.login();
String body = HttpRequest
.post(URL_PREFIX + urlString)
.header(Header.AUTHORIZATION, TOKEN_TYPE + token)
.header(Header.CONTENT_TYPE, "application/json")
.body(json)
.timeout(timeout)
.execute()
.body();
return CompletableFuture.completedFuture(getResult(body));
}
@Override
@Async("httpThreadPool")
public CompletableFuture<Result<Serializable>> put(String urlString, Object obj, int timeout) {
String json = JSONUtil.toJsonStr(obj);
String token = ZyUtil.login();
String body = HttpRequest
.put(URL_PREFIX + urlString)
.header(Header.AUTHORIZATION, TOKEN_TYPE + token)
.header(Header.CONTENT_TYPE, "application/json")
.body(json)
.timeout(timeout)
.execute()
.body();
return CompletableFuture.completedFuture(getResult(body));
}
@Override
@Async("httpThreadPool")
public CompletableFuture<Result<Serializable>> delete(String urlString, Object obj, int timeout) {
String json = JSONUtil.toJsonStr(obj);
String token = ZyUtil.login();
String body = HttpRequest
.delete(URL_PREFIX + urlString)
.header(Header.AUTHORIZATION, TOKEN_TYPE + token)
.header(Header.CONTENT_TYPE, "application/x-www-form-urlencoded")
.body(json)
.timeout(timeout)
.execute()
.body();
return CompletableFuture.completedFuture(getResult(body));
}
/**
* 返回类型转换
* @param body json
* @return Result
*/
private static Result<Serializable> getResult(String body) {
String data = null;
Map map = JSONUtil.toBean(body, Map.class);
Integer code = Convert.toInt(map.get("code"));
String msg = Convert.toStr(map.get("msg"));
if (ObjectUtil.isNotEmpty(map.get("data"))) {
data = Convert.toStr(map.get("data"));
}
return Result.builder().status(code).message(msg).body(data).build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.stomp;
import lombok.AccessLevel;
import lombok.Data;
import lombok.experimental.FieldDefaults;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* RabbitmqProperties
*
* @author ifzm
* @version 0.1
* 2019/9/25 21:31
*/
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
@Component
@ConfigurationProperties(prefix = "spring.rabbitmq")
public class RabbitmqProperties {
int port;
String host;
String username;
String password;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.dept;
import com.yiring.app.vo.user.UserVo;
import com.yiring.auth.domain.dept.Department;
import com.yiring.auth.domain.post.Post;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Set;
import lombok.*;
import lombok.experimental.FieldDefaults;
/**
* 部门详细信息视图
*
* @author LJ-2204
* @date 2022/4/21
*/
@ApiModel("DepartmentInfoVo")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class DepartmentInfoVo implements Serializable {
@Serial
private static final long serialVersionUID = -1765633704385903288L;
@ApiModelProperty(value = "部门名称", example = "研发部")
String name;
@ApiModelProperty(value = "负责人", example = "张三")
UserVo userVo;
@ApiModelProperty(value = "是否启用", example = "T/F")
Boolean enable;
@ApiModelProperty(value = "上级部门", example = "0根目录")
Long pid;
@ApiModelProperty(value = "上级部门名称", example = "前端")
String pName;
@ApiModelProperty(value = "岗位", example = "岗位")
@Builder.Default
Set<Post> posts = new HashSet<>(0);
@ApiModelProperty(value = "更新时间", example = "2022-02-02 11:11:11")
LocalDateTime updateTime;
@ApiModelProperty(value = "创建时间", example = "2022-02-02 11:11:11")
LocalDateTime createTime;
public static DepartmentInfoVo transform(Department department) {
return DepartmentInfoVo
.builder()
.name(department.getName())
.userVo(UserVo.transform(department.getLeader()))
.enable(department.getEnable())
.posts(department.getPosts())
.pid(department.getPid())
.createTime(department.getCreateTime())
.updateTime(department.getUpdateTime())
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.dept;
import com.yiring.app.vo.user.UserVo;
import com.yiring.auth.domain.dept.Department;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
import lombok.*;
import lombok.experimental.FieldDefaults;
/**
* 部门树型视图
*
* @author LJ-2204
* @date 2022/4/20
*/
@ApiModel("DepartmentVo")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class DepartmentVo implements Serializable {
@Serial
private static final long serialVersionUID = -8193039102015929156L;
@ApiModelProperty(value = "主键", example = "111")
Long id;
@ApiModelProperty(value = "部门名称", example = "研发部")
String name;
@ApiModelProperty(value = "负责人", example = "张三")
UserVo leader;
@ApiModelProperty(value = "是否启用", example = "T/F")
Boolean enable;
@ApiModelProperty(value = "上级部门", example = "0根目录")
Long pid;
@ApiModelProperty(value = "上级部门名称", example = "前端")
String pName;
@ApiModelProperty(value = "更新时间", example = "2022-02-02 11:11:11")
LocalDateTime updateTime;
@ApiModelProperty(value = "创建时间", example = "2022-02-02 11:11:11")
LocalDateTime createTime;
@ApiModelProperty(value = "子节点")
List<DepartmentVo> childList;
public static List<DepartmentVo> transforms(List<Department> departments) {
return departments
.stream()
.map(department ->
DepartmentVo
.builder()
.id(department.getId())
.name(department.getName())
.leader(UserVo.transform(department.getLeader()))
.enable(department.getEnable())
.pid(department.getPid())
.updateTime(department.getUpdateTime())
.createTime(department.getCreateTime())
.build()
)
.collect(Collectors.toList());
}
}
......@@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.domain.location.LocationTag;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
......@@ -27,6 +28,7 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE)
public class LocationTagVo implements Serializable {
@Serial
private static final long serialVersionUID = -7884163207638158359L;
@JsonSerialize(using = ToStringSerializer.class)
......@@ -62,6 +64,8 @@ public class LocationTagVo implements Serializable {
.type(locationTag.getType())
.silent(locationTag.getSilent())
.volt(locationTag.getVolt())
.imei(locationTag.getImei())
.updateTime(locationTag.getUpdateTime())
.build()
)
.collect(Collectors.toList());
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.auth.vo.post;
package com.yiring.app.vo.post;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.auth.domain.post.Post;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
import lombok.*;
......@@ -26,6 +28,7 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE)
public class PostVo implements Serializable {
@Serial
private static final long serialVersionUID = 1011259844584399825L;
@JsonSerialize(using = ToStringSerializer.class)
......@@ -38,6 +41,12 @@ public class PostVo implements Serializable {
@ApiModelProperty(value = "描述", example = "描述")
String describe;
@ApiModelProperty(value = "创建时间", example = "创建时间")
LocalDateTime createTime;
@ApiModelProperty(value = "更新时间", example = "更新时间")
LocalDateTime updateTime;
@ApiModelProperty(value = "是否启用", example = "true")
Boolean enable;
......@@ -48,6 +57,8 @@ public class PostVo implements Serializable {
.name(post.getName())
.describe(post.getDescribe())
.enable(post.getEnable())
.createTime(post.getCreateTime())
.updateTime(post.getUpdateTime())
.build();
}
......@@ -61,6 +72,8 @@ public class PostVo implements Serializable {
.name(post.getName())
.describe(post.getDescribe())
.enable(post.getEnable())
.createTime(post.getCreateTime())
.updateTime(post.getUpdateTime())
.build()
)
.collect(Collectors.toList());
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.user;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.auth.domain.user.User;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
import lombok.*;
import lombok.experimental.FieldDefaults;
/**
* 用户信息
* @author ifzm
* 2022/03/03 10:35
**/
@ApiModel("UserVo")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class UserVo implements Serializable {
@Serial
private static final long serialVersionUID = -2184378273450466835L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "主键", example = "1")
Long id;
@ApiModelProperty(value = "真实姓名", example = "超级用户")
String realName;
@ApiModelProperty(value = "工号", example = "8888888")
String uuid;
@ApiModelProperty(value = "类型", example = "员工")
User.Type type;
@ApiModelProperty(value = "部门", example = "系统管理员")
String department;
@ApiModelProperty(value = "手机号", example = "13012345678")
String mobile;
@ApiModelProperty(value = "职位", example = "系统管理员")
String post;
@ApiModelProperty(value = "标签编号", example = "BTT88888888")
String code;
@ApiModelProperty(value = "用户名", example = "admin")
String username;
@ApiModelProperty(value = "邮箱", example = "developer@yiring.com")
String email;
@ApiModelProperty(value = "头像", example = "https://s1.ax1x.com/2022/03/30/qggJH0.jpg")
String avatar;
@ApiModelProperty(value = "是否启用", example = "true")
Boolean enabled;
@ApiModelProperty(value = "是否删除", example = "false")
Boolean deleted;
@ApiModelProperty(value = "最后登录IP地址", example = "127.0.0.1")
String lastLoginIp;
@ApiModelProperty(value = "最后登录时间", example = "2022-10-24 10:24:00")
LocalDateTime lastLoginTime;
@ApiModelProperty(value = "创建时间", example = "2022-01-01 00:00:00")
LocalDateTime createTime;
public static UserVo transform(User user) {
return UserVo
.builder()
.id(user.getId())
.realName(user.getRealName())
.username(user.getUsername())
.mobile(user.getMobile())
.email(user.getEmail())
.enabled(user.getEnabled())
.deleted(user.getDeleted())
.lastLoginIp(user.getLastLoginIp())
.lastLoginTime(user.getLastLoginTime())
.createTime(user.getCreateTime())
.build();
}
public static List<UserVo> transforms(List<User> users) {
return users
.stream()
.map(user ->
UserVo
.builder()
.id(user.getId())
.realName(user.getRealName())
.username(user.getUsername())
.mobile(user.getMobile())
.email(user.getEmail())
.avatar(user.getAvatar())
.enabled(user.getEnabled())
.deleted(user.getDeleted())
.lastLoginIp(user.getLastLoginIp())
.lastLoginTime(user.getLastLoginTime())
.createTime(user.getCreateTime())
.build()
)
.collect(Collectors.toList());
}
public UserVo(
String realName,
String uuid,
User.Type type,
String department,
String mobile,
String post,
String code
) {
this.realName = realName;
this.uuid = uuid;
this.type = type;
this.department = department;
this.mobile = mobile;
this.post = post;
this.code = code;
}
public static UserVo transformUserInfo(User user) {
return UserVo
.builder()
.id(user.getId())
.realName(user.getRealName())
.username(user.getUsername())
.mobile(user.getMobile())
.email(user.getEmail())
.avatar(user.getAvatar())
.enabled(user.getEnabled())
.deleted(user.getDeleted())
.lastLoginIp(user.getLastLoginIp())
.lastLoginTime(user.getLastLoginTime())
.createTime(user.getCreateTime())
.build();
}
}
/* (C) 2021 YiRing, Inc. */
package com.yiring.app.web;
import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.fastjson.JSONObject;
import com.yiring.app.constant.Code;
import com.yiring.app.exception.CodeException;
import com.yiring.app.push.domain.PushMessage;
import com.yiring.app.push.service.PushService;
import com.yiring.app.util.GeoUtils;
import com.yiring.common.core.Result;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
......@@ -11,6 +16,7 @@ import java.util.Arrays;
import java.util.List;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.locationtech.jts.geom.Point;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
......@@ -46,4 +52,12 @@ public class HelloController {
PageVo<String> vo = PageVo.build(data, data.size());
return Result.ok(vo);
}
@GetMapping("test")
public Result<Point> test() {
PushService service = SpringUtil.getBean(PushService.class);
service.push(PushMessage.Type.WS, new JSONObject().fluentPut("msg", "hello"));
Point point = GeoUtils.createPoint(112.1, 23.56);
return Result.ok(point);
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.web.dept;
import com.yiring.app.param.dept.DepartmentAddParam;
import com.yiring.app.param.dept.DepartmentFindParam;
import com.yiring.app.service.dept.DepartmentService;
import com.yiring.app.vo.dept.DepartmentInfoVo;
import com.yiring.app.vo.dept.DepartmentVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* 部门信息控制器
* @author LJ-2204
* @date 2022/4/19
*/
@Slf4j
@Validated
@Api(tags = "部门信息")
@RestController
@RequestMapping("/dept/")
public class DepartmentController {
@Resource
DepartmentService departmentService;
@ApiOperation("新增部门")
@PostMapping("addDepartment")
public Result<String> addDepartment(@Valid DepartmentAddParam param) {
return departmentService.addDepartment(param);
}
@ApiOperation("树形表格")
@GetMapping("findDepartmentTree")
public Result<PageVo<DepartmentVo>> findDepartmentTree(@Valid DepartmentFindParam param) {
return departmentService.findDepartmentTree(param);
}
@ApiOperation("部门详细信息")
@GetMapping("findDepartmentInfo")
public Result<DepartmentInfoVo> findDepartmentInfo(@Valid IdParam idParam) {
return departmentService.findDepartmentInfo(idParam);
}
@ApiOperation("部门导出")
@GetMapping("exportDepartment")
public void exportDepartment(@Valid DepartmentFindParam param, HttpServletResponse response) {
departmentService.exportDepartment(param, response);
}
@ApiOperation("逻辑删除部门")
@DeleteMapping("deleteDepartment")
public Result<String> deleteDepartment(@Valid IdParam idParam) {
return departmentService.deleteDepartment(idParam);
}
@ApiOperation("启用/停用")
@PutMapping("stateDepartment")
public Result<String> stateDepartment(@Valid IdParam idParam) {
return departmentService.stateDepartment(idParam);
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.web;
package com.yiring.app.web.location.tag;
import com.yiring.app.param.location.LocationTagAddParam;
import com.yiring.app.param.location.LocationTagDeleteParam;
......@@ -8,7 +8,7 @@ import com.yiring.app.param.location.LocationTagModifyParam;
import com.yiring.app.service.location.LocationTagService;
import com.yiring.app.vo.location.LocationTagVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
......@@ -44,8 +44,8 @@ public class LocationTagController {
@ApiOperation("分页查询")
@GetMapping("findLocationTagPage")
public Result<PageVo<LocationTagVo>> findLocationTagPage(@Valid LocationTagFindParam param) {
return locationTagService.findLocationTagPage(param);
public Result<PageVo<LocationTagVo>> findLocationTagPage(@Valid LocationTagFindParam param, PageParam pageParam) {
return locationTagService.findLocationTagPage(param, pageParam);
}
@ApiOperation("销毁定位标签")
......@@ -68,7 +68,7 @@ public class LocationTagController {
@ApiOperation("修改定位标签")
@PutMapping("modifyLocationTag")
public Result<String> modifyLocationTag(@Valid LocationTagModifyParam param, IdParam idParam) {
return locationTagService.modifyLocationTag(param, idParam);
public Result<String> modifyLocationTag(@Valid LocationTagModifyParam param) {
return locationTagService.modifyLocationTag(param);
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.auth.web.post;
package com.yiring.app.web.post;
import com.yiring.auth.param.post.PostFindParam;
import com.yiring.auth.param.post.PostParam;
import com.yiring.auth.service.post.PostService;
import com.yiring.auth.vo.post.PostVo;
import com.yiring.app.param.post.PostFindParam;
import com.yiring.app.param.post.PostParam;
import com.yiring.app.service.post.PostService;
import com.yiring.app.vo.post.PostVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
......@@ -53,8 +54,8 @@ public class PostController {
@ApiOperation(value = "分页查询")
@GetMapping("findPostPage")
public Result<PageVo<PostVo>> findPostPage(@Valid PostFindParam param) {
return postService.findPostPage(param);
public Result<PageVo<PostVo>> findPostPage(@Valid PostFindParam param, @Valid PageParam pageParam) {
return postService.findPostPage(param, pageParam);
}
@ApiOperation(value = "详细信息查询")
......@@ -68,4 +69,10 @@ public class PostController {
public void exportPostInfo(@Valid PostFindParam param, HttpServletResponse response) {
postService.exportPostInfo(param, response);
}
@ApiOperation(value = "下拉菜单")
@GetMapping("selectPost")
public Result<PageVo<PostVo>> selectPost() {
return postService.selectPost();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.web.user;
import com.yiring.app.param.user.UserBingTagParam;
import com.yiring.app.param.user.UserFindParam;
import com.yiring.app.service.user.UserService;
import com.yiring.app.vo.user.UserVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* 用户信息
*
* @author Jim
* @version 0.1
* 2022/1/24 14:13
*/
@Slf4j
@Validated
@Api(tags = "User")
@RestController
@RequestMapping("/user/")
public class UserAppController {
@Resource
UserService userService;
@ApiOperation("表格查询")
@GetMapping("findUserPage")
public Result<PageVo<UserVo>> findUserPage(@Valid UserFindParam param, @Valid PageParam pageParam) {
return userService.findUserPage(param, pageParam);
}
@ApiOperation("用户详细信息查询")
@GetMapping("findUserById")
public Result<UserVo> findUserById(@Valid IdParam idParam) {
return userService.findUserById(idParam);
}
@ApiOperation("给用户分配标签卡")
@PutMapping("userBingTag")
public Result<String> userBingTag(@Valid UserBingTagParam param) {
return userService.userBingTag(param);
}
@ApiOperation("收卡")
@PutMapping("userUnBingTag")
public Result<String> userUnBingTag(@Valid IdParam idParam) {
return userService.userUnBingTag(idParam);
}
@ApiOperation("逻辑删除用户")
@DeleteMapping("deleteUser")
public Result<String> deleteUser(@Valid IdParam idParam) {
return userService.deleteUser(idParam);
}
@ApiOperation("下拉菜单")
@GetMapping("selectUser")
public Result<PageVo<UserVo>> selectUser() {
return userService.selectUser();
}
@ApiOperation("用户导出")
@GetMapping("exportUser")
public void exportUser(@Valid UserFindParam param, HttpServletResponse response) {
userService.exportUser(param, response);
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.auth.domain.dept;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.yiring.auth.domain.post.Post;
import com.yiring.auth.domain.user.User;
import com.yiring.common.annotation.FieldMapping;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
......@@ -63,6 +65,7 @@ public class Department implements Serializable {
@ManyToOne
@JoinColumn(name = "leader_id")
@JsonIgnore
@Comment("负责人")
User leader;
......@@ -84,6 +87,12 @@ public class Department implements Serializable {
@Comment("树节点标识")
String tree;
@Comment("更新时间")
LocalDateTime updateTime;
@Comment("创建时间")
LocalDateTime createTime;
@Comment("岗位集合")
@Builder.Default
@ToString.Exclude
......
......@@ -3,6 +3,7 @@ package com.yiring.auth.domain.dept;
import java.io.Serializable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
/**
......@@ -12,4 +13,5 @@ import org.springframework.stereotype.Repository;
*/
@Repository
public interface DepartmentRepository extends JpaRepository<Department, Serializable> {}
public interface DepartmentRepository
extends JpaRepository<Department, Serializable>, JpaSpecificationExecutor<Department> {}
......@@ -3,6 +3,7 @@ package com.yiring.auth.domain.post;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
......@@ -49,6 +50,12 @@ public class Post implements Serializable {
@Comment("描述")
String describe;
@Comment("创建时间")
LocalDateTime createTime;
@Comment("更新时间")
LocalDateTime updateTime;
@Comment("是否启用")
Boolean enable;
}
......@@ -110,9 +110,15 @@ public class User extends BasicEntity implements Serializable {
@Comment("所属部门")
@ManyToOne
@JsonIgnore
@JoinColumn(name = "department_id")
Department department;
@Comment("所属职称")
@ManyToOne
@JoinColumn(name = "post_id")
Post post;
@Comment("用户类型")
@Enumerated(EnumType.STRING)
Type type;
......
......@@ -3,6 +3,7 @@ package com.yiring.auth.domain.user;
import java.io.Serializable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
......@@ -14,7 +15,7 @@ import org.springframework.stereotype.Repository;
*/
@Repository
public interface UserRepository extends JpaRepository<User, Serializable> {
public interface UserRepository extends JpaRepository<User, Serializable>, JpaSpecificationExecutor<User> {
/**
* 根据用户名称查询用户信息
*
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.auth.excel.post;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.github.liaochong.myexcel.core.annotation.ExcelColumn;
import com.github.liaochong.myexcel.core.annotation.ExcelModel;
import com.yiring.auth.domain.post.Post;
......@@ -25,9 +24,9 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE)
public class PostExcel {
@ExcelColumn(title = "编号")
/*@ExcelColumn(title = "编号")
@JsonSerialize(using = ToStringSerializer.class)
Long id;
Long id;*/
@ExcelColumn(title = "职位名称")
String name;
......@@ -36,8 +35,10 @@ public class PostExcel {
String describe;
@ExcelColumn(title = "是否启用")
@JsonSerialize(using = ToStringSerializer.class)
Boolean enable;
String enable;
@ExcelColumn(title = "创建时间")
String createTime;
public static List<PostExcel> transforms(List<Post> posts) {
return posts
......@@ -45,10 +46,11 @@ public class PostExcel {
.map(post ->
PostExcel
.builder()
.id(post.getId())
// .id(post.getId())
.name(post.getName())
.describe(post.getDescribe())
.enable(post.getEnable())
.enable(post.getEnable() ? "启用" : "禁用")
.createTime(LocalDateTimeUtil.format(post.getCreateTime(), "yyyy-MM-dd HH:mm:ss"))
.build()
)
.collect(Collectors.toList());
......
......@@ -5,13 +5,8 @@ import cn.hutool.core.convert.Convert;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.hutool.http.Header;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.yiring.common.core.Result;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
......@@ -41,10 +36,6 @@ public class ZyUtil {
public final String KEY = "zy_token";
public final String TOKEN_TYPE = "bearer ";
public final String URL_PREFIX = "http://project.yz-online.com:789";
/**
* 获取token
* @return token
......@@ -61,7 +52,8 @@ public class ZyUtil {
String json = HttpUtil.get("http://project.yz-online.com:789/positionApi/oauth/token", map);
Map result = JSON.parseObject(json, Map.class);
String access_token = result.get("access_token").toString();
redisTemplate.opsForValue().set(KEY, access_token, 1200, TimeUnit.SECONDS);
String expires_in = result.get("expires_in").toString();
redisTemplate.opsForValue().set(KEY, access_token, Convert.toInt(expires_in), TimeUnit.SECONDS);
return access_token;
}
......@@ -72,100 +64,4 @@ public class ZyUtil {
public static boolean getToken() {
return ObjectUtil.isNotEmpty(redisTemplate.opsForValue().get(KEY));
}
/**
* get请求
* @param urlString 路径
* @param obj 参数
* @param timeout 请求时长
* @return json
*/
public static Result get(String urlString, Object obj, int timeout) {
String json = JSONUtil.toJsonStr(obj);
String token = login();
String body = HttpRequest
.get(URL_PREFIX + urlString)
.header(Header.AUTHORIZATION, TOKEN_TYPE + token)
.header(Header.CONTENT_TYPE, "application/json")
.body(json)
.timeout(timeout)
.execute()
.body();
return getResult(body);
}
/**
* post请求
* @param urlString 路径
* @param obj 参数
* @param timeout 请求时长
* @return json
*/
public static Result<Serializable> post(String urlString, Object obj, int timeout) {
String json = JSONUtil.toJsonStr(obj);
String token = login();
String body = HttpRequest
.post(URL_PREFIX + urlString)
.header(Header.AUTHORIZATION, TOKEN_TYPE + token)
.header(Header.CONTENT_TYPE, "application/json")
.body(json)
.timeout(timeout)
.execute()
.body();
return getResult(body);
}
/**
* put请求
* @param urlString 路径
* @param obj 参数
* @param timeout 请求时长
* @return json
*/
public static Result<Serializable> put(String urlString, Object obj, int timeout) {
String json = JSONUtil.toJsonStr(obj);
String token = login();
String body = HttpRequest
.put(URL_PREFIX + urlString)
.header(Header.AUTHORIZATION, TOKEN_TYPE + token)
.header(Header.CONTENT_TYPE, "application/json")
.body(json)
.timeout(timeout)
.execute()
.body();
return getResult(body);
}
/**
* delete请求
* @param urlString 路径
* @param obj 参数
* @param timeout 请求时长
* @return json
*/
public static Result<Serializable> delete(String urlString, Object obj, int timeout) {
String json = JSONUtil.toJsonStr(obj);
String token = login();
String body = HttpRequest
.delete(URL_PREFIX + urlString)
.header(Header.AUTHORIZATION, TOKEN_TYPE + token)
.header(Header.CONTENT_TYPE, "application/json")
.body(json)
.timeout(timeout)
.execute()
.body();
return getResult(body);
}
/**
* 返回类型转换
* @param body json
* @return Result
*/
private static Result<Serializable> getResult(String body) {
Map map = JSONUtil.toBean(body, Map.class);
Integer code = Convert.toInt(map.get("code"));
String msg = Convert.toStr(map.get("msg"));
return Result.builder().code(code).message(msg).build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.common.config;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
/**
* 线程池
* @author LJ-2204
* @date 2022/4/18
*/
@Configuration
@EnableAsync
@Slf4j
public class ExecutorConfig {
@Bean("httpThreadPool")
public Executor asyncServiceExecutor() {
log.info("start asyncServiceExecutor");
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(10);
//配置最大线程数
executor.setMaxPoolSize(100);
//配置队列大小
executor.setQueueCapacity(10000);
//配置线程池中的线程的名称前缀
//线程池维护线程所允许的空闲时间
executor.setKeepAliveSeconds(60);
executor.setThreadNamePrefix("async--");
// rejection-policy:当pool已经达到maxsize的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//执行初始化
executor.initialize();
return executor;
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论