提交修改
This commit is contained in:
commit
2a73677ea1
@ -39,6 +39,8 @@ public interface EvaluationGroupMapper extends BaseMapper<EvaluationGroup> {
|
||||
|
||||
List<EvaluationGroup> selectEvaluationGroupByIds(@Param("ids") List<Long> ids);
|
||||
|
||||
List<EvaluationGroup> selectEvaluationGroupByNotIds(@Param("ids") List<Long> ids);
|
||||
|
||||
EvaluationGroup selectEvaluationGroupByName(@Param("name") String name);
|
||||
|
||||
void deleteByCopyIds(@Param("ids") List<Long> ids);
|
||||
|
||||
@ -60,6 +60,10 @@ public class EvaluationGroup implements java.io.Serializable {
|
||||
@ApiModelProperty(value = "是否评分 0 :未通知 1:已通知", name = "score")
|
||||
private int score;
|
||||
|
||||
@TableField(exist = false)
|
||||
@ApiModelProperty(value = "是否确认变更组 0 :首次否 1:确认", name = "confirm")
|
||||
private int confirm;
|
||||
|
||||
/**
|
||||
*
|
||||
* @return
|
||||
|
||||
@ -7,6 +7,7 @@ import com.lz.modules.app.entity.StaffSimpleInfo;
|
||||
import com.lz.modules.flow.entity.EvaluationGroup;
|
||||
import com.lz.modules.flow.req.EvaluationGroupReq;
|
||||
import com.lz.modules.performance.dto.CheckStaffDto;
|
||||
import com.lz.modules.performance.req.CheckStaffReq;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@ -44,11 +45,13 @@ public interface EvaluationGroupService extends IService<EvaluationGroup> {
|
||||
|
||||
List<EvaluationGroup> selectEvaluationGroupByIds(List<Long> ids);
|
||||
|
||||
List<EvaluationGroup> selectEvaluationGroupByNotIds(List<Long> ids);
|
||||
|
||||
EvaluationGroup selectEvaluationGroupByName(String name);
|
||||
//获取考核组里面所有参与的人员信息,去除重复,去除离职
|
||||
List<StaffSimpleInfo> selectAllStaffSimpleInfoByGroupId(EvaluationGroup evaluationGroup);
|
||||
|
||||
void deleteByCopyIds(List<Long> ids);
|
||||
|
||||
List<CheckStaffDto> checkStaff(EvaluationGroup evaluationGroup);
|
||||
R checkStaff(CheckStaffReq checkStaffReq);
|
||||
}
|
||||
@ -1,12 +1,15 @@
|
||||
package com.lz.modules.flow.service.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.lz.common.utils.ISelect;
|
||||
import com.lz.common.utils.PageUtils;
|
||||
import com.lz.common.utils.R;
|
||||
import com.lz.common.utils.StringUtil;
|
||||
import com.lz.modules.app.dto.StaffSimpleDto;
|
||||
import com.lz.modules.app.entity.DepartmentsEntity;
|
||||
import com.lz.modules.app.entity.StaffSimpleInfo;
|
||||
import com.lz.modules.app.service.DepartmentsService;
|
||||
@ -20,16 +23,22 @@ import com.lz.modules.flow.req.EvaluationGroupReq;
|
||||
import com.lz.modules.flow.service.EvaluationGroupService;
|
||||
import com.lz.modules.flow.service.FlowStartService;
|
||||
import com.lz.modules.performance.dto.CheckStaffDto;
|
||||
import com.lz.modules.performance.req.CheckStaffReq;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static java.util.stream.Collectors.toList;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 考评组表 服务类
|
||||
@ -38,7 +47,7 @@ import java.util.stream.Collectors;
|
||||
* @author quyixiao
|
||||
* @since 2020-10-13
|
||||
*/
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class EvaluationGroupServiceImpl extends ServiceImpl<EvaluationGroupMapper, EvaluationGroup> implements EvaluationGroupService {
|
||||
|
||||
@ -178,6 +187,12 @@ public class EvaluationGroupServiceImpl extends ServiceImpl<EvaluationGroupMappe
|
||||
return evaluationGroupMapper.selectEvaluationGroupByIds(ids);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<EvaluationGroup> selectEvaluationGroupByNotIds(List<Long> ids){
|
||||
return evaluationGroupMapper.selectEvaluationGroupByNotIds(ids);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EvaluationGroup selectEvaluationGroupByName(String name){
|
||||
return evaluationGroupMapper.selectEvaluationGroupByName(name);
|
||||
@ -261,25 +276,73 @@ public class EvaluationGroupServiceImpl extends ServiceImpl<EvaluationGroupMappe
|
||||
|
||||
|
||||
@Override
|
||||
public List<CheckStaffDto> checkStaff(EvaluationGroup evaluationGroup) {
|
||||
List<CheckStaffDto> staffs= new ArrayList<>();
|
||||
public R checkStaff(CheckStaffReq checkStaffReq) {
|
||||
EvaluationGroup evaluationGroup = new EvaluationGroup();
|
||||
BeanUtils.copyProperties(checkStaffReq,evaluationGroup);
|
||||
//本次参加人员
|
||||
List<String> staffIdsByGroup = getStaffIdsByGroup(evaluationGroup);
|
||||
//其他组全部成员
|
||||
List<String> allStaffIdsByGroup = new ArrayList<>();
|
||||
|
||||
//获取之前
|
||||
List<EvaluationGroup> evaluationGroups = evaluationGroupMapper.selectList(new QueryWrapper<EvaluationGroup>()
|
||||
.eq("is_delete", 0).eq("copy_id", 0));
|
||||
|
||||
if(CollectionUtils.isEmpty(evaluationGroups)){
|
||||
return staffs;
|
||||
//获取其他组成员
|
||||
List<Long> ids = new ArrayList<>();
|
||||
if(evaluationGroup.getId()!=null){
|
||||
ids.add(evaluationGroup.getId());
|
||||
}
|
||||
evaluationGroups.stream().map(new Function<EvaluationGroup, CheckStaffDto>() {
|
||||
@Override
|
||||
public CheckStaffDto apply(EvaluationGroup evaluationGroup) {
|
||||
//evaluationGroupService.
|
||||
return null;
|
||||
List<EvaluationGroup> evaluationGroups = evaluationGroupMapper.selectEvaluationGroupByNotIds(ids);
|
||||
//根据组id成员分组
|
||||
Map<Long,List<String>> map = Maps.newHashMap();
|
||||
if(CollectionUtils.isNotEmpty(evaluationGroups)){
|
||||
evaluationGroups.forEach(evaluationGroup1 -> {
|
||||
List<String> staffIds = getStaffIdsByGroup(evaluationGroup1);
|
||||
allStaffIdsByGroup.addAll(staffIds);
|
||||
map.put(evaluationGroup1.getId(),staffIds);
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
//是否存在其他组成员
|
||||
staffIdsByGroup.retainAll(allStaffIdsByGroup);
|
||||
if(CollectionUtils.isNotEmpty(staffIdsByGroup)){
|
||||
List<Long> collect = staffIdsByGroup.stream().map(s -> Long.valueOf(s)).distinct().collect(toList());
|
||||
List<StaffSimpleDto> staffSimpleDtos = staffService.selectStaffSimpleInfoByIds(collect);
|
||||
String notInGroupNames = StringUtil.EMPTY;
|
||||
for(StaffSimpleDto dto:staffSimpleDtos){
|
||||
notInGroupNames = notInGroupNames + dto.getName() + " ";
|
||||
}
|
||||
});
|
||||
return null;
|
||||
|
||||
if(evaluationGroup.getConfirm()==0){
|
||||
return R.error(504,notInGroupNames + "已在其他类型为月度的考评组中,是否改为到此考评组中进行考核");
|
||||
}
|
||||
evaluationGroups.forEach(evaluationGroup12 -> {
|
||||
List<String> staffs = map.get(evaluationGroup12.getId());
|
||||
staffs.retainAll(collect);
|
||||
if(CollectionUtils.isNotEmpty(staffs)){
|
||||
//添加到保存时添加
|
||||
//删除存在得
|
||||
log.info("需删除其他组信息,staffs:" + JSON.toJSONString(staffs));
|
||||
removeStaffsToAssessGroup(collect,evaluationGroup12);
|
||||
}
|
||||
|
||||
});
|
||||
return R.ok();
|
||||
|
||||
}
|
||||
//直接添加
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
private int removeStaffsToAssessGroup(List<Long> ids,EvaluationGroup group) {
|
||||
String staffIds = group.getStaffIds();
|
||||
if(StringUtil.isNotBlank(staffIds)){
|
||||
String[] split = staffIds.split(",");
|
||||
Set<String> set = new HashSet(Arrays.asList(split));
|
||||
set.removeAll(new HashSet(ids)); //set.addAll(new HashSet(ids));
|
||||
String join = StringUtils.join(set, ",");
|
||||
group.setStaffIds(join);
|
||||
int i = evaluationGroupMapper.updateCoverEvaluationGroupById(group);
|
||||
return i;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -94,7 +94,7 @@ public class AssessManagerController {
|
||||
|
||||
@PostMapping("assess/manager/change")
|
||||
@ApiOperation("考核管理组管理变更")
|
||||
@ApiResponses({@ApiResponse(code = 200,message = "成功")})
|
||||
@ApiResponses({@ApiResponse(code = 200,message = "成功"),@ApiResponse(code = 503,message = "去设置")})
|
||||
public R assessChange(@RequestBody AssessChangeReq req){
|
||||
if(req.getStartId()==null){
|
||||
return R.error("考核id不能为空");
|
||||
|
||||
@ -15,6 +15,7 @@ import com.lz.modules.flow.entity.StaffRole;
|
||||
import com.lz.modules.flow.model.EvaluationGroupDto;
|
||||
import com.lz.modules.flow.req.EvaluationGroupReq;
|
||||
import com.lz.modules.flow.service.*;
|
||||
import com.lz.modules.performance.req.CheckStaffReq;
|
||||
import io.swagger.annotations.*;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@ -190,13 +191,10 @@ public class EvaluationGroupController {
|
||||
}
|
||||
|
||||
|
||||
@GetMapping("/checkStaff")
|
||||
@PostMapping("/checkStaff")
|
||||
@ApiOperation("校验是否有跨组人员")
|
||||
public R checkStaff(@RequestParam @RequestBody @ApiParam EvaluationGroup evaluationGroup) {
|
||||
|
||||
evaluationGroupService.checkStaff(evaluationGroup);
|
||||
|
||||
return R.ok();
|
||||
|
||||
@ApiResponses({@ApiResponse(code = 200,message = "成功"),@ApiResponse(code = 504,message = "已跨组")})
|
||||
public R checkStaff(@RequestBody @ApiParam(required = true,name = "body") CheckStaffReq checkStaffReq) {
|
||||
return evaluationGroupService.checkStaff(checkStaffReq);
|
||||
}
|
||||
}
|
||||
|
||||
@ -23,4 +23,7 @@ public class AssessChangeReq {
|
||||
@ApiModelProperty(value = "变动人员ids",name = "staffIds")
|
||||
private String staffIds;
|
||||
|
||||
@ApiModelProperty(value = "确认变更考核组 0 :首次不确认 1:确认",name = "confirm")
|
||||
private int confirm;
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,35 @@
|
||||
package com.lz.modules.performance.req;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @Author: djc
|
||||
* @Desc:
|
||||
* @Date: 2020/11/2 9:55
|
||||
*/
|
||||
@ApiModel("校验人员是否存在其他组")
|
||||
@Data
|
||||
public class CheckStaffReq {
|
||||
//
|
||||
@ApiModelProperty(value = "如果不传,那么表示新建,否则更新", name = "id")
|
||||
private Long id;
|
||||
//参与部门id,逗号隔开
|
||||
@ApiModelProperty(value = "参与部门id,逗号隔开", name = "depIds")
|
||||
private String depIds;
|
||||
//参与考核员工staff_id,逗号隔开
|
||||
@ApiModelProperty(value = "参与考核员工staff_id,逗号隔开", name = "staffIds")
|
||||
private String staffIds;
|
||||
//排除人员ids,逗号隔开
|
||||
@ApiModelProperty(value = "排除人员ids,逗号隔开", name = "outIds")
|
||||
private String outIds;
|
||||
|
||||
@ApiModelProperty(value = "是否确认变更组 0 :首次否 1:确认", name = "confirm")
|
||||
private int confirm;
|
||||
}
|
||||
@ -31,11 +31,16 @@ import com.lz.modules.sys.dao.app.ResultRecordMapper;
|
||||
import com.lz.modules.sys.entity.app.ResultRecord;
|
||||
import com.lz.modules.sys.service.app.ResultRecordService;
|
||||
import com.sun.org.apache.regexp.internal.RE;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
@ -48,6 +53,7 @@ import static java.util.stream.Collectors.toList;
|
||||
* @Date: 2020/10/22 17:28
|
||||
*/
|
||||
@Service("assessManagerService")
|
||||
@Slf4j
|
||||
public class AssessManagerServiceImpl implements AssessManagerService {
|
||||
@Autowired
|
||||
private FlowStartMapper flowStartMapper;
|
||||
@ -133,7 +139,7 @@ public class AssessManagerServiceImpl implements AssessManagerService {
|
||||
String[] split = flowStart.getGroupIds().split(",");
|
||||
List<String> strings = Arrays.asList(split);
|
||||
List<Long> ids = strings.stream().map(s -> Long.valueOf(s)).collect(toList());
|
||||
List<EvaluationGroup> evaluationGroups = evaluationGroupService.selectEvaluationGroupByIds(ids);
|
||||
List<EvaluationGroup> otheEvaluationGroups = evaluationGroupService.selectEvaluationGroupByNotIds(ids);
|
||||
|
||||
//获取变更人员
|
||||
String[] changeStaffIds = req.getStaffIds().split(",");
|
||||
@ -145,7 +151,7 @@ public class AssessManagerServiceImpl implements AssessManagerService {
|
||||
|
||||
//根据组id成员分组
|
||||
Map<Long,List<String>> map = Maps.newHashMap();
|
||||
for(EvaluationGroup group:evaluationGroups){
|
||||
for(EvaluationGroup group:otheEvaluationGroups){
|
||||
List<String> staff = evaluationGroupService.selectAllStaffIdsByGroupId(group.getId());
|
||||
all.addAll(staff);
|
||||
map.put(group.getId(),staff);
|
||||
@ -162,7 +168,8 @@ public class AssessManagerServiceImpl implements AssessManagerService {
|
||||
for(StaffSimpleDto dto:staffSimpleDtos){
|
||||
notInGroupNames = notInGroupNames + dto.getName() + " ";
|
||||
}
|
||||
throw new RRException(notInGroupNames + "已在其他类型为月度的考评组中,是否改为到此考评组中进行考核");
|
||||
|
||||
return R.error(503,notInGroupNames + "未加入月度类型考评组,被考核人需要加入月度考评组后才能参与当前月度考核。");
|
||||
}
|
||||
|
||||
//初始化添加用户的数据
|
||||
@ -171,23 +178,29 @@ public class AssessManagerServiceImpl implements AssessManagerService {
|
||||
//排除已发起过的
|
||||
List<Long> longs = evaluationStartStaffMapper.selectStaffIdsByStart(req.getStartId());
|
||||
|
||||
for(EvaluationGroup group:evaluationGroups){
|
||||
for(EvaluationGroup group:otheEvaluationGroups){
|
||||
GroupStaffs groupStaffs = new GroupStaffs();
|
||||
groupStaffs.setEvaluationGroup(group);
|
||||
|
||||
List<String> staffs = map.get(group.getId());
|
||||
staffs.retainAll(change);
|
||||
|
||||
List<Long> collect = staffs.stream().map(s -> Long.valueOf(s)).collect(toList());
|
||||
collect.removeAll(longs);
|
||||
groupStaffs.setStaffIds(collect);
|
||||
groupS.add(groupStaffs);
|
||||
if(CollectionUtils.isNotEmpty(collect)){
|
||||
groupStaffs.setStaffIds(collect);
|
||||
groupS.add(groupStaffs);
|
||||
}
|
||||
}
|
||||
|
||||
StartGroups startGroups = new StartGroups();
|
||||
startGroups.setStartId(req.getStartId());
|
||||
startGroups.setGroups(groupS);
|
||||
flowStartService.startStaffs(startGroups);
|
||||
try {
|
||||
flowStartService.startStaffs(startGroups);
|
||||
} catch (Exception e) {
|
||||
log.error("调用初始化失败");
|
||||
return R.error("初始化失败");
|
||||
}
|
||||
return R.ok();
|
||||
|
||||
|
||||
@ -210,39 +223,42 @@ public class AssessManagerServiceImpl implements AssessManagerService {
|
||||
Long evaluation = Long.valueOf(s);
|
||||
//更新评分
|
||||
int i = evaluationStartStaffService.updateBatchToScore(req.getStartId(), evaluation);
|
||||
log.info("更新evaluationStartStaff 数据 为已评分 " + i);
|
||||
|
||||
List<Long> longs = resultRecordMapper.selectToScoreList(req.getStartId(), evaluation);
|
||||
//更新流程绩效
|
||||
ApprovalDto approvalDto = new ApprovalDto();
|
||||
approvalDto.setStatus(1);
|
||||
approvalDto.setResultRecordId(1L);
|
||||
approvalDto.setMenuName("开始评分");
|
||||
try {
|
||||
resultRecordService.newApproval(approvalDto);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
List<Long> recordIds = resultRecordMapper.selectToScoreList(req.getStartId(), evaluation);
|
||||
if(CollectionUtils.isEmpty(recordIds)){
|
||||
continue;
|
||||
}
|
||||
recordIds.forEach(aLong -> {
|
||||
//更新流程绩效
|
||||
ApprovalDto approvalDto = new ApprovalDto();
|
||||
approvalDto.setStatus(1);
|
||||
approvalDto.setResultRecordId(1L);
|
||||
approvalDto.setMenuName("开始评分");
|
||||
try {
|
||||
resultRecordService.newApproval(approvalDto);
|
||||
} catch (Exception e) {
|
||||
log.error("执行中状态跳过失败 recorId:" + aLong,e);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
private List<EvaluationStartStaff> buildStartStaffList(List<String> staffIds){
|
||||
List<EvaluationStartStaff> evaluationStartStaffs = new ArrayList<>();
|
||||
staffIds.forEach(new Consumer<String>() {
|
||||
@Override
|
||||
public void accept(String s) {
|
||||
EvaluationStartStaff startStaff = new EvaluationStartStaff();
|
||||
startStaff.setStaffId(Long.valueOf(s));
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
return evaluationStartStaffs;
|
||||
|
||||
public static void main(String[] args) {
|
||||
ExecutorService executorService = Executors.newFixedThreadPool(10);
|
||||
CompletableFuture<List<Long>> future = CompletableFuture.supplyAsync(()-> Arrays.asList(1L,2L),executorService);
|
||||
try {
|
||||
List<Long> longs = future.get();
|
||||
System.out.println();
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
} catch (ExecutionException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@ -79,7 +79,7 @@ public interface ResultRecordMapper extends BaseMapper<ResultRecord> {
|
||||
|
||||
List<ResultRecord> selectChartDetailList(@Param("page") IPage page, @Param("staffIds") List<String> staffIds, @Param("startId")Long startId,@Param("scoreLevel")Long scoreLevel);
|
||||
|
||||
void batchDeleteByStartId(@Param("startId")Long startId);
|
||||
int batchDeleteByStartId(@Param("startId")Long startId);
|
||||
|
||||
int countStartAndGroupNum(@Param("startId")Long startId);
|
||||
|
||||
|
||||
@ -451,7 +451,8 @@
|
||||
|
||||
|
||||
<update id="batchDeleteByStartIdAndStaffId">
|
||||
update lz_result_record set is_delete = 1 where
|
||||
update lz_result_record set is_delete = 1,gmt_modified = now()
|
||||
where
|
||||
is_delete = 0
|
||||
and start_id = #{startId}
|
||||
and staff_id in (
|
||||
|
||||
@ -118,6 +118,18 @@
|
||||
)
|
||||
</select>
|
||||
|
||||
|
||||
<select id="selectEvaluationGroupByNotIds" resultType="EvaluationGroup" >
|
||||
select * from lz_evaluation_group where is_delete = 0 and copy_id = 0
|
||||
<if test="ids!=null and ids.size()!=0">
|
||||
and id not in (
|
||||
<foreach collection="ids" item="id" separator=",">
|
||||
#{id}
|
||||
</foreach>
|
||||
)
|
||||
</if>
|
||||
</select>
|
||||
|
||||
<select id="selectEvaluationGroupByName" resultType="EvaluationGroup" >
|
||||
select * from lz_evaluation_group where name=#{name} and is_delete = 0 limit 1
|
||||
</select>
|
||||
|
||||
@ -143,7 +143,7 @@
|
||||
lz_evaluation_start_staff
|
||||
set
|
||||
score = 1,
|
||||
,gmt_modified = now()
|
||||
gmt_modified = now()
|
||||
where is_delete = 0 and score = 0 and type = 0
|
||||
and evaluation_id = #{evaluationId} and start_id = #{startId}
|
||||
</update>
|
||||
@ -154,7 +154,7 @@
|
||||
lz_evaluation_start_staff
|
||||
set
|
||||
is_delete = 1,
|
||||
,gmt_modified = now()
|
||||
gmt_modified = now()
|
||||
where is_delete = 0 and type = 0
|
||||
and start_id = #{startId}
|
||||
and staff_id in (
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user