feature:1.新增预算接口(列表字段缺失)
This commit is contained in:
parent
477be1154d
commit
054e30c1b8
|
@ -0,0 +1,61 @@
|
|||
package com.dite.znpt.domain.entity;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
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.dite.znpt.domain.AuditableEntity;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author huise23
|
||||
* @date 2025/07/17 21:58
|
||||
* @Description: 项目预算信息表实体类
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
@TableName("project_budget_info")
|
||||
@ApiModel(value="ProjectBudgetInfoEntity对象", description="项目预算信息表")
|
||||
public class ProjectBudgetInfoEntity extends AuditableEntity implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 514469235298737990L;
|
||||
|
||||
@ExcelProperty("主键")
|
||||
@ApiModelProperty("主键")
|
||||
@TableId(value = "budget_id", type = IdType.ASSIGN_ID)
|
||||
private String budgetId;
|
||||
|
||||
@ExcelProperty("项目id")
|
||||
@ApiModelProperty("项目id")
|
||||
@TableField("project_id")
|
||||
private String projectId;
|
||||
|
||||
@ExcelProperty("预算名称")
|
||||
@ApiModelProperty("预算名称")
|
||||
@TableField("budget_name")
|
||||
private String budgetName;
|
||||
|
||||
@ExcelProperty("预算类型")
|
||||
@ApiModelProperty("预算类型")
|
||||
@TableField("budget_type")
|
||||
private String budgetType;
|
||||
|
||||
@ExcelProperty("预算金额(万元)")
|
||||
@ApiModelProperty("预算金额(万元)")
|
||||
@TableField("budget_amount")
|
||||
private Double budgetAmount;
|
||||
|
||||
@ExcelProperty("预算说明")
|
||||
@ApiModelProperty("预算说明")
|
||||
@TableField("budget_desc")
|
||||
private String budgetDesc;
|
||||
}
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
package com.dite.znpt.domain.vo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
/**
|
||||
* @author huise23
|
||||
* @date 2025/07/17 21:58
|
||||
* @Description: 项目预算信息表导入请求类
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
@ApiModel(value="ProjectBudgetInfo导入请求对象", description="项目预算信息表")
|
||||
public class ProjectBudgetInfoImportReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 580212651388155611L;
|
||||
|
||||
|
||||
@ExcelProperty(value = "项目名称")
|
||||
private String projectName;
|
||||
|
||||
@ExcelProperty(value = "预算名称")
|
||||
private String budgetName;
|
||||
|
||||
@ExcelProperty(value = "预算类型")
|
||||
private String budgetType;
|
||||
|
||||
@ExcelProperty(value = "预算金额(万元)")
|
||||
private Double budgetAmount;
|
||||
|
||||
@ExcelProperty(value = "预算说明")
|
||||
private String budgetDesc;
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
package com.dite.znpt.domain.vo;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author huise23
|
||||
* @date 2025/07/17 21:58
|
||||
* @Description: 项目预算信息请求实体
|
||||
*/
|
||||
@Data
|
||||
@ApiModel("项目预算信息列表请求实体")
|
||||
public class ProjectBudgetInfoListReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 539751666379021505L;
|
||||
|
||||
@ApiModelProperty("查询关键字")
|
||||
private String keyword;
|
||||
|
||||
@ApiModelProperty("项目预算信息Id")
|
||||
private String budgetId;
|
||||
|
||||
@ApiModelProperty("项目id")
|
||||
private String projectId;
|
||||
|
||||
@ApiModelProperty("预算名称")
|
||||
private String budgetName;
|
||||
|
||||
@ApiModelProperty("预算类型")
|
||||
private String budgetType;
|
||||
|
||||
@ApiModelProperty("预算金额(万元)")
|
||||
private Double budgetAmount;
|
||||
|
||||
@ApiModelProperty("预算说明")
|
||||
private String budgetDesc;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
package com.dite.znpt.domain.vo;
|
||||
|
||||
import com.dite.znpt.domain.entity.ProjectBudgetInfoEntity;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* @author huise23
|
||||
* @date 2025/07/17 21:58
|
||||
* @Description: 项目预算信息列表响应实体
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ApiModel("项目预算信息列表响应实体")
|
||||
public class ProjectBudgetInfoListResp extends ProjectBudgetInfoEntity {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
package com.dite.znpt.domain.vo;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
/**
|
||||
* @author huise23
|
||||
* @date 2025/07/17 21:58
|
||||
* @Description: 项目预算信息表请求类
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
@ApiModel(value="ProjectBudgetInfo请求对象", description="项目预算信息表")
|
||||
public class ProjectBudgetInfoReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 778519049897573879L;
|
||||
|
||||
@ApiModelProperty("项目id")
|
||||
private String projectId;
|
||||
|
||||
@ApiModelProperty("预算名称")
|
||||
private String budgetName;
|
||||
|
||||
@ApiModelProperty("预算类型")
|
||||
private String budgetType;
|
||||
|
||||
@ApiModelProperty("预算金额(万元)")
|
||||
private Double budgetAmount;
|
||||
|
||||
@ApiModelProperty("预算说明")
|
||||
private String budgetDesc;
|
||||
|
||||
@ApiModelProperty("附件id")
|
||||
private String attachId;
|
||||
}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
package com.dite.znpt.domain.vo;
|
||||
|
||||
import com.dite.znpt.domain.entity.ProjectBudgetInfoEntity;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* @author huise23
|
||||
* @date 2025/07/17 21:58
|
||||
* @Description: 项目预算信息响应实体
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ApiModel("项目预算信息响应实体")
|
||||
public class ProjectBudgetInfoResp extends ProjectBudgetInfoEntity {
|
||||
|
||||
@ApiModelProperty("预算类型描述")
|
||||
private String budgetTypeDesc;
|
||||
}
|
||||
|
|
@ -17,6 +17,8 @@ public enum AttachBusinessTypeEnum {
|
|||
INSURANCE_FILE("insurance", "保险文件"),
|
||||
MODEL_FILE("model", "模型文件"),
|
||||
DEFECT_MARK_PIC("defect_mark_pic", "缺陷标注图片"),
|
||||
REPORT("report", "报告"),
|
||||
PROJECT_BUDGE("project_budge", "预算文件"),
|
||||
;
|
||||
private final String code;
|
||||
private final String desc;
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
package com.dite.znpt.enums;
|
||||
|
||||
import cn.hutool.json.JSONObject;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: gaoxiong
|
||||
* @Date: 2025/5/7 21:22
|
||||
* @Description:
|
||||
*/
|
||||
@Getter
|
||||
public enum BudgeTypeEnum {
|
||||
PROCUREMENT("procurement", "采购"),
|
||||
ARTIFICIAL("artificial", "人工"),
|
||||
MANAGEMENT_FEE("managementFee", "管理费"),
|
||||
;
|
||||
|
||||
private final String code;
|
||||
private final String desc;
|
||||
|
||||
BudgeTypeEnum(String code, String desc){
|
||||
this.code = code;
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public static BudgeTypeEnum getByCode(String code){
|
||||
for (BudgeTypeEnum e : BudgeTypeEnum.values() ) {
|
||||
if(e.code.equals(code)){
|
||||
return e;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String getDescByCode(String code){
|
||||
BudgeTypeEnum e = getByCode(code);
|
||||
return null == e ? null : e.desc;
|
||||
}
|
||||
|
||||
public static List<JSONObject> listAll(){
|
||||
List<JSONObject> list = new ArrayList<>(BudgeTypeEnum.values().length);
|
||||
for (BudgeTypeEnum e : BudgeTypeEnum.values() ) {
|
||||
JSONObject jsonObject = new JSONObject();
|
||||
jsonObject.set(e.code, e.desc);
|
||||
list.add(jsonObject);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
package com.dite.znpt.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.dite.znpt.domain.entity.ProjectBudgetInfoEntity;
|
||||
import com.dite.znpt.domain.vo.ProjectBudgetInfoListReq;
|
||||
import com.dite.znpt.domain.vo.ProjectBudgetInfoListResp;
|
||||
import com.dite.znpt.domain.vo.ProjectBudgetInfoResp;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author huise23
|
||||
* @date 2025/07/17 21:58
|
||||
* @Description: 项目预算信息表数据库访问层
|
||||
*/
|
||||
public interface ProjectBudgetInfoMapper extends BaseMapper<ProjectBudgetInfoEntity> {
|
||||
List<ProjectBudgetInfoListResp> queryBySelective(ProjectBudgetInfoListReq projectBudgetInfoReq);
|
||||
List<ProjectBudgetInfoResp> detailByProjectId(String projectId);
|
||||
}
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
package com.dite.znpt.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.dite.znpt.domain.entity.ProjectBudgetInfoEntity;
|
||||
import com.dite.znpt.domain.vo.ProjectBudgetInfoListReq;
|
||||
import com.dite.znpt.domain.vo.ProjectBudgetInfoListResp;
|
||||
import com.dite.znpt.domain.vo.ProjectBudgetInfoReq;
|
||||
import com.dite.znpt.domain.vo.ProjectBudgetInfoResp;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author huise23
|
||||
* @date 2025/07/17 21:58
|
||||
* @Description: 项目预算信息表服务接口
|
||||
*/
|
||||
public interface ProjectBudgetInfoService extends IService<ProjectBudgetInfoEntity> {
|
||||
|
||||
/**
|
||||
* 功能描述:查询项目预算信息列表
|
||||
*
|
||||
* @param projectBudgetInfoReq 项目预算信息
|
||||
* @return {@link List }<{@link ProjectBudgetInfoListResp }>
|
||||
* @author huise23
|
||||
* @date 2025/07/17 21:58
|
||||
**/
|
||||
List<ProjectBudgetInfoListResp> selectList(ProjectBudgetInfoListReq projectBudgetInfoReq);
|
||||
|
||||
/**
|
||||
* 功能描述:根据项目id获取项目预算信息列表
|
||||
*
|
||||
* @param projectId 项目id
|
||||
* @return {@link List }<{@link ProjectBudgetInfoListResp }>
|
||||
* @author huise23
|
||||
* @date 2025/07/17 21:58
|
||||
**/
|
||||
List<ProjectBudgetInfoResp> detailByProjectId(String projectId);
|
||||
|
||||
/**
|
||||
* 功能描述:新增项目预算信息
|
||||
*
|
||||
* @param projectBudgetInfoReq 项目预算信息
|
||||
* @author huise23
|
||||
* @date 2025/07/17 21:58
|
||||
**/
|
||||
void saveData(List<ProjectBudgetInfoReq> projectBudgetInfoReq);
|
||||
}
|
||||
|
|
@ -0,0 +1,92 @@
|
|||
package com.dite.znpt.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.collection.ListUtil;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.dite.znpt.domain.entity.ProjectBudgetInfoEntity;
|
||||
import com.dite.znpt.domain.vo.ProjectBudgetInfoListReq;
|
||||
import com.dite.znpt.domain.vo.ProjectBudgetInfoListResp;
|
||||
import com.dite.znpt.domain.vo.ProjectBudgetInfoReq;
|
||||
import com.dite.znpt.domain.vo.ProjectBudgetInfoResp;
|
||||
import com.dite.znpt.enums.AttachBusinessTypeEnum;
|
||||
import com.dite.znpt.enums.BudgeTypeEnum;
|
||||
import com.dite.znpt.mapper.ProjectBudgetInfoMapper;
|
||||
import com.dite.znpt.service.AttachInfoService;
|
||||
import com.dite.znpt.service.ProjectBudgetInfoService;
|
||||
import com.dite.znpt.util.PageUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author huise23
|
||||
* @date 2025/07/17 21:58
|
||||
* @Description: 项目预算信息表服务实现类
|
||||
*/
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class ProjectBudgetInfoServiceImpl extends ServiceImpl<ProjectBudgetInfoMapper, ProjectBudgetInfoEntity> implements ProjectBudgetInfoService {
|
||||
|
||||
private final AttachInfoService attachInfoService;
|
||||
|
||||
/**
|
||||
* 功能描述:查询项目预算信息列表
|
||||
*
|
||||
* @param projectBudgetInfoReq 项目预算信息信息
|
||||
* @return {@link List }<{@link ProjectBudgetInfoResp }>
|
||||
* @author huise23
|
||||
* @date 2025/07/17 21:58
|
||||
**/
|
||||
@Override
|
||||
public List<ProjectBudgetInfoListResp> selectList(ProjectBudgetInfoListReq projectBudgetInfoReq) {
|
||||
PageUtil.startPage();
|
||||
List<ProjectBudgetInfoListResp> projectBudgetInfoList= this.baseMapper.queryBySelective(projectBudgetInfoReq);
|
||||
projectBudgetInfoList.forEach(resp -> {
|
||||
|
||||
});
|
||||
return projectBudgetInfoList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 功能描述:根据项目id获取项目预算信息列表
|
||||
*
|
||||
* @param projectId 项目id
|
||||
* @return {@link List }<{@link ProjectBudgetInfoListResp }>
|
||||
* @author huise23
|
||||
* @date 2025/07/17 21:58
|
||||
**/
|
||||
@Override
|
||||
public List<ProjectBudgetInfoResp> detailByProjectId(String projectId) {
|
||||
List<ProjectBudgetInfoResp> projectBudgetInfoList= this.baseMapper.detailByProjectId(projectId);
|
||||
projectBudgetInfoList.forEach(resp -> {
|
||||
resp.setBudgetTypeDesc(BudgeTypeEnum.getDescByCode(resp.getBudgetType()));
|
||||
});
|
||||
return projectBudgetInfoList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 功能描述:新增项目预算信息
|
||||
*
|
||||
* @param projectBudgetInfoReq 项目预算信息
|
||||
* @author huise23
|
||||
* @date 2025/07/17 21:58
|
||||
**/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void saveData(List<ProjectBudgetInfoReq> projectBudgetInfoReq) {
|
||||
List<ProjectBudgetInfoEntity> list = new ArrayList<>();
|
||||
for (ProjectBudgetInfoReq req : projectBudgetInfoReq) {
|
||||
ProjectBudgetInfoEntity info = BeanUtil.copyProperties(req, ProjectBudgetInfoEntity.class);
|
||||
info.setBudgetId(IdUtil.simpleUUID());
|
||||
attachInfoService.updateBusinessIdByAttachIds(info.getBudgetId(), ListUtil.of(req.getAttachId()), AttachBusinessTypeEnum.PROJECT_BUDGE);
|
||||
list.add(info);
|
||||
}
|
||||
lambdaUpdate().eq(ProjectBudgetInfoEntity::getProjectId, list.get(0).getProjectId()).remove();
|
||||
baseMapper.insert(list);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.dite.znpt.mapper.ProjectBudgetInfoMapper">
|
||||
|
||||
<sql id="Base_Column_List">
|
||||
a.budget_id, a.project_id, a.budget_name, a.budget_type,
|
||||
a.budget_amount, a.budget_desc, a.update_by, a.create_time,
|
||||
a.create_by, a.update_time
|
||||
</sql>
|
||||
|
||||
<select id="queryBySelective" resultType="com.dite.znpt.domain.vo.ProjectBudgetInfoListResp">
|
||||
select
|
||||
<include refid="Base_Column_List"/>, p.*
|
||||
from project_budget_info a
|
||||
left join project p on a.project_id = p.project_id
|
||||
<where>
|
||||
<if test="budgetId != null and budgetId != ''">
|
||||
and a.budget_id like concat ('%', #{budgetId}, '%')
|
||||
</if>
|
||||
<if test="projectId != null and projectId != ''">
|
||||
and a.project_id like concat ('%', #{projectId}, '%')
|
||||
</if>
|
||||
<if test="budgetName != null and budgetName != ''">
|
||||
and a.budget_name like concat ('%', #{budgetName}, '%')
|
||||
</if>
|
||||
<if test="budgetType != null and budgetType != ''">
|
||||
and a.budget_type like concat ('%', #{budgetType}, '%')
|
||||
</if>
|
||||
<if test="budgetAmount != null">
|
||||
and a.budget_amount = #{budgetAmount}
|
||||
</if>
|
||||
<if test="budgetDesc != null and budgetDesc != ''">
|
||||
and a.budget_desc like concat ('%', #{budgetDesc}, '%')
|
||||
</if>
|
||||
</where>
|
||||
</select>
|
||||
|
||||
<select id="detailByProjectId" resultType="com.dite.znpt.domain.vo.ProjectBudgetInfoResp">
|
||||
select
|
||||
<include refid="Base_Column_List"/>
|
||||
from project_budget_info a
|
||||
<where>
|
||||
<if test="_parameter != null and _parameter != ''">
|
||||
and a.project_id like concat ('%', #{projectId}, '%')
|
||||
</if>
|
||||
</where>
|
||||
</select>
|
||||
</mapper>
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
package com.dite.znpt.web.controller;
|
||||
|
||||
|
||||
import com.dite.znpt.domain.PageResult;
|
||||
import com.dite.znpt.domain.Result;
|
||||
import com.dite.znpt.domain.vo.ProjectBudgetInfoListReq;
|
||||
import com.dite.znpt.domain.vo.ProjectBudgetInfoListResp;
|
||||
import com.dite.znpt.domain.vo.ProjectBudgetInfoReq;
|
||||
import com.dite.znpt.domain.vo.ProjectBudgetInfoResp;
|
||||
import com.dite.znpt.service.ProjectBudgetInfoService;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author huise23
|
||||
* @date 2025/07/17 21:55
|
||||
*/
|
||||
@Api(tags = "项目预算信息")
|
||||
@RestController
|
||||
@RequestMapping("/project-budget-info")
|
||||
public class ProjectBudgetInfoController {
|
||||
@Resource
|
||||
private ProjectBudgetInfoService projectBudgetInfoService;
|
||||
|
||||
@ApiOperation(value = "获取项目预算信息列表", httpMethod = "GET")
|
||||
@GetMapping("/list")
|
||||
public PageResult<ProjectBudgetInfoListResp> list(ProjectBudgetInfoListReq projectBudgetInfoReq) {
|
||||
return PageResult.ok(projectBudgetInfoService.selectList(projectBudgetInfoReq));
|
||||
}
|
||||
|
||||
@ApiOperation(value = "根据项目id获取项目预算信息列表", httpMethod = "GET")
|
||||
@GetMapping("/detail/{projectId}")
|
||||
public PageResult<ProjectBudgetInfoResp> detailByProjectId(@PathVariable String projectId) {
|
||||
return PageResult.ok(projectBudgetInfoService.detailByProjectId(projectId));
|
||||
}
|
||||
|
||||
@ApiOperation(value = "保存项目预算信息", httpMethod = "POST")
|
||||
@PostMapping
|
||||
public Result<Object> add(@RequestBody List<ProjectBudgetInfoReq> projectBudgetInfoReq) {
|
||||
projectBudgetInfoService.saveData(projectBudgetInfoReq);
|
||||
return Result.ok();
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue