31 changed files with 1051 additions and 86 deletions
@ -0,0 +1,183 @@ |
|||
<template> |
|||
<div class="imgDemo"> |
|||
<div style="text-align:center;height: 1500px;"> |
|||
<div id="video-container" > |
|||
</div> |
|||
<div style="text-align:center;" > |
|||
<el-button type="primary" size="small" @click="togglePlay">{{ play ? '正在播放' : '停止' }}</el-button> |
|||
<!-- <el-tooltip effect="dark" :content="play ? '正在播放' : '停止'" > |
|||
<i :class="play ? 'el-icon-video-pause' : 'el-icon-video-play'" @click="togglePlay" ></i> |
|||
</el-tooltip>--> |
|||
<el-button type="primary" size="small" @click="isCapturePicture">视频截图</el-button> |
|||
<!-- <el-tooltip effect="dark" content="视频截图"> |
|||
<i class="el-icon-camera" @click="isCapturePicture"></i> |
|||
</el-tooltip>--> |
|||
<!-- <el-tooltip effect="dark" :content="enableZ ? '电子放大-已开启' : '电子放大-已关闭'"> |
|||
<i :class="enableZ ? 'el-icon-zoom-out' : 'el-icon-zoom-in'" @click="toggleZoom"></i> |
|||
</el-tooltip>--> |
|||
<el-button type="primary" size="small" @click="isFullScreen">全屏</el-button> |
|||
<!-- <div effect="dark" content="全屏"> |
|||
<div @click="isFullScreen" style="width: 100px;height: 100px;background: image('') "></div> |
|||
</div>--> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import EZUIKit from 'ezuikit-js'; |
|||
// import { login1 } from '@/api/system/user/login.js' |
|||
export default { |
|||
name: '', |
|||
data() { |
|||
return { |
|||
token: '', |
|||
player: null, |
|||
enableZ:false, //默认关闭电子放大 |
|||
play: false //默认停止播放 |
|||
} |
|||
}, |
|||
created(){ |
|||
this.getVideoData() |
|||
}, |
|||
methods: { |
|||
getVideoData(){ |
|||
this.player = new EZUIKit.EZUIKitPlayer({ |
|||
id: 'video-container', // 视频容器ID |
|||
accessToken: 'at.cnqo1upn5o4m2zkh6htzpd6a5u5cxklx-2315mkg9mw-11hq79z-g6qxd1wmw', |
|||
url: 'ezopen://open.ys7.com/109860978/1.hd.live', |
|||
audio: 1, // 是否默认开启声音 0 - 关闭 1 - 开启 |
|||
autoplay: true, |
|||
templete: "security", |
|||
header: ["capturePicture"], |
|||
footer: ['talk','fullScreen'], |
|||
width: 608, |
|||
plugin: ['talk'], |
|||
height: 437 |
|||
}) |
|||
}, |
|||
// 开启/关闭 电子放大 |
|||
/* toggleZoom(){ |
|||
console.log(this.enableZ); |
|||
console.log(this.player); |
|||
console.log(!this.player || !this.play); |
|||
if(!this.player ) return; |
|||
switch (this.enableZ) { |
|||
case true: |
|||
|
|||
console.log("1111111111111111"); |
|||
this.player.closeZoom(); |
|||
this.enableZ = false; |
|||
break; |
|||
case false: |
|||
console.log("2222222222222222"); |
|||
this.player.enableZoom(); |
|||
this.enableZ = true; |
|||
break; |
|||
default: |
|||
break; |
|||
} |
|||
},*/ |
|||
// 播放/停止 监控 |
|||
togglePlay(){ |
|||
if(!this.player) return; |
|||
switch (this.play) { |
|||
case true: |
|||
this.player.stop(); |
|||
this.play = false; |
|||
break; |
|||
case false: |
|||
this.player.play(); |
|||
this.play = true; |
|||
break; |
|||
default: |
|||
break; |
|||
} |
|||
}, |
|||
// 视频截图 |
|||
isCapturePicture(){ |
|||
if(!this.player || !this.play) return; |
|||
this.player.capturePicture(); |
|||
}, |
|||
// 全屏 |
|||
isFullScreen(){ |
|||
if(!this.player || !this.play) return; |
|||
this.player.fullScreen(); |
|||
} |
|||
|
|||
}, |
|||
beforeDestroy() { |
|||
this.player && this.player.stop() //销毁并停止直播视频 |
|||
} |
|||
// getToken(){ |
|||
// let params = { |
|||
// password: "329653", |
|||
// roleSid: "", |
|||
// token: "", |
|||
// userName: "15097329653", |
|||
// verifyCode: "" |
|||
// } |
|||
// login1(params).then(res => { |
|||
// this.token = res.data.token |
|||
// window.sessionStorage.setItem('token', res.data.token) |
|||
// }) |
|||
// } |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.imgDemo { |
|||
width: 100%; |
|||
height: 100%; |
|||
background: radial-gradient(#fff,#f5f7f4, #fff); |
|||
} |
|||
canvas { |
|||
} |
|||
#video-container{ |
|||
position: relative; |
|||
} |
|||
::v-deep #video-container iframe{ |
|||
width: 100% !important; |
|||
} |
|||
.mask{ |
|||
position: absolute; |
|||
top:0; |
|||
left:0; |
|||
width:100%; |
|||
height:500px; |
|||
background: rgba(255, 255, 255, .6) url('../../../assets/images/place.png') no-repeat center; |
|||
background-size: 100px; |
|||
} |
|||
.controll{ |
|||
display: flex; |
|||
position: absolute; |
|||
bottom: 0; |
|||
left: 0; |
|||
width: 100%; |
|||
height: 48px; |
|||
line-height: 48px; |
|||
background: rgba(0, 0, 0, 0.65); |
|||
padding: 0 15px; |
|||
z-index: 2; |
|||
opacity:0; |
|||
transition: all 0.3s; |
|||
.left{ |
|||
width: 50%; |
|||
i{ |
|||
margin-right: 10px; |
|||
} |
|||
} |
|||
.right{ |
|||
width: 50%; |
|||
text-align: right; |
|||
} |
|||
i{ |
|||
vertical-align: middle; |
|||
color: #fff; |
|||
font-size: 30px; |
|||
} |
|||
} |
|||
#video-container:hover .controll{ |
|||
opacity: 0.65; |
|||
} |
|||
</style> |
@ -0,0 +1,85 @@ |
|||
package com.yxt.supervise.portal.biz.gdsales; |
|||
|
|||
import com.baomidou.mybatisplus.annotation.TableName; |
|||
import com.fasterxml.jackson.annotation.JsonFormat; |
|||
import com.yxt.common.core.domain.EntityWithId; |
|||
import lombok.Data; |
|||
|
|||
import java.util.Date; |
|||
|
|||
@Data |
|||
@TableName("gd_sales_reportday") |
|||
public class GdSalesReportday extends EntityWithId { |
|||
|
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
|||
private Date createTime = new Date(); // 记录创建时间/
|
|||
private String remarks; // 备注说明
|
|||
private String orderDate; // 单据日期
|
|||
private String serialNumber; // 编号
|
|||
private String reportTime; // 上报时间
|
|||
private String kmdatea; // 科目/日,大前天
|
|||
private String kmdateb; // 科目/日,前天
|
|||
private String kmdatec; // 科目/日,昨天
|
|||
private double xjlla = 0; // 现金流量-经营活动产生的现金流量(元),大前天
|
|||
private double xjllb = 0; // 现金流量-经营活动产生的现金流量(元),前天
|
|||
private double xjllc = 0; // 现金流量-经营活动产生的现金流量(元),昨天
|
|||
private double xsxja = 0; // 销售商品收到的现金(元),大前天
|
|||
private double xsxjb = 0; // 销售商品收到的现金(元),前天
|
|||
private double xsxjc = 0; // 销售商品收到的现金(元),昨天
|
|||
private double qtxja = 0; // 收到其他与经营活动有关的现金(元),大前天
|
|||
private double qtxjb = 0; // 收到其他与经营活动有关的现金(元),前天
|
|||
private double qtxjc = 0; // 收到其他与经营活动有关的现金(元),昨天
|
|||
private double cwfxhja = 0; // 财务分析本项合计,大前天
|
|||
private double cwfxhjb = 0; // 财务分析本项合计,前天
|
|||
private double cwfxhjc = 0; // 财务分析本项合计,昨天
|
|||
private double zcfza = 0; // 资产负债-流动资产(元),大前天
|
|||
private double zcfzb = 0; // 资产负债-流动资产(元),前天
|
|||
private double zcfzc = 0; // 资产负债-流动资产(元),昨天
|
|||
private double yszka = 0; // 应收账款(元),大前天
|
|||
private double yszkb = 0; // 应收账款(元),前天
|
|||
private double yszkc = 0; // 应收账款(元),昨天
|
|||
private double ldfza = 0; // 流动负债(元),大前天
|
|||
private double ldfzb = 0; // 流动负债(元),前天
|
|||
private double ldfzc = 0; // 流动负债(元),昨天
|
|||
private double yskxa = 0; // 预收款项(元),大前天
|
|||
private double yskxb = 0; // 预收款项(元),前天
|
|||
private double yskxc = 0; // 预收款项(元),昨天
|
|||
private String qczhz; // 期初总货值
|
|||
private String ycqchz; // 烟草期初货值
|
|||
private String xmdatea; // 项目/日,前天
|
|||
private String xmdateb; // 项目/日,昨天
|
|||
private String xmdatec; // 项目/日,今天
|
|||
private double zthza = 0; // 在途货值(元),前天
|
|||
private double zthzb = 0; // 在途货值(元),昨天
|
|||
private double zthzc = 0; // 在途货值(元),今天
|
|||
private double kchza = 0; // 库存货值(元),前天
|
|||
private double kchzb = 0; // 库存货值(元),昨天
|
|||
private double kchzc = 0; // 库存货值(元),今天
|
|||
private double zhyea = 0; // 帐户余额(元)账户余额为前一天余额,前天
|
|||
private double zhyeb = 0; // 帐户余额(元)账户余额为前一天余额,昨天
|
|||
private double zhyec = 0; // 帐户余额(元)账户余额为前一天余额,今天
|
|||
private double yjyszka = 0; // 预警应收帐款(元),前天
|
|||
private double yjyszkb = 0; // 预警应收帐款(元),昨天
|
|||
private double yjyszkc = 0; // 预警应收帐款(元),今天
|
|||
private double yjhja = 0; // 主要预警指标本项合计,前天
|
|||
private double yjhjb = 0; // 主要预警指标本项合计,昨天
|
|||
private double yjhjc = 0; // 主要预警指标本项合计,今天
|
|||
private double lwlsdze = 0; // 连网连锁店,总额(元)
|
|||
private double lwlsdyszk = 0; // 连网连锁店,应收帐款(元)
|
|||
private double lwlsdkcje = 0; // 连网连锁店,扣除应收金额(元)
|
|||
private double lsnjmze = 0; // 连锁内加盟,总额(元)
|
|||
private double lsnjmyszk = 0; // 连锁内加盟,应收帐款(元)
|
|||
private double lsnjmkcje = 0; // 连锁内加盟,扣除应收金额(元)
|
|||
private double pszxze = 0; // 配送中心,总额(元)
|
|||
private double pszxyszk = 0; // 配送中心,应收帐款(元)
|
|||
private double pszxkcje = 0; // 配送中心,扣除应收金额(元)
|
|||
private double lswjmze = 0; // 连锁外加盟(销配结算),总额(元)
|
|||
private double lswjmyszk = 0; // 连锁外加盟(销配结算),应收帐款(元)
|
|||
private double lswjmkcje = 0; // 连锁外加盟(销配结算),扣除应收金额(元)
|
|||
private double ycmdze = 0; // 36524集团报烟门店仓,总额(元)
|
|||
private double ycmdyszk = 0; // 36524集团报烟门店仓,应收帐款(元)
|
|||
private double ycmdkcje = 0; // 36524集团报烟门店仓,扣除应收金额(元)
|
|||
private double ycjmdze = 0; // 烟草连锁外加盟(销配结算),总额(元)
|
|||
private double ycjmdyszk = 0; // 烟草连锁外加盟(销配结算),应收帐款(元)
|
|||
private double ycjmdkcje = 0; // 烟草连锁外加盟(销配结算),扣除应收金额(元)
|
|||
} |
@ -0,0 +1,14 @@ |
|||
package com.yxt.supervise.portal.biz.gdsales; |
|||
|
|||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
|||
import org.apache.ibatis.annotations.Delete; |
|||
import org.apache.ibatis.annotations.Mapper; |
|||
import org.apache.ibatis.annotations.Param; |
|||
|
|||
@Mapper |
|||
public interface GdSalesReportdayMapper extends BaseMapper<GdSalesReportday> { |
|||
|
|||
|
|||
@Delete("delete from gd_sales_reportday where orderDate=#{orderDate} ") |
|||
void clearByOrderDate(@Param("orderDate") String orderDate); |
|||
} |
@ -0,0 +1,172 @@ |
|||
package com.yxt.supervise.portal.biz.gdsales; |
|||
|
|||
import cn.hutool.core.date.DateTime; |
|||
import cn.hutool.core.date.DateUtil; |
|||
import cn.hutool.core.util.StrUtil; |
|||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
|||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
|||
import com.yxt.supervise.portal.biz.gdinstorage.GdInstorageCountService; |
|||
import com.yxt.supervise.portal.biz.gdinstorage.GdInstorageJmdService; |
|||
import com.yxt.supervise.portal.biz.gdinstorage.GdInstorageYcService; |
|||
import com.yxt.supervise.portal.biz.gdinventory.GdInventoryOkService; |
|||
import com.yxt.supervise.portal.biz.gdwholesale.GdWholesaleService; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
import java.util.Date; |
|||
import java.util.List; |
|||
|
|||
@Service |
|||
public class GdSalesReportdayService extends ServiceImpl<GdSalesReportdayMapper, GdSalesReportday> { |
|||
|
|||
@Autowired |
|||
private GdSalesService gdSalesService; |
|||
@Autowired |
|||
private GdSalesYcService gdSalesYcService; |
|||
@Autowired |
|||
private GdWholesaleService gdWholesaleService; |
|||
@Autowired |
|||
private GdInstorageJmdService gdInstorageJmdService; |
|||
@Autowired |
|||
private GdInstorageYcService gdInstorageYcService; |
|||
@Autowired |
|||
private GdInventoryOkService gdInventoryOkService; |
|||
@Autowired |
|||
private GdInstorageCountService gdInstorageCountService; |
|||
|
|||
public GdSalesReportday clearAndInitByOrderDate(String orderDate) { |
|||
this.clearByOrderDate(orderDate); // 清除数据日的数据
|
|||
|
|||
Date curDate = new Date(); |
|||
String dfmt = DateUtil.format(curDate, "yyyy-MM-dd"); |
|||
String dfmt2 = DateUtil.format(curDate, "yyyy-MM-dd HH:mm"); |
|||
|
|||
String preOrderDate = dayAgo(orderDate, -1); // 前一天
|
|||
String befOrderDate = dayAgo(orderDate, -2); // 前两天
|
|||
String thrOrderDate = dayAgo(orderDate, -3); // 前三天
|
|||
|
|||
GdSalesReportday preRp = fetchByOrderDate(preOrderDate); |
|||
if (preRp == null) |
|||
preRp = new GdSalesReportday(); |
|||
|
|||
GdSalesReportday rp = new GdSalesReportday(); |
|||
rp.setOrderDate(orderDate); // 单据日期
|
|||
rp.setSerialNumber("xsjyrbb" + orderDate.replace("-", "")); // 编号
|
|||
rp.setReportTime(dfmt2); // 上报时间
|
|||
rp.setKmdatea(befOrderDate); // 科目/日,大前天
|
|||
rp.setKmdateb(preOrderDate); // 科目/日,前天
|
|||
rp.setKmdatec(orderDate); // 科目/日,昨天
|
|||
// rp.setXjlla(""); // 现金流量-经营活动产生的现金流量(元),大前天
|
|||
// rp.setXjllb(""); // 现金流量-经营活动产生的现金流量(元),前天
|
|||
// rp.setXjllc(""); // 现金流量-经营活动产生的现金流量(元),昨天
|
|||
rp.setXsxja(preRp.getXsxjb()); // 销售商品收到的现金(元),大前天
|
|||
rp.setXsxjb(preRp.getXsxjc()); // 销售商品收到的现金(元),前天
|
|||
rp.setXsxjc(0); // 销售商品收到的现金(元),昨天 //后面计算
|
|||
// rp.setQtxja(""); // 收到其他与经营活动有关的现金(元),大前天
|
|||
// rp.setQtxjb(""); // 收到其他与经营活动有关的现金(元),前天
|
|||
// rp.setQtxjc(""); // 收到其他与经营活动有关的现金(元),昨天
|
|||
rp.setCwfxhja(preRp.getCwfxhjb()); // 财务分析本项合计,大前天
|
|||
rp.setCwfxhjb(preRp.getCwfxhjc()); // 财务分析本项合计,前天
|
|||
rp.setCwfxhjc(0); // 财务分析本项合计,昨天 //后面计算
|
|||
// rp.setZcfza(""); // 资产负债-流动资产(元),大前天
|
|||
// rp.setZcfzb(""); // 资产负债-流动资产(元),前天
|
|||
// rp.setZcfzc(""); // 资产负债-流动资产(元),昨天
|
|||
// rp.setYszka(""); // 应收账款(元),大前天
|
|||
// rp.setYszkb(""); // 应收账款(元),前天
|
|||
// rp.setYszkc(""); // 应收账款(元),昨天
|
|||
// rp.setLdfza(""); // 流动负债(元),大前天
|
|||
// rp.setLdfzb(""); // 流动负债(元),前天
|
|||
// rp.setLdfzc(""); // 流动负债(元),昨天
|
|||
// rp.setYskxa(""); // 预收款项(元),大前天
|
|||
// rp.setYskxb(""); // 预收款项(元),前天
|
|||
// rp.setYskxc(""); // 预收款项(元),昨天
|
|||
rp.setQczhz(""); // 期初总货值
|
|||
rp.setYcqchz(""); // 烟草期初货值
|
|||
rp.setXmdatea(StrUtil.isBlank(preRp.getXmdateb()) ? preOrderDate : preRp.getXmdateb()); // 项目/日,前天
|
|||
rp.setXmdateb(StrUtil.isBlank(preRp.getXmdatec()) ? orderDate : preRp.getXmdatec()); // 项目/日,昨天
|
|||
rp.setXmdatec(dfmt); // 项目/日,今天
|
|||
rp.setZthza(preRp.getZthzb()); // 在途货值(元),前天
|
|||
rp.setZthzb(preRp.getZthzc()); // 在途货值(元),昨天
|
|||
rp.setZthzc(0); // 在途货值(元),今天 // 计算
|
|||
rp.setKchza(preRp.getKchzb()); // 库存货值(元),前天
|
|||
rp.setKchzb(preRp.getKchzc()); // 库存货值(元),昨天
|
|||
rp.setKchzc(0); // 库存货值(元),今天 // 计算
|
|||
// rp.setZhyea(""); // 帐户余额(元)账户余额为前一天余额,前天
|
|||
// rp.setZhyeb(""); // 帐户余额(元)账户余额为前一天余额,昨天
|
|||
// rp.setZhyec(""); // 帐户余额(元)账户余额为前一天余额,今天
|
|||
// rp.setYjyszka(""); // 预警应收帐款(元),前天
|
|||
// rp.setYjyszkb(""); // 预警应收帐款(元),昨天
|
|||
// rp.setYjyszkc(""); // 预警应收帐款(元),今天
|
|||
// rp.setYjhja(""); // 主要预警指标本项合计,前天
|
|||
// rp.setYjhjb(""); // 主要预警指标本项合计,昨天
|
|||
// rp.setYjhjc(""); // 主要预警指标本项合计,今天
|
|||
double xsLwlsd = gdSalesService.amountOfLwlsdDay(orderDate); |
|||
rp.setLwlsdze(xsLwlsd); // 连网连锁店,总额(元)
|
|||
// rp.setLwlsdyszk(""); // 连网连锁店,应收帐款(元)
|
|||
rp.setLwlsdkcje(xsLwlsd); // 连网连锁店,扣除应收金额(元)
|
|||
|
|||
double xsLsnjm = gdSalesService.amountOfLsnjmDay(orderDate); |
|||
rp.setLsnjmze(xsLsnjm); // 连锁内加盟,总额(元)
|
|||
// rp.setLsnjmyszk(""); // 连锁内加盟,应收帐款(元)
|
|||
rp.setLsnjmkcje(xsLsnjm); // 连锁内加盟,扣除应收金额(元)
|
|||
|
|||
double xsPszx = gdWholesaleService.amountOfDay(orderDate); |
|||
rp.setPszxze(xsPszx); // 配送中心,总额(元)
|
|||
// rp.setPszxyszk(""); // 配送中心,应收帐款(元)
|
|||
rp.setPszxkcje(xsPszx); // 配送中心,扣除应收金额(元)
|
|||
|
|||
double xsLswjm = gdInstorageJmdService.amountOfDay(orderDate); |
|||
rp.setLswjmze(xsLswjm); // 连锁外加盟(销配结算),总额(元)
|
|||
// rp.setLswjmyszk(""); // 连锁外加盟(销配结算),应收帐款(元)
|
|||
rp.setLswjmkcje(xsLswjm); // 连锁外加盟(销配结算),扣除应收金额(元)
|
|||
|
|||
double xsYc = gdSalesYcService.amountOfDay(orderDate); |
|||
rp.setYcmdze(xsYc); // 36524集团报烟门店仓,总额(元)
|
|||
// rp.setYcmdyszk(""); // 36524集团报烟门店仓,应收帐款(元)
|
|||
rp.setYcmdkcje(xsYc); // 36524集团报烟门店仓,扣除应收金额(元)
|
|||
|
|||
double xsYcJmd = gdInstorageYcService.amountOfDayJmd(orderDate); |
|||
rp.setYcjmdze(xsYcJmd); // 烟草连锁外加盟(销配结算),总额(元)
|
|||
// rp.setYcjmdyszk(""); // 烟草连锁外加盟(销配结算),应收帐款(元)
|
|||
rp.setYcjmdkcje(xsYcJmd); // 烟草连锁外加盟(销配结算),扣除应收金额(元)
|
|||
|
|||
double xshz1 = Math.round((xsLwlsd + xsLsnjm + xsPszx + xsLswjm + xsYc + xsYcJmd) * 100) / 100; |
|||
rp.setXsxjc(xshz1); // 销售商品收到的现金(元),昨天 //后面计算
|
|||
rp.setCwfxhjc(xshz1); // 财务分析本项合计,昨天 //后面计算
|
|||
|
|||
//在途货值
|
|||
double zthz = gdInstorageCountService.amountZaitu(); |
|||
rp.setZthzc(0); // 在途货值(元),今天 // 计算
|
|||
|
|||
//库存货值
|
|||
double kzhz = gdInventoryOkService.amountCurrent(); |
|||
rp.setKchzc(0); // 库存货值(元),今天 // 计算
|
|||
|
|||
baseMapper.insert(rp); |
|||
return rp; |
|||
} |
|||
|
|||
public GdSalesReportday fetchByOrderDate(String orderDate) { |
|||
QueryWrapper<GdSalesReportday> qw = new QueryWrapper<>(); |
|||
qw.eq("orderDate", orderDate); |
|||
List<GdSalesReportday> list = list(qw); |
|||
if (list == null || list.isEmpty()) |
|||
return null; |
|||
return list.get(0); |
|||
} |
|||
|
|||
private String dayAgo(String orderDate, int offset) { |
|||
DateTime nowDate = DateUtil.parse(orderDate, "yyyy-MM-dd"); |
|||
DateTime preDate = DateUtil.offsetDay(nowDate, offset); |
|||
return DateUtil.format(preDate, "yyyy-MM-dd"); |
|||
} |
|||
|
|||
/** |
|||
* 清理数据日期的数据 |
|||
* |
|||
* @param orderDate |
|||
*/ |
|||
public void clearByOrderDate(String orderDate) { |
|||
baseMapper.clearByOrderDate(orderDate); |
|||
} |
|||
} |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue