feat(柜机格口操作): 添加带关联信息的操作记录详情查询功能
新增操作记录详情查询接口,包含柜机、商店等关联信息 清空密码时重置备注字段为空
This commit is contained in:
parent
91aa34efe9
commit
078c18fec9
|
|
@ -11,6 +11,7 @@ import com.agileboot.domain.cabinet.operation.command.AddCabinetCellOperationCom
|
||||||
import com.agileboot.domain.cabinet.operation.command.UpdateCabinetCellOperationCommand;
|
import com.agileboot.domain.cabinet.operation.command.UpdateCabinetCellOperationCommand;
|
||||||
import com.agileboot.domain.cabinet.operation.db.CabinetCellOperationEntity;
|
import com.agileboot.domain.cabinet.operation.db.CabinetCellOperationEntity;
|
||||||
import com.agileboot.domain.cabinet.operation.dto.CabinetCellOperationDTO;
|
import com.agileboot.domain.cabinet.operation.dto.CabinetCellOperationDTO;
|
||||||
|
import com.agileboot.domain.cabinet.operation.query.SearchCabinetCellOperationDetailQuery;
|
||||||
import com.agileboot.domain.cabinet.operation.query.SearchCabinetCellOperationQuery;
|
import com.agileboot.domain.cabinet.operation.query.SearchCabinetCellOperationQuery;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -41,6 +42,13 @@ public class CabinetCellOperationController extends BaseController {
|
||||||
return ResponseDTO.ok(page);
|
return ResponseDTO.ok(page);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Operation(summary = "柜机格口操作详情列表")
|
||||||
|
@GetMapping("/page")
|
||||||
|
public ResponseDTO<PageDTO<CabinetCellOperationDTO>> listDetail(SearchCabinetCellOperationDetailQuery query) {
|
||||||
|
PageDTO<CabinetCellOperationDTO> page = cabinetCellOperationService.getOperationDetailList(query);
|
||||||
|
return ResponseDTO.ok(page);
|
||||||
|
}
|
||||||
|
|
||||||
@Operation(summary = "新增柜机格口操作")
|
@Operation(summary = "新增柜机格口操作")
|
||||||
@AccessLog(title = "柜机格口操作管理", businessType = BusinessTypeEnum.ADD)
|
@AccessLog(title = "柜机格口操作管理", businessType = BusinessTypeEnum.ADD)
|
||||||
@PostMapping
|
@PostMapping
|
||||||
|
|
|
||||||
|
|
@ -98,6 +98,8 @@ public class CabinetCellServiceImpl extends ServiceImpl<CabinetCellMapper, Cabin
|
||||||
UpdateWrapper<CabinetCellEntity> updateWrapper = new UpdateWrapper<>();
|
UpdateWrapper<CabinetCellEntity> updateWrapper = new UpdateWrapper<>();
|
||||||
updateWrapper.set("password", null)
|
updateWrapper.set("password", null)
|
||||||
.set("password_create_time", null)
|
.set("password_create_time", null)
|
||||||
|
// 清空密码时重置备注为空,暂不生效
|
||||||
|
.set("remark", "")
|
||||||
.set("usage_status", 1) // 空闲
|
.set("usage_status", 1) // 空闲
|
||||||
.eq("cell_id", cellId)
|
.eq("cell_id", cellId)
|
||||||
.eq("deleted", 0);
|
.eq("deleted", 0);
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ import com.agileboot.domain.cabinet.operation.db.CabinetCellOperationService;
|
||||||
import com.agileboot.domain.cabinet.operation.dto.CabinetCellOperationDTO;
|
import com.agileboot.domain.cabinet.operation.dto.CabinetCellOperationDTO;
|
||||||
import com.agileboot.domain.cabinet.operation.model.CabinetCellOperationModel;
|
import com.agileboot.domain.cabinet.operation.model.CabinetCellOperationModel;
|
||||||
import com.agileboot.domain.cabinet.operation.model.CabinetCellOperationModelFactory;
|
import com.agileboot.domain.cabinet.operation.model.CabinetCellOperationModelFactory;
|
||||||
|
import com.agileboot.domain.cabinet.operation.query.SearchCabinetCellOperationDetailQuery;
|
||||||
import com.agileboot.domain.cabinet.operation.query.SearchCabinetCellOperationQuery;
|
import com.agileboot.domain.cabinet.operation.query.SearchCabinetCellOperationQuery;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -54,4 +55,9 @@ public class CabinetCellOperationApplicationService {
|
||||||
public CabinetCellOperationEntity getByOperationId(Long operationId) {
|
public CabinetCellOperationEntity getByOperationId(Long operationId) {
|
||||||
return cabinetCellOperationService.getById(operationId);
|
return cabinetCellOperationService.getById(operationId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PageDTO<CabinetCellOperationDTO> getOperationDetailList(SearchCabinetCellOperationDetailQuery query) {
|
||||||
|
Page<CabinetCellOperationDTO> page = cabinetCellOperationService.getOperationDetailList(query);
|
||||||
|
return new PageDTO<>(page.getRecords(), page.getTotal());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package com.agileboot.domain.cabinet.operation.db;
|
package com.agileboot.domain.cabinet.operation.db;
|
||||||
|
|
||||||
|
import com.agileboot.domain.cabinet.operation.dto.CabinetCellOperationDTO;
|
||||||
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Constants;
|
import com.baomidou.mybatisplus.core.toolkit.Constants;
|
||||||
|
|
@ -25,6 +26,17 @@ public interface CabinetCellOperationMapper extends BaseMapper<CabinetCellOperat
|
||||||
@Param(Constants.WRAPPER) Wrapper<CabinetCellOperationEntity> queryWrapper
|
@Param(Constants.WRAPPER) Wrapper<CabinetCellOperationEntity> queryWrapper
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@Select("SELECT cco.*, cc.cabinet_id, sc.cabinet_name, sc.shop_id, s.shop_name, cc.cell_no, cc.cell_type " +
|
||||||
|
"FROM cabinet_cell_operation cco " +
|
||||||
|
"LEFT JOIN cabinet_cell cc ON cco.cell_id = cc.cell_id " +
|
||||||
|
"LEFT JOIN smart_cabinet sc ON cc.cabinet_id = sc.cabinet_id " +
|
||||||
|
"LEFT JOIN shop s ON sc.shop_id = s.shop_id " +
|
||||||
|
"${ew.customSqlSegment}")
|
||||||
|
Page<CabinetCellOperationDTO> getOperationDetailList(
|
||||||
|
Page<CabinetCellOperationDTO> page,
|
||||||
|
@Param(Constants.WRAPPER) Wrapper<CabinetCellOperationDTO> queryWrapper
|
||||||
|
);
|
||||||
|
|
||||||
@Select("SELECT * " +
|
@Select("SELECT * " +
|
||||||
"FROM cabinet_cell_operation " +
|
"FROM cabinet_cell_operation " +
|
||||||
"WHERE status = '1' " +
|
"WHERE status = '1' " +
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
package com.agileboot.domain.cabinet.operation.db;
|
package com.agileboot.domain.cabinet.operation.db;
|
||||||
|
|
||||||
import com.agileboot.common.core.page.AbstractPageQuery;
|
import com.agileboot.common.core.page.AbstractPageQuery;
|
||||||
|
import com.agileboot.domain.cabinet.operation.dto.CabinetCellOperationDTO;
|
||||||
|
import com.agileboot.domain.cabinet.operation.query.SearchCabinetCellOperationDetailQuery;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
|
||||||
|
|
@ -15,4 +17,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
public interface CabinetCellOperationService extends IService<CabinetCellOperationEntity> {
|
public interface CabinetCellOperationService extends IService<CabinetCellOperationEntity> {
|
||||||
|
|
||||||
Page<CabinetCellOperationEntity> getOperationList(AbstractPageQuery<CabinetCellOperationEntity> query);
|
Page<CabinetCellOperationEntity> getOperationList(AbstractPageQuery<CabinetCellOperationEntity> query);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取操作记录详情列表(带关联表信息)
|
||||||
|
*
|
||||||
|
* @param query 查询条件
|
||||||
|
* @return 分页结果
|
||||||
|
*/
|
||||||
|
Page<CabinetCellOperationDTO> getOperationDetailList(SearchCabinetCellOperationDetailQuery query);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import com.agileboot.common.core.page.AbstractPageQuery;
|
import com.agileboot.common.core.page.AbstractPageQuery;
|
||||||
|
import com.agileboot.domain.cabinet.operation.dto.CabinetCellOperationDTO;
|
||||||
|
import com.agileboot.domain.cabinet.operation.query.SearchCabinetCellOperationDetailQuery;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -21,4 +23,9 @@ public class CabinetCellOperationServiceImpl extends ServiceImpl<CabinetCellOper
|
||||||
public Page<CabinetCellOperationEntity> getOperationList(AbstractPageQuery<CabinetCellOperationEntity> query) {
|
public Page<CabinetCellOperationEntity> getOperationList(AbstractPageQuery<CabinetCellOperationEntity> query) {
|
||||||
return this.page(query.toPage(), query.toQueryWrapper());
|
return this.page(query.toPage(), query.toQueryWrapper());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Page<CabinetCellOperationDTO> getOperationDetailList(SearchCabinetCellOperationDetailQuery query) {
|
||||||
|
return this.baseMapper.getOperationDetailList(query.toPage(), query.toQueryWrapper());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,16 +8,23 @@ import java.util.Date;
|
||||||
import com.agileboot.common.annotation.ExcelColumn;
|
import com.agileboot.common.annotation.ExcelColumn;
|
||||||
import com.agileboot.common.annotation.ExcelSheet;
|
import com.agileboot.common.annotation.ExcelSheet;
|
||||||
import com.agileboot.domain.cabinet.operation.db.CabinetCellOperationEntity;
|
import com.agileboot.domain.cabinet.operation.db.CabinetCellOperationEntity;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
@ExcelSheet(name = "柜机格口操作记录列表")
|
@ExcelSheet(name = "柜机格口操作记录列表")
|
||||||
@Data
|
@Data
|
||||||
public class CabinetCellOperationDTO {
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
public class CabinetCellOperationDTO extends CabinetCellOperationEntity {
|
||||||
|
|
||||||
|
public CabinetCellOperationDTO() {
|
||||||
|
}
|
||||||
|
|
||||||
public CabinetCellOperationDTO(CabinetCellOperationEntity entity) {
|
public CabinetCellOperationDTO(CabinetCellOperationEntity entity) {
|
||||||
if (entity != null) {
|
if (entity != null) {
|
||||||
BeanUtil.copyProperties(entity, this);
|
BeanUtil.copyProperties(entity, this);
|
||||||
|
|
||||||
this.statusDesc = convertStatus(entity.getStatus());
|
this.statusDesc = convertStatus(entity.getStatus());
|
||||||
this.createTimeStr = DateUtil.format(entity.getCreateTime(), "yyyy-MM-dd HH:mm:ss");
|
this.createTimeStr = DateUtil.format(entity.getCreateTime(), "yyyy-MM-dd HH:mm:ss");
|
||||||
}
|
}
|
||||||
|
|
@ -25,52 +32,46 @@ public class CabinetCellOperationDTO {
|
||||||
|
|
||||||
private String convertStatus(Integer status) {
|
private String convertStatus(Integer status) {
|
||||||
if (status == null) return "未知状态";
|
if (status == null) return "未知状态";
|
||||||
switch(status) {
|
switch (status) {
|
||||||
case 1: return "正常";
|
case 1:
|
||||||
case 2: return "操作失败";
|
return "正常";
|
||||||
default: return "未知状态";
|
case 2:
|
||||||
|
return "操作失败";
|
||||||
|
default:
|
||||||
|
return "未知状态";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ExcelColumn(name = "操作流水号")
|
@ApiModelProperty("创建时间字符串")
|
||||||
private Long operationId;
|
@TableField(exist = false)
|
||||||
|
|
||||||
@ExcelColumn(name = "关联格口ID")
|
|
||||||
private Long cellId;
|
|
||||||
|
|
||||||
@ExcelColumn(name = "关联商品ID")
|
|
||||||
private Long goodsId;
|
|
||||||
|
|
||||||
@ExcelColumn(name = "商品名称")
|
|
||||||
private String goodsName;
|
|
||||||
|
|
||||||
@ExcelColumn(name = "企业微信用户ID")
|
|
||||||
private String userid;
|
|
||||||
|
|
||||||
@ExcelColumn(name = "是否内部用户")
|
|
||||||
private Boolean isInternal;
|
|
||||||
|
|
||||||
@ExcelColumn(name = "成员名称")
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
@ExcelColumn(name = "手机号码")
|
|
||||||
private String mobile;
|
|
||||||
|
|
||||||
@ExcelColumn(name = "操作类型")
|
|
||||||
private Integer operationType;
|
|
||||||
|
|
||||||
@ExcelColumn(name = "操作状态")
|
|
||||||
private Integer status;
|
|
||||||
|
|
||||||
@ExcelColumn(name = "操作状态")
|
|
||||||
private String statusDesc;
|
private String statusDesc;
|
||||||
|
|
||||||
@ExcelColumn(name = "操作人")
|
@ApiModelProperty("创建时间字符串")
|
||||||
private String operator;
|
@TableField(exist = false)
|
||||||
|
|
||||||
@ExcelColumn(name = "创建时间")
|
|
||||||
private Date createTime;
|
|
||||||
|
|
||||||
@ExcelColumn(name = "创建时间")
|
|
||||||
private String createTimeStr;
|
private String createTimeStr;
|
||||||
}
|
|
||||||
|
@ApiModelProperty("柜机ID")
|
||||||
|
@TableField(exist = false)
|
||||||
|
private Long cabinetId;
|
||||||
|
|
||||||
|
@ApiModelProperty("柜机名称")
|
||||||
|
@TableField(exist = false)
|
||||||
|
private String cabinetName;
|
||||||
|
|
||||||
|
@ApiModelProperty("商店ID")
|
||||||
|
@TableField(exist = false)
|
||||||
|
private Long shopId;
|
||||||
|
|
||||||
|
@ApiModelProperty("商店名称")
|
||||||
|
@TableField(exist = false)
|
||||||
|
private String shopName;
|
||||||
|
|
||||||
|
@ApiModelProperty("格口号")
|
||||||
|
@TableField(exist = false)
|
||||||
|
private Integer cellNo;
|
||||||
|
|
||||||
|
@ApiModelProperty("格口类型(1小格 2中格 3大格 4超大格)")
|
||||||
|
@TableField(exist = false)
|
||||||
|
private Integer cellType;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
package com.agileboot.domain.cabinet.operation.query;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import com.agileboot.common.core.page.AbstractPageQuery;
|
||||||
|
import com.agileboot.domain.cabinet.operation.dto.CabinetCellOperationDTO;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import java.util.Date;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 柜机格口操作记录详细查询(带关联表信息)
|
||||||
|
*
|
||||||
|
* @author valarchie
|
||||||
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
public class SearchCabinetCellOperationDetailQuery extends AbstractPageQuery<CabinetCellOperationDTO> {
|
||||||
|
|
||||||
|
private Long cabinetId;
|
||||||
|
private Long shopId;
|
||||||
|
private Long operationId;
|
||||||
|
private Long cellId;
|
||||||
|
private Long goodsId;
|
||||||
|
private Integer cellNo;
|
||||||
|
private String userid;
|
||||||
|
private String goodsName;
|
||||||
|
private Boolean isInternal;
|
||||||
|
private String name;
|
||||||
|
private String mobile;
|
||||||
|
private Integer operationType;
|
||||||
|
private Integer status;
|
||||||
|
private Date startTime;
|
||||||
|
private Date endTime;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public QueryWrapper<CabinetCellOperationDTO> addQueryCondition() {
|
||||||
|
QueryWrapper<CabinetCellOperationDTO> queryWrapper = new QueryWrapper<>();
|
||||||
|
|
||||||
|
queryWrapper
|
||||||
|
.eq(cabinetId != null, "sc.cabinet_id", cabinetId)
|
||||||
|
.eq(shopId != null, "s.shop_id", shopId)
|
||||||
|
.eq(operationId != null, "cco.operation_id", operationId)
|
||||||
|
.eq(cellId != null, "cco.cell_id", cellId)
|
||||||
|
.eq(goodsId != null, "cco.goods_id", goodsId)
|
||||||
|
.eq(cellNo != null, "cc.cell_no", cellNo)
|
||||||
|
.eq(StrUtil.isNotEmpty(userid), "cco.userid", userid)
|
||||||
|
.like(StrUtil.isNotEmpty(goodsName), "cco.goods_name", goodsName)
|
||||||
|
.eq(isInternal != null, "cco.is_internal", isInternal)
|
||||||
|
.like(StrUtil.isNotEmpty(name), "cco.name", name)
|
||||||
|
.like(StrUtil.isNotEmpty(mobile), "cco.mobile", mobile)
|
||||||
|
.eq(operationType != null, "cco.operation_type", operationType)
|
||||||
|
.eq(status != null, "cco.status", status)
|
||||||
|
.between(startTime != null && endTime != null, "cco.create_time", startTime, endTime)
|
||||||
|
.orderByDesc("cco.create_time");
|
||||||
|
|
||||||
|
this.timeRangeColumn = "cco.create_time";
|
||||||
|
|
||||||
|
return queryWrapper;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -109,4 +109,26 @@ CREATE TABLE `cabinet_cell` (
|
||||||
KEY `idx_goods` (`goods_id`),
|
KEY `idx_goods` (`goods_id`),
|
||||||
CONSTRAINT `fk_cell_cabinet` FOREIGN KEY (`cabinet_id`) REFERENCES `smart_cabinet` (`cabinet_id`),
|
CONSTRAINT `fk_cell_cabinet` FOREIGN KEY (`cabinet_id`) REFERENCES `smart_cabinet` (`cabinet_id`),
|
||||||
CONSTRAINT `fk_cell_goods` FOREIGN KEY (`goods_id`) REFERENCES `shop_goods` (`goods_id`)
|
CONSTRAINT `fk_cell_goods` FOREIGN KEY (`goods_id`) REFERENCES `shop_goods` (`goods_id`)
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=1268 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='柜机格口信息表';
|
) ENGINE=InnoDB AUTO_INCREMENT=1268 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='柜机格口信息表';
|
||||||
|
|
||||||
|
CREATE TABLE `cabinet_cell_operation` (
|
||||||
|
`operation_id` bigint NOT NULL AUTO_INCREMENT COMMENT '操作流水号',
|
||||||
|
`cell_id` bigint NOT NULL COMMENT '关联格口ID',
|
||||||
|
`goods_id` bigint DEFAULT NULL COMMENT '关联商品ID',
|
||||||
|
`goods_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商品名称',
|
||||||
|
`userid` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '企业微信用户ID',
|
||||||
|
`is_internal` tinyint(1) DEFAULT '0' COMMENT '是否内部用户(0否 1是)',
|
||||||
|
`name` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '成员名称',
|
||||||
|
`mobile` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '手机号码',
|
||||||
|
`operation_type` tinyint NOT NULL COMMENT '操作类型(1用户 2管理员)',
|
||||||
|
`status` tinyint NOT NULL DEFAULT '1' COMMENT '操作状态(1正常 2操作失败)',
|
||||||
|
`creator_id` bigint NOT NULL DEFAULT '0' COMMENT '创建者ID',
|
||||||
|
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||||
|
`updater_id` bigint NOT NULL DEFAULT '0' COMMENT '更新者ID',
|
||||||
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
|
`deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '删除标志(0存在 1删除)',
|
||||||
|
PRIMARY KEY (`operation_id`),
|
||||||
|
KEY `idx_cell` (`cell_id`),
|
||||||
|
KEY `idx_user` (`userid`),
|
||||||
|
KEY `idx_operation_time` (`create_time`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=5717 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='柜机格口操作记录表';
|
||||||
Loading…
Reference in New Issue