Compare commits
No commits in common. '720a8386b6ad5602b1d81a79eae226e86ed6585e' and 'd5f735d3d2be42e6c41eb6d25985b86eeb3f4191' have entirely different histories.
720a8386b6
...
d5f735d3d2
13 changed files with 10545 additions and 435 deletions
File diff suppressed because one or more lines are too long
@ -1,181 +0,0 @@ |
||||
package org.jeecg.modules.demo.rulex.entity; |
||||
|
||||
import java.io.Serializable; |
||||
import com.baomidou.mybatisplus.annotation.IdType; |
||||
import com.baomidou.mybatisplus.annotation.TableId; |
||||
import com.baomidou.mybatisplus.annotation.TableName; |
||||
import lombok.Data; |
||||
import com.fasterxml.jackson.annotation.JsonFormat; |
||||
import org.springframework.format.annotation.DateTimeFormat; |
||||
import org.jeecgframework.poi.excel.annotation.Excel; |
||||
//import org.jeecg.common.aspect.annotation.Dict;
|
||||
import io.swagger.annotations.ApiModel; |
||||
import io.swagger.annotations.ApiModelProperty; |
||||
import lombok.EqualsAndHashCode; |
||||
import lombok.experimental.Accessors; |
||||
|
||||
/** |
||||
* @Description: 规则管理 |
||||
* @Author: jeecg-boot |
||||
* @Date: 2023-04-10 |
||||
* @Version: V1.0 |
||||
*/ |
||||
@Data |
||||
@TableName("rule_vo") |
||||
@Accessors(chain = true) |
||||
@EqualsAndHashCode(callSuper = false) |
||||
@ApiModel(value = "rulex对象", description = "规则管理") |
||||
public class RuleVo implements Serializable { |
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
/** |
||||
* 主键 |
||||
*/ |
||||
@TableId(type = IdType.ASSIGN_ID) |
||||
@ApiModelProperty(value = "主键") |
||||
private java.lang.String id; |
||||
/** |
||||
* 创建人 |
||||
*/ |
||||
@ApiModelProperty(value = "创建人") |
||||
private java.lang.String createBy; |
||||
/** |
||||
* 创建日期 |
||||
*/ |
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") |
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
||||
@ApiModelProperty(value = "创建日期") |
||||
private String createTime; |
||||
/** |
||||
* 更新人 |
||||
*/ |
||||
@ApiModelProperty(value = "更新人") |
||||
private java.lang.String updateBy; |
||||
/** |
||||
* 更新日期 |
||||
*/ |
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") |
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
||||
@ApiModelProperty(value = "更新日期") |
||||
private String updateTime; |
||||
/** |
||||
* 对应模块id |
||||
*/ |
||||
@Excel(name = "对应模块id", width = 15) |
||||
@ApiModelProperty(value = "对应模块id") |
||||
// /*@Dict(dictTable = "modulex", dicCode = "id", dicText = "module_name")*/
|
||||
private java.lang.String moduleId; |
||||
/** |
||||
* 对应功能id |
||||
*/ |
||||
@Excel(name = "对应功能id", width = 15) |
||||
@ApiModelProperty(value = "对应功能id") |
||||
// /*@Dict(dictTable = "functionx", dicCode = "id", dicText = "function_name")*/
|
||||
private java.lang.String functionId; |
||||
/** |
||||
* 规则序号 |
||||
*/ |
||||
@Excel(name = "规则序号", width = 15) |
||||
@ApiModelProperty(value = "规则序号") |
||||
private java.lang.String ruleNo; |
||||
/** |
||||
* 规则编码 |
||||
*/ |
||||
@Excel(name = "规则编码", width = 15) |
||||
@ApiModelProperty(value = "规则编码") |
||||
private java.lang.String ruleCode; |
||||
/** |
||||
* 规则描述 |
||||
*/ |
||||
@Excel(name = "规则描述", width = 15) |
||||
@ApiModelProperty(value = "规则描述") |
||||
private java.lang.String pmDescribe; |
||||
/** |
||||
* 分析图 |
||||
*/ |
||||
@Excel(name = "分析图", width = 15) |
||||
@ApiModelProperty(value = "分析图") |
||||
private java.lang.String diagrams; |
||||
/** |
||||
* 对应实体id |
||||
*/ |
||||
@Excel(name = "对应实体id", width = 15) |
||||
@ApiModelProperty(value = "对应实体id") |
||||
// @Dict(dictTable = "tablex", dicText = "table_name", dicCode = "id")
|
||||
private java.lang.String tableId; |
||||
/** |
||||
* 对应字段 |
||||
*/ |
||||
@Excel(name = "对应字段", width = 15) |
||||
@ApiModelProperty(value = "对应字段") |
||||
// @Dict(dictTable = "fieldx", dicText = "field_name", dicCode = "id")
|
||||
private java.lang.String fieldId; |
||||
/** |
||||
* 责任人 |
||||
*/ |
||||
@Excel(name = "责任人", width = 15) |
||||
@ApiModelProperty(value = "责任人") |
||||
private java.lang.String managerUsers; |
||||
/** |
||||
* 任务等级 |
||||
*/ |
||||
@Excel(name = "任务等级", width = 15) |
||||
@ApiModelProperty(value = "任务等级") |
||||
// @Dict(dicCode = "work_level")
|
||||
private String workLevel; |
||||
/** |
||||
* 任务状态 |
||||
*/ |
||||
@Excel(name = "任务状态", width = 15) |
||||
@ApiModelProperty(value = "任务状态") |
||||
// @Dict(dicCode = "work_status")
|
||||
private String workStatus; |
||||
/** |
||||
* 开始时间 |
||||
*/ |
||||
@Excel(name = "开始时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") |
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") |
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
||||
@ApiModelProperty(value = "开始时间") |
||||
private String startTime; |
||||
/** |
||||
* 任务时长 |
||||
*/ |
||||
@Excel(name = "任务时长", width = 15) |
||||
@ApiModelProperty(value = "任务时长") |
||||
private String duration; |
||||
/** |
||||
* 提交时间 |
||||
*/ |
||||
@Excel(name = "提交时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") |
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") |
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
||||
@ApiModelProperty(value = "提交时间") |
||||
private String submitTime; |
||||
/** |
||||
* 实际时长 |
||||
*/ |
||||
@Excel(name = "实际时长", width = 15) |
||||
@ApiModelProperty(value = "实际时长") |
||||
private String realDuration; |
||||
/** |
||||
* 规则状态 |
||||
*/ |
||||
@Excel(name = "规则状态", width = 15) |
||||
@ApiModelProperty(value = "规则状态") |
||||
// @Dict(dicCode = "status")
|
||||
private String status; |
||||
/** |
||||
* 版本状态 |
||||
*/ |
||||
@Excel(name = "版本状态", width = 15) |
||||
@ApiModelProperty(value = "版本状态") |
||||
// @Dict(dicCode = "verison_status")
|
||||
private String verisonStatus; |
||||
/** |
||||
* 版本号 |
||||
*/ |
||||
@Excel(name = "版本号", width = 15) |
||||
@ApiModelProperty(value = "版本号") |
||||
private java.lang.String verison; |
||||
} |
@ -1,16 +0,0 @@ |
||||
package org.jeecg.modules.demo.rulex.mapper; |
||||
|
||||
import org.jeecg.modules.demo.rulex.entity.RuleVo; |
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||
|
||||
/** |
||||
* <p> |
||||
* Mapper 接口 |
||||
* </p> |
||||
* |
||||
* @author zjh |
||||
* @since 2023-07-10 |
||||
*/ |
||||
public interface RuleVoMapper extends BaseMapper<RuleVo> { |
||||
|
||||
} |
@ -1,16 +0,0 @@ |
||||
package org.jeecg.modules.demo.rulex.service; |
||||
|
||||
import org.jeecg.modules.demo.rulex.entity.RuleVo; |
||||
import com.baomidou.mybatisplus.extension.service.IService; |
||||
|
||||
/** |
||||
* <p> |
||||
* 服务类 |
||||
* </p> |
||||
* |
||||
* @author zjh |
||||
* @since 2023-07-10 |
||||
*/ |
||||
public interface IRuleVoService extends IService<RuleVo> { |
||||
|
||||
} |
@ -1,20 +0,0 @@ |
||||
package org.jeecg.modules.demo.rulex.service.impl; |
||||
|
||||
import org.jeecg.modules.demo.rulex.entity.RuleVo; |
||||
import org.jeecg.modules.demo.rulex.mapper.RuleVoMapper; |
||||
import org.jeecg.modules.demo.rulex.service.IRuleVoService; |
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
||||
import org.springframework.stereotype.Service; |
||||
|
||||
/** |
||||
* <p> |
||||
* 服务实现类 |
||||
* </p> |
||||
* |
||||
* @author zjh |
||||
* @since 2023-07-10 |
||||
*/ |
||||
@Service |
||||
public class RuleVoServiceImpl extends ServiceImpl<RuleVoMapper, RuleVo> implements IRuleVoService { |
||||
|
||||
} |
@ -1,5 +0,0 @@ |
||||
package org.jeecg.modules.demo.rulex.util; |
||||
|
||||
public interface DateValidator { |
||||
boolean isValid(String dateStr); |
||||
} |
@ -1,27 +0,0 @@ |
||||
package org.jeecg.modules.demo.rulex.util; |
||||
|
||||
import org.jeecg.modules.demo.rulex.util.DateValidator; |
||||
|
||||
import java.text.DateFormat; |
||||
import java.text.ParseException; |
||||
import java.text.SimpleDateFormat; |
||||
|
||||
public class DateValidatorUsingDateFormat implements DateValidator { |
||||
private final String dateFormat; |
||||
|
||||
public DateValidatorUsingDateFormat(String dateFormat) { |
||||
this.dateFormat = dateFormat; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isValid(String dateStr) { |
||||
final DateFormat sdf = new SimpleDateFormat(this.dateFormat); |
||||
sdf.setLenient(false); |
||||
try { |
||||
sdf.parse(dateStr); |
||||
} catch (ParseException e) { |
||||
return false; |
||||
} |
||||
return true; |
||||
} |
||||
} |
@ -0,0 +1,329 @@ |
||||
server: |
||||
port: 18081 |
||||
max-http-header-size: 65546 |
||||
tomcat: |
||||
max-swallow-size: -1 |
||||
error: |
||||
include-exception: true |
||||
include-stacktrace: ALWAYS |
||||
include-message: ALWAYS |
||||
servlet: |
||||
context-path: /jeecg-boot |
||||
compression: |
||||
enabled: true |
||||
min-response-size: 1024 |
||||
mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/* |
||||
management: |
||||
endpoints: |
||||
web: |
||||
exposure: |
||||
include: metrics,httptrace |
||||
|
||||
spring: |
||||
servlet: |
||||
multipart: |
||||
max-file-size: 1024MB |
||||
max-request-size: 1024MB |
||||
# mail: |
||||
# host: smtp.163.com |
||||
# username: jeecgos@163.com |
||||
# password: ?? |
||||
# properties: |
||||
# mail: |
||||
# smtp: |
||||
# auth: true |
||||
# starttls: |
||||
# enable: true |
||||
# required: true |
||||
## quartz定时任务,采用数据库方式 |
||||
# quartz: |
||||
# job-store-type: jdbc |
||||
# initialize-schema: embedded |
||||
# #设置自动启动,默认为 true |
||||
# auto-startup: true |
||||
# #启动时更新己存在的Job |
||||
# overwrite-existing-jobs: true |
||||
# properties: |
||||
# org: |
||||
# quartz: |
||||
# scheduler: |
||||
# instanceName: MyScheduler |
||||
# instanceId: AUTO |
||||
# jobStore: |
||||
# class: org.quartz.impl.jdbcjobstore.JobStoreTX |
||||
# driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate |
||||
# tablePrefix: QRTZ_ |
||||
# isClustered: true |
||||
# misfireThreshold: 60000 |
||||
# clusterCheckinInterval: 10000 |
||||
# threadPool: |
||||
# class: org.quartz.simpl.SimpleThreadPool |
||||
# threadCount: 10 |
||||
# threadPriority: 5 |
||||
# threadsInheritContextClassLoaderOfInitializingThread: true |
||||
#json 时间戳统一转换 |
||||
jackson: |
||||
date-format: yyyy-MM-dd HH:mm:ss |
||||
time-zone: GMT+8 |
||||
jpa: |
||||
open-in-view: false |
||||
activiti: |
||||
check-process-definitions: false |
||||
#启用作业执行器 |
||||
async-executor-activate: false |
||||
#启用异步执行器 |
||||
job-executor-activate: false |
||||
aop: |
||||
proxy-target-class: true |
||||
#配置freemarker |
||||
freemarker: |
||||
# 设置模板后缀名 |
||||
suffix: .ftl |
||||
# 设置文档类型 |
||||
content-type: text/html |
||||
# 设置页面编码格式 |
||||
charset: UTF-8 |
||||
# 设置页面缓存 |
||||
cache: false |
||||
prefer-file-system-access: false |
||||
# 设置ftl文件路径 |
||||
template-loader-path: |
||||
- classpath:/templates |
||||
# 设置静态文件路径,js,css等 |
||||
mvc: |
||||
static-path-pattern: /** |
||||
resource: |
||||
static-locations: classpath:/static/,classpath:/public/ |
||||
autoconfigure: |
||||
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure |
||||
datasource: |
||||
druid: |
||||
stat-view-servlet: |
||||
enabled: true |
||||
loginUsername: admin |
||||
loginPassword: 123456 |
||||
allow: |
||||
web-stat-filter: |
||||
enabled: true |
||||
dynamic: |
||||
druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置) |
||||
# 连接池的配置信息 |
||||
# 初始化大小,最小,最大 |
||||
initial-size: 5 |
||||
min-idle: 5 |
||||
maxActive: 20 |
||||
# 配置获取连接等待超时的时间 |
||||
maxWait: 60000 |
||||
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 |
||||
timeBetweenEvictionRunsMillis: 60000 |
||||
# 配置一个连接在池中最小生存的时间,单位是毫秒 |
||||
minEvictableIdleTimeMillis: 300000 |
||||
validationQuery: SELECT 1 FROM DUAL |
||||
testWhileIdle: true |
||||
testOnBorrow: false |
||||
testOnReturn: false |
||||
# 打开PSCache,并且指定每个连接上PSCache的大小 |
||||
poolPreparedStatements: true |
||||
maxPoolPreparedStatementPerConnectionSize: 20 |
||||
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 |
||||
filters: stat,wall,slf4j |
||||
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录 |
||||
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 |
||||
datasource: |
||||
master: |
||||
# url: jdbc:mysql://mysql-lee.mysql.rds.aliyuncs.com:3306/zy?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai |
||||
# username: root1 |
||||
# password: zxcvbnm023@lee |
||||
# driver-class-name: com.mysql.cj.jdbc.Driver |
||||
# 多数据源配置 |
||||
#multi-datasource1: |
||||
url: jdbc:mysql://182.92.169.222:3306/project_management?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai |
||||
username: root |
||||
password: ycwl2022. |
||||
driver-class-name: com.mysql.cj.jdbc.Driver |
||||
#redis 配置 |
||||
redis: |
||||
database: 2 |
||||
host: 127.0.0.1 |
||||
lettuce: |
||||
pool: |
||||
max-active: 8 #最大连接数据库连接数,设 -1 为没有限制 |
||||
max-idle: 8 #最大等待连接中的数量,设 0 为没有限制 |
||||
max-wait: -1ms #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。 |
||||
min-idle: 0 #最小等待连接中的数量,设 0 为没有限制 |
||||
shutdown-timeout: 100ms |
||||
password: |
||||
port: 6379 |
||||
# password: 'zy2021zy' |
||||
# port: 7480 |
||||
#mybatis plus 设置 |
||||
mybatis-plus: |
||||
mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml |
||||
global-config: |
||||
# 关闭MP3.0自带的banner |
||||
banner: false |
||||
db-config: |
||||
#主键类型 0:"数据库ID自增",1:"该类型为未设置主键类型", 2:"用户输入ID",3:"全局唯一ID (数字类型唯一ID)", 4:"全局唯一ID UUID",5:"字符串全局唯一ID (idWorker 的字符串表示)"; |
||||
id-type: ASSIGN_ID |
||||
# 默认数据库表下划线命名 |
||||
table-underline: true |
||||
configuration: |
||||
# 这个配置会将执行的sql打印出来,在开发或测试的时候可以用 |
||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl |
||||
# 返回类型为Map,显示null对应的字段 |
||||
call-setters-on-nulls: true |
||||
#jeecg专用配置 |
||||
minidao: |
||||
base-package: org.jeecg.modules.jmreport.* |
||||
#DB类型(mysql | postgresql | oracle | sqlserver| other) |
||||
db-type: mysql |
||||
jeecg: |
||||
wordPath: /opt/word |
||||
# 本地:local\Minio:minio\阿里云:alioss |
||||
uploadType: local |
||||
path: |
||||
#文件上传根目录 设置 |
||||
upload: /opt/upFiles |
||||
#webapp文件路径 |
||||
webapp: /opt/webapp |
||||
shiro: |
||||
excludeUrls: /VideoRecorder/jeecgDemo/demo3,/VideoRecorder/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/** |
||||
#阿里云oss存储和大鱼短信秘钥配置 |
||||
oss: |
||||
accessKey: ?? |
||||
secretKey: ?? |
||||
endpoint: oss-cn-beijing.aliyuncs.com |
||||
bucketName: ?? |
||||
# ElasticSearch 6设置 |
||||
elasticsearch: |
||||
cluster-name: jeecg-ES |
||||
cluster-nodes: 127.0.0.1:9200 |
||||
check-enabled: false |
||||
# 表单设计器配置 |
||||
desform: |
||||
# 主题颜色(仅支持 16进制颜色代码) |
||||
theme-color: "#1890ff" |
||||
# 文件、图片上传方式,可选项:qiniu(七牛云)、system(跟随系统配置) |
||||
upload-type: system |
||||
map: |
||||
# 配置百度地图的AK,申请地址:https://lbs.baidu.com/apiconsole/key?application=key#/home |
||||
baidu: ?? |
||||
# 在线预览文件服务器地址配置 |
||||
file-view-domain: 127.0.0.1:8012 |
||||
# minio文件上传 |
||||
minio: |
||||
minio_url: http://minio.jeecg.com |
||||
minio_name: ?? |
||||
minio_pass: ?? |
||||
bucketName: otatest |
||||
#大屏报表参数设置 |
||||
jmreport: |
||||
mode: dev |
||||
#数据字典是否进行saas数据隔离,自己看自己的字典 |
||||
saas: false |
||||
#是否需要校验token |
||||
is_verify_token: true |
||||
#必须校验方法 |
||||
verify_methods: remove,delete,save,add,update |
||||
#Wps在线文档 |
||||
wps: |
||||
domain: https://wwo.wps.cn/office/ |
||||
appid: ?? |
||||
appsecret: ?? |
||||
#xxl-job配置 |
||||
xxljob: |
||||
enabled: false |
||||
adminAddresses: http://127.0.0.1:9080/xxl-job-admin |
||||
appname: ${spring.application.name} |
||||
accessToken: '' |
||||
address: 127.0.0.1:30007 |
||||
ip: 127.0.0.1 |
||||
port: 30007 |
||||
logPath: logs/jeecg/job/jobhandler/ |
||||
logRetentionDays: 30 |
||||
#自定义路由配置 yml nacos database |
||||
route: |
||||
config: |
||||
data-id: jeecg-gateway-router |
||||
group: DEFAULT_GROUP |
||||
data-type: yml |
||||
#分布式锁配置 |
||||
redisson: |
||||
address: 127.0.0.1:6379 |
||||
password: |
||||
type: STANDALONE |
||||
enabled: true |
||||
#cas单点登录 |
||||
cas: |
||||
prefixUrl: http://cas.example.org:8443/cas |
||||
#Mybatis输出sql日志 |
||||
logging: |
||||
level: |
||||
org.jeecg.modules.system.mapper: info |
||||
#swagger |
||||
knife4j: |
||||
production: false |
||||
basic: |
||||
enable: true |
||||
username: jeecg |
||||
password: jeecg1314 |
||||
#第三方登录 |
||||
justauth: |
||||
enabled: true |
||||
type: |
||||
GITHUB: |
||||
client-id: ?? |
||||
client-secret: ?? |
||||
redirect-uri: http://sso.VideoRecorder.com:8080/jeecg-boot/sys/thirdLogin/github/callback |
||||
WECHAT_ENTERPRISE: |
||||
client-id: ?? |
||||
client-secret: ?? |
||||
redirect-uri: http://sso.VideoRecorder.com:8080/jeecg-boot/sys/thirdLogin/wechat_enterprise/callback |
||||
agent-id: ?? |
||||
DINGTALK: |
||||
client-id: ?? |
||||
client-secret: ?? |
||||
redirect-uri: http://sso.VideoRecorder.com:8080/jeecg-boot/sys/thirdLogin/dingtalk/callback |
||||
WECHAT_OPEN: |
||||
client-id: ?? |
||||
client-secret: ?? |
||||
redirect-uri: http://sso.VideoRecorder.com:8080/jeecg-boot/sys/thirdLogin/wechat_open/callback |
||||
cache: |
||||
type: default |
||||
prefix: 'demo::' |
||||
timeout: 1h |
||||
#第三方APP对接 |
||||
third-app: |
||||
enabled: false |
||||
type: |
||||
#企业微信 |
||||
WECHAT_ENTERPRISE: |
||||
enabled: false |
||||
#CORP_ID |
||||
client-id: ?? |
||||
#SECRET |
||||
client-secret: ?? |
||||
#自建应用id |
||||
agent-id: ?? |
||||
#自建应用秘钥(新版企微需要配置) |
||||
# agent-app-secret: ?? |
||||
#钉钉 |
||||
DINGTALK: |
||||
enabled: false |
||||
# appKey |
||||
client-id: ?? |
||||
# appSecret |
||||
client-secret: ?? |
||||
agent-id: ?? |
||||
|
||||
mq: |
||||
pay: |
||||
exchange: |
||||
order: exchange.order |
||||
returnorder: exchange.returnorder |
||||
queue: |
||||
order: queue.order |
||||
returnorder: queue.returnorder |
||||
routing: |
||||
key: queue.order |
||||
returnorder: queue.returnorder |
Loading…
Reference in new issue