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

Loading…
Cancel
Save