Browse Source

添加分布式锁

dev
jianjun 3 years ago
parent
commit
c7b8e07ce3
  1. 12
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java
  2. 339
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java

12
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java

@ -778,6 +778,18 @@ public class RedisKeys {
return rootPrefix.concat("lock:").concat(methodName);
}
/**
* desc:获取分布式锁key
* @param customerId
* @return
*/
public static String getXiaoquEditLock(String customerId) {
if (StringUtils.isBlank(customerId)){
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(),"参数错误");
}
return rootPrefix.concat("lock:xiaoquedit").concat(customerId);
}
/**
* desc:获取更新 房屋内有居民数量的key
* @param customerId

339
epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java

@ -26,6 +26,7 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.epmet.bean.ResiExportBaseInfoData;
import com.epmet.commons.mybatis.service.impl.BaseServiceImpl;
import com.epmet.commons.tools.constant.*;
import com.epmet.commons.tools.distributedlock.DistributedLock;
import com.epmet.commons.tools.dto.form.DictListFormDTO;
import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult;
import com.epmet.commons.tools.dto.result.DictListResultDTO;
@ -78,6 +79,7 @@ import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.compress.utils.Lists;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@ -153,6 +155,8 @@ public class IcResiUserServiceImpl extends BaseServiceImpl<IcResiUserDao, IcResi
private UserBaseInfoDao userBaseInfoDao;
@Autowired
private EpmetUserOpenFeignClient epmetUserOpenFeignClient;
@Autowired
private DistributedLock distributedLock;
@ -467,195 +471,201 @@ public class IcResiUserServiceImpl extends BaseServiceImpl<IcResiUserDao, IcResi
@Override
@Transactional(rollbackFor = Exception.class)
public String edit(TokenDto tokenDto, List<IcResiUserFormDTO> formDTO) {
//1.校验主表数据是否存在
String resiUserId = "";
LinkedHashMap<String, String> map = new LinkedHashMap<>();
com.epmet.resi.partymember.dto.partymember.IcPartyMemberDTO partyMemberDTO = new com.epmet.resi.partymember.dto.partymember.IcPartyMemberDTO();
Map<String, List<LinkedHashMap<String, String>>> formMap = formDTO.stream().collect(Collectors.toMap(IcResiUserFormDTO::getTableName, IcResiUserFormDTO::getList));
boolean isDyzxh = false;
//判断是否是党员中心户
if (formMap.containsKey("ic_party_member")) {
for (LinkedHashMap<String, String> hash : formMap.get("ic_party_member")) {
if (NumConstant.ONE_STR.equals(hash.get("IS_DYZXH"))) {
isDyzxh = true;
RLock lock = null;
try {
lock = distributedLock.getLock(RedisKeys.getXiaoquEditLock(tokenDto.getCustomerId()), 120L, 3L,TimeUnit.SECONDS);
//1.校验主表数据是否存在
String resiUserId = "";
LinkedHashMap<String, String> map = new LinkedHashMap<>();
com.epmet.resi.partymember.dto.partymember.IcPartyMemberDTO partyMemberDTO = new com.epmet.resi.partymember.dto.partymember.IcPartyMemberDTO();
Map<String, List<LinkedHashMap<String, String>>> formMap = formDTO.stream().collect(Collectors.toMap(IcResiUserFormDTO::getTableName, IcResiUserFormDTO::getList));
boolean isDyzxh = false;
//判断是否是党员中心户
if (formMap.containsKey("ic_party_member")) {
for (LinkedHashMap<String, String> hash : formMap.get("ic_party_member")) {
if (NumConstant.ONE_STR.equals(hash.get("IS_DYZXH"))) {
isDyzxh = true;
}
}
}
}
for (IcResiUserFormDTO d : formDTO) {
if ("ic_resi_user".equals(d.getTableName())) {
map = d.getList().get(0);
if (!map.containsKey("ID")) {
throw new RenException(String.format("居民信息修改-居民信息表主键值为空"));
}
//2021.11.25 新增需求 客户下身份证号唯一 start
if (map.containsKey("ID_CARD")) {
LambdaQueryWrapper<IcResiUserEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(IcResiUserEntity::getCustomerId, tokenDto.getCustomerId());
wrapper.eq(IcResiUserEntity::getIdCard, map.get("ID_CARD"));
wrapper.ne(IcResiUserEntity::getId, map.get("ID"));
List<IcResiUserEntity> entityList = baseDao.selectList(wrapper);
if (CollectionUtils.isNotEmpty(entityList)) {
String errorMsg = "修改居民信息失败,身份证号已存在!";
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), errorMsg, errorMsg);
for (IcResiUserFormDTO d : formDTO) {
if ("ic_resi_user".equals(d.getTableName())) {
map = d.getList().get(0);
if (!map.containsKey("ID")) {
throw new RenException(String.format("居民信息修改-居民信息表主键值为空"));
}
}
//2021.11.25 end
//2022.04.19 start 这个房屋下已经设置了户主后,再次选择户主时提示提示“房屋下已存在户主” PS.户主指与户主关系是本人的用户
if (map.containsKey("YHZGX") && RelationshipEnum.SELF.getCode().equals(map.get("YHZGX"))) {
IcResiUserEntity entity = baseDao.selectById(map.get("ID"));
if (entity != null && !RelationshipEnum.SELF.getCode().equals(entity.getYhzgx())) {
//2021.11.25 新增需求 客户下身份证号唯一 start
if (map.containsKey("ID_CARD")) {
LambdaQueryWrapper<IcResiUserEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(IcResiUserEntity::getHomeId, entity.getHomeId());
wrapper.eq(IcResiUserEntity::getYhzgx, RelationshipEnum.SELF.getCode());
wrapper.eq(IcResiUserEntity::getCustomerId, tokenDto.getCustomerId());
wrapper.eq(IcResiUserEntity::getIdCard, map.get("ID_CARD"));
wrapper.ne(IcResiUserEntity::getId, map.get("ID"));
List<IcResiUserEntity> entityList = baseDao.selectList(wrapper);
if (CollectionUtils.isNotEmpty(entityList)) {
String errorMsg = "房屋下已存在户主";
throw new EpmetException(EpmetErrorCode.ORG_ADD_FAILED.getCode(), errorMsg, errorMsg);
String errorMsg = "修改居民信息失败,身份证号已存在!";
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), errorMsg, errorMsg);
}
}
}
//2022.04.19 end
resiUserId = map.get("ID");
//2022.05.18 start zhaoqf 党员信息同步
IcResiUserEntity icResiUser = baseDao.selectById(resiUserId);
if ((map.containsKey("IS_PARTY") && NumConstant.ONE_STR.equals(map.get("IS_PARTY")))) {
if (formMap.containsKey("ic_party_member")) {
for (LinkedHashMap<String, String> hash : formMap.get("ic_party_member")) {
if (!hash.containsKey("ID") && !hash.containsKey("SSZB")) {
String errorMsg = "党员信息所属支部不能为空";
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), errorMsg, errorMsg);
//2021.11.25 end
//2022.04.19 start 这个房屋下已经设置了户主后,再次选择户主时提示提示“房屋下已存在户主” PS.户主指与户主关系是本人的用户
if (map.containsKey("YHZGX") && RelationshipEnum.SELF.getCode().equals(map.get("YHZGX"))) {
IcResiUserEntity entity = baseDao.selectById(map.get("ID"));
if (entity != null && !RelationshipEnum.SELF.getCode().equals(entity.getYhzgx())) {
LambdaQueryWrapper<IcResiUserEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(IcResiUserEntity::getHomeId, entity.getHomeId());
wrapper.eq(IcResiUserEntity::getYhzgx, RelationshipEnum.SELF.getCode());
List<IcResiUserEntity> entityList = baseDao.selectList(wrapper);
if (CollectionUtils.isNotEmpty(entityList)) {
String errorMsg = "房屋下已存在户主";
throw new EpmetException(EpmetErrorCode.ORG_ADD_FAILED.getCode(), errorMsg, errorMsg);
}
}
} else {
String errorMsg = "党员信息所属支部不能为空";
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), errorMsg, errorMsg);
}
}
if ((map.containsKey("IS_PARTY") && NumConstant.ONE_STR.equals(map.get("IS_PARTY")))
|| (!map.containsKey("IS_PARTY") && NumConstant.ONE_STR.equals(icResiUser.getIsParty()))) {
partyMemberDTO.setCustomerId(tokenDto.getCustomerId());
partyMemberDTO.setAgencyId(icResiUser.getAgencyId());
partyMemberDTO.setAgencyPids(icResiUser.getPids());
partyMemberDTO.setIcResiUser(resiUserId);
if (map.containsKey("NAME")) {
partyMemberDTO.setName(map.get("NAME"));
} else {
partyMemberDTO.setName(icResiUser.getName());
}
if (map.containsKey("ID_CARD")) {
partyMemberDTO.setIdCard(map.get("ID_CARD"));
} else {
partyMemberDTO.setIdCard(icResiUser.getIdCard());
}
if (map.containsKey("MOBILE")) {
partyMemberDTO.setMobile(map.get("MOBILE"));
} else {
partyMemberDTO.setMobile(icResiUser.getMobile());
}
//查询网格信息
String gridId = null;
if (map.containsKey("GRID_ID")) {
gridId = map.get("GRID_ID");
} else {
gridId = icResiUser.getGridId();
}
GridInfoCache gridInfo = CustomerOrgRedis.getGridInfo(gridId);
//查询房屋信息
String houseId = null;
if (map.containsKey("HOME_ID")) {
houseId = map.get("HOME_ID");
} else {
houseId = icResiUser.getHomeId();
//2022.04.19 end
resiUserId = map.get("ID");
//2022.05.18 start zhaoqf 党员信息同步
IcResiUserEntity icResiUser = baseDao.selectById(resiUserId);
if ((map.containsKey("IS_PARTY") && NumConstant.ONE_STR.equals(map.get("IS_PARTY")))) {
if (formMap.containsKey("ic_party_member")) {
for (LinkedHashMap<String, String> hash : formMap.get("ic_party_member")) {
if (!hash.containsKey("ID") && !hash.containsKey("SSZB")) {
String errorMsg = "党员信息所属支部不能为空";
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), errorMsg, errorMsg);
}
}
} else {
String errorMsg = "党员信息所属支部不能为空";
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), errorMsg, errorMsg);
}
}
HouseInfoCache houseInfo = CustomerIcHouseRedis.getHouseInfo(tokenDto.getCustomerId(), houseId);
if (null != gridInfo && null != houseInfo) {
String address;
if (StringUtils.isNotBlank(gridInfo.getAllParentName())) {
address = gridInfo.getAllParentName().concat(StrConstant.HYPHEN).concat(gridInfo.getGridNamePath())
.concat(StrConstant.HYPHEN).concat(houseInfo.getNeighborHoodName())
.concat(StrConstant.HYPHEN).concat(houseInfo.getHouseName());
if ((map.containsKey("IS_PARTY") && NumConstant.ONE_STR.equals(map.get("IS_PARTY")))
|| (!map.containsKey("IS_PARTY") && NumConstant.ONE_STR.equals(icResiUser.getIsParty()))) {
partyMemberDTO.setCustomerId(tokenDto.getCustomerId());
partyMemberDTO.setAgencyId(icResiUser.getAgencyId());
partyMemberDTO.setAgencyPids(icResiUser.getPids());
partyMemberDTO.setIcResiUser(resiUserId);
if (map.containsKey("NAME")) {
partyMemberDTO.setName(map.get("NAME"));
} else {
partyMemberDTO.setName(icResiUser.getName());
}
if (map.containsKey("ID_CARD")) {
partyMemberDTO.setIdCard(map.get("ID_CARD"));
} else {
address = gridInfo.getGridNamePath()
.concat(StrConstant.HYPHEN).concat(houseInfo.getNeighborHoodName())
.concat(StrConstant.HYPHEN).concat(houseInfo.getHouseName());
partyMemberDTO.setIdCard(icResiUser.getIdCard());
}
if (map.containsKey("MOBILE")) {
partyMemberDTO.setMobile(map.get("MOBILE"));
} else {
partyMemberDTO.setMobile(icResiUser.getMobile());
}
//查询网格信息
String gridId = null;
if (map.containsKey("GRID_ID")) {
gridId = map.get("GRID_ID");
} else {
gridId = icResiUser.getGridId();
}
GridInfoCache gridInfo = CustomerOrgRedis.getGridInfo(gridId);
//查询房屋信息
String houseId = null;
if (map.containsKey("HOME_ID")) {
houseId = map.get("HOME_ID");
} else {
houseId = icResiUser.getHomeId();
}
HouseInfoCache houseInfo = CustomerIcHouseRedis.getHouseInfo(tokenDto.getCustomerId(), houseId);
if (null != gridInfo && null != houseInfo) {
String address;
if (StringUtils.isNotBlank(gridInfo.getAllParentName())) {
address = gridInfo.getAllParentName().concat(StrConstant.HYPHEN).concat(gridInfo.getGridNamePath())
.concat(StrConstant.HYPHEN).concat(houseInfo.getNeighborHoodName())
.concat(StrConstant.HYPHEN).concat(houseInfo.getHouseName());
} else {
address = gridInfo.getGridNamePath()
.concat(StrConstant.HYPHEN).concat(houseInfo.getNeighborHoodName())
.concat(StrConstant.HYPHEN).concat(houseInfo.getHouseName());
}
partyMemberDTO.setAddress(address);
}
partyMemberDTO.setAddress(address);
}
//2022.05.18 end zhaoqf
}
//2022.05.18 end zhaoqf
}
}
if (null == map) {
throw new RenException(String.format("居民信息修改,参数错误,未传入基础信息Id"));
}
IcResiUserEntity entity = baseDao.selectById(resiUserId);
if (null == entity) {
throw new RenException(String.format("居民信息修改,获取基础信息失败,基础信息Id->", resiUserId));
}
//2022-1-18 信息修改判断基础信息表人员网格、小区、楼栋、单元、房屋维度数据以及十八类的类别数据是否变化,相应生成变更记录和变更明细数据 sun start
icUserChangeRecord(tokenDto, entity, map);
//2022-1-18 sun end
//2.更新主表数据
if (map.size() > NumConstant.ONE) {
if (isDyzxh) {
map.put("IS_VOLUNTEER", NumConstant.ONE_STR);
if (null == map) {
throw new RenException(String.format("居民信息修改,参数错误,未传入基础信息Id"));
}
map.put("updated_by", tokenDto.getUserId());
baseDao.upTable("ic_resi_user", resiUserId, map);
}
//3.循环更新或新增字表数据
String finalResiUserId = resiUserId;
//存放子表的表名,用于删除字表数据时使用,比如未来可能会存在子表多条数据的情况,那样的只能删一次,不然第二条保存时又把第一条删了
Map<String, String> tableMap = new HashMap<>();
formDTO.forEach(d -> {
if (!"ic_resi_user".equals(d.getTableName())) {
for (LinkedHashMap<String, String> hash : d.getList()) {
hash.put("updated_by", tokenDto.getUserId());
if (!hash.containsKey("ID")) {
hash.put("id", UUID.randomUUID().toString().replaceAll("-", ""));
hash.put("ic_resi_user", finalResiUserId);
hash.put("customer_id", tokenDto.getCustomerId());
hash.put("created_by", tokenDto.getUserId());
//2022.5.31 bug修改【举例党员类别新增选是,修改为否,在修改为是时,此时字表id没值,实际有脏数据,导致字表新数据进不去】
if (!"ic_resi_demand".equals(d.getTableName()) && !tableMap.containsKey(d.getTableName())) {
baseDao.del(d.getTableName(), finalResiUserId);
tableMap.put(d.getTableName(), d.getTableName());
IcResiUserEntity entity = baseDao.selectById(resiUserId);
if (null == entity) {
throw new RenException(String.format("居民信息修改,获取基础信息失败,基础信息Id->", resiUserId));
}
//2022-1-18 信息修改判断基础信息表人员网格、小区、楼栋、单元、房屋维度数据以及十八类的类别数据是否变化,相应生成变更记录和变更明细数据 sun start
icUserChangeRecord(tokenDto, entity, map);
//2022-1-18 sun end
//2.更新主表数据
if (map.size() > NumConstant.ONE) {
if (isDyzxh) {
map.put("IS_VOLUNTEER", NumConstant.ONE_STR);
}
map.put("updated_by", tokenDto.getUserId());
baseDao.upTable("ic_resi_user", resiUserId, map);
}
//3.循环更新或新增字表数据
String finalResiUserId = resiUserId;
//存放子表的表名,用于删除字表数据时使用,比如未来可能会存在子表多条数据的情况,那样的只能删一次,不然第二条保存时又把第一条删了
Map<String, String> tableMap = new HashMap<>();
formDTO.forEach(d -> {
if (!"ic_resi_user".equals(d.getTableName())) {
for (LinkedHashMap<String, String> hash : d.getList()) {
hash.put("updated_by", tokenDto.getUserId());
if (!hash.containsKey("ID")) {
hash.put("id", UUID.randomUUID().toString().replaceAll("-", ""));
hash.put("ic_resi_user", finalResiUserId);
hash.put("customer_id", tokenDto.getCustomerId());
hash.put("created_by", tokenDto.getUserId());
//2022.5.31 bug修改【举例党员类别新增选是,修改为否,在修改为是时,此时字表id没值,实际有脏数据,导致字表新数据进不去】
if (!"ic_resi_demand".equals(d.getTableName()) && !tableMap.containsKey(d.getTableName())) {
baseDao.del(d.getTableName(), finalResiUserId);
tableMap.put(d.getTableName(), d.getTableName());
}
//字表新增数据
baseDao.add(d.getTableName(), hash);
} else {
//字表更新数据
baseDao.upTable(d.getTableName(), hash.get("ID"), hash);
}
//字表新增数据
baseDao.add(d.getTableName(), hash);
} else {
//字表更新数据
baseDao.upTable(d.getTableName(), hash.get("ID"), hash);
}
}
}
//2022.05.18 start zhaoqf 党员信息同步
if ("ic_party_member".equals(d.getTableName())) {
for (LinkedHashMap<String, String> hash : d.getList()) {
partyMemberDTO.setRdsj(hash.get("RDSJ"));
partyMemberDTO.setSszb(hash.get("SSZB"));
partyMemberDTO.setIsLd(hash.get("IS_LD"));
partyMemberDTO.setLdzh(hash.get("LDZH"));
partyMemberDTO.setPartyZw(hash.get("PARTY_ZW"));
partyMemberDTO.setIsTx(hash.get("IS_TX"));
partyMemberDTO.setIsDyzxh(hash.get("IS_DYZXH"));
//2022.05.18 start zhaoqf 党员信息同步
if ("ic_party_member".equals(d.getTableName())) {
for (LinkedHashMap<String, String> hash : d.getList()) {
partyMemberDTO.setRdsj(hash.get("RDSJ"));
partyMemberDTO.setSszb(hash.get("SSZB"));
partyMemberDTO.setIsLd(hash.get("IS_LD"));
partyMemberDTO.setLdzh(hash.get("LDZH"));
partyMemberDTO.setPartyZw(hash.get("PARTY_ZW"));
partyMemberDTO.setIsTx(hash.get("IS_TX"));
partyMemberDTO.setIsDyzxh(hash.get("IS_DYZXH"));
}
}
}
if ("ic_volunteer".equals(d.getTableName())) {
for (LinkedHashMap<String, String> hash : d.getList()) {
partyMemberDTO.setVolunteerCategory(hash.get("VOLUNTEER_CATEGORY"));
if ("ic_volunteer".equals(d.getTableName())) {
for (LinkedHashMap<String, String> hash : d.getList()) {
partyMemberDTO.setVolunteerCategory(hash.get("VOLUNTEER_CATEGORY"));
}
}
//2022.05.18 end zhaoqf
});
if (StringUtils.isNotBlank(partyMemberDTO.getIcResiUser())) {
Result syncResult = resiPartyMemberOpenFeignClient.icPartyMemberSync(partyMemberDTO);
if (!syncResult.success()) {
log.error("同步党员信息失败");
}
}
//2022.05.18 end zhaoqf
});
if (StringUtils.isNotBlank(partyMemberDTO.getIcResiUser())) {
Result syncResult = resiPartyMemberOpenFeignClient.icPartyMemberSync(partyMemberDTO);
if (!syncResult.success()) {
log.error("同步党员信息失败");
}
return resiUserId;
} finally {
distributedLock.unlock(lock);
}
return resiUserId;
}
/**
@ -2209,7 +2219,6 @@ public class IcResiUserServiceImpl extends BaseServiceImpl<IcResiUserDao, IcResi
return listPage.getResult();
}
@Transactional(rollbackFor = Exception.class)
@Override
public List<String> changeIcResiUserBelongTo(TokenDto tokenDto, IcUserBelongToChangedFormDTO formDTO) {
List<String> resiUserIdList = baseDao.listUserIds(formDTO.getCustomerId(), formDTO.getSourceGridId());

Loading…
Cancel
Save