添加商品类型和机构选择父级的时候只能从父级或者旁级选择的控制
This commit is contained in:
@@ -116,6 +116,7 @@
|
|||||||
var url;
|
var url;
|
||||||
//初始化界面
|
//初始化界面
|
||||||
$(function () {
|
$(function () {
|
||||||
|
var id=$("#id").val();
|
||||||
var treeHeight=webH-35;
|
var treeHeight=webH-35;
|
||||||
//初始化系统基础信息
|
//初始化系统基础信息
|
||||||
$('#tableData').datagrid({
|
$('#tableData').datagrid({
|
||||||
@@ -142,7 +143,7 @@
|
|||||||
});
|
});
|
||||||
$('#tableData').prev('.datagrid-view2').find(".datagrid-body").append("<ul id='tt'><ul>");
|
$('#tableData').prev('.datagrid-view2').find(".datagrid-body").append("<ul id='tt'><ul>");
|
||||||
$('#tt').tree({
|
$('#tt').tree({
|
||||||
url: '/organization/getOrganizationTree',
|
url: '/organization/getOrganizationTree?id='+id,
|
||||||
animate: true,
|
animate: true,
|
||||||
checkbox: true,
|
checkbox: true,
|
||||||
onDblClick: function(node){
|
onDblClick: function(node){
|
||||||
|
|||||||
@@ -23,8 +23,9 @@
|
|||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
$(function () {
|
$(function () {
|
||||||
|
var id=$("#id").val();
|
||||||
$('#ttForSelect').tree({
|
$('#ttForSelect').tree({
|
||||||
url: '/organization/getOrganizationTree',
|
url: '/organization/getOrganizationTree?id='+id,
|
||||||
animate: true,
|
animate: true,
|
||||||
onDblClick: function (node) {
|
onDblClick: function (node) {
|
||||||
//双击修改
|
//双击修改
|
||||||
|
|||||||
@@ -82,6 +82,7 @@
|
|||||||
//初始化界面
|
//初始化界面
|
||||||
$(function () {
|
$(function () {
|
||||||
var treeHeight=webH-35;
|
var treeHeight=webH-35;
|
||||||
|
var id=$("#id").val();
|
||||||
//初始化系统基础信息
|
//初始化系统基础信息
|
||||||
$('#tableData').datagrid({
|
$('#tableData').datagrid({
|
||||||
height: treeHeight,
|
height: treeHeight,
|
||||||
@@ -107,7 +108,7 @@
|
|||||||
});
|
});
|
||||||
$('#tableData').prev('.datagrid-view2').find(".datagrid-body").append("<ul id='tt'><ul>");
|
$('#tableData').prev('.datagrid-view2').find(".datagrid-body").append("<ul id='tt'><ul>");
|
||||||
$('#tt').tree({
|
$('#tt').tree({
|
||||||
url: '/materialCategory/getMaterialCategoryTree',
|
url: '/materialCategory/getMaterialCategoryTree?id='+id,
|
||||||
animate: true,
|
animate: true,
|
||||||
checkbox: true,
|
checkbox: true,
|
||||||
onDblClick: function(node){
|
onDblClick: function(node){
|
||||||
|
|||||||
@@ -21,10 +21,19 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
/**
|
||||||
|
* create by: qiankunpingtai
|
||||||
|
* create time: 2019/3/14 11:41
|
||||||
|
* description:
|
||||||
|
* 为了防止当前节点选择父级目录为其子代节点造成闭环无法获取的问题
|
||||||
|
* 决定对树结构可选父级目录做一个筛选,只能为其上级目录
|
||||||
|
*
|
||||||
|
*/
|
||||||
$(function () {
|
$(function () {
|
||||||
|
var id=$("#id").val();
|
||||||
|
console.log(id);
|
||||||
$('#ttForSelect').tree({
|
$('#ttForSelect').tree({
|
||||||
url: '/materialCategory/getMaterialCategoryTree',
|
url: '/materialCategory/getMaterialCategoryTree?id='+id,
|
||||||
animate: true,
|
animate: true,
|
||||||
onDblClick: function (node) {
|
onDblClick: function (node) {
|
||||||
//双击修改
|
//双击修改
|
||||||
|
|||||||
@@ -83,7 +83,14 @@ public class BusinessConstants {
|
|||||||
/**
|
/**
|
||||||
* 商品类别根目录id
|
* 商品类别根目录id
|
||||||
* */
|
* */
|
||||||
public static final Long MATERIAL_CATEGORY_ROOT_ID = 1L;
|
/**
|
||||||
|
* create by: qiankunpingtai
|
||||||
|
* create time: 2019/3/14 11:41
|
||||||
|
* description:
|
||||||
|
* 为了使用户可以自己建初始目录,设定根目录的父级目录id为-1
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static final Long MATERIAL_CATEGORY_ROOT_PARENT_ID = -1L;
|
||||||
/**
|
/**
|
||||||
* 商品类别状态
|
* 商品类别状态
|
||||||
* 0系统默认,1启用,2删除
|
* 0系统默认,1启用,2删除
|
||||||
@@ -101,10 +108,10 @@ public class BusinessConstants {
|
|||||||
public static final String ORGANIZATION_STCD_BUSINESS_TERMINATED = "4";
|
public static final String ORGANIZATION_STCD_BUSINESS_TERMINATED = "4";
|
||||||
public static final String ORGANIZATION_STCD_REMOVED = "5";
|
public static final String ORGANIZATION_STCD_REMOVED = "5";
|
||||||
/**
|
/**
|
||||||
* 根机构编号
|
* 根机构父级编号
|
||||||
* 根机构编号默认为-1
|
* 根机父级构编号默认为-1
|
||||||
* */
|
* */
|
||||||
public static final String ORGANIZATION_ROOT_NO = "-1";
|
public static final String ORGANIZATION_ROOT_PARENT_NO = "-1";
|
||||||
/**
|
/**
|
||||||
* 新增用户默认密码
|
* 新增用户默认密码
|
||||||
* */
|
* */
|
||||||
|
|||||||
@@ -92,9 +92,9 @@ public class MaterialCategoryController {
|
|||||||
* @return com.alibaba.fastjson.JSONArray
|
* @return com.alibaba.fastjson.JSONArray
|
||||||
*/
|
*/
|
||||||
@RequestMapping(value = "/getMaterialCategoryTree")
|
@RequestMapping(value = "/getMaterialCategoryTree")
|
||||||
public JSONArray getMaterialCategoryTree() throws Exception{
|
public JSONArray getMaterialCategoryTree(@RequestParam("id") Long id) throws Exception{
|
||||||
JSONArray arr=new JSONArray();
|
JSONArray arr=new JSONArray();
|
||||||
List<TreeNode> materialCategoryTree = materialCategoryService.getMaterialCategoryTree();
|
List<TreeNode> materialCategoryTree = materialCategoryService.getMaterialCategoryTree(id);
|
||||||
if(materialCategoryTree!=null&&materialCategoryTree.size()>0){
|
if(materialCategoryTree!=null&&materialCategoryTree.size()>0){
|
||||||
for(TreeNode node:materialCategoryTree){
|
for(TreeNode node:materialCategoryTree){
|
||||||
String str=JSON.toJSONString(node);
|
String str=JSON.toJSONString(node);
|
||||||
|
|||||||
@@ -95,9 +95,9 @@ public class OrganizationController {
|
|||||||
* @return com.alibaba.fastjson.JSONArray
|
* @return com.alibaba.fastjson.JSONArray
|
||||||
*/
|
*/
|
||||||
@RequestMapping(value = "/getOrganizationTree")
|
@RequestMapping(value = "/getOrganizationTree")
|
||||||
public JSONArray getOrganizationTree() throws Exception{
|
public JSONArray getOrganizationTree(@RequestParam("id") Long id) throws Exception{
|
||||||
JSONArray arr=new JSONArray();
|
JSONArray arr=new JSONArray();
|
||||||
List<TreeNode> organizationTree= organizationService.getOrganizationTree();
|
List<TreeNode> organizationTree= organizationService.getOrganizationTree(id);
|
||||||
if(organizationTree!=null&&organizationTree.size()>0){
|
if(organizationTree!=null&&organizationTree.size()>0){
|
||||||
for(TreeNode node:organizationTree){
|
for(TreeNode node:organizationTree){
|
||||||
String str=JSON.toJSONString(node);
|
String str=JSON.toJSONString(node);
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import org.apache.ibatis.annotations.Param;
|
|||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Description
|
* Description
|
||||||
@@ -24,8 +25,8 @@ public interface MaterialCategoryMapperEx {
|
|||||||
@Param("name") String name,
|
@Param("name") String name,
|
||||||
@Param("parentId") Integer parentId);
|
@Param("parentId") Integer parentId);
|
||||||
|
|
||||||
List<TreeNode> getNodeTree();
|
List<TreeNode> getNodeTree(@Param("currentId")Long currentId);
|
||||||
List<TreeNode> getNextNodeTree(@Param("id") Long id);
|
List<TreeNode> getNextNodeTree(Map<String, Object> parameterMap);
|
||||||
|
|
||||||
int addMaterialCategory(MaterialCategory mc);
|
int addMaterialCategory(MaterialCategory mc);
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import org.apache.ibatis.annotations.Param;
|
|||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Description
|
* Description
|
||||||
@@ -17,8 +18,8 @@ import java.util.List;
|
|||||||
public interface OrganizationMapperEx {
|
public interface OrganizationMapperEx {
|
||||||
|
|
||||||
|
|
||||||
List<TreeNode> getNodeTree();
|
List<TreeNode> getNodeTree(@Param("currentId")Long currentId);
|
||||||
List<TreeNode> getNextNodeTree(@Param("id") Long id);
|
List<TreeNode> getNextNodeTree(Map<String, Object> parameterMap);
|
||||||
|
|
||||||
int addOrganization(Organization org);
|
int addOrganization(Organization org);
|
||||||
|
|
||||||
|
|||||||
@@ -100,8 +100,8 @@ public class MaterialCategoryService {
|
|||||||
* @Param:
|
* @Param:
|
||||||
* @return java.util.List<com.jsh.erp.datasource.vo.TreeNode>
|
* @return java.util.List<com.jsh.erp.datasource.vo.TreeNode>
|
||||||
*/
|
*/
|
||||||
public List<TreeNode> getMaterialCategoryTree() throws Exception{
|
public List<TreeNode> getMaterialCategoryTree(Long id) throws Exception{
|
||||||
return materialCategoryMapperEx.getNodeTree();
|
return materialCategoryMapperEx.getNodeTree(id);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* create by: cjl
|
* create by: cjl
|
||||||
@@ -117,8 +117,8 @@ public class MaterialCategoryService {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if(mc.getParentid()==null){
|
if(mc.getParentid()==null){
|
||||||
//没有给定父级目录的id,默认设置父级目录为根目录
|
//没有给定父级目录的id,默认设置父级目录为根目录的父目录
|
||||||
mc.setParentid(BusinessConstants.MATERIAL_CATEGORY_ROOT_ID);
|
mc.setParentid(BusinessConstants.MATERIAL_CATEGORY_ROOT_PARENT_ID);
|
||||||
}
|
}
|
||||||
//检查商品类型编号是否已存在
|
//检查商品类型编号是否已存在
|
||||||
checkMaterialCategorySerialNo(mc);
|
checkMaterialCategorySerialNo(mc);
|
||||||
@@ -148,40 +148,16 @@ public class MaterialCategoryService {
|
|||||||
if(strArray.length<1){
|
if(strArray.length<1){
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
* create by: qiankunpingtai
|
|
||||||
* create time: 2019/3/13 14:49
|
|
||||||
* description:
|
|
||||||
* 添加一个限制,根目录不允许删除
|
|
||||||
*/
|
|
||||||
String rootIdStr=BusinessConstants.MATERIAL_CATEGORY_ROOT_ID.toString();
|
|
||||||
for(String s:strArray){
|
|
||||||
if(rootIdStr.equals(s)){
|
|
||||||
logger.error("异常码[{}],异常提示[{}],参数,id:[{}]",
|
|
||||||
ExceptionConstants.MATERIAL_CATEGORY_ROOT_NOT_SUPPORT_DELETE_CODE,
|
|
||||||
ExceptionConstants.MATERIAL_CATEGORY_ROOT_NOT_SUPPORT_DELETE_MSG,s);
|
|
||||||
throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_CATEGORY_ROOT_NOT_SUPPORT_DELETE_CODE,
|
|
||||||
ExceptionConstants.MATERIAL_CATEGORY_ROOT_NOT_SUPPORT_DELETE_MSG);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return materialCategoryMapperEx.batchDeleteMaterialCategoryByIds(updateDate,updater,strArray);
|
return materialCategoryMapperEx.batchDeleteMaterialCategoryByIds(updateDate,updater,strArray);
|
||||||
}
|
}
|
||||||
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
|
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
|
||||||
public int editMaterialCategory(MaterialCategory mc) {
|
public int editMaterialCategory(MaterialCategory mc) {
|
||||||
/**
|
if(mc.getParentid()==null){
|
||||||
* create by: qiankunpingtai
|
//没有给定父级目录的id,默认设置父级目录为根目录的父目录
|
||||||
* create time: 2019/3/13 14:49
|
mc.setParentid(BusinessConstants.MATERIAL_CATEGORY_ROOT_PARENT_ID);
|
||||||
* description:
|
|
||||||
* 添加一个限制根目录不允许修改
|
|
||||||
*/
|
|
||||||
if(BusinessConstants.MATERIAL_CATEGORY_ROOT_ID.equals(mc.getId())){
|
|
||||||
logger.error("异常码[{}],异常提示[{}],参数,id:[{}]",
|
|
||||||
ExceptionConstants.MATERIAL_CATEGORY_ROOT_NOT_SUPPORT_EDIT_CODE,
|
|
||||||
ExceptionConstants.MATERIAL_CATEGORY_ROOT_NOT_SUPPORT_EDIT_MSG,mc.getId());
|
|
||||||
throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_CATEGORY_ROOT_NOT_SUPPORT_EDIT_CODE,
|
|
||||||
ExceptionConstants.MATERIAL_CATEGORY_ROOT_NOT_SUPPORT_EDIT_MSG);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//检查商品类型编号是否已存在
|
//检查商品类型编号是否已存在
|
||||||
checkMaterialCategorySerialNo(mc);
|
checkMaterialCategorySerialNo(mc);
|
||||||
//更新时间
|
//更新时间
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ public class OrganizationService {
|
|||||||
* 未指定父级机构的时候默认为根机构
|
* 未指定父级机构的时候默认为根机构
|
||||||
* */
|
* */
|
||||||
if(StringUtil.isEmpty(org.getOrgParentNo())){
|
if(StringUtil.isEmpty(org.getOrgParentNo())){
|
||||||
org.setOrgParentNo(BusinessConstants.ORGANIZATION_ROOT_NO);
|
org.setOrgParentNo(BusinessConstants.ORGANIZATION_ROOT_PARENT_NO);
|
||||||
}
|
}
|
||||||
return organizationMapperEx.addOrganization(org);
|
return organizationMapperEx.addOrganization(org);
|
||||||
}
|
}
|
||||||
@@ -103,13 +103,13 @@ public class OrganizationService {
|
|||||||
* 未指定父级机构的时候默认为根机构
|
* 未指定父级机构的时候默认为根机构
|
||||||
* */
|
* */
|
||||||
if(StringUtil.isEmpty(org.getOrgParentNo())){
|
if(StringUtil.isEmpty(org.getOrgParentNo())){
|
||||||
org.setOrgParentNo(BusinessConstants.ORGANIZATION_ROOT_NO);
|
org.setOrgParentNo(BusinessConstants.ORGANIZATION_ROOT_PARENT_NO);
|
||||||
}
|
}
|
||||||
return organizationMapperEx.editOrganization(org);
|
return organizationMapperEx.editOrganization(org);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<TreeNode> getOrganizationTree()throws Exception {
|
public List<TreeNode> getOrganizationTree(Long id)throws Exception {
|
||||||
return organizationMapperEx.getNodeTree();
|
return organizationMapperEx.getNodeTree(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Organization> findById(Long id) throws Exception{
|
public List<Organization> findById(Long id) throws Exception{
|
||||||
|
|||||||
@@ -33,14 +33,14 @@
|
|||||||
<resultMap id="BaseTreeResultMap" type="com.jsh.erp.datasource.vo.TreeNode">
|
<resultMap id="BaseTreeResultMap" type="com.jsh.erp.datasource.vo.TreeNode">
|
||||||
<result column="id" property="id"/>
|
<result column="id" property="id"/>
|
||||||
<result column="name" property="text"/>
|
<result column="name" property="text"/>
|
||||||
<collection column="id" property="children" javaType="java.util.ArrayList"
|
<collection column="{currentId=currentId,id=id}" property="children" javaType="java.util.ArrayList"
|
||||||
ofType="com.jsh.erp.datasource.vo.TreeNode" select="getNextNodeTree"/>
|
ofType="com.jsh.erp.datasource.vo.TreeNode" select="getNextNodeTree"/>
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
<resultMap id="NextTreeResultMap" type="com.jsh.erp.datasource.vo.TreeNode">
|
<resultMap id="NextTreeResultMap" type="com.jsh.erp.datasource.vo.TreeNode">
|
||||||
<result column="id" property="id"/>
|
<result column="id" property="id"/>
|
||||||
<result column="name" property="text"/>
|
<result column="name" property="text"/>
|
||||||
<collection column="id" property="children" javaType="java.util.ArrayList"
|
<collection column="{currentId=currentId,id=id}" property="children" javaType="java.util.ArrayList"
|
||||||
ofType="com.jsh.erp.datasource.vo.TreeNode" select="getNextNodeTree"/>
|
ofType="com.jsh.erp.datasource.vo.TreeNode" select="getNextNodeTree"/>
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
@@ -50,19 +50,25 @@
|
|||||||
|
|
||||||
<select id="getNextNodeTree" resultMap="NextTreeResultMap">
|
<select id="getNextNodeTree" resultMap="NextTreeResultMap">
|
||||||
SELECT
|
SELECT
|
||||||
<include refid="Base_Column_List"/>
|
<include refid="Base_Column_List"/>,#{currentId} as currentId
|
||||||
FROM jsh_materialcategory
|
FROM jsh_materialcategory
|
||||||
WHERE ParentId = #{id}
|
WHERE ParentId = #{id}
|
||||||
|
<if test="currentId != null">
|
||||||
|
and id !=#{currentId}
|
||||||
|
</if>
|
||||||
and status !='2'
|
and status !='2'
|
||||||
order by sort asc
|
order by sort asc
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="getNodeTree" resultMap="BaseTreeResultMap">
|
<select id="getNodeTree" resultMap="BaseTreeResultMap">
|
||||||
SELECT
|
SELECT
|
||||||
<include refid="Base_Column_List"/>
|
<include refid="Base_Column_List"/>,#{currentId} as currentId
|
||||||
FROM jsh_materialcategory
|
FROM jsh_materialcategory
|
||||||
WHERE ParentId = -1
|
WHERE ParentId = -1
|
||||||
and status !='2'
|
and status !='2'
|
||||||
|
<if test="currentId != null">
|
||||||
|
and id !=#{currentId}
|
||||||
|
</if>
|
||||||
order by sort asc
|
order by sort asc
|
||||||
</select>
|
</select>
|
||||||
<insert id="addMaterialCategory" parameterType="com.jsh.erp.datasource.entities.MaterialCategory"
|
<insert id="addMaterialCategory" parameterType="com.jsh.erp.datasource.entities.MaterialCategory"
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<result column="id" property="id"/>
|
<result column="id" property="id"/>
|
||||||
<result column="org_abr" property="text"/>
|
<result column="org_abr" property="text"/>
|
||||||
<result column="org_no" property="attributes"/>
|
<result column="org_no" property="attributes"/>
|
||||||
<collection column="org_no" property="children" javaType="java.util.ArrayList"
|
<collection column="{currentId=currentId,org_no=org_no}" property="children" javaType="java.util.ArrayList"
|
||||||
ofType="com.jsh.erp.datasource.vo.TreeNode" select="getNextNodeTree"/>
|
ofType="com.jsh.erp.datasource.vo.TreeNode" select="getNextNodeTree"/>
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
<result column="id" property="id"/>
|
<result column="id" property="id"/>
|
||||||
<result column="org_abr" property="text"/>
|
<result column="org_abr" property="text"/>
|
||||||
<result column="org_no" property="attributes"/>
|
<result column="org_no" property="attributes"/>
|
||||||
<collection column="org_no" property="children" javaType="java.util.ArrayList"
|
<collection column="{currentId=currentId,org_no=org_no}" property="children" javaType="java.util.ArrayList"
|
||||||
ofType="com.jsh.erp.datasource.vo.TreeNode" select="getNextNodeTree"/>
|
ofType="com.jsh.erp.datasource.vo.TreeNode" select="getNextNodeTree"/>
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
@@ -24,18 +24,24 @@
|
|||||||
|
|
||||||
<select id="getNextNodeTree" resultMap="NextTreeResultMap">
|
<select id="getNextNodeTree" resultMap="NextTreeResultMap">
|
||||||
SELECT
|
SELECT
|
||||||
<include refid="Base_Column_List"/>
|
<include refid="Base_Column_List"/>,#{currentId} as currentId
|
||||||
FROM jsh_organization
|
FROM jsh_organization
|
||||||
WHERE org_parent_no = #{org_no}
|
WHERE org_parent_no = #{org_no}
|
||||||
|
<if test="currentId != null">
|
||||||
|
and id !=#{currentId}
|
||||||
|
</if>
|
||||||
and org_stcd !='5'
|
and org_stcd !='5'
|
||||||
order by sort asc
|
order by sort asc
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="getNodeTree" resultMap="BaseTreeResultMap">
|
<select id="getNodeTree" resultMap="BaseTreeResultMap">
|
||||||
SELECT
|
SELECT
|
||||||
<include refid="Base_Column_List"/>
|
<include refid="Base_Column_List"/>,#{currentId} as currentId
|
||||||
FROM jsh_organization
|
FROM jsh_organization
|
||||||
WHERE org_parent_no = -1
|
WHERE org_parent_no = -1
|
||||||
|
<if test="currentId != null">
|
||||||
|
and id !=#{currentId}
|
||||||
|
</if>
|
||||||
and org_stcd !='5'
|
and org_stcd !='5'
|
||||||
order by sort asc
|
order by sort asc
|
||||||
</select>
|
</select>
|
||||||
|
|||||||
Reference in New Issue
Block a user