提交 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. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.excel.location; package com.yiring.app.excel.location;
import com.fasterxml.jackson.databind.annotation.JsonSerialize; import cn.hutool.core.date.LocalDateTimeUtil;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.github.liaochong.myexcel.core.annotation.ExcelColumn; import com.github.liaochong.myexcel.core.annotation.ExcelColumn;
import com.github.liaochong.myexcel.core.annotation.ExcelModel; import com.github.liaochong.myexcel.core.annotation.ExcelModel;
import com.yiring.app.domain.location.LocationTag; import com.yiring.app.domain.location.LocationTag;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import lombok.AccessLevel; import lombok.AccessLevel;
...@@ -27,11 +26,12 @@ import lombok.experimental.FieldDefaults; ...@@ -27,11 +26,12 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class LocationTagExportExcel implements Serializable { public class LocationTagExportExcel implements Serializable {
@Serial
private static final long serialVersionUID = -4549580878785078998L; private static final long serialVersionUID = -4549580878785078998L;
@ExcelColumn(title = "主键") /* @ExcelColumn(title = "主键")
@JsonSerialize(using = ToStringSerializer.class) @JsonSerialize(using = ToStringSerializer.class)
Long id; Long id;*/
@ExcelColumn(title = "编号") @ExcelColumn(title = "编号")
String code; String code;
...@@ -49,7 +49,7 @@ public class LocationTagExportExcel implements Serializable { ...@@ -49,7 +49,7 @@ public class LocationTagExportExcel implements Serializable {
Integer volt; Integer volt;
@ExcelColumn(title = "最近更新时间") @ExcelColumn(title = "最近更新时间")
LocalDateTime updateTime; String updateTime;
public static List<LocationTagExportExcel> transforms(List<LocationTag> locationTags) { public static List<LocationTagExportExcel> transforms(List<LocationTag> locationTags) {
return locationTags return locationTags
...@@ -57,13 +57,12 @@ public class LocationTagExportExcel implements Serializable { ...@@ -57,13 +57,12 @@ public class LocationTagExportExcel implements Serializable {
.map(locationTag -> .map(locationTag ->
LocationTagExportExcel LocationTagExportExcel
.builder() .builder()
.id(locationTag.getId())
.code(locationTag.getCode()) .code(locationTag.getCode())
.type(locationTag.getType()) .type(locationTag.getType())
.silent(locationTag.getSilent()) .silent(locationTag.getSilent())
.imei(locationTag.getImei()) .imei(locationTag.getImei())
.volt(locationTag.getVolt()) .volt(locationTag.getVolt())
.updateTime(locationTag.getUpdateTime()) .updateTime(LocalDateTimeUtil.format(locationTag.getUpdateTime(), "yyyy-MM-dd HH:mm:ss"))
.build() .build()
) )
.collect(Collectors.toList()); .collect(Collectors.toList());
......
...@@ -3,7 +3,9 @@ package com.yiring.app.excel.location; ...@@ -3,7 +3,9 @@ package com.yiring.app.excel.location;
import com.github.liaochong.myexcel.core.annotation.ExcelColumn; import com.github.liaochong.myexcel.core.annotation.ExcelColumn;
import com.yiring.app.domain.location.LocationTag; import com.yiring.app.domain.location.LocationTag;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.*; import lombok.*;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
...@@ -19,6 +21,7 @@ import lombok.experimental.FieldDefaults; ...@@ -19,6 +21,7 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class LocationTagImportExcel implements Serializable { public class LocationTagImportExcel implements Serializable {
@Serial
private static final long serialVersionUID = -8817732062049005201L; private static final long serialVersionUID = -8817732062049005201L;
// 编号 // 编号
...@@ -34,6 +37,12 @@ public class LocationTagImportExcel implements Serializable { ...@@ -34,6 +37,12 @@ public class LocationTagImportExcel implements Serializable {
String imei; String imei;
public LocationTag transform() { 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; ...@@ -4,7 +4,10 @@ package com.yiring.app.param.location;
import com.yiring.app.domain.location.LocationTag; import com.yiring.app.domain.location.LocationTag;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime;
import javax.validation.constraints.NotNull;
import lombok.*; import lombok.*;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
...@@ -22,18 +25,31 @@ import lombok.experimental.FieldDefaults; ...@@ -22,18 +25,31 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class LocationTagAddParam implements Serializable { public class LocationTagAddParam implements Serializable {
@Serial
private static final long serialVersionUID = -2942040230386389302L; private static final long serialVersionUID = -2942040230386389302L;
@ApiModelProperty(value = "编号", example = "BTT88888888", required = true) @ApiModelProperty(value = "编号", example = "BTT88888888", required = true)
@NotNull
String code; String code;
@ApiModelProperty(value = "标签类型", example = "蓝牙人员定位卡", required = true) @ApiModelProperty(value = "标签类型", example = "蓝牙人员定位卡", required = true)
@NotNull
LocationTag.Type type; LocationTag.Type type;
@ApiModelProperty(value = "imei 设备编码标识", example = "88888888") @ApiModelProperty(value = "imei 设备编码标识", example = "88888888")
String imei; String imei;
public LocationTag transform() { 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. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.location; package com.yiring.app.param.location;
import com.yiring.auth.domain.user.User;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import lombok.*; import lombok.*;
...@@ -23,12 +23,14 @@ import lombok.experimental.FieldDefaults; ...@@ -23,12 +23,14 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class LocationTagDeleteParam implements Serializable { public class LocationTagDeleteParam implements Serializable {
@Serial
private static final long serialVersionUID = 2404060244461070885L; private static final long serialVersionUID = 2404060244461070885L;
@ApiModelProperty(value = "id", example = "145235231", required = true) @ApiModelProperty(value = "ids", example = "145235231,145235232", required = true)
@NotNull(message = "id 不能为空") @NotNull(message = "ids 不能为空")
Long id; Long[] ids;
@ApiModelProperty(value = "人员", example = "1") @ApiModelProperty(value = "codes", example = "BTT99999998,BTT99999999", required = true)
User user; @NotNull(message = "codes 不能为空")
String[] codes;
} }
...@@ -4,6 +4,7 @@ package com.yiring.app.param.location; ...@@ -4,6 +4,7 @@ package com.yiring.app.param.location;
import com.yiring.app.domain.location.LocationTag; import com.yiring.app.domain.location.LocationTag;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import lombok.*; import lombok.*;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
...@@ -22,6 +23,7 @@ import lombok.experimental.FieldDefaults; ...@@ -22,6 +23,7 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class LocationTagFindParam implements Serializable { public class LocationTagFindParam implements Serializable {
@Serial
private static final long serialVersionUID = -5134311481372693111L; private static final long serialVersionUID = -5134311481372693111L;
@ApiModelProperty(value = "编号", example = "BTT88888888") @ApiModelProperty(value = "编号", example = "BTT88888888")
...@@ -32,10 +34,4 @@ public class LocationTagFindParam implements Serializable { ...@@ -32,10 +34,4 @@ public class LocationTagFindParam implements Serializable {
@ApiModelProperty(value = "状态", example = "true") @ApiModelProperty(value = "状态", example = "true")
Boolean silent; Boolean silent;
@ApiModelProperty(value = "每页记录数", example = "10")
Integer pageSize;
@ApiModelProperty(value = "页码", example = "1")
Integer pageNo;
} }
...@@ -4,6 +4,7 @@ package com.yiring.app.param.location; ...@@ -4,6 +4,7 @@ package com.yiring.app.param.location;
import com.yiring.app.domain.location.LocationTag; import com.yiring.app.domain.location.LocationTag;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import lombok.*; import lombok.*;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
...@@ -22,8 +23,12 @@ import lombok.experimental.FieldDefaults; ...@@ -22,8 +23,12 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class LocationTagModifyParam implements Serializable { public class LocationTagModifyParam implements Serializable {
@Serial
private static final long serialVersionUID = 7711908393372149723L; private static final long serialVersionUID = 7711908393372149723L;
@ApiModelProperty(value = "id", example = "7777777", required = true)
Long id;
@ApiModelProperty(value = "编号", example = "BTT88888888", required = true) @ApiModelProperty(value = "编号", example = "BTT88888888", required = true)
String code; String code;
......
...@@ -3,9 +3,13 @@ package com.yiring.app.param.location.zy; ...@@ -3,9 +3,13 @@ package com.yiring.app.param.location.zy;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.yiring.app.domain.location.LocationTag; import com.yiring.app.domain.location.LocationTag;
import com.yiring.app.excel.location.LocationTagImportExcel;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;
import lombok.*; import lombok.*;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
...@@ -23,10 +27,11 @@ import lombok.experimental.FieldDefaults; ...@@ -23,10 +27,11 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class ZyLocationTagAddParam implements Serializable { public class ZyLocationTagAddParam implements Serializable {
@Serial
private static final long serialVersionUID = -8828137320896062620L; private static final long serialVersionUID = -8828137320896062620L;
@ApiModelProperty(value = "工厂", example = "100") @ApiModelProperty(value = "工厂", example = "100")
String orgId; Integer orgId;
@ApiModelProperty(value = "标签类型", example = "蓝牙人员定位卡", required = true) @ApiModelProperty(value = "标签类型", example = "蓝牙人员定位卡", required = true)
LocationTag.Type types; LocationTag.Type types;
...@@ -37,14 +42,33 @@ public class ZyLocationTagAddParam implements Serializable { ...@@ -37,14 +42,33 @@ public class ZyLocationTagAddParam implements Serializable {
@ApiModelProperty(value = "实体类型", example = "car", required = true) @ApiModelProperty(value = "实体类型", example = "car", required = true)
String entityType; 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"; String entityType = StrUtil.equals(locationTag.getType().name(), "BTT02") ? "car" : "staff";
return ZyLocationTagAddParam return ZyLocationTagAddParam
.builder() .builder()
.orgId("100") .orgId(orgId)
.tagId(locationTag.getCode()) .tagId(locationTag.getCode())
.types(locationTag.getType()) .types(locationTag.getType())
.entityType(entityType) .entityType(entityType)
.build(); .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. */ /* (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.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import lombok.*; import lombok.*;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
...@@ -21,6 +22,7 @@ import lombok.experimental.FieldDefaults; ...@@ -21,6 +22,7 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class PostFindParam implements Serializable { public class PostFindParam implements Serializable {
@Serial
private static final long serialVersionUID = 1926710333813935577L; private static final long serialVersionUID = 1926710333813935577L;
@ApiModelProperty(value = "名称", example = "Java") @ApiModelProperty(value = "名称", example = "Java")
...@@ -28,10 +30,4 @@ public class PostFindParam implements Serializable { ...@@ -28,10 +30,4 @@ public class PostFindParam implements Serializable {
@ApiModelProperty(value = "是否启用", example = "true") @ApiModelProperty(value = "是否启用", example = "true")
Boolean enable; Boolean enable;
@ApiModelProperty(value = "每页记录数", example = "10")
Integer pageSize;
@ApiModelProperty(value = "页码", example = "1")
Integer pageNo;
} }
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.auth.param.post; package com.yiring.app.param.post;
import com.yiring.auth.domain.post.Post; import com.yiring.auth.domain.post.Post;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import javax.validation.constraints.NotNull;
import lombok.*; import lombok.*;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
...@@ -22,9 +24,11 @@ import lombok.experimental.FieldDefaults; ...@@ -22,9 +24,11 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class PostParam implements Serializable { public class PostParam implements Serializable {
@Serial
private static final long serialVersionUID = 5247408856592333466L; private static final long serialVersionUID = 5247408856592333466L;
@ApiModelProperty(value = "名称", example = "Java", required = true) @ApiModelProperty(value = "名称", example = "Java", required = true)
@NotNull
String name; String name;
@ApiModelProperty(value = "描述", example = "描述", required = true) @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; ...@@ -7,7 +7,7 @@ import com.yiring.app.param.location.LocationTagFindParam;
import com.yiring.app.param.location.LocationTagModifyParam; import com.yiring.app.param.location.LocationTagModifyParam;
import com.yiring.app.vo.location.LocationTagVo; import com.yiring.app.vo.location.LocationTagVo;
import com.yiring.common.core.Result; 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 com.yiring.common.vo.PageVo;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
...@@ -30,7 +30,7 @@ public interface LocationTagService { ...@@ -30,7 +30,7 @@ public interface LocationTagService {
* @param param 入参 * @param param 入参
* @return Result<PageVo<LocationTagVo>> * @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 { ...@@ -58,5 +58,5 @@ public interface LocationTagService {
* @param param 入参 * @param param 入参
* @return Result<String> * @return Result<String>
*/ */
Result<String> modifyLocationTag(LocationTagModifyParam param, IdParam idParam); Result<String> modifyLocationTag(LocationTagModifyParam param);
} }
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
package com.yiring.app.service.location.impl; package com.yiring.app.service.location.impl;
import cn.hutool.core.collection.ListUtil; import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder; import com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder;
...@@ -16,22 +17,18 @@ import com.yiring.app.param.location.LocationTagFindParam; ...@@ -16,22 +17,18 @@ import com.yiring.app.param.location.LocationTagFindParam;
import com.yiring.app.param.location.LocationTagModifyParam; import com.yiring.app.param.location.LocationTagModifyParam;
import com.yiring.app.param.location.zy.ZyLocationTagAddParam; import com.yiring.app.param.location.zy.ZyLocationTagAddParam;
import com.yiring.app.service.location.LocationTagService; import com.yiring.app.service.location.LocationTagService;
import com.yiring.app.service.zy.ZyHttpService;
import com.yiring.app.vo.location.LocationTagVo; import com.yiring.app.vo.location.LocationTagVo;
import com.yiring.auth.util.ZyUtil;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.core.Status; 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 com.yiring.common.vo.PageVo;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.Serializable;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.annotation.Resource; import javax.annotation.Resource;
...@@ -61,36 +58,34 @@ public class LocationTagServiceImpl implements LocationTagService { ...@@ -61,36 +58,34 @@ public class LocationTagServiceImpl implements LocationTagService {
final Integer FACTORY_ID = 100; final Integer FACTORY_ID = 100;
@Resource @Resource
ZyHttpService zyHttpService;
@Resource
LocationTagRepository locationTagRepository; LocationTagRepository locationTagRepository;
@Override @Override
public Result<String> addLocationTag(LocationTagAddParam param) { public Result<String> addLocationTag(LocationTagAddParam param) {
if (hasLocationTagInfoByCode(param.getCode())) return Result.no(Status.BAD_REQUEST, "编号已存在"); if (hasLocationTagInfoByCode(param.getCode())) return Result.no(Status.BAD_REQUEST, "编号已存在");
LocationTag locationTag = param.transform(); LocationTag locationTag = param.transform();
locationTagRepository.save(locationTag); ZyLocationTagAddParam zyLocationTagAddParam = ZyLocationTagAddParam.transform(locationTag, FACTORY_ID);
ZyLocationTagAddParam zyLocationTagAddParam = ZyLocationTagAddParam.transform(locationTag);
List<ZyLocationTagAddParam> of = ListUtil.of(zyLocationTagAddParam); List<ZyLocationTagAddParam> of = ListUtil.of(zyLocationTagAddParam);
new Thread(() -> { zyHttpService.post("/positionApi/api/tag/saveTag", of, 3000);
Result<Serializable> result = ZyUtil.post("/positionApi/api/tag/saveTag", of, 3000); locationTagRepository.save(locationTag);
if (result.getCode() != 200) throw new RuntimeException(result.getMessage());
})
.start();
return Result.ok(); return Result.ok();
} }
@Override @Override
public Result<PageVo<LocationTagVo>> findLocationTagPage(LocationTagFindParam param) { public Result<PageVo<LocationTagVo>> findLocationTagPage(LocationTagFindParam param, PageParam pageParam) {
Specification<LocationTag> specification = getLocationTagPageSpecification(param); Specification<LocationTag> specification = getLocationTagPageSpecification(param);
Sort sort = Sort.by(Sort.Order.desc(LocationTag.Fields.createTime)); 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); Page<LocationTag> locationTags = locationTagRepository.findAll(specification, pageable);
List<LocationTagVo> locationTagVos = LocationTagVo.transforms(locationTags.getContent()); 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); return Result.ok(page);
} else { } else {
List<LocationTag> locationTags = locationTagRepository.findAll(specification, sort); List<LocationTag> locationTags = locationTagRepository.findAll(specification, sort);
...@@ -102,8 +97,12 @@ public class LocationTagServiceImpl implements LocationTagService { ...@@ -102,8 +97,12 @@ public class LocationTagServiceImpl implements LocationTagService {
@Override @Override
public Result<String> deleteLocationTag(LocationTagDeleteParam param) { public Result<String> deleteLocationTag(LocationTagDeleteParam param) {
if (ObjectUtil.isNotEmpty(param.getUser())) return Result.no(Status.BAD_REQUEST, "请先解绑人员"); if (ObjectUtil.isEmpty(param)) return Result.no(Status.EXPECTATION_FAILED);
locationTagRepository.deleteById(param.getId()); 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(); return Result.ok();
} }
...@@ -128,6 +127,7 @@ public class LocationTagServiceImpl implements LocationTagService { ...@@ -128,6 +127,7 @@ public class LocationTagServiceImpl implements LocationTagService {
String fileName = URLEncoder.encode("定位标签信息.xlsx", StandardCharsets.UTF_8); String fileName = URLEncoder.encode("定位标签信息.xlsx", StandardCharsets.UTF_8);
response.setContentType("application/octet-stream"); response.setContentType("application/octet-stream");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName); response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
OutputStream out = response.getOutputStream(); OutputStream out = response.getOutputStream();
...@@ -157,32 +157,27 @@ public class LocationTagServiceImpl implements LocationTagService { ...@@ -157,32 +157,27 @@ public class LocationTagServiceImpl implements LocationTagService {
log.info(e.getMessage()); log.info(e.getMessage());
throw new RuntimeException("文件导入异常"); throw new RuntimeException("文件导入异常");
} }
List<LocationTag> locationTags;
List<LocationTag> locationTags = locationTagImportExcels
.stream() locationTags =
.map(LocationTagImportExcel::transform) locationTagImportExcels
.collect(Collectors.toList()); .stream()
.filter(locationTagImportExcel -> !hasLocationTagInfoByCode(locationTagImportExcel.getCode()))
locationTags.forEach(locationTag -> { .map(LocationTagImportExcel::transform)
locationTagRepository .collect(Collectors.toList());
.findOne((root, cq, cb) -> {
List<Predicate> predicates = new ArrayList<>(); List<ZyLocationTagAddParam> zyLocationTagAddParams = ZyLocationTagAddParam.transforms(
locationTagImportExcels,
if (StrUtil.isNotEmpty(locationTag.getCode())) { FACTORY_ID
predicates.add(cb.equal(root.get(LocationTag.Fields.code), locationTag.getCode())); );
} zyHttpService.post("/positionApi/api/tag/saveTag", zyLocationTagAddParams, 3000);
locationTagRepository.saveAll(locationTags);
return cq.where(predicates.toArray(new Predicate[0])).getRestriction();
})
.ifPresent(temp -> locationTag.setId(temp.getId()));
locationTagRepository.save(locationTag);
});
return Result.ok(); return Result.ok();
} }
@Override @Override
public Result<String> modifyLocationTag(LocationTagModifyParam param, IdParam idParam) { public Result<String> modifyLocationTag(LocationTagModifyParam param) {
Optional<LocationTag> locationTagOptional = locationTagRepository.findById(idParam.getId()); Optional<LocationTag> locationTagOptional = locationTagRepository.findById(param.getId());
if (locationTagOptional.isEmpty()) return Result.no(Status.BAD_REQUEST, "被修改的数据不存在"); if (locationTagOptional.isEmpty()) return Result.no(Status.BAD_REQUEST, "被修改的数据不存在");
LocationTag locationTag = locationTagOptional.get(); LocationTag locationTag = locationTagOptional.get();
...@@ -192,7 +187,7 @@ public class LocationTagServiceImpl implements LocationTagService { ...@@ -192,7 +187,7 @@ public class LocationTagServiceImpl implements LocationTagService {
} }
locationTag = param.transform(); locationTag = param.transform();
locationTag.setId(idParam.getId()); locationTag.setId(param.getId());
locationTagRepository.save(locationTag); locationTagRepository.save(locationTag);
return Result.ok(); return Result.ok();
...@@ -209,15 +204,15 @@ public class LocationTagServiceImpl implements LocationTagService { ...@@ -209,15 +204,15 @@ public class LocationTagServiceImpl implements LocationTagService {
List<Predicate> predicates = ListUtil.toList(); List<Predicate> predicates = ListUtil.toList();
if (StrUtil.isNotEmpty(param.getCode())) { 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())) { 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())) { 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)); Order order = cb.desc(root.get(LocationTag.Fields.createTime));
......
/* (C) 2022 YiRing, Inc. */ /* (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.app.param.post.PostFindParam;
import com.yiring.auth.param.post.PostParam; import com.yiring.app.param.post.PostParam;
import com.yiring.auth.vo.post.PostVo; import com.yiring.app.vo.post.PostVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam; import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo; import com.yiring.common.vo.PageVo;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
...@@ -42,7 +43,7 @@ public interface PostService { ...@@ -42,7 +43,7 @@ public interface PostService {
* @param param 入参 * @param param 入参
* @return Result<PageVo<PostVo>> * @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 { ...@@ -64,4 +65,10 @@ public interface PostService {
* @param response 响应信息 * @param response 响应信息
*/ */
void exportPostInfo(PostFindParam param, HttpServletResponse response); void exportPostInfo(PostFindParam param, HttpServletResponse response);
/**
* 下拉菜单
* @return Result<PageVo<PostVo>>
*/
Result<PageVo<PostVo>> selectPost();
} }
/* (C) 2022 YiRing, Inc. */ /* (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.collection.ListUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder; 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.Post;
import com.yiring.auth.domain.post.PostRepository; import com.yiring.auth.domain.post.PostRepository;
import com.yiring.auth.excel.post.PostExcel; 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.Result;
import com.yiring.common.core.Status; import com.yiring.common.core.Status;
import com.yiring.common.param.IdParam; import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo; import com.yiring.common.vo.PageVo;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.persistence.criteria.Order;
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.data.domain.Example; import org.springframework.data.domain.*;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
...@@ -52,6 +52,7 @@ public class PostServiceImpl implements PostService { ...@@ -52,6 +52,7 @@ public class PostServiceImpl implements PostService {
public Result<String> addPost(PostParam postParam) { public Result<String> addPost(PostParam postParam) {
if (hasPostInfo(postParam.getName())) return Result.no(Status.BAD_REQUEST, "职位已存在"); if (hasPostInfo(postParam.getName())) return Result.no(Status.BAD_REQUEST, "职位已存在");
Post post = postParam.transform(); Post post = postParam.transform();
post.setCreateTime(LocalDateTime.now());
postRepository.save(post); postRepository.save(post);
return Result.ok(); return Result.ok();
} }
...@@ -66,8 +67,10 @@ public class PostServiceImpl implements PostService { ...@@ -66,8 +67,10 @@ public class PostServiceImpl implements PostService {
if (!StrUtil.equals(post.getName(), postParam.getName())) { if (!StrUtil.equals(post.getName(), postParam.getName())) {
if (hasPostInfo(postParam.getName())) return Result.no(Status.BAD_REQUEST, "职位已存在"); if (hasPostInfo(postParam.getName())) return Result.no(Status.BAD_REQUEST, "职位已存在");
} }
post.setName(postParam.getName());
post = postParam.transform(); post.setDescribe(postParam.getDescribe());
post.setEnable(postParam.getEnable());
post.setUpdateTime(LocalDateTime.now());
post.setId(idParam.getId()); post.setId(idParam.getId());
postRepository.save(post); postRepository.save(post);
return Result.ok(); return Result.ok();
...@@ -81,18 +84,20 @@ public class PostServiceImpl implements PostService { ...@@ -81,18 +84,20 @@ public class PostServiceImpl implements PostService {
} }
@Override @Override
public Result<PageVo<PostVo>> findPostPage(PostFindParam param) { public Result<PageVo<PostVo>> findPostPage(PostFindParam param, PageParam pageParam) {
Specification<Post> specification = getPostPageSpecification(param); 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); Page<Post> page = postRepository.findAll(specification, pageable);
List<PostVo> postVos = PostVo.transforms(page.getContent()); List<PostVo> postVos = PostVo.transforms(page.getContent());
PageVo<PostVo> pageVo = PageVo.build(postVos, postVos.size()); PageVo<PostVo> pageVo = PageVo.build(postVos, postVos.size());
return Result.ok(pageVo); return Result.ok(pageVo);
} else { } else {
List<Post> posts = postRepository.findAll(specification); List<Post> posts = postRepository.findAll(specification, sort);
List<PostVo> postVos = PostVo.transforms(posts); List<PostVo> postVos = PostVo.transforms(posts);
PageVo<PostVo> pageVo = PageVo.build(postVos, postVos.size()); PageVo<PostVo> pageVo = PageVo.build(postVos, postVos.size());
return Result.ok(pageVo); return Result.ok(pageVo);
...@@ -133,6 +138,7 @@ public class PostServiceImpl implements PostService { ...@@ -133,6 +138,7 @@ public class PostServiceImpl implements PostService {
String fileName = URLEncoder.encode("职位信息.xlsx", StandardCharsets.UTF_8); String fileName = URLEncoder.encode("职位信息.xlsx", StandardCharsets.UTF_8);
response.setContentType("application/octet-stream"); response.setContentType("application/octet-stream");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName); response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
OutputStream out = response.getOutputStream(); OutputStream out = response.getOutputStream();
...@@ -147,19 +153,29 @@ public class PostServiceImpl implements PostService { ...@@ -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) { private Specification<Post> getPostPageSpecification(PostFindParam param) {
return (root, cq, cb) -> { return (root, cq, cb) -> {
List<Predicate> predicates = ListUtil.toList(); List<Predicate> predicates = ListUtil.toList();
if (StrUtil.isNotEmpty(param.getName())) { 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())) { if (ObjectUtil.isNotEmpty(param.getEnable())) {
predicates.add(cb.equal(root.get(Post.Fields.enable), 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; ...@@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.domain.location.LocationTag; import com.yiring.app.domain.location.LocationTag;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
...@@ -27,6 +28,7 @@ import lombok.experimental.FieldDefaults; ...@@ -27,6 +28,7 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class LocationTagVo implements Serializable { public class LocationTagVo implements Serializable {
@Serial
private static final long serialVersionUID = -7884163207638158359L; private static final long serialVersionUID = -7884163207638158359L;
@JsonSerialize(using = ToStringSerializer.class) @JsonSerialize(using = ToStringSerializer.class)
...@@ -62,6 +64,8 @@ public class LocationTagVo implements Serializable { ...@@ -62,6 +64,8 @@ public class LocationTagVo implements Serializable {
.type(locationTag.getType()) .type(locationTag.getType())
.silent(locationTag.getSilent()) .silent(locationTag.getSilent())
.volt(locationTag.getVolt()) .volt(locationTag.getVolt())
.imei(locationTag.getImei())
.updateTime(locationTag.getUpdateTime())
.build() .build()
) )
.collect(Collectors.toList()); .collect(Collectors.toList());
......
/* (C) 2022 YiRing, Inc. */ /* (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.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.auth.domain.post.Post; import com.yiring.auth.domain.post.Post;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import lombok.*; import lombok.*;
...@@ -26,6 +28,7 @@ import lombok.experimental.FieldDefaults; ...@@ -26,6 +28,7 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class PostVo implements Serializable { public class PostVo implements Serializable {
@Serial
private static final long serialVersionUID = 1011259844584399825L; private static final long serialVersionUID = 1011259844584399825L;
@JsonSerialize(using = ToStringSerializer.class) @JsonSerialize(using = ToStringSerializer.class)
...@@ -38,6 +41,12 @@ public class PostVo implements Serializable { ...@@ -38,6 +41,12 @@ public class PostVo implements Serializable {
@ApiModelProperty(value = "描述", example = "描述") @ApiModelProperty(value = "描述", example = "描述")
String describe; String describe;
@ApiModelProperty(value = "创建时间", example = "创建时间")
LocalDateTime createTime;
@ApiModelProperty(value = "更新时间", example = "更新时间")
LocalDateTime updateTime;
@ApiModelProperty(value = "是否启用", example = "true") @ApiModelProperty(value = "是否启用", example = "true")
Boolean enable; Boolean enable;
...@@ -48,6 +57,8 @@ public class PostVo implements Serializable { ...@@ -48,6 +57,8 @@ public class PostVo implements Serializable {
.name(post.getName()) .name(post.getName())
.describe(post.getDescribe()) .describe(post.getDescribe())
.enable(post.getEnable()) .enable(post.getEnable())
.createTime(post.getCreateTime())
.updateTime(post.getUpdateTime())
.build(); .build();
} }
...@@ -61,6 +72,8 @@ public class PostVo implements Serializable { ...@@ -61,6 +72,8 @@ public class PostVo implements Serializable {
.name(post.getName()) .name(post.getName())
.describe(post.getDescribe()) .describe(post.getDescribe())
.enable(post.getEnable()) .enable(post.getEnable())
.createTime(post.getCreateTime())
.updateTime(post.getUpdateTime())
.build() .build()
) )
.collect(Collectors.toList()); .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. */ /* (C) 2021 YiRing, Inc. */
package com.yiring.app.web; 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.constant.Code;
import com.yiring.app.exception.CodeException; 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.core.Result;
import com.yiring.common.param.PageParam; import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo; import com.yiring.common.vo.PageVo;
...@@ -11,6 +16,7 @@ import java.util.Arrays; ...@@ -11,6 +16,7 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.locationtech.jts.geom.Point;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
...@@ -46,4 +52,12 @@ public class HelloController { ...@@ -46,4 +52,12 @@ public class HelloController {
PageVo<String> vo = PageVo.build(data, data.size()); PageVo<String> vo = PageVo.build(data, data.size());
return Result.ok(vo); 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. */ /* (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.LocationTagAddParam;
import com.yiring.app.param.location.LocationTagDeleteParam; import com.yiring.app.param.location.LocationTagDeleteParam;
...@@ -8,7 +8,7 @@ import com.yiring.app.param.location.LocationTagModifyParam; ...@@ -8,7 +8,7 @@ import com.yiring.app.param.location.LocationTagModifyParam;
import com.yiring.app.service.location.LocationTagService; import com.yiring.app.service.location.LocationTagService;
import com.yiring.app.vo.location.LocationTagVo; import com.yiring.app.vo.location.LocationTagVo;
import com.yiring.common.core.Result; 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 com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
...@@ -44,8 +44,8 @@ public class LocationTagController { ...@@ -44,8 +44,8 @@ public class LocationTagController {
@ApiOperation("分页查询") @ApiOperation("分页查询")
@GetMapping("findLocationTagPage") @GetMapping("findLocationTagPage")
public Result<PageVo<LocationTagVo>> findLocationTagPage(@Valid LocationTagFindParam param) { public Result<PageVo<LocationTagVo>> findLocationTagPage(@Valid LocationTagFindParam param, PageParam pageParam) {
return locationTagService.findLocationTagPage(param); return locationTagService.findLocationTagPage(param, pageParam);
} }
@ApiOperation("销毁定位标签") @ApiOperation("销毁定位标签")
...@@ -68,7 +68,7 @@ public class LocationTagController { ...@@ -68,7 +68,7 @@ public class LocationTagController {
@ApiOperation("修改定位标签") @ApiOperation("修改定位标签")
@PutMapping("modifyLocationTag") @PutMapping("modifyLocationTag")
public Result<String> modifyLocationTag(@Valid LocationTagModifyParam param, IdParam idParam) { public Result<String> modifyLocationTag(@Valid LocationTagModifyParam param) {
return locationTagService.modifyLocationTag(param, idParam); return locationTagService.modifyLocationTag(param);
} }
} }
/* (C) 2022 YiRing, Inc. */ /* (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.app.param.post.PostFindParam;
import com.yiring.auth.param.post.PostParam; import com.yiring.app.param.post.PostParam;
import com.yiring.auth.service.post.PostService; import com.yiring.app.service.post.PostService;
import com.yiring.auth.vo.post.PostVo; import com.yiring.app.vo.post.PostVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam; import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo; import com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
...@@ -53,8 +54,8 @@ public class PostController { ...@@ -53,8 +54,8 @@ public class PostController {
@ApiOperation(value = "分页查询") @ApiOperation(value = "分页查询")
@GetMapping("findPostPage") @GetMapping("findPostPage")
public Result<PageVo<PostVo>> findPostPage(@Valid PostFindParam param) { public Result<PageVo<PostVo>> findPostPage(@Valid PostFindParam param, @Valid PageParam pageParam) {
return postService.findPostPage(param); return postService.findPostPage(param, pageParam);
} }
@ApiOperation(value = "详细信息查询") @ApiOperation(value = "详细信息查询")
...@@ -68,4 +69,10 @@ public class PostController { ...@@ -68,4 +69,10 @@ public class PostController {
public void exportPostInfo(@Valid PostFindParam param, HttpServletResponse response) { public void exportPostInfo(@Valid PostFindParam param, HttpServletResponse response) {
postService.exportPostInfo(param, 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. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.auth.domain.dept; package com.yiring.auth.domain.dept;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.yiring.auth.domain.post.Post; import com.yiring.auth.domain.post.Post;
import com.yiring.auth.domain.user.User; import com.yiring.auth.domain.user.User;
import com.yiring.common.annotation.FieldMapping; import com.yiring.common.annotation.FieldMapping;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.HashSet; import java.util.HashSet;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
...@@ -63,6 +65,7 @@ public class Department implements Serializable { ...@@ -63,6 +65,7 @@ public class Department implements Serializable {
@ManyToOne @ManyToOne
@JoinColumn(name = "leader_id") @JoinColumn(name = "leader_id")
@JsonIgnore
@Comment("负责人") @Comment("负责人")
User leader; User leader;
...@@ -84,6 +87,12 @@ public class Department implements Serializable { ...@@ -84,6 +87,12 @@ public class Department implements Serializable {
@Comment("树节点标识") @Comment("树节点标识")
String tree; String tree;
@Comment("更新时间")
LocalDateTime updateTime;
@Comment("创建时间")
LocalDateTime createTime;
@Comment("岗位集合") @Comment("岗位集合")
@Builder.Default @Builder.Default
@ToString.Exclude @ToString.Exclude
......
...@@ -3,6 +3,7 @@ package com.yiring.auth.domain.dept; ...@@ -3,6 +3,7 @@ package com.yiring.auth.domain.dept;
import java.io.Serializable; import java.io.Serializable;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
/** /**
...@@ -12,4 +13,5 @@ import org.springframework.stereotype.Repository; ...@@ -12,4 +13,5 @@ import org.springframework.stereotype.Repository;
*/ */
@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; ...@@ -3,6 +3,7 @@ package com.yiring.auth.domain.post;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.GeneratedValue; import javax.persistence.GeneratedValue;
import javax.persistence.Id; import javax.persistence.Id;
...@@ -49,6 +50,12 @@ public class Post implements Serializable { ...@@ -49,6 +50,12 @@ public class Post implements Serializable {
@Comment("描述") @Comment("描述")
String describe; String describe;
@Comment("创建时间")
LocalDateTime createTime;
@Comment("更新时间")
LocalDateTime updateTime;
@Comment("是否启用") @Comment("是否启用")
Boolean enable; Boolean enable;
} }
...@@ -110,9 +110,15 @@ public class User extends BasicEntity implements Serializable { ...@@ -110,9 +110,15 @@ public class User extends BasicEntity implements Serializable {
@Comment("所属部门") @Comment("所属部门")
@ManyToOne @ManyToOne
@JsonIgnore
@JoinColumn(name = "department_id") @JoinColumn(name = "department_id")
Department department; Department department;
@Comment("所属职称")
@ManyToOne
@JoinColumn(name = "post_id")
Post post;
@Comment("用户类型") @Comment("用户类型")
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
Type type; Type type;
......
...@@ -3,6 +3,7 @@ package com.yiring.auth.domain.user; ...@@ -3,6 +3,7 @@ package com.yiring.auth.domain.user;
import java.io.Serializable; import java.io.Serializable;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
...@@ -14,7 +15,7 @@ import org.springframework.stereotype.Repository; ...@@ -14,7 +15,7 @@ import org.springframework.stereotype.Repository;
*/ */
@Repository @Repository
public interface UserRepository extends JpaRepository<User, Serializable> { public interface UserRepository extends JpaRepository<User, Serializable>, JpaSpecificationExecutor<User> {
/** /**
* 根据用户名称查询用户信息 * 根据用户名称查询用户信息
* *
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.auth.excel.post; package com.yiring.auth.excel.post;
import com.fasterxml.jackson.databind.annotation.JsonSerialize; import cn.hutool.core.date.LocalDateTimeUtil;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.github.liaochong.myexcel.core.annotation.ExcelColumn; import com.github.liaochong.myexcel.core.annotation.ExcelColumn;
import com.github.liaochong.myexcel.core.annotation.ExcelModel; import com.github.liaochong.myexcel.core.annotation.ExcelModel;
import com.yiring.auth.domain.post.Post; import com.yiring.auth.domain.post.Post;
...@@ -25,9 +24,9 @@ import lombok.experimental.FieldDefaults; ...@@ -25,9 +24,9 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class PostExcel { public class PostExcel {
@ExcelColumn(title = "编号") /*@ExcelColumn(title = "编号")
@JsonSerialize(using = ToStringSerializer.class) @JsonSerialize(using = ToStringSerializer.class)
Long id; Long id;*/
@ExcelColumn(title = "职位名称") @ExcelColumn(title = "职位名称")
String name; String name;
...@@ -36,8 +35,10 @@ public class PostExcel { ...@@ -36,8 +35,10 @@ public class PostExcel {
String describe; String describe;
@ExcelColumn(title = "是否启用") @ExcelColumn(title = "是否启用")
@JsonSerialize(using = ToStringSerializer.class) String enable;
Boolean enable;
@ExcelColumn(title = "创建时间")
String createTime;
public static List<PostExcel> transforms(List<Post> posts) { public static List<PostExcel> transforms(List<Post> posts) {
return posts return posts
...@@ -45,10 +46,11 @@ public class PostExcel { ...@@ -45,10 +46,11 @@ public class PostExcel {
.map(post -> .map(post ->
PostExcel PostExcel
.builder() .builder()
.id(post.getId()) // .id(post.getId())
.name(post.getName()) .name(post.getName())
.describe(post.getDescribe()) .describe(post.getDescribe())
.enable(post.getEnable()) .enable(post.getEnable() ? "启用" : "禁用")
.createTime(LocalDateTimeUtil.format(post.getCreateTime(), "yyyy-MM-dd HH:mm:ss"))
.build() .build()
) )
.collect(Collectors.toList()); .collect(Collectors.toList());
......
...@@ -5,13 +5,8 @@ import cn.hutool.core.convert.Convert; ...@@ -5,13 +5,8 @@ import cn.hutool.core.convert.Convert;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.extra.spring.SpringUtil; import cn.hutool.extra.spring.SpringUtil;
import cn.hutool.http.Header;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil; import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.yiring.common.core.Result;
import java.io.Serializable;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
...@@ -41,10 +36,6 @@ public class ZyUtil { ...@@ -41,10 +36,6 @@ public class ZyUtil {
public final String KEY = "zy_token"; public final String KEY = "zy_token";
public final String TOKEN_TYPE = "bearer ";
public final String URL_PREFIX = "http://project.yz-online.com:789";
/** /**
* 获取token * 获取token
* @return token * @return token
...@@ -61,7 +52,8 @@ public class ZyUtil { ...@@ -61,7 +52,8 @@ public class ZyUtil {
String json = HttpUtil.get("http://project.yz-online.com:789/positionApi/oauth/token", map); String json = HttpUtil.get("http://project.yz-online.com:789/positionApi/oauth/token", map);
Map result = JSON.parseObject(json, Map.class); Map result = JSON.parseObject(json, Map.class);
String access_token = result.get("access_token").toString(); 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; return access_token;
} }
...@@ -72,100 +64,4 @@ public class ZyUtil { ...@@ -72,100 +64,4 @@ public class ZyUtil {
public static boolean getToken() { public static boolean getToken() {
return ObjectUtil.isNotEmpty(redisTemplate.opsForValue().get(KEY)); 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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论