4f23450e by 李仁豪

[init]

0 parents
Showing 63 changed files with 2343 additions and 0 deletions
# maven
target/
.mvn/
mvnw
mvnw.cmd
.flattened-pom.xml
# gradle
.gradle/
bin/
build/
*.class
classes/
out/
# eclipse
.settings/
.project
.classpath
# idea
.idea/
*.ipr
*.iml
*.iws
*.http
# temp
*.log
*.cache
*.diff
*.patch
*.tmp
# system
.DS_Store
Thumbs.db
# other
*.jar
*.war
*.zip
*.tar
*.tar.gz
# apollo
.apollo/
log/
logs/
# auto
gen/
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.pl.backend</groupId>
<artifactId>ql-backend</artifactId>
<packaging>pom</packaging>
<version>1.0.0-SNAPSHOT</version>
<modules>
<module>ql-backend-parent</module>
<module>ql-backend-taskmanager</module>
<module>ql-backend-service</module>
<module>ql-backend-ploycenter</module>
<module>ql-backend-core</module>
<module>ql-backend-taskmanager-common</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<parameters>true</parameters>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ql-backend-parent</artifactId>
<groupId>com.pl.backend</groupId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../ql-backend-parent/pom.xml</relativePath> <!-- lookup parent from repository -->
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ql-backend-core</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
</dependencies>
</project>
package com.ql.backend.core.infrastructure.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* @author lirenhao
* date: 2022/9/7 10:31
*/
@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {
/**
* 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//向Mybatis过滤器链中添加分页拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
//还可以添加i他的拦截器
return interceptor;
}
// @Bean
// public ConfigurationCustomizer configurationCustomizer() {
// return configuration -> configuration.setUseDeprecatedExecutor(false);
// }
}
/**
* @author lirenhao
* date: 2022/9/1 00:19
*/
package com.ql.backend.core.infrastructure;
/**
* @author lirenhao
* date: 2022/8/31 18:01
*/
package com.ql.backend.core.interfaces;
package com.ql.backend.core.interfaces.vo;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Data;
import java.io.Serializable;
/**
* @author lirenhao
* date: 2022/8/31 18:04
*/
@Data
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class ApiResponse<VO> implements Serializable {
private int code;
private String message;
private VO data;
public ApiResponse() {
}
private ApiResponse(int code, String message, VO data) {
this.code = code;
this.message = message;
this.data = data;
}
public boolean isOk() {
return code == 0;
}
public static <VO> ApiResponse<VO> of(int code, String message, VO data) {
return new ApiResponse<>(code, message, data);
}
public static <VO> ApiResponse<VO> ok(String message, VO data) {
return new ApiResponse<>(0, message, data);
}
public static <VO> ApiResponse<VO> ok(VO data) {
return ok("OK", data);
}
public static <VO> ApiResponse<VO> ok() {
return ok("OK", null);
}
public static <VO> ApiResponse<VO> fail(String message, VO data) {
return new ApiResponse<>(-1, message, data);
}
public static <VO> ApiResponse<VO> fail(VO data) {
return ok("NETWORK ERROR", data);
}
public static <VO> ApiResponse<VO> fail() {
return ok("NETWORK ERROR", null);
}
}
package com.ql.backend.core.interfaces.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author lirenhao
* date: 2022/9/4 20:45
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PageVO<T> {
private int page;
private int size;
private long total;
private List<T> list;
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.pl.backend</groupId>
<artifactId>ql-backend-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.2.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.12</version>
</dependency>
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.5</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ql-backend-parent</artifactId>
<groupId>com.pl.backend</groupId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../ql-backend-parent/pom.xml</relativePath> <!-- lookup parent from repository -->
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ql-backend-ploycenter</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<easy.rules.version>4.1.0</easy.rules.version>
<aviator.version>5.3.1</aviator.version>
</properties>
<dependencies>
<dependency>
<groupId>com.pl.backend</groupId>
<artifactId>ql-backend-core</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.pl.backend</groupId>
<artifactId>ql-backend-taskmanager-common</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- easy-rules 执行引擎 -->
<dependency>
<groupId>org.jeasy</groupId>
<artifactId>easy-rules-core</artifactId>
<version>${easy.rules.version}</version>
</dependency>
<dependency>
<groupId>org.jeasy</groupId>
<artifactId>easy-rules-support</artifactId>
<version>${easy.rules.version}</version>
</dependency>
<!-- 表达式引擎 Aviator -->
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>${aviator.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
package com.ql.backend.ploycenter.application;
import com.ql.backend.core.interfaces.vo.PageVO;
import com.ql.backend.ploycenter.domain.condition.DeviceCondition;
import com.ql.backend.ploycenter.interfaces.request.DeviceReportRequest;
import com.ql.backend.ploycenter.interfaces.vo.DeviceVO;
/**
* @author lirenhao
* date: 2022/9/4 11:34
*/
public interface DeviceService {
/**
* 上报设备状态
*/
void reportDeviceStatus(DeviceReportRequest request);
PageVO<DeviceVO> findDevice(DeviceCondition condition);
}
package com.ql.backend.ploycenter.application;
import com.ql.backend.core.interfaces.vo.ApiResponse;
import com.ql.backend.ploycenter.interfaces.request.PloyCreateRequest;
import com.ql.backend.taskmanager.common.dto.TaskDTO;
/**
* @author lirenhao
* date: 2022/9/2 17:09
*/
public interface PloyService {
String createPloy(PloyCreateRequest request);
ApiResponse<String> fire(TaskDTO taskDTO);
}
package com.ql.backend.ploycenter.application.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ql.backend.core.interfaces.vo.PageVO;
import com.ql.backend.ploycenter.application.DeviceService;
import com.ql.backend.ploycenter.domain.condition.DeviceCondition;
import com.ql.backend.ploycenter.domain.po.DevicePO;
import com.ql.backend.ploycenter.infrastructure.converter.mapper.DeviceConverter;
import com.ql.backend.ploycenter.infrastructure.persistence.dao.DeviceDao;
import com.ql.backend.ploycenter.interfaces.request.DeviceReportRequest;
import com.ql.backend.ploycenter.interfaces.vo.DeviceVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
/**
* @author lirenhao
* date: 2022/9/4 11:35
*/
@Slf4j
@Service
public class DeviceServiceImpl implements DeviceService {
@Resource
private DeviceDao deviceDao;
@Override
public void reportDeviceStatus(DeviceReportRequest request) {
/* todo 加锁 */
log.info("[ReportDeviceStatus] request -> [{}]", JSON.toJSONString(request));
DevicePO newOrUpdateDevice = DeviceConverter.INSTANCE.convertRequest2Po(request);
/* 查询是否存在设备 */
DevicePO oldPo = deviceDao.getByDeviceId(request.getDeviceId());
if (oldPo == null) {
/* 新增设备 */
newOrUpdateDevice.setGmtCreated(new Date());
newOrUpdateDevice.setGmtModified(new Date());
newOrUpdateDevice.setIsDeleted(Boolean.FALSE);
deviceDao.save(newOrUpdateDevice);
} else if (oldPo.getGmtModified().getTime() < request.getTimestamp()) {
/* 更新设备状态 */
newOrUpdateDevice.setDeviceId(oldPo.getDeviceId());
newOrUpdateDevice.setGmtModified(new Date(request.getTimestamp()));
deviceDao.updateById(oldPo);
}
}
@Override
public PageVO<DeviceVO> findDevice(DeviceCondition condition) {
Page<DevicePO> page = deviceDao.findDevice(condition);
return PageVO.<DeviceVO>builder()
.page(condition.getPage())
.size(condition.getSize())
.total(page.getPages())
.list(DeviceConverter.INSTANCE.convertPo2Vo(page.getRecords()))
.build();
}
}
package com.ql.backend.ploycenter.application.impl;
import com.ql.backend.core.interfaces.vo.ApiResponse;
import com.ql.backend.ploycenter.application.PloyService;
import com.ql.backend.ploycenter.domain.po.PloyPO;
import com.ql.backend.ploycenter.infrastructure.converter.mapper.PloyConverter;
import com.ql.backend.ploycenter.infrastructure.persistence.dao.PloyDao;
import com.ql.backend.ploycenter.interfaces.request.PloyCreateRequest;
import com.ql.backend.taskmanager.common.dto.TaskDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.Date;
import java.util.UUID;
/**
* @author lirenhao
* date: 2022/9/3 16:16
*/
@Slf4j
@Service
public class PloyServiceImpl implements PloyService {
@Resource
private PloyDao ployDao;
@Override
public String createPloy(PloyCreateRequest request) {
PloyPO po = PloyConverter.INSTANCE.convertRequest2Po(request);
po.setPloyId(UUID.randomUUID().toString());
po.setGmtCreated(new Date());
po.setGmtModified(new Date());
po.setIsDeleted(Boolean.FALSE);
ployDao.save(po);
return po.getPloyId();
}
@Override
public ApiResponse<String> fire(TaskDTO taskDTO) {
/* todo 执行策略, 创建任务 */
if (!ObjectUtils.isEmpty(taskDTO.getPloyId())) {
/* 查询策略 */
/* 创建任务 */
}
return ApiResponse.fail("未查询到策略", null);
}
}
package com.ql.backend.ploycenter.common.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author lirenhao
* date: 2022/9/5 17:47
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PloyDTO {
private String ployId;
}
package com.ql.backend.ploycenter.common.enums;
import lombok.Getter;
import java.util.stream.Stream;
/**
* @author lirenhao
* date: 2022/9/4 10:52
*/
public enum DeviceStatus {
CONNECTING(0, "connecting", "连线中"),
IDLE(1, "idle", "空闲"),
BUSY(2, "busy", "忙碌"),
OFFLINE(3, "offline", "下线");
@Getter
private final int code;
@Getter
private final String type;
@Getter
private final String desc;
DeviceStatus(int code, String type, String desc) {
this.code = code;
this.type = type;
this.desc = desc;
}
public static DeviceStatus convert(String type) {
return Stream.of(values())
.filter(status -> status.getType().equalsIgnoreCase(type))
.findFirst()
.orElse(null);
}
public static DeviceStatus convert(Integer code) {
return Stream.of(values())
.filter(status -> status.getCode() == code)
.findFirst()
.orElse(null);
}
}
package com.ql.backend.ploycenter.domain.condition;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import com.ql.backend.ploycenter.common.enums.DeviceStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Set;
/**
* @author lirenhao
* date: 2022/9/5 11:18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class DeviceCondition {
private int page;
private int size;
private Set<DeviceStatus> deviceStatuses;
}
package com.ql.backend.ploycenter.domain.po;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ql.backend.ploycenter.common.enums.DeviceStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* 设备信息
*
* @author lirenhao
* date: 2022/9/4 10:47
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_device")
public class DevicePO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 设备ID
*/
@TableId(value = "device_id", type = IdType.ASSIGN_ID)
private String deviceId;
/**
* 设备名称
*/
@TableField(value = "device_name")
private String deviceName;
/**
* 设备系统版本
*/
@TableField(value = "device_operate_system")
private String deviceOperateSystem;
/**
* 设备IP
*/
@TableField(value = "device_ip")
private String deviceIp;
/**
* 设备Bot版本
*/
@TableField(value = "device_bot_version")
private String deviceBotVersion;
/**
* 上次登录时间
*/
@TableField(value = "lasted_login_time")
private Date lastedLoginTime;
/**
* 设备状态
*/
@TableField(value = "device_status")
private DeviceStatus deviceStatus;
/**
* 机器上运行的任务数量
*/
@TableField(value = "task_num")
private Long taskNum;
@TableField(value = "is_deleted")
private Boolean isDeleted;
@TableField(value = "gmt_created")
private Date gmtCreated;
@TableField(value = "gmt_modified")
private Date gmtModified;
}
package com.ql.backend.ploycenter.domain.po;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* 策略
*
* @author lirenhao
* date: 2022/9/2 16:50
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_ploy")
public class PloyPO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 策略ID
*/
@TableId(value = "poly_id", type = IdType.ASSIGN_ID)
private String ployId;
/**
* 策略名称
*/
@TableField(value = "ploy_name")
private String ployName;
@TableField(value = "process_detail_uuid")
private String processDetailUUID;
@TableField(value = "process_channel")
private String processChannel;
@TableField(value = "execute_times")
private Integer executeTimes;
@TableField(value = "execute_type")
private String executeType;
@TableField(value = "cron_expression")
private String cronExpression;
@TableField(value = "input_param")
private String inputParam;
@TableField(value = "priority")
private Integer priority;
@TableField(value = "distribution_type")
private Integer distributionType;
@TableField(value = "is_deleted")
private Boolean isDeleted;
@TableField(value = "gmt_created")
private Date gmtCreated;
@TableField(value = "gmt_modified")
private Date gmtModified;
}
package com.ql.backend.ploycenter.domain.po;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author lirenhao
* date: 2022/9/4 10:44
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_shop_group")
public class ShopGroupPO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 店铺ID
*/
@TableId(value = "shop_group_id", type = IdType.ASSIGN_ID)
private String shopGroupId;
}
package com.ql.backend.ploycenter.domain.po;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author lirenhao
* date: 2022/9/4 10:38
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_shop")
public class ShopPO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 店铺ID
*/
@TableId(value = "shop_id", type = IdType.ASSIGN_ID)
private String shopId;
}
package com.ql.backend.ploycenter.infrastructure.converter.mapper;
/**
* @author lirenhao
* date: 2022/9/5 17:46
*/
public interface CommonConverter<PO, DTO, VO> {
}
package com.ql.backend.ploycenter.infrastructure.converter.mapper;
import cn.hutool.core.date.DateUtil;
import com.ql.backend.ploycenter.common.enums.DeviceStatus;
import com.ql.backend.ploycenter.domain.po.DevicePO;
import com.ql.backend.ploycenter.interfaces.request.DeviceReportRequest;
import com.ql.backend.ploycenter.interfaces.vo.DeviceVO;
import org.mapstruct.*;
import org.mapstruct.factory.Mappers;
import java.util.Date;
import java.util.List;
/**
* @author lirenhao
* date: 2022/9/4 11:54
*/
@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE,
nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE,
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface DeviceConverter {
DeviceConverter INSTANCE = Mappers.getMapper(DeviceConverter.class);
@Mapping(source = "deviceStatus", target = "deviceStatus", qualifiedByName = "convertDeviceStatus")
DevicePO convertRequest2Po(DeviceReportRequest request);
List<DeviceVO> convertPo2Vo(List<DevicePO> pos);
@Named("convertDeviceStatus")
default DeviceStatus convertDeviceStatus(Integer deviceStatus) {
return DeviceStatus.convert(deviceStatus);
}
default Integer convertDeviceStatus(DeviceStatus deviceStatus) {
return deviceStatus == null ? null : deviceStatus.getCode();
}
default Date convertStr2Date(String date) {
return DateUtil.parse(date);
}
default String convertDate2Str(Date date) {
return DateUtil.format(date, "yyyy-MM-dd HH:mm:ss");
}
}
package com.ql.backend.ploycenter.infrastructure.converter.mapper;
import com.ql.backend.ploycenter.common.dto.PloyDTO;
import com.ql.backend.ploycenter.domain.po.PloyPO;
import com.ql.backend.ploycenter.interfaces.request.PloyCreateRequest;
import com.ql.backend.ploycenter.interfaces.vo.PloyVO;
import org.mapstruct.Mapper;
import org.mapstruct.NullValueCheckStrategy;
import org.mapstruct.NullValuePropertyMappingStrategy;
import org.mapstruct.ReportingPolicy;
import org.mapstruct.factory.Mappers;
/**
* @author lirenhao
* date: 2022/9/5 17:45
*/
@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE,
nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE,
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface PloyConverter extends CommonConverter<PloyPO, PloyDTO, PloyVO> {
PloyConverter INSTANCE = Mappers.getMapper(PloyConverter.class);
PloyPO convertRequest2Po(PloyCreateRequest request);
}
package com.ql.backend.ploycenter.infrastructure.easyrule;
import com.googlecode.aviator.AviatorEvaluator;
import com.googlecode.aviator.Expression;
import org.jeasy.rules.api.Action;
import org.jeasy.rules.api.Facts;
import java.util.Map;
/**
* @author lirenhao
* date: 2022/1/12 11:36 上午
*/
public class AviatorAction implements Action {
private final Expression compliedExpression;
public AviatorAction(String expression) {
this.compliedExpression = AviatorEvaluator.compile(expression);
}
@Override
public void execute(Facts facts) throws Exception {
Map<String, Object> env = facts.asMap();
compliedExpression.execute(env);
}
}
package com.ql.backend.ploycenter.infrastructure.easyrule;
import com.googlecode.aviator.AviatorEvaluator;
import com.googlecode.aviator.Expression;
import org.jeasy.rules.api.Condition;
import org.jeasy.rules.api.Facts;
import java.util.Map;
/**
* @author lirenhao
* date: 2022/1/12 11:39 上午
*/
public class AviatorCondition implements Condition {
private final Expression compliedExpression;
public AviatorCondition(String expression) {
this.compliedExpression = AviatorEvaluator.compile(expression);
}
@Override
public boolean evaluate(Facts facts) {
Map<String, Object> env = facts.asMap();
return (boolean) compliedExpression.execute(env);
}
}
package com.ql.backend.ploycenter.infrastructure.easyrule;
import com.googlecode.aviator.runtime.function.AbstractFunction;
import org.jeasy.rules.support.reader.JsonRuleDefinitionReader;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.List;
/**
* @author lirenhao
* date: 2022/9/3 16:05
*/
@Configuration
public class AviatorConfiguration {
@Bean
public AviatorRuleFactory aviatorRuleFactory(List<AbstractFunction> functions) {
return new AviatorRuleFactory(new JsonRuleDefinitionReader(), functions);
}
}
package com.ql.backend.ploycenter.infrastructure.easyrule;
import org.jeasy.rules.api.Action;
import org.jeasy.rules.api.Condition;
import org.jeasy.rules.api.Facts;
import org.jeasy.rules.core.BasicRule;
import java.util.ArrayList;
import java.util.List;
/**
* @author lirenhao
* date: 2022/1/12 11:39 上午
*/
public class AviatorRule extends BasicRule {
private int ruleType;
private Condition condition = Condition.FALSE;
private final List<Action> actions = new ArrayList<>();
/**
* Set rule type.
*
* @param ruleType of the rule
* @return this rule
*/
public AviatorRule ruleType(int ruleType) {
this.ruleType = ruleType;
return this;
}
/**
* Set rule name.
*
* @param name of the rule
* @return this rule
*/
public AviatorRule name(String name) {
this.name = name;
return this;
}
/**
* Set rule description.
*
* @param description of the rule
* @return this rule
*/
public AviatorRule description(String description) {
this.description = description;
return this;
}
/**
* Set rule priority.
*
* @param priority of the rule
* @return this rule
*/
public AviatorRule priority(int priority) {
this.priority = priority;
return this;
}
/**
* Specify the rule's condition as SpEL expression.
*
* @param condition of the rule
* @return this rule
*/
public AviatorRule when(String condition) {
this.condition = new AviatorCondition(condition);
return this;
}
/**
* Add an action specified as an SpEL expression to the rule.
*
* @param action to add to the rule
* @return this rule
*/
public AviatorRule then(String action) {
this.actions.add(new AviatorAction(action));
return this;
}
public int getRuleType() {
return ruleType;
}
@Override
public boolean evaluate(Facts facts) {
return condition.evaluate(facts);
}
@Override
public void execute(Facts facts) throws Exception {
for (Action action : actions) {
action.execute(facts);
}
}
}
package com.ql.backend.ploycenter.infrastructure.easyrule;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.jeasy.rules.support.RuleDefinition;
/**
* @author lirenhao
* date: 2022/4/6 3:45 下午
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class AviatorRuleDefinition extends RuleDefinition {
/**
* 规则ID
*/
private String ruleId;
/**
* 规则类型
*/
private int ruleType;
}
package com.ql.backend.ploycenter.infrastructure.easyrule;
import com.googlecode.aviator.AviatorEvaluator;
import com.googlecode.aviator.runtime.function.AbstractFunction;
import org.jeasy.rules.api.Rule;
import org.jeasy.rules.api.Rules;
import org.jeasy.rules.support.AbstractRuleFactory;
import org.jeasy.rules.support.RuleDefinition;
import org.jeasy.rules.support.reader.RuleDefinitionReader;
import org.springframework.util.CollectionUtils;
import java.io.Reader;
import java.util.List;
/**
* @author lirenhao
* date: 2022/1/12 11:40 上午
*/
public class AviatorRuleFactory extends AbstractRuleFactory {
private final RuleDefinitionReader reader;
/**
* Create a new {@link AviatorRuleFactory} with a given reader.
*
* @param reader used to read rule definitions
*/
public AviatorRuleFactory(RuleDefinitionReader reader, List<AbstractFunction> functions) {
this.reader = reader;
if (!CollectionUtils.isEmpty(functions)) {
functions.forEach(AviatorEvaluator::addFunction);
}
}
/**
* Create a set of {@link AviatorRule} from a Reader.
*
* @param rulesDescriptor descriptor of rule definitions
* @return a set of rules
* @throws Exception if unable to create rules from the descriptor
*/
public Rules createRules(Reader rulesDescriptor) throws Exception {
Rules rules = new Rules();
List<RuleDefinition> ruleDefinitions = reader.read(rulesDescriptor);
for (RuleDefinition ruleDefinition : ruleDefinitions) {
rules.register(createRule(ruleDefinition));
}
return rules;
}
public Rules createRules(List<RuleDefinition> ruleDefinitions) throws Exception {
Rules rules = new Rules();
for (RuleDefinition ruleDefinition : ruleDefinitions) {
rules.register(createRule(ruleDefinition));
}
return rules;
}
@Override
protected Rule createSimpleRule(RuleDefinition ruleDefinition) {
int ruleType = 0;
if (ruleDefinition instanceof AviatorRuleDefinition) {
ruleType = ((AviatorRuleDefinition) ruleDefinition).getRuleType();
}
AviatorRule aviatorRule = new AviatorRule()
.ruleType(ruleType)
.name(ruleDefinition.getName())
.description(ruleDefinition.getDescription())
.priority(ruleDefinition.getPriority())
.when(ruleDefinition.getCondition());
for (String action : ruleDefinition.getActions()) {
aviatorRule.then(action);
}
return aviatorRule;
}
}
package com.ql.backend.ploycenter.infrastructure.easyrule.function;
import com.googlecode.aviator.runtime.function.AbstractFunction;
/**
* @author lirenhao
* date: 2022/9/3 16:15
*/
public abstract class BaseFunction extends AbstractFunction {
}
package com.ql.backend.ploycenter.infrastructure.persistence.dao;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ql.backend.ploycenter.domain.condition.DeviceCondition;
import com.ql.backend.ploycenter.domain.po.DevicePO;
/**
* @author lirenhao
* date: 2022/9/4 11:41
*/
public interface DeviceDao extends IService<DevicePO> {
DevicePO getByDeviceId(String deviceId);
Page<DevicePO> findDevice(DeviceCondition condition);
}
package com.ql.backend.ploycenter.infrastructure.persistence.dao;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ql.backend.ploycenter.domain.po.PloyPO;
/**
* @author lirenhao
* date: 2022/9/5 16:41
*/
public interface PloyDao extends IService<PloyPO> {
}
package com.ql.backend.ploycenter.infrastructure.persistence.dao.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ql.backend.ploycenter.domain.condition.DeviceCondition;
import com.ql.backend.ploycenter.domain.po.DevicePO;
import com.ql.backend.ploycenter.infrastructure.persistence.dao.DeviceDao;
import com.ql.backend.ploycenter.infrastructure.persistence.mapper.DeviceMapper;
import org.springframework.stereotype.Service;
/**
* @author lirenhao
* date: 2022/9/4 11:41
*/
@Service
public class DeviceDaoImpl extends ServiceImpl<DeviceMapper, DevicePO> implements DeviceDao {
@Override
public DevicePO getByDeviceId(String deviceId) {
return this.getById(deviceId);
}
@Override
public Page<DevicePO> findDevice(DeviceCondition condition) {
Page<DevicePO> page = new Page<>(condition.getPage(), condition.getSize());
return this.baseMapper.selectPage(page, new QueryWrapper<>());
}
}
package com.ql.backend.ploycenter.infrastructure.persistence.dao.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ql.backend.ploycenter.domain.po.PloyPO;
import com.ql.backend.ploycenter.infrastructure.persistence.dao.PloyDao;
import com.ql.backend.ploycenter.infrastructure.persistence.mapper.PloyMapper;
import org.springframework.stereotype.Service;
/**
* @author lirenhao
* date: 2022/9/5 16:41
*/
@Service
public class PloyDaoImpl extends ServiceImpl<PloyMapper, PloyPO> implements PloyDao {
}
package com.ql.backend.ploycenter.infrastructure.persistence.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ql.backend.ploycenter.domain.po.DevicePO;
/**
* @author lirenhao
* date: 2022/9/7 10:10
*/
public interface DeviceMapper extends BaseMapper<DevicePO> {
DevicePO getDevicePOByDeviceId(String deviceId);
}
package com.ql.backend.ploycenter.infrastructure.persistence.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ql.backend.ploycenter.domain.po.PloyPO;
/**
* @author lirenhao
* date: 2022/9/7 10:10
*/
public interface PloyMapper extends BaseMapper<PloyPO> {
}
package com.ql.backend.ploycenter.interfaces.facade;
import com.ql.backend.core.interfaces.vo.ApiResponse;
import com.ql.backend.core.interfaces.vo.PageVO;
import com.ql.backend.ploycenter.application.DeviceService;
import com.ql.backend.ploycenter.domain.condition.DeviceCondition;
import com.ql.backend.ploycenter.interfaces.request.DeviceReportRequest;
import com.ql.backend.ploycenter.interfaces.vo.DeviceVO;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @author lirenhao
* date: 2022/9/4 11:06
*/
@RestController
@RequestMapping("/ploy-center/v1/devices")
public class DeviceFacade {
@Resource
private DeviceService deviceService;
/**
* 上报设备状态
*/
@PostMapping
public ApiResponse<Void> reportDeviceStatus(@RequestBody DeviceReportRequest request) {
deviceService.reportDeviceStatus(request);
return ApiResponse.ok();
}
/**
* 查询设备状态
*/
@GetMapping
public ApiResponse<PageVO<DeviceVO>> findDevice(DeviceCondition condition) {
return ApiResponse.ok(
deviceService.findDevice(condition)
);
}
}
package com.ql.backend.ploycenter.interfaces.facade;
import com.ql.backend.core.interfaces.vo.ApiResponse;
import com.ql.backend.ploycenter.application.PloyService;
import com.ql.backend.ploycenter.interfaces.request.PloyCreateRequest;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author lirenhao
* date: 2022/9/5 15:54
*/
@RestController
@RequestMapping("/ploy-center/v1/ploys")
public class PloyFacade {
@Resource
private PloyService ployService;
/**
* 创建策略
*/
@PostMapping
public ApiResponse<String> createPloy(@RequestBody PloyCreateRequest request) {
return ApiResponse.ok(
ployService.createPloy(request)
);
}
/* todo 更新策略 */
/* todo 查询策略列表 */
/* todo 查询策略详情 */
}
package com.ql.backend.ploycenter.interfaces.facade;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author lirenhao
* date: 2022/9/5 15:56
*/
@RestController
@RequestMapping("/ploy-center/v1/shops")
public class ShopFacade {
/* todo 创建店铺 */
/* todo 更新店铺信息 */
/* todo 查询店铺列表 */
/* todo 查询店铺详情 */
}
package com.ql.backend.ploycenter.interfaces.request;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author lirenhao
* date: 2022/9/4 11:11
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class DeviceReportRequest {
/**
* 设备ID
*/
private String deviceId;
/**
* 设备名称
*/
private String deviceName;
/**
* 设备系统版本
*/
private String deviceOperateSystem;
/**
* 设备IP
*/
private String deviceIp;
/**
* 设备Bot版本
*/
private String deviceBotVersion;
/**
* 上次登录时间
*/
private String lastedLoginTime;
/**
* 设备状态
*/
private Integer deviceStatus;
/**
* 设备任务数量
*/
private Long taskNum;
/**
* 上报的时间
*/
private long timestamp;
}
package com.ql.backend.ploycenter.interfaces.request;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author lirenhao
* date: 2022/9/5 17:40
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class PloyCreateRequest {
/**
* 策略名称
*/
private String ployName;
private String processDetailUUID;
private String processChannel;
private Integer executeTimes;
private String executeType;
private String cronExpression;
private String inputParam;
private Integer priority;
private Integer distributionType;
}
package com.ql.backend.ploycenter.interfaces.vo;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author lirenhao
* date: 2022/9/4 20:44
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class DeviceVO {
/**
* 设备ID
*/
private String deviceId;
/**
* 设备名称
*/
private String deviceName;
/**
* 设备系统版本
*/
private String deviceOperateSystem;
/**
* 设备状态
*/
private Integer deviceStatus;
/**
* 设备IP
*/
private String deviceIp;
/**
* 设备Bot版本
*/
private String deviceBotVersion;
/**
* 上次登录时间
*/
private String lastedLoginTime;
/**
* 机器上运行的任务数量
*/
private Long taskNum;
private String gmtModified;
}
package com.ql.backend.ploycenter.interfaces.vo;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author lirenhao
* date: 2022/9/5 17:49
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class PloyVO {
private String ployId;
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ql-backend-parent</artifactId>
<groupId>com.pl.backend</groupId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../ql-backend-parent/pom.xml</relativePath> <!-- lookup parent from repository -->
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ql-backend-service</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.pl.backend</groupId>
<artifactId>ql-backend-taskmanager</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.3</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
</plugins>
</build>
</project>
package com.ql.backend.service;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author lirenhao
* date: 2022/8/31 11:35
*/
@SpringBootApplication(scanBasePackages = "com.ql.backend")
@MapperScan("com.ql.backend.*.infrastructure.persistence.mapper")
public class QLBackendServiceApplication {
public static void main(String[] args) {
SpringApplication.run(QLBackendServiceApplication.class, args);
}
}
server:
port: 9999
spring:
datasource:
url: jdbc:mysql://localhost:3306/ql-backend?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
username: root
password: a15728006904
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
#开启驼峰命名法
configuration:
map-underscore-to-camel-case: true
mybatis-plus:
# xml地址
mapper-locations: classpath:mapper/*Mapper.xml
# 实体扫描,多个package用逗号或者分号分隔
type-aliases-package: com.ql.backend.*.domain.po #自己的实体类地址
configuration:
# 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.pl.backend</groupId>
<artifactId>ql-backend-taskmanager-common</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
</dependencies>
</project>
package com.ql.backend.taskmanager.common.dto;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import com.ql.backend.taskmanager.common.enums.TaskStatus;
import com.ql.backend.taskmanager.common.enums.TaskSubStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author lirenhao
* date: 2022/9/3 16:21
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class TaskDTO {
/**
* 任务ID
*/
private String taskId;
/**
* 任务状态
*/
private TaskStatus taskStatus;
/**
* 任务子状态
*/
private TaskSubStatus taskSubStatus;
private String shopId;
private String ployId;
private String taskParam;
}
package com.ql.backend.taskmanager.common.enums;
import lombok.Getter;
import java.util.stream.Stream;
/**
* @author lirenhao
* date: 2022/8/31 17:46
*/
public enum TaskStatus {
CREATED(0, "created", "创建"),
EXECUTED(1, "executed", "执行"),
DONE(2, "done", "完成");
@Getter
private final int code;
@Getter
private final String type;
@Getter
private final String desc;
TaskStatus(int code, String type, String desc) {
this.code = code;
this.type = type;
this.desc = desc;
}
public static TaskStatus convert(String type) {
return Stream.of(values())
.filter(taskStatus -> taskStatus.getType().equalsIgnoreCase(type))
.findFirst()
.orElse(null);
}
}
package com.ql.backend.taskmanager.common.enums;
import lombok.Getter;
/**
* @author lirenhao
* date: 2022/8/31 19:55
*/
public enum TaskSubStatus {
PENDING(0, "pending", "等待中"),
DOING(1, "doing", "执行中"),
DONE_SUCCESS(2, "done_success", "成功"),
DONE_FAIL(3, "done_fail", "失败"),
DONE_TIMEOUT(4, "done_timeout", "超时");
@Getter
private final int code;
@Getter
private final String type;
@Getter
private final String desc;
TaskSubStatus(int code, String type, String desc) {
this.code = code;
this.type = type;
this.desc = desc;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ql-backend-parent</artifactId>
<groupId>com.pl.backend</groupId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../ql-backend-parent/pom.xml</relativePath> <!-- lookup parent from repository -->
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ql-backend-taskmanager</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.pl.backend</groupId>
<artifactId>ql-backend-core</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.pl.backend</groupId>
<artifactId>ql-backend-taskmanager-common</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.pl.backend</groupId>
<artifactId>ql-backend-ploycenter</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
</plugins>
</build>
</project>
package com.ql.backend.taskmanager.application;
import com.ql.backend.taskmanager.interfaces.request.TaskCreateRequest;
import com.ql.backend.taskmanager.interfaces.vo.TaskVO;
/**
* @author lirenhao
* date: 2022/9/1 10:10
*/
public interface TaskService {
String createTask(TaskCreateRequest request);
TaskVO getTask(String taskId);
}
package com.ql.backend.taskmanager.application.impl;
import com.ql.backend.core.interfaces.vo.ApiResponse;
import com.ql.backend.ploycenter.application.PloyService;
import com.ql.backend.taskmanager.application.TaskService;
import com.ql.backend.taskmanager.common.dto.TaskDTO;
import com.ql.backend.taskmanager.common.enums.TaskStatus;
import com.ql.backend.taskmanager.common.enums.TaskSubStatus;
import com.ql.backend.taskmanager.domain.po.TaskPO;
import com.ql.backend.taskmanager.infrastructure.converter.mapper.TaskConverter;
import com.ql.backend.taskmanager.infrastructure.persistence.dao.TaskDao;
import com.ql.backend.taskmanager.interfaces.request.TaskCreateRequest;
import com.ql.backend.taskmanager.interfaces.vo.TaskVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.UUID;
/**
* @author lirenhao
* date: 2022/9/1 10:11
*/
@Slf4j
@Service
public class TaskServiceImpl implements TaskService {
@Resource
private TaskDao taskDao;
@Resource
private PloyService ployService;
@Override
@Transactional
public String createTask(TaskCreateRequest request) {
TaskPO taskPO = TaskConverter.INSTANCE.convertRequest2Po(request);
taskPO.setTaskId(UUID.randomUUID().toString());
taskPO.setTaskStatus(TaskStatus.CREATED);
taskPO.setTaskSubStatus(TaskSubStatus.PENDING);
taskDao.save(taskPO);
/* 执行策略 */
TaskDTO taskDTO = TaskConverter.INSTANCE.convertPo2Dto(taskPO);
ApiResponse<String> response = ployService.fire(taskDTO);
TaskPO update = new TaskPO();
if (response.isOk()) {
update.setTaskStatus(TaskStatus.CREATED);
update.setTaskSubStatus(TaskSubStatus.DONE_SUCCESS);
} else {
update.setTaskStatus(TaskStatus.CREATED);
update.setTaskSubStatus(TaskSubStatus.DONE_FAIL);
update.setFailReason(response.getMessage());
}
taskDao.updateByTaskId(taskPO.getTaskId(), update);
return taskPO.getTaskId();
}
@Override
public TaskVO getTask(String taskId) {
return TaskConverter.INSTANCE.convertPo2Vo(taskDao.getByTaskId(taskId));
}
}
/**
* @author lirenhao
* date: 2022/8/31 23:59
*/
package com.ql.backend.taskmanager.domain;
package com.ql.backend.taskmanager.domain.po;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ql.backend.taskmanager.common.enums.TaskStatus;
import com.ql.backend.taskmanager.common.enums.TaskSubStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* 任务表
*
* @author lirenhao
* date: 2022/8/31 15:23
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_task")
public class TaskPO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 任务ID
*/
@TableId(value = "task_id", type = IdType.ASSIGN_ID)
private String taskId;
/**
* 任务状态
*/
@TableField(value = "task_status")
private TaskStatus taskStatus;
/**
* 任务子状态
*/
@TableField(value = "task_sub_status")
private TaskSubStatus taskSubStatus;
@TableField(value = "shop_id")
private String shopId;
@TableField(value = "ploy_id")
private String ployId;
@TableField(value = "task_param")
private String taskParam;
@TableField(value = "fail_reason")
private String failReason;
@TableField(value = "is_deleted")
private Boolean isDeleted;
@TableField(value = "gmt_created")
private Date gmtCreated;
@TableField(value = "gmt_modified")
private Date gmtModified;
}
package com.ql.backend.taskmanager.infrastructure.converter.mapper;
import com.ql.backend.taskmanager.common.dto.TaskDTO;
import com.ql.backend.taskmanager.domain.po.TaskPO;
import com.ql.backend.taskmanager.interfaces.request.TaskCreateRequest;
import com.ql.backend.taskmanager.interfaces.vo.TaskVO;
import org.mapstruct.Mapper;
import org.mapstruct.NullValueCheckStrategy;
import org.mapstruct.NullValuePropertyMappingStrategy;
import org.mapstruct.ReportingPolicy;
import org.mapstruct.factory.Mappers;
/**
* @author lirenhao
* date: 2022/9/3 17:08
*/
@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE,
nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE,
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface TaskConverter {
TaskConverter INSTANCE = Mappers.getMapper(TaskConverter.class);
TaskPO convertRequest2Po(TaskCreateRequest request);
TaskDTO convertPo2Dto(TaskPO po);
TaskVO convertPo2Vo(TaskPO po);
}
package com.ql.backend.taskmanager.infrastructure.persistence.dao;
import com.ql.backend.taskmanager.domain.po.TaskPO;
/**
* @author lirenhao
* date: 2022/9/1 11:02
*/
public interface TaskDao {
TaskPO save(TaskPO po);
boolean updateByTaskId(String taskId, TaskPO update);
TaskPO getByTaskId(String taskId);
}
package com.ql.backend.taskmanager.infrastructure.persistence.dao.impl;
import com.ql.backend.taskmanager.domain.po.TaskPO;
import com.ql.backend.taskmanager.infrastructure.persistence.dao.TaskDao;
import org.springframework.stereotype.Service;
/**
* @author lirenhao
* date: 2022/9/1 11:02
*/
@Service
public class TaskDaoImpl implements TaskDao {
@Override
public TaskPO save(TaskPO po) {
return null;
}
@Override
public boolean updateByTaskId(String taskId, TaskPO update) {
return false;
}
@Override
public TaskPO getByTaskId(String taskId) {
return null;
}
}
package com.ql.backend.taskmanager.infrastructure.persistence.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ql.backend.taskmanager.domain.po.TaskPO;
/**
* @author lirenhao
* date: 2022/9/7 10:11
*/
public interface TaskMapper extends BaseMapper<TaskPO> {
}
package com.ql.backend.taskmanager.interfaces.facade;
import com.ql.backend.core.interfaces.vo.ApiResponse;
import com.ql.backend.taskmanager.application.TaskService;
import com.ql.backend.taskmanager.interfaces.request.TaskCreateRequest;
import com.ql.backend.taskmanager.interfaces.vo.TaskVO;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @author lirenhao
* date: 2022/8/31 17:53
*/
@RestController
@RequestMapping("/task-manager/v1/tasks")
public class TaskFacade {
@Resource
private TaskService taskService;
@PostMapping
public ApiResponse<String> createTask(@RequestBody TaskCreateRequest request) {
return ApiResponse.ok(taskService.createTask(request));
}
@GetMapping("/{taskId}")
public ApiResponse<TaskVO> getTask(@PathVariable("taskId") String taskId) {
return ApiResponse.ok(taskService.getTask(taskId));
}
/* todo 设备上报任务状态 */
}
package com.ql.backend.taskmanager.interfaces.request;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Data;
/**
* @author lirenhao
* date: 2022/8/31 18:13
*/
@Data
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class TaskCreateRequest {
/**
* 店铺ID
*/
private String shopId;
/**
* 策略ID
*/
private String ployId;
/**
* 任务参数
*/
private String taskParam;
}
package com.ql.backend.taskmanager.interfaces.vo;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author lirenhao
* date: 2022/8/31 18:17
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class TaskVO {
private String taskId;
}
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!