优化账户统计的查询逻辑,提高查询速度
This commit is contained in:
@@ -9,6 +9,7 @@ import com.jsh.erp.service.account.AccountService;
|
||||
import com.jsh.erp.service.systemConfig.SystemConfigService;
|
||||
import com.jsh.erp.utils.BaseResponseInfo;
|
||||
import com.jsh.erp.utils.ErpInfo;
|
||||
import com.jsh.erp.utils.StringUtil;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.slf4j.Logger;
|
||||
@@ -178,8 +179,8 @@ public class AccountController {
|
||||
BaseResponseInfo res = new BaseResponseInfo();
|
||||
try {
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
List<AccountVo4List> list = accountService.listWithBalance(name, serialNo, (currentPage-1)*pageSize, pageSize);
|
||||
Long count = accountService.listWithBalanceCount(name, serialNo);
|
||||
List<AccountVo4List> list = accountService.listWithBalance(StringUtil.toNull(name), StringUtil.toNull(serialNo), (currentPage-1)*pageSize, pageSize);
|
||||
Long count = accountService.listWithBalanceCount(StringUtil.toNull(name), StringUtil.toNull(serialNo));
|
||||
map.put("rows", list);
|
||||
map.put("total", count);
|
||||
res.code = 200;
|
||||
@@ -204,7 +205,7 @@ public class AccountController {
|
||||
HttpServletRequest request) throws Exception {
|
||||
BaseResponseInfo res = new BaseResponseInfo();
|
||||
try {
|
||||
Map<String, Object> map = accountService.getStatistics(name, serialNo);
|
||||
Map<String, Object> map = accountService.getStatistics(StringUtil.toNull(name), StringUtil.toNull(serialNo));
|
||||
res.code = 200;
|
||||
res.data = map;
|
||||
} catch(Exception e){
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
package com.jsh.erp.datasource.entities;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
public class AccountVo4Sum {
|
||||
|
||||
private Long id;
|
||||
|
||||
private BigDecimal accountSum;
|
||||
|
||||
private BigDecimal accountSumByHead;
|
||||
|
||||
private BigDecimal accountSumByDetail;
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public BigDecimal getAccountSum() {
|
||||
return accountSum;
|
||||
}
|
||||
|
||||
public void setAccountSum(BigDecimal accountSum) {
|
||||
this.accountSum = accountSum;
|
||||
}
|
||||
|
||||
public BigDecimal getAccountSumByHead() {
|
||||
return accountSumByHead;
|
||||
}
|
||||
|
||||
public void setAccountSumByHead(BigDecimal accountSumByHead) {
|
||||
this.accountSumByHead = accountSumByHead;
|
||||
}
|
||||
|
||||
public BigDecimal getAccountSumByDetail() {
|
||||
return accountSumByDetail;
|
||||
}
|
||||
|
||||
public void setAccountSumByDetail(BigDecimal accountSumByDetail) {
|
||||
this.accountSumByDetail = accountSumByDetail;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.jsh.erp.datasource.mappers;
|
||||
|
||||
import com.jsh.erp.datasource.entities.Account;
|
||||
import com.jsh.erp.datasource.entities.AccountVo4Sum;
|
||||
import com.jsh.erp.datasource.entities.DepotHead;
|
||||
import com.jsh.erp.datasource.vo.AccountVo4InOutList;
|
||||
import com.jsh.erp.datasource.vo.AccountVo4List;
|
||||
@@ -52,6 +53,20 @@ public interface AccountMapperEx {
|
||||
@Param("endTime") String endTime,
|
||||
@Param("forceFlag") Boolean forceFlag);
|
||||
|
||||
List<AccountVo4Sum> getAccountSumByParam(
|
||||
@Param("name") String name,
|
||||
@Param("serialNo") String serialNo,
|
||||
@Param("beginTime") String beginTime,
|
||||
@Param("endTime") String endTime,
|
||||
@Param("forceFlag") Boolean forceFlag,
|
||||
@Param("offset") Integer offset,
|
||||
@Param("rows") Integer rows);
|
||||
|
||||
List<DepotHead> getManyAccountSumByParam(
|
||||
@Param("beginTime") String beginTime,
|
||||
@Param("endTime") String endTime,
|
||||
@Param("forceFlag") Boolean forceFlag);
|
||||
|
||||
List<AccountVo4InOutList> findAccountInOutList(
|
||||
@Param("accountId") Long accountId,
|
||||
@Param("offset") Integer offset,
|
||||
@@ -61,4 +76,5 @@ public interface AccountMapperEx {
|
||||
@Param("accountId") Long accountId);
|
||||
|
||||
int batchDeleteAccountByIds(@Param("updateTime") Date updateTime, @Param("updater") Long updater, @Param("ids") String ids[]);
|
||||
|
||||
}
|
||||
@@ -106,22 +106,43 @@ public class AccountService {
|
||||
String bTime = Tools.firstDayOfMonth(timeStr) + BusinessConstants.DAY_FIRST_TIME;
|
||||
String eTime = Tools.lastDayOfMonth(timeStr) + BusinessConstants.DAY_LAST_TIME;
|
||||
Boolean forceFlag = systemConfigService.getForceApprovalFlag();
|
||||
Map<Long, BigDecimal> thisMonthAccountSumMap = new HashMap<>();
|
||||
Map<Long, BigDecimal> thisMonthAccountSumByHeadMap = new HashMap<>();
|
||||
Map<Long, BigDecimal> thisMonthAccountSumByDetailMap = new HashMap<>();
|
||||
Map<Long, BigDecimal> currentAccountSumMap = new HashMap<>();
|
||||
Map<Long, BigDecimal> currentAccountSumByHeadMap = new HashMap<>();
|
||||
Map<Long, BigDecimal> currentAccountSumByDetailMap = new HashMap<>();
|
||||
List<AccountVo4Sum> thisMonthAmountList = accountMapperEx.getAccountSumByParam(name, serialNo, bTime, eTime, forceFlag, offset, rows);
|
||||
List<AccountVo4Sum> currentAmountList = accountMapperEx.getAccountSumByParam(name, serialNo, null, null, forceFlag, offset, rows);
|
||||
List<DepotHead> thisMonthManyAmountList = accountMapperEx.getManyAccountSumByParam(bTime, eTime, forceFlag);
|
||||
List<DepotHead> currentManyAmountList = accountMapperEx.getManyAccountSumByParam(null, null, forceFlag);
|
||||
for (AccountVo4Sum thisMonthAmount: thisMonthAmountList) {
|
||||
thisMonthAccountSumMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSum());
|
||||
thisMonthAccountSumByHeadMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSumByHead());
|
||||
thisMonthAccountSumByDetailMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSumByDetail());
|
||||
}
|
||||
for (AccountVo4Sum currentAmount: currentAmountList) {
|
||||
currentAccountSumMap.put(currentAmount.getId(), currentAmount.getAccountSum());
|
||||
currentAccountSumByHeadMap.put(currentAmount.getId(), currentAmount.getAccountSumByHead());
|
||||
currentAccountSumByDetailMap.put(currentAmount.getId(), currentAmount.getAccountSumByDetail());
|
||||
}
|
||||
if (null != list) {
|
||||
for (AccountVo4List al : list) {
|
||||
DecimalFormat df = new DecimalFormat(".##");
|
||||
BigDecimal thisMonthAmount = getAccountSum(al.getId(), bTime, eTime, forceFlag)
|
||||
.add(getAccountSumByHead(al.getId(), bTime, eTime, forceFlag))
|
||||
.add(getAccountSumByDetail(al.getId(), bTime, eTime, forceFlag))
|
||||
.add(getManyAccountSum(al.getId(), bTime, eTime, forceFlag));
|
||||
BigDecimal thisMonthAmount = thisMonthAccountSumMap.get(al.getId())
|
||||
.add(thisMonthAccountSumByHeadMap.get(al.getId()))
|
||||
.add(thisMonthAccountSumByDetailMap.get(al.getId()))
|
||||
.add(getManyAccountSumParse(al.getId(), thisMonthManyAmountList));
|
||||
String thisMonthAmountFmt = "0";
|
||||
if ((thisMonthAmount.compareTo(BigDecimal.ZERO))!=0) {
|
||||
thisMonthAmountFmt = df.format(thisMonthAmount);
|
||||
}
|
||||
al.setThisMonthAmount(thisMonthAmountFmt); //本月发生额
|
||||
BigDecimal currentAmount = getAccountSum(al.getId(), null, null, forceFlag)
|
||||
.add(getAccountSumByHead(al.getId(), null, null, forceFlag))
|
||||
.add(getAccountSumByDetail(al.getId(), null, null, forceFlag))
|
||||
.add(getManyAccountSum(al.getId(), null, null, forceFlag)).add(al.getInitialAmount()) ;
|
||||
BigDecimal currentAmount = currentAccountSumMap.get(al.getId())
|
||||
.add(currentAccountSumByHeadMap.get(al.getId()))
|
||||
.add(currentAccountSumByDetailMap.get(al.getId()))
|
||||
.add(getManyAccountSumParse(al.getId(), currentManyAmountList))
|
||||
.add(al.getInitialAmount()) ;
|
||||
al.setCurrentAmount(currentAmount);
|
||||
resList.add(al);
|
||||
}
|
||||
@@ -328,6 +349,32 @@ public class AccountService {
|
||||
return accountSum;
|
||||
}
|
||||
|
||||
/**
|
||||
* 单个账户的金额求和-多账户的明细合计(格式化)
|
||||
* @return
|
||||
*/
|
||||
public BigDecimal getManyAccountSumParse(Long accountId, List<DepotHead> manyAmountList) {
|
||||
BigDecimal accountSum = BigDecimal.ZERO;
|
||||
if (manyAmountList != null) {
|
||||
for (DepotHead depotHead : manyAmountList) {
|
||||
String accountIdList = depotHead.getAccountIdList();
|
||||
String accountMoneyList = depotHead.getAccountMoneyList();
|
||||
if(StringUtil.isNotEmpty(accountIdList) && StringUtil.isNotEmpty(accountMoneyList)) {
|
||||
String[] aList = accountIdList.split(",");
|
||||
String[] amList = accountMoneyList.split(",");
|
||||
for (int i = 0; i < aList.length; i++) {
|
||||
if (aList[i].equals(accountId.toString())) {
|
||||
if(amList.length>0) {
|
||||
accountSum = accountSum.add(new BigDecimal(amList[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return accountSum;
|
||||
}
|
||||
|
||||
public List<AccountVo4InOutList> findAccountInOutList(Long accountId, Integer offset, Integer rows) throws Exception{
|
||||
List<AccountVo4InOutList> list=null;
|
||||
try{
|
||||
@@ -402,22 +449,43 @@ public class AccountService {
|
||||
String bTime = Tools.firstDayOfMonth(timeStr) + BusinessConstants.DAY_FIRST_TIME;
|
||||
String eTime = Tools.lastDayOfMonth(timeStr) + BusinessConstants.DAY_LAST_TIME;
|
||||
Boolean forceFlag = systemConfigService.getForceApprovalFlag();
|
||||
Map<Long, BigDecimal> thisMonthAccountSumMap = new HashMap<>();
|
||||
Map<Long, BigDecimal> thisMonthAccountSumByHeadMap = new HashMap<>();
|
||||
Map<Long, BigDecimal> thisMonthAccountSumByDetailMap = new HashMap<>();
|
||||
Map<Long, BigDecimal> currentAccountSumMap = new HashMap<>();
|
||||
Map<Long, BigDecimal> currentAccountSumByHeadMap = new HashMap<>();
|
||||
Map<Long, BigDecimal> currentAccountSumByDetailMap = new HashMap<>();
|
||||
List<AccountVo4Sum> thisMonthAmountList = accountMapperEx.getAccountSumByParam(name, serialNo, bTime, eTime, forceFlag, offset, rows);
|
||||
List<AccountVo4Sum> currentAmountList = accountMapperEx.getAccountSumByParam(name, serialNo, null, null, forceFlag, offset, rows);
|
||||
List<DepotHead> thisMonthManyAmountList = accountMapperEx.getManyAccountSumByParam(bTime, eTime, forceFlag);
|
||||
List<DepotHead> currentManyAmountList = accountMapperEx.getManyAccountSumByParam(null, null, forceFlag);
|
||||
for (AccountVo4Sum thisMonthAmount: thisMonthAmountList) {
|
||||
thisMonthAccountSumMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSum());
|
||||
thisMonthAccountSumByHeadMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSumByHead());
|
||||
thisMonthAccountSumByDetailMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSumByDetail());
|
||||
}
|
||||
for (AccountVo4Sum currentAmount: currentAmountList) {
|
||||
currentAccountSumMap.put(currentAmount.getId(), currentAmount.getAccountSum());
|
||||
currentAccountSumByHeadMap.put(currentAmount.getId(), currentAmount.getAccountSumByHead());
|
||||
currentAccountSumByDetailMap.put(currentAmount.getId(), currentAmount.getAccountSumByDetail());
|
||||
}
|
||||
if (null != list) {
|
||||
for (AccountVo4List al : list) {
|
||||
DecimalFormat df = new DecimalFormat(".##");
|
||||
BigDecimal thisMonthAmount = getAccountSum(al.getId(), bTime, eTime, forceFlag)
|
||||
.add(getAccountSumByHead(al.getId(), bTime, eTime, forceFlag))
|
||||
.add(getAccountSumByDetail(al.getId(), bTime, eTime, forceFlag))
|
||||
.add(getManyAccountSum(al.getId(), bTime, eTime, forceFlag));
|
||||
BigDecimal thisMonthAmount = thisMonthAccountSumMap.get(al.getId())
|
||||
.add(thisMonthAccountSumByHeadMap.get(al.getId()))
|
||||
.add(thisMonthAccountSumByDetailMap.get(al.getId()))
|
||||
.add(getManyAccountSumParse(al.getId(), thisMonthManyAmountList));
|
||||
String thisMonthAmountFmt = "0";
|
||||
if ((thisMonthAmount.compareTo(BigDecimal.ZERO))!=0) {
|
||||
thisMonthAmountFmt = df.format(thisMonthAmount);
|
||||
}
|
||||
al.setThisMonthAmount(thisMonthAmountFmt); //本月发生额
|
||||
BigDecimal currentAmount = getAccountSum(al.getId(), null, null, forceFlag)
|
||||
.add(getAccountSumByHead(al.getId(), null, null, forceFlag))
|
||||
.add(getAccountSumByDetail(al.getId(), null, null, forceFlag))
|
||||
.add(getManyAccountSum(al.getId(), null, null, forceFlag)).add(al.getInitialAmount()) ;
|
||||
BigDecimal currentAmount = currentAccountSumMap.get(al.getId())
|
||||
.add(currentAccountSumByHeadMap.get(al.getId()))
|
||||
.add(currentAccountSumByDetailMap.get(al.getId()))
|
||||
.add(getManyAccountSumParse(al.getId(), currentManyAmountList))
|
||||
.add(al.getInitialAmount());
|
||||
al.setCurrentAmount(currentAmount);
|
||||
resList.add(al);
|
||||
}
|
||||
@@ -448,22 +516,43 @@ public class AccountService {
|
||||
BigDecimal allMonthAmount = BigDecimal.ZERO;
|
||||
BigDecimal allCurrentAmount = BigDecimal.ZERO;
|
||||
Boolean forceFlag = systemConfigService.getForceApprovalFlag();
|
||||
if (null != list && null !=timeStr) {
|
||||
Map<Long, BigDecimal> thisMonthAccountSumMap = new HashMap<>();
|
||||
Map<Long, BigDecimal> thisMonthAccountSumByHeadMap = new HashMap<>();
|
||||
Map<Long, BigDecimal> thisMonthAccountSumByDetailMap = new HashMap<>();
|
||||
Map<Long, BigDecimal> currentAccountSumMap = new HashMap<>();
|
||||
Map<Long, BigDecimal> currentAccountSumByHeadMap = new HashMap<>();
|
||||
Map<Long, BigDecimal> currentAccountSumByDetailMap = new HashMap<>();
|
||||
List<AccountVo4Sum> thisMonthAmountList = accountMapperEx.getAccountSumByParam(name, serialNo, bTime, eTime, forceFlag, null, null);
|
||||
List<AccountVo4Sum> currentAmountList = accountMapperEx.getAccountSumByParam(name, serialNo, null, null, forceFlag, null, null);
|
||||
List<DepotHead> thisMonthManyAmountList = accountMapperEx.getManyAccountSumByParam(bTime, eTime, forceFlag);
|
||||
List<DepotHead> currentManyAmountList = accountMapperEx.getManyAccountSumByParam(null, null, forceFlag);
|
||||
for (AccountVo4Sum thisMonthAmount: thisMonthAmountList) {
|
||||
thisMonthAccountSumMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSum());
|
||||
thisMonthAccountSumByHeadMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSumByHead());
|
||||
thisMonthAccountSumByDetailMap.put(thisMonthAmount.getId(), thisMonthAmount.getAccountSumByDetail());
|
||||
}
|
||||
for (AccountVo4Sum currentAmount: currentAmountList) {
|
||||
currentAccountSumMap.put(currentAmount.getId(), currentAmount.getAccountSum());
|
||||
currentAccountSumByHeadMap.put(currentAmount.getId(), currentAmount.getAccountSumByHead());
|
||||
currentAccountSumByDetailMap.put(currentAmount.getId(), currentAmount.getAccountSumByDetail());
|
||||
}
|
||||
if (null != list) {
|
||||
for (Account a : list) {
|
||||
BigDecimal monthAmount = getAccountSum(a.getId(), bTime, eTime, forceFlag)
|
||||
.add(getAccountSumByHead(a.getId(), bTime, eTime, forceFlag))
|
||||
.add(getAccountSumByDetail(a.getId(), bTime, eTime, forceFlag))
|
||||
.add(getManyAccountSum(a.getId(), bTime, eTime, forceFlag));
|
||||
BigDecimal currentAmount = getAccountSum(a.getId(), null, null, forceFlag)
|
||||
.add(getAccountSumByHead(a.getId(), null, null, forceFlag))
|
||||
.add(getAccountSumByDetail(a.getId(), null, null, forceFlag))
|
||||
.add(getManyAccountSum(a.getId(), null, null, forceFlag)).add(a.getInitialAmount());
|
||||
BigDecimal monthAmount = thisMonthAccountSumMap.get(a.getId())
|
||||
.add(thisMonthAccountSumByHeadMap.get(a.getId()))
|
||||
.add(thisMonthAccountSumByDetailMap.get(a.getId()))
|
||||
.add(getManyAccountSumParse(a.getId(), thisMonthManyAmountList));
|
||||
BigDecimal currentAmount = currentAccountSumMap.get(a.getId())
|
||||
.add(currentAccountSumByHeadMap.get(a.getId()))
|
||||
.add(currentAccountSumByDetailMap.get(a.getId()))
|
||||
.add(getManyAccountSumParse(a.getId(), currentManyAmountList))
|
||||
.add(a.getInitialAmount());
|
||||
allMonthAmount = allMonthAmount.add(monthAmount);
|
||||
allCurrentAmount = allCurrentAmount.add(currentAmount);
|
||||
}
|
||||
}
|
||||
map.put("allCurrentAmount", priceFormat(allCurrentAmount)); //当前总金额
|
||||
map.put("allMonthAmount", priceFormat(allMonthAmount)); //本月发生额
|
||||
map.put("allCurrentAmount", priceFormat(allCurrentAmount)); //当前总金额
|
||||
} catch (Exception e) {
|
||||
JshException.readFail(logger, e);
|
||||
}
|
||||
|
||||
@@ -148,6 +148,80 @@
|
||||
and ifnull(dh.delete_flag,'0') !='1'
|
||||
</select>
|
||||
|
||||
<select id="getAccountSumByParam" resultType="com.jsh.erp.datasource.entities.AccountVo4Sum">
|
||||
select a.id,
|
||||
(select ifnull(sum(dh.change_amount),0) from jsh_depot_head dh
|
||||
where 1=1 and dh.pay_type != '预付款'
|
||||
and dh.account_id = a.id
|
||||
<if test="beginTime != null">
|
||||
and dh.oper_time >= #{beginTime}
|
||||
</if>
|
||||
<if test="endTime != null">
|
||||
and dh.oper_time <= #{endTime}
|
||||
</if>
|
||||
<if test="forceFlag">
|
||||
and dh.status = '1'
|
||||
</if>
|
||||
and ifnull(dh.delete_flag,'0') !='1') accountSum,
|
||||
(select ifnull(sum(ah.change_amount),0) from jsh_account_head ah
|
||||
where 1=1 and ah.account_id = a.id
|
||||
<if test="beginTime != null">
|
||||
and ah.bill_time >= #{beginTime}
|
||||
</if>
|
||||
<if test="endTime != null">
|
||||
and ah.bill_time <= #{endTime}
|
||||
</if>
|
||||
<if test="forceFlag">
|
||||
and ah.status = '1'
|
||||
</if>
|
||||
and ifnull(ah.delete_flag,'0') !='1') accountSumByHead,
|
||||
(select ifnull(sum(ai.each_amount),0) from jsh_account_head ah
|
||||
left join jsh_account_item ai on ah.id = ai.header_id and ifnull(ai.delete_flag,'0') !='1'
|
||||
where 1=1 and ai.account_id = a.id
|
||||
<if test="beginTime != null">
|
||||
and ah.bill_time >= #{beginTime}
|
||||
</if>
|
||||
<if test="endTime != null">
|
||||
and ah.bill_time <= #{endTime}
|
||||
</if>
|
||||
<if test="forceFlag">
|
||||
and ah.status = '1'
|
||||
</if>
|
||||
and ifnull(ah.delete_flag,'0') !='1') accountSumByDetail
|
||||
from jsh_account a
|
||||
where 1=1
|
||||
<if test="name != null">
|
||||
<bind name="bindName" value="'%'+name+'%'"/>
|
||||
and a.name like #{bindName}
|
||||
</if>
|
||||
<if test="serialNo != null and serialNo !=''">
|
||||
<bind name="bindSerialNo" value="'%'+serialNo+'%'"/>
|
||||
and a.serial_no like #{bindSerialNo}
|
||||
</if>
|
||||
and ifnull(a.delete_flag,'0') !='1'
|
||||
order by a.sort asc, a.id desc
|
||||
<if test="offset != null and rows != null">
|
||||
limit #{offset},#{rows}
|
||||
</if>
|
||||
</select>
|
||||
|
||||
<select id="getManyAccountSumByParam" resultType="com.jsh.erp.datasource.entities.DepotHead">
|
||||
select dh.account_id_list accountIdList, dh.account_money_list accountMoneyList
|
||||
from jsh_depot_head dh
|
||||
where 1=1
|
||||
and dh.account_id_list !=''
|
||||
<if test="beginTime != null">
|
||||
and dh.oper_time >= #{beginTime}
|
||||
</if>
|
||||
<if test="endTime != null">
|
||||
and dh.oper_time <= #{endTime}
|
||||
</if>
|
||||
<if test="forceFlag">
|
||||
and dh.status = '1'
|
||||
</if>
|
||||
and ifnull(dh.delete_flag,'0') !='1'
|
||||
</select>
|
||||
|
||||
<select id="findAccountInOutList" parameterType="com.jsh.erp.datasource.entities.AccountExample" resultMap="ResultInOutList">
|
||||
<!--主表出入库涉及的账户 -->
|
||||
select dh.number,concat(dh.sub_type,dh.type) as newType, 'bill' as fromType, s.supplier,dh.change_amount,date_format(dh.oper_time,'%Y-%m-%d %H:%i:%S') as oTime,'' as AList,'' as AMList
|
||||
|
||||
Reference in New Issue
Block a user