查看报告详情修改
This commit is contained in:
parent
f8958337de
commit
e2a6f9943f
@ -1,5 +1,8 @@
|
||||
package cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanualbackup;
|
||||
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskauto.vo.ModelAssessTaskAutoPageReqVO;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskauto.vo.ModelAssessTaskAutoRespVO;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.ManualEvaluationReportRespVO;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import javax.annotation.Resource;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
@ -79,6 +82,23 @@ public class ModelAssessTaskManualBackupController {
|
||||
return success(BeanUtils.toBean(pageResult, ModelAssessTaskManualBackupRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping("/automatic-get")
|
||||
@Operation(summary = "获得模型评估任务 —— 自动评估")
|
||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||
@PreAuthorize("@ss.hasPermission('llm:model-assess-task-auto:query')")
|
||||
public CommonResult<ModelAssessTaskAutoRespVO> getModelAssessTaskAuto(@RequestParam("id") Long id) {
|
||||
ModelAssessTaskAutoRespVO result = modelAssessTaskManualBackupService.getModelAssessTaskAuto(id);
|
||||
|
||||
return success(result);
|
||||
}
|
||||
@GetMapping("/automatic-page")
|
||||
@Operation(summary = "获得模型评估任务 —— 自动评估分页")
|
||||
@PreAuthorize("@ss.hasPermission('llm:model-assess-task-auto:query')")
|
||||
public CommonResult<PageResult<ModelAssessTaskAutoRespVO>> getModelAssessTaskAutoPage(@Valid ModelAssessTaskAutoPageReqVO pageReqVO) {
|
||||
PageResult<ModelAssessTaskAutoRespVO> pageResult = modelAssessTaskManualBackupService.getModelAssessTaskAutoPage1(pageReqVO);
|
||||
return success(pageResult);
|
||||
}
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
@Operation(summary = "导出人工评估备份 Excel")
|
||||
@PreAuthorize("@ss.hasPermission('llm:model-assess-task-manual-backup:export')")
|
||||
@ -91,5 +111,14 @@ public class ModelAssessTaskManualBackupController {
|
||||
ExcelUtils.write(response, "人工评估备份.xls", "数据", ModelAssessTaskManualBackupRespVO.class,
|
||||
BeanUtils.toBean(list, ModelAssessTaskManualBackupRespVO.class));
|
||||
}
|
||||
@GetMapping("/gitReport")
|
||||
@Operation(summary = "查看报告详情")
|
||||
@PreAuthorize("@ss.hasPermission('llm:model-assess-task-manual:query')")
|
||||
public CommonResult<List<ManualEvaluationReportRespVO>> gitViewTheReportDetails(@RequestParam("id") Long id) {
|
||||
//TODO 人工评估-查看报告待补充
|
||||
List<ManualEvaluationReportRespVO> manualEvaluationReportRespVOS = modelAssessTaskManualBackupService.gitViewTheReportDetails(id);
|
||||
return success(manualEvaluationReportRespVOS);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,8 +1,11 @@
|
||||
package cn.iocoder.yudao.module.llm.dal.mysql.modelassesstaskauto;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskauto.vo.ModelAssessTaskAutoPageReqVO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskauto.ModelAssessTaskAutoBackupDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskauto.ModelAssessTaskAutoDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import java.util.*;
|
||||
|
||||
@ -16,6 +19,18 @@ import java.util.*;
|
||||
@Mapper
|
||||
public interface ModelAssessTaskAutoBackupMapper extends BaseMapperX<ModelAssessTaskAutoBackupDO> {
|
||||
|
||||
default PageResult<ModelAssessTaskAutoBackupDO> selectPage(ModelAssessTaskAutoPageReqVO reqVO) {
|
||||
return selectPage(reqVO, new LambdaQueryWrapperX<ModelAssessTaskAutoBackupDO>()
|
||||
.eq(ModelAssessTaskAutoBackupDO::getDeleted, false)
|
||||
.likeIfPresent(ModelAssessTaskAutoBackupDO::getTaskName, reqVO.getTaskName())
|
||||
.eqIfPresent(ModelAssessTaskAutoBackupDO::getTaskInfro, reqVO.getTaskInfro())
|
||||
.eqIfPresent(ModelAssessTaskAutoBackupDO::getCpuType, reqVO.getCpuType())
|
||||
.eqIfPresent(ModelAssessTaskAutoBackupDO::getModelService, reqVO.getModelService())
|
||||
.eqIfPresent(ModelAssessTaskAutoBackupDO::getDataset, reqVO.getDataset())
|
||||
.betweenIfPresent(ModelAssessTaskAutoBackupDO::getCreateTime, reqVO.getCreateTime())
|
||||
.eqIfPresent(ModelAssessTaskAutoBackupDO::getDimension, reqVO.getDimension())
|
||||
.orderByDesc(ModelAssessTaskAutoBackupDO::getId));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -2,6 +2,10 @@ package cn.iocoder.yudao.module.llm.service.modelassesstaskmanualbackup;
|
||||
|
||||
import java.util.*;
|
||||
import javax.validation.*;
|
||||
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskauto.vo.ModelAssessTaskAutoPageReqVO;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskauto.vo.ModelAssessTaskAutoRespVO;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.ManualEvaluationReportRespVO;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanualbackup.vo.*;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskmanualbackup.ModelAssessTaskManualBackupDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
@ -57,4 +61,10 @@ public interface ModelAssessTaskManualBackupService {
|
||||
void unBackup(Long id);
|
||||
|
||||
ModelAssessTaskManualBackupRespVO getModelAssessTaskManualBackup1(Long id);
|
||||
}
|
||||
|
||||
List<ManualEvaluationReportRespVO> gitViewTheReportDetails(Long id);
|
||||
|
||||
PageResult<ModelAssessTaskAutoRespVO> getModelAssessTaskAutoPage1(ModelAssessTaskAutoPageReqVO pageReqVO);
|
||||
|
||||
ModelAssessTaskAutoRespVO getModelAssessTaskAuto(Long id);
|
||||
}
|
||||
|
@ -1,16 +1,32 @@
|
||||
package cn.iocoder.yudao.module.llm.service.modelassesstaskmanualbackup;
|
||||
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskauto.vo.ModelAssessTaskAutoPageReqVO;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskauto.vo.ModelAssessTaskAutoRespVO;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskauto.vo.ModelAssessTaskStoplistRespVO;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.LabelInformationVO;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.ManualEvaluationReportRespVO;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.ModelAssessTaskDimensionRespVO;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.ModelAssessTaskManualRespVO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.basemodel.BaseModelDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.dataset.DatasetDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassessstoplist.ModelAssessStoplistDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskauto.ModelAssessTaskAutoBackupDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskauto.ModelAssessTaskAutoDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskauto.ModelAssessTaskStoplistBackupDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskauto.ModelAssessTaskStoplistDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskmanual.ManualModelAnswerDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskmanual.ModelAssessDimensionDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskmanual.ModelAssessTaskDimensionDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskmanual.ModelAssessTaskManualDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskmanualbackup.ManualModelAnswerBackupDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskmanualbackup.ModelAssessTaskDimensionBackupDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.modelservice.ModelServiceDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.mysql.basemodel.BaseModelMapper;
|
||||
import cn.iocoder.yudao.module.llm.dal.mysql.dataset.DatasetMapper;
|
||||
import cn.iocoder.yudao.module.llm.dal.mysql.modelassessstoplist.ModelAssessStoplistMapper;
|
||||
import cn.iocoder.yudao.module.llm.dal.mysql.modelassesstaskauto.ModelAssessTaskAutoBackupMapper;
|
||||
import cn.iocoder.yudao.module.llm.dal.mysql.modelassesstaskauto.ModelAssessTaskStoplistBackupMapper;
|
||||
import cn.iocoder.yudao.module.llm.dal.mysql.modelassesstaskauto.ModelAssessTaskStoplistMapper;
|
||||
import cn.iocoder.yudao.module.llm.dal.mysql.modelassesstaskmanual.ManualModelAnswerMapper;
|
||||
import cn.iocoder.yudao.module.llm.dal.mysql.modelassesstaskmanual.ModelAssessDimensionMapper;
|
||||
import cn.iocoder.yudao.module.llm.dal.mysql.modelassesstaskmanualbackup.ManualModelAnswerBackupMapper;
|
||||
@ -23,6 +39,8 @@ import javax.annotation.Resource;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@ -60,6 +78,12 @@ public class ModelAssessTaskManualBackupServiceImpl implements ModelAssessTaskMa
|
||||
private DatasetMapper datasetMapper;
|
||||
@Resource
|
||||
private BaseModelMapper baseModelMapper;
|
||||
@Resource
|
||||
private ModelAssessTaskAutoBackupMapper modelAssessTaskAutoBaackupMapper;
|
||||
@Resource
|
||||
private ModelAssessTaskStoplistBackupMapper modelAssessTaskStoplistBackupMapper;
|
||||
@Resource
|
||||
private ModelAssessStoplistMapper modelAssessStoplistMapper;
|
||||
|
||||
@Override
|
||||
public Long createModelAssessTaskManualBackup(ModelAssessTaskManualBackupSaveReqVO createReqVO) {
|
||||
@ -162,4 +186,141 @@ public class ModelAssessTaskManualBackupServiceImpl implements ModelAssessTaskMa
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
@Override
|
||||
public List<ManualEvaluationReportRespVO> gitViewTheReportDetails(Long id) {
|
||||
List<ManualEvaluationReportRespVO> manualEvaluationReportRespVOS = new ArrayList<>();
|
||||
LambdaQueryWrapper<ManualModelAnswerBackupDO> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(ManualModelAnswerBackupDO::getManalTaskId,id)
|
||||
.eq(ManualModelAnswerBackupDO::getStatus,2)
|
||||
.isNotNull(ManualModelAnswerBackupDO::getReqRespVos);
|
||||
List<ManualModelAnswerBackupDO> manualModelAnswerDOS = manualModelAnswerBackupMapper.selectList(wrapper);
|
||||
// 获取维度
|
||||
List<String> collect =new ArrayList<>();
|
||||
if (CollectionUtils.isNotEmpty(manualModelAnswerDOS)){
|
||||
List<LabelInformationVO> bean = BeanUtils.toBean(manualModelAnswerDOS.get(0).getReqRespVos(), LabelInformationVO.class);
|
||||
collect = bean.stream().map(LabelInformationVO::getLabel).collect(Collectors.toList());
|
||||
}
|
||||
List<LabelInformationVO> labelInformationVOS = new ArrayList<>();
|
||||
for (ManualModelAnswerBackupDO manualModelAnswerDO : manualModelAnswerDOS){
|
||||
List<LabelInformationVO> bean = BeanUtils.toBean(manualModelAnswerDO.getReqRespVos(), LabelInformationVO.class);
|
||||
labelInformationVOS.addAll(bean);
|
||||
}
|
||||
if (CollectionUtils.isNotEmpty(labelInformationVOS)){
|
||||
// 计算平均分
|
||||
double average = labelInformationVOS.stream().mapToDouble(LabelInformationVO::getScore).average().getAsDouble();
|
||||
double score = average * 50.0;
|
||||
ManualEvaluationReportRespVO reportRespVO = new ManualEvaluationReportRespVO();
|
||||
double bd = new BigDecimal(average).setScale(2, RoundingMode.HALF_UP).doubleValue();
|
||||
double v = new BigDecimal(score).setScale(2, RoundingMode.HALF_UP).doubleValue();
|
||||
reportRespVO.setDimension("平均分");
|
||||
reportRespVO.setScore(bd);
|
||||
reportRespVO.setPercent(v);
|
||||
manualEvaluationReportRespVOS.add(reportRespVO);
|
||||
for (String collect1 : collect){
|
||||
List<LabelInformationVO> voList = labelInformationVOS.stream().filter(manualModelAnswerDO -> manualModelAnswerDO.getLabel().equals(collect1)).collect(Collectors.toList());
|
||||
ManualEvaluationReportRespVO reportRespVO1 = new ManualEvaluationReportRespVO();
|
||||
reportRespVO1.setDimension(collect1);
|
||||
double average1 = voList.stream().mapToDouble(LabelInformationVO::getScore).average().getAsDouble();
|
||||
reportRespVO1.setScore(new BigDecimal(average1).setScale(2, RoundingMode.HALF_UP).doubleValue());
|
||||
reportRespVO1.setPercent(new BigDecimal(average1 * 50.0).setScale(2, RoundingMode.HALF_UP).doubleValue());
|
||||
long count = voList.stream().filter(manualModelAnswerDO -> manualModelAnswerDO.getScore() == 0).count();
|
||||
double zeroPercent = (double) count / voList.size() * 100.0;
|
||||
reportRespVO1.setZeroPercent(new BigDecimal(zeroPercent).setScale(2, RoundingMode.HALF_UP).doubleValue());
|
||||
long count1 = voList.stream().filter(manualModelAnswerDO -> manualModelAnswerDO.getScore() == 1).count();
|
||||
long count2 = voList.stream().filter(manualModelAnswerDO -> manualModelAnswerDO.getScore() == 2).count();
|
||||
double onePercent = (double)count1 / voList.size() * 100.0;
|
||||
reportRespVO1.setOnePercent(new BigDecimal(onePercent).setScale(2, RoundingMode.HALF_UP).doubleValue());
|
||||
double twoPercent = (double)count2 / voList.size() * 100.0;
|
||||
reportRespVO1.setTwoPercent(new BigDecimal(twoPercent).setScale(2, RoundingMode.HALF_UP).doubleValue());
|
||||
manualEvaluationReportRespVOS.add(reportRespVO1);
|
||||
}
|
||||
}
|
||||
return manualEvaluationReportRespVOS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<ModelAssessTaskAutoRespVO> getModelAssessTaskAutoPage1(ModelAssessTaskAutoPageReqVO pageReqVO) {
|
||||
PageResult<ModelAssessTaskAutoBackupDO> modelAssessTaskAutoDOPageResult = modelAssessTaskAutoBaackupMapper.selectPage(pageReqVO);
|
||||
PageResult<ModelAssessTaskAutoRespVO> result = BeanUtils.toBean(modelAssessTaskAutoDOPageResult, ModelAssessTaskAutoRespVO.class);
|
||||
if (CollectionUtils.isNotEmpty(result.getList())){
|
||||
// 我的模型获取校验
|
||||
List<Long> serviceIds = modelAssessTaskAutoDOPageResult.getList().stream().
|
||||
filter(modelAssessTaskManualDO -> modelAssessTaskManualDO.getModelType() == 0)
|
||||
.map(ModelAssessTaskAutoBackupDO::getModelService).collect(Collectors.toList());
|
||||
Map<Long, ModelServiceDO> longModelServiceDOMap = null;
|
||||
if (!CollectionUtils.isEmpty(serviceIds)){
|
||||
LambdaQueryWrapper<ModelServiceDO> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.in(ModelServiceDO::getId,serviceIds);
|
||||
List<ModelServiceDO> modelServiceDOS = modelServiceMapper.selectList(wrapper);
|
||||
longModelServiceDOMap = cn.iocoder.yudao.framework.common.util.collection.
|
||||
CollectionUtils.convertMap(modelServiceDOS, ModelServiceDO::getId);
|
||||
}
|
||||
// 人工模型获取校验
|
||||
List<Long> serviceForeseeIds = modelAssessTaskAutoDOPageResult.getList().stream().
|
||||
filter(modelAssessTaskManualDO -> modelAssessTaskManualDO.getModelType() == 1)
|
||||
.map(ModelAssessTaskAutoBackupDO::getModelService).collect(Collectors.toList());
|
||||
Map<Long, BaseModelDO> serviceForeseeMaps = null;
|
||||
if (!CollectionUtils.isEmpty(serviceForeseeIds)) {
|
||||
List<BaseModelDO> baseModelDOS = baseModelMapper.selectList(new LambdaQueryWrapper<BaseModelDO>()
|
||||
.in(BaseModelDO::getId, serviceForeseeIds));
|
||||
serviceForeseeMaps = cn.iocoder.yudao.framework.common.util.collection.
|
||||
CollectionUtils.convertMap(baseModelDOS, BaseModelDO::getId);
|
||||
}
|
||||
for (ModelAssessTaskAutoRespVO modelAssessTaskManualRespVO : result.getList()){
|
||||
if (modelAssessTaskManualRespVO.getModelType() == 0 && longModelServiceDOMap != null){
|
||||
ModelServiceDO modelServiceDO = longModelServiceDOMap.get(modelAssessTaskManualRespVO.getModelService());
|
||||
if(modelServiceDO != null){
|
||||
modelAssessTaskManualRespVO.setModelServiceName(modelServiceDO.getServiceName());
|
||||
}
|
||||
}else if (modelAssessTaskManualRespVO.getModelType() == 1 && serviceForeseeMaps != null){
|
||||
BaseModelDO baseModelDO = serviceForeseeMaps.get(modelAssessTaskManualRespVO.getModelService());
|
||||
if(baseModelDO != null){
|
||||
modelAssessTaskManualRespVO.setModelServiceName(baseModelDO.getModelName());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ModelAssessTaskAutoRespVO getModelAssessTaskAuto(Long id) {
|
||||
ModelAssessTaskAutoBackupDO modelAssessTaskAutoDO = modelAssessTaskAutoBaackupMapper.selectById(id);
|
||||
ModelAssessTaskAutoRespVO result = BeanUtils.toBean(modelAssessTaskAutoDO, ModelAssessTaskAutoRespVO.class);
|
||||
|
||||
// 标注查询
|
||||
List<ModelAssessTaskStoplistBackupDO> modelAssessTaskStoplistDOS = modelAssessTaskStoplistBackupMapper.selectList(new LambdaQueryWrapper<ModelAssessTaskStoplistBackupDO>()
|
||||
.eq(ModelAssessTaskStoplistBackupDO::getTaskId, id)
|
||||
.eq(ModelAssessTaskStoplistBackupDO::getDeleted, false));
|
||||
List<ModelAssessTaskStoplistRespVO> stoplistRespVOS = BeanUtils.toBean(modelAssessTaskStoplistDOS, ModelAssessTaskStoplistRespVO.class);
|
||||
// 提取id
|
||||
List<Long> stoplistIds = modelAssessTaskStoplistDOS.stream().map(ModelAssessTaskStoplistBackupDO::getStoplistId).collect(Collectors.toList());
|
||||
if (!CollectionUtils.isEmpty(stoplistIds)){
|
||||
// 查询停用词表 将词表word返回
|
||||
LambdaQueryWrapper<ModelAssessStoplistDO> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.in(ModelAssessStoplistDO::getId,stoplistIds);
|
||||
List<ModelAssessStoplistDO> modelAssessStoplistDOs = modelAssessStoplistMapper.selectList(wrapper);
|
||||
Map<Long, ModelAssessStoplistDO> longModelServiceDOMap = cn.iocoder.yudao.framework.common.util.collection.
|
||||
CollectionUtils.convertMap(modelAssessStoplistDOs, ModelAssessStoplistDO::getId);
|
||||
stoplistRespVOS.stream().forEach(stoplistRespVO -> {
|
||||
ModelAssessStoplistDO modelAssessStoplistDO = longModelServiceDOMap.get(stoplistRespVO.getStoplistId());
|
||||
if(modelAssessStoplistDO != null){
|
||||
stoplistRespVO.setStoplistName(modelAssessStoplistDO.getWord());
|
||||
}
|
||||
});
|
||||
}
|
||||
result.setStoplists(stoplistRespVOS);
|
||||
|
||||
ModelServiceDO modelServiceDO = modelServiceMapper.selectById(modelAssessTaskAutoDO.getModelService());
|
||||
if (modelServiceDO != null){
|
||||
result.setModelServiceName(modelServiceDO.getServiceName());
|
||||
}
|
||||
DatasetDO datasetDO = datasetMapper.selectById(modelAssessTaskAutoDO.getDataset());
|
||||
if (datasetDO != null){
|
||||
result.setDatasetName(datasetDO.getDatasetName());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user