格式化区划数据
This commit is contained in:
parent
3912ec2bd1
commit
02c5e71c79
@ -1,14 +1,18 @@
|
|||||||
package com.xkrs.controller;
|
package com.xkrs.controller;
|
||||||
|
|
||||||
import com.xkrs.common.encapsulation.PromptMessageEnum;
|
import com.xkrs.common.encapsulation.PromptMessageEnum;
|
||||||
|
import com.xkrs.dao.DistrictDao;
|
||||||
import com.xkrs.dao.FirePointOrdinaryDao;
|
import com.xkrs.dao.FirePointOrdinaryDao;
|
||||||
import com.xkrs.dao.StreetDao;
|
import com.xkrs.dao.StreetDao;
|
||||||
import com.xkrs.dao.SysUserDao;
|
import com.xkrs.dao.SysUserDao;
|
||||||
import com.xkrs.fireseason.FireSeasonConfigService;
|
import com.xkrs.fireseason.FireSeasonConfigService;
|
||||||
|
import com.xkrs.model.bean.AddressBean;
|
||||||
|
import com.xkrs.model.entity.DistrictEntity;
|
||||||
import com.xkrs.model.qo.AllFirePointQo;
|
import com.xkrs.model.qo.AllFirePointQo;
|
||||||
import com.xkrs.model.qo.UpdateFirePointQo;
|
import com.xkrs.model.qo.UpdateFirePointQo;
|
||||||
import com.xkrs.service.DispatchFirePointService;
|
import com.xkrs.service.DispatchFirePointService;
|
||||||
import com.xkrs.service.impl.FirePointServiceImpl;
|
import com.xkrs.service.impl.FirePointServiceImpl;
|
||||||
|
import com.xkrs.utilsnew.FirePointAddressUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.context.i18n.LocaleContextHolder;
|
import org.springframework.context.i18n.LocaleContextHolder;
|
||||||
@ -18,6 +22,7 @@ import org.springframework.web.bind.annotation.RequestBody;
|
|||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
import static com.xkrs.common.encapsulation.OutputEncapsulation.outputEncapsulationObject;
|
import static com.xkrs.common.encapsulation.OutputEncapsulation.outputEncapsulationObject;
|
||||||
@ -36,45 +41,130 @@ public class DispatchFirePointController {
|
|||||||
private FirePointOrdinaryDao firePointOrdinaryDao;
|
private FirePointOrdinaryDao firePointOrdinaryDao;
|
||||||
@Resource
|
@Resource
|
||||||
private StreetDao streetDao;
|
private StreetDao streetDao;
|
||||||
|
@Resource
|
||||||
|
private DistrictDao districtDao;
|
||||||
private final Locale locale = LocaleContextHolder.getLocale();
|
private final Locale locale = LocaleContextHolder.getLocale();
|
||||||
|
|
||||||
@GetMapping("/debug")
|
@GetMapping("/debug")
|
||||||
public String debug() {
|
public String debug() throws Exception {
|
||||||
|
int count = 0;
|
||||||
|
List<DistrictEntity> districtList = districtDao.findAll();
|
||||||
|
for (DistrictEntity districtItem : districtList) {
|
||||||
|
try {
|
||||||
|
String[] split = districtItem.getCenter().split(",");
|
||||||
|
double longitude = Double.parseDouble(split[0]);
|
||||||
|
double latitude = Double.parseDouble(split[1]);
|
||||||
|
AddressBean addressBean = FirePointAddressUtils.analysisWithNetwork(longitude, latitude);
|
||||||
|
if (!addressBean.isSuccess()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!addressBean.getTownCode().startsWith(districtItem.getStreetCode())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
districtDao.updateStreetCode(districtItem.getId(), addressBean.getTownCode());
|
||||||
|
count++;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// System.out.println("开始更新用户VIP时间范围");
|
|
||||||
|
// int count = 0;
|
||||||
|
// String result = HttpClientUtils.sendHttpsGet("https://restapi.amap.com/v3/config/district?key=89d34909932a58c094da0ea390058a12&subdistrict=4");
|
||||||
|
// DistrictBean districtBean = JSONUtil.toBean(result, DistrictBean.class);
|
||||||
|
// List<DistrictBean.DistrictsDTO> list111 = districtBean.getDistricts().get(0).getDistricts();
|
||||||
|
// list111.sort(Comparator.comparing(DistrictBean.DistrictsDTO::getAdcode));
|
||||||
|
// for (DistrictBean.DistrictsDTO proItem : list111) {
|
||||||
|
// if (proItem != null && proItem.getDistricts() != null && proItem.getDistricts().size() > 0) {
|
||||||
|
// List<DistrictBean.DistrictsDTO> list222 = proItem.getDistricts();
|
||||||
|
// list222.sort(Comparator.comparing(DistrictBean.DistrictsDTO::getAdcode));
|
||||||
|
// for (DistrictBean.DistrictsDTO cityItem : list222) {
|
||||||
|
// if (cityItem != null && cityItem.getDistricts() != null && cityItem.getDistricts().size() > 0) {
|
||||||
|
// List<DistrictBean.DistrictsDTO> list333 = cityItem.getDistricts();
|
||||||
|
// list333.sort(Comparator.comparing(DistrictBean.DistrictsDTO::getAdcode));
|
||||||
|
// for (DistrictBean.DistrictsDTO countyItem : list333) {
|
||||||
|
// if (countyItem != null && countyItem.getDistricts() != null && countyItem.getDistricts().size() > 0) {
|
||||||
|
// List<DistrictBean.DistrictsDTO> list444 = countyItem.getDistricts();
|
||||||
|
// list444.sort(Comparator.comparing(DistrictBean.DistrictsDTO::getAdcode));
|
||||||
|
// for (DistrictBean.DistrictsDTO streetItem : list444) {
|
||||||
|
// DistrictEntity districtEntity = new DistrictEntity();
|
||||||
|
// districtEntity.setProName(proItem.getName());
|
||||||
|
// districtEntity.setProCode(proItem.getAdcode());
|
||||||
|
// districtEntity.setCityName(cityItem.getName());
|
||||||
|
// districtEntity.setCityCode(cityItem.getAdcode());
|
||||||
|
// districtEntity.setCountyName(countyItem.getName());
|
||||||
|
// districtEntity.setCountyCode(countyItem.getAdcode());
|
||||||
|
// districtEntity.setStreetName(streetItem.getName());
|
||||||
|
// districtEntity.setStreetCode(streetItem.getAdcode());
|
||||||
|
// districtEntity.setCenter(streetItem.getCenter());
|
||||||
|
// districtEntity.setLevel(streetItem.getLevel());
|
||||||
|
// districtDao.saveAndFlush(districtEntity);
|
||||||
|
// count++;
|
||||||
|
// if (count % 100 == 0) {
|
||||||
|
// System.out.println("已完成" + count + "条记录");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
//
|
//
|
||||||
// List<SysUserEntity> sysUserEntityList = sysUserDao.findAll();
|
//
|
||||||
// for (SysUserEntity sysUserEntity : sysUserEntityList) {
|
//// System.out.println("开始更新用户VIP时间范围");
|
||||||
// String addTime = sysUserEntity.getAddTime();
|
////
|
||||||
// String vipTimeRangeJson = sysUserEntity.getVipTimeRangeJson();
|
//// List<SysUserEntity> sysUserEntityList = sysUserDao.findAll();
|
||||||
// if (!DateTimeUtil.isValidDateTime(addTime)) {
|
//// for (SysUserEntity sysUserEntity : sysUserEntityList) {
|
||||||
// return sysUserEntity.getUserName();
|
//// String addTime = sysUserEntity.getAddTime();
|
||||||
// }
|
//// String vipTimeRangeJson = sysUserEntity.getVipTimeRangeJson();
|
||||||
// if (!DateTimeUtil.isValidDateTime(vipTimeRangeJson)) {
|
//// if (!DateTimeUtil.isValidDateTime(addTime)) {
|
||||||
// return sysUserEntity.getUserName();
|
//// return sysUserEntity.getUserName();
|
||||||
// }
|
//// }
|
||||||
// VipTimeRangeBean.VipTimeRangeItemBean vipTimeRangeItemBean = new VipTimeRangeBean.VipTimeRangeItemBean();
|
//// if (!DateTimeUtil.isValidDateTime(vipTimeRangeJson)) {
|
||||||
// vipTimeRangeItemBean.setStartTime(addTime);
|
//// return sysUserEntity.getUserName();
|
||||||
// vipTimeRangeItemBean.setEndTime(vipTimeRangeJson);
|
//// }
|
||||||
// List<VipTimeRangeBean.VipTimeRangeItemBean> list = new ArrayList<>();
|
//// VipTimeRangeBean.VipTimeRangeItemBean vipTimeRangeItemBean = new VipTimeRangeBean.VipTimeRangeItemBean();
|
||||||
// list.add(vipTimeRangeItemBean);
|
//// vipTimeRangeItemBean.setStartTime(addTime);
|
||||||
// VipTimeRangeBean vipTimeRangeBean = new VipTimeRangeBean();
|
//// vipTimeRangeItemBean.setEndTime(vipTimeRangeJson);
|
||||||
// vipTimeRangeBean.setList(list);
|
//// List<VipTimeRangeBean.VipTimeRangeItemBean> list = new ArrayList<>();
|
||||||
// String serialize = JsonUtils.<VipTimeRangeBean>serialize(vipTimeRangeBean);
|
//// list.add(vipTimeRangeItemBean);
|
||||||
// System.out.println("serialize = " + serialize);
|
//// VipTimeRangeBean vipTimeRangeBean = new VipTimeRangeBean();
|
||||||
// sysUserEntity.setVipTimeRangeJson(serialize);
|
//// vipTimeRangeBean.setList(list);
|
||||||
// sysUserDao.save(sysUserEntity);
|
//// String serialize = JsonUtils.<VipTimeRangeBean>serialize(vipTimeRangeBean);
|
||||||
// }
|
//// System.out.println("serialize = " + serialize);
|
||||||
|
//// sysUserEntity.setVipTimeRangeJson(serialize);
|
||||||
|
//// sysUserDao.save(sysUserEntity);
|
||||||
|
//// }
|
||||||
|
//
|
||||||
|
//// for (int i = 0; i < 10000; i++) {
|
||||||
|
//// firePointOrdinaryDao.updateProCityCode(i * 310L, (i + 1) * 310L);
|
||||||
|
//// firePointOrdinaryDao.updateProCityName(i * 310L, (i + 1) * 310L);
|
||||||
|
//// System.out.println(i + "/" + 10000);
|
||||||
|
//// }
|
||||||
|
|
||||||
// for (int i = 0; i < 10000; i++) {
|
return outputEncapsulationObject(PromptMessageEnum.SUCCESS, "(" + count + "/" + districtList.size() + ")", locale);
|
||||||
// firePointOrdinaryDao.updateProCityCode(i * 310L, (i + 1) * 310L);
|
|
||||||
// firePointOrdinaryDao.updateProCityName(i * 310L, (i + 1) * 310L);
|
|
||||||
// System.out.println(i + "/" + 10000);
|
|
||||||
// }
|
|
||||||
|
|
||||||
return outputEncapsulationObject(PromptMessageEnum.SUCCESS, "OKKKK", locale);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// private void handleDistrict(List<DistrictBean.DistrictsDTO> districtList) {
|
||||||
|
// if (districtList != null || districtList.size() > 0) {
|
||||||
|
// for (DistrictBean.DistrictsDTO districtItem : districtList) {
|
||||||
|
// DistrictEntity districtEntity = new DistrictEntity();
|
||||||
|
// districtEntity.setProName();
|
||||||
|
// districtEntity.setProCode();
|
||||||
|
// districtEntity.setCityName();
|
||||||
|
// districtEntity.setCityCode();
|
||||||
|
// districtEntity.setCountyName();
|
||||||
|
// districtEntity.setCountyCode();
|
||||||
|
// districtEntity.setStreetName();
|
||||||
|
// districtEntity.setStreetCode();
|
||||||
|
// districtEntity.setCenter();
|
||||||
|
// districtEntity.setLevel();
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
@GetMapping("/autoSync")
|
@GetMapping("/autoSync")
|
||||||
public String autoSync() {
|
public String autoSync() {
|
||||||
return fireSeasonConfigService.updateFireSeasonConfig();
|
return fireSeasonConfigService.updateFireSeasonConfig();
|
||||||
|
18
src/main/java/com/xkrs/dao/DistrictDao.java
Normal file
18
src/main/java/com/xkrs/dao/DistrictDao.java
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package com.xkrs.dao;
|
||||||
|
|
||||||
|
import com.xkrs.model.entity.DistrictEntity;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||||
|
import org.springframework.data.jpa.repository.Modifying;
|
||||||
|
import org.springframework.data.jpa.repository.Query;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public interface DistrictDao extends JpaRepository<DistrictEntity, Integer>, JpaSpecificationExecutor<DistrictEntity> {
|
||||||
|
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
@Modifying(clearAutomatically = true)
|
||||||
|
@Query(value = "UPDATE district SET street_code = ?2 WHERE id = ?1", nativeQuery = true)
|
||||||
|
void updateStreetCode(Integer id, String townCode);
|
||||||
|
}
|
102
src/main/java/com/xkrs/model/bean/DistrictBean.java
Normal file
102
src/main/java/com/xkrs/model/bean/DistrictBean.java
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
package com.xkrs.model.bean;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class DistrictBean {
|
||||||
|
|
||||||
|
@JsonProperty("status")
|
||||||
|
private String status;
|
||||||
|
@JsonProperty("info")
|
||||||
|
private String info;
|
||||||
|
@JsonProperty("infocode")
|
||||||
|
private String infocode;
|
||||||
|
@JsonProperty("districts")
|
||||||
|
private List<DistrictsDTO> districts;
|
||||||
|
|
||||||
|
public static class DistrictsDTO {
|
||||||
|
@JsonProperty("adcode")
|
||||||
|
private String adcode;
|
||||||
|
@JsonProperty("name")
|
||||||
|
private String name;
|
||||||
|
@JsonProperty("center")
|
||||||
|
private String center;
|
||||||
|
@JsonProperty("level")
|
||||||
|
private String level;
|
||||||
|
@JsonProperty("districts")
|
||||||
|
private List<DistrictsDTO> districts;
|
||||||
|
|
||||||
|
public String getAdcode() {
|
||||||
|
return adcode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAdcode(String adcode) {
|
||||||
|
this.adcode = adcode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCenter() {
|
||||||
|
return center;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCenter(String center) {
|
||||||
|
this.center = center;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLevel() {
|
||||||
|
return level;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLevel(String level) {
|
||||||
|
this.level = level;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<DistrictsDTO> getDistricts() {
|
||||||
|
return districts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDistricts(List<DistrictsDTO> districts) {
|
||||||
|
this.districts = districts;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(String status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getInfo() {
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInfo(String info) {
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getInfocode() {
|
||||||
|
return infocode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInfocode(String infocode) {
|
||||||
|
this.infocode = infocode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<DistrictsDTO> getDistricts() {
|
||||||
|
return districts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDistricts(List<DistrictsDTO> districts) {
|
||||||
|
this.districts = districts;
|
||||||
|
}
|
||||||
|
}
|
168
src/main/java/com/xkrs/model/entity/DistrictEntity.java
Normal file
168
src/main/java/com/xkrs/model/entity/DistrictEntity.java
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
package com.xkrs.model.entity;
|
||||||
|
|
||||||
|
import javax.persistence.*;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "district")
|
||||||
|
public class DistrictEntity implements Serializable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键id
|
||||||
|
*/
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "district_seq_gen")
|
||||||
|
@SequenceGenerator(name = "district_seq_gen", sequenceName = "district_id_seq", allocationSize = 1)
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 省名称
|
||||||
|
*/
|
||||||
|
@Column(length = 65, columnDefinition = "varchar(65)")
|
||||||
|
private String proName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 省编码
|
||||||
|
*/
|
||||||
|
@Column(length = 65, columnDefinition = "varchar(65)")
|
||||||
|
private String proCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 市名称
|
||||||
|
*/
|
||||||
|
@Column(length = 65, columnDefinition = "varchar(65)")
|
||||||
|
private String cityName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 市编码
|
||||||
|
*/
|
||||||
|
@Column(length = 65, columnDefinition = "varchar(65)")
|
||||||
|
private String cityCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 区县名称
|
||||||
|
*/
|
||||||
|
@Column(length = 65, columnDefinition = "varchar(65)")
|
||||||
|
private String countyName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 区县编码
|
||||||
|
*/
|
||||||
|
@Column(length = 65, columnDefinition = "varchar(65)")
|
||||||
|
private String countyCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 街道名称
|
||||||
|
*/
|
||||||
|
@Column(length = 65, columnDefinition = "varchar(65)")
|
||||||
|
private String streetName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 街道编码
|
||||||
|
*/
|
||||||
|
@Column(length = 65, columnDefinition = "varchar(65)")
|
||||||
|
private String streetCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 中心点
|
||||||
|
*/
|
||||||
|
@Column(length = 65, columnDefinition = "varchar(65)")
|
||||||
|
private String center;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 等级
|
||||||
|
*/
|
||||||
|
@Column(length = 65, columnDefinition = "varchar(65)")
|
||||||
|
private String level;
|
||||||
|
|
||||||
|
public DistrictEntity() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProName() {
|
||||||
|
return proName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProName(String proName) {
|
||||||
|
this.proName = proName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProCode() {
|
||||||
|
return proCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProCode(String proCode) {
|
||||||
|
this.proCode = proCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCityName() {
|
||||||
|
return cityName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCityName(String cityName) {
|
||||||
|
this.cityName = cityName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCityCode() {
|
||||||
|
return cityCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCityCode(String cityCode) {
|
||||||
|
this.cityCode = cityCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCountyName() {
|
||||||
|
return countyName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCountyName(String countyName) {
|
||||||
|
this.countyName = countyName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCountyCode() {
|
||||||
|
return countyCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCountyCode(String countyCode) {
|
||||||
|
this.countyCode = countyCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStreetName() {
|
||||||
|
return streetName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStreetName(String streetName) {
|
||||||
|
this.streetName = streetName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStreetCode() {
|
||||||
|
return streetCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStreetCode(String streetCode) {
|
||||||
|
this.streetCode = streetCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCenter() {
|
||||||
|
return center;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCenter(String center) {
|
||||||
|
this.center = center;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLevel() {
|
||||||
|
return level;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLevel(String level) {
|
||||||
|
this.level = level;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user