diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java index b9795ef8dc..99dca942df 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java +++ b/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 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java index 6fc096dfd4..a2a67103c3 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java +++ b/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 formDTO) { - //1.校验主表数据是否存在 - String resiUserId = ""; - LinkedHashMap map = new LinkedHashMap<>(); - com.epmet.resi.partymember.dto.partymember.IcPartyMemberDTO partyMemberDTO = new com.epmet.resi.partymember.dto.partymember.IcPartyMemberDTO(); - Map>> formMap = formDTO.stream().collect(Collectors.toMap(IcResiUserFormDTO::getTableName, IcResiUserFormDTO::getList)); - boolean isDyzxh = false; - //判断是否是党员中心户 - if (formMap.containsKey("ic_party_member")) { - for (LinkedHashMap 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 map = new LinkedHashMap<>(); + com.epmet.resi.partymember.dto.partymember.IcPartyMemberDTO partyMemberDTO = new com.epmet.resi.partymember.dto.partymember.IcPartyMemberDTO(); + Map>> formMap = formDTO.stream().collect(Collectors.toMap(IcResiUserFormDTO::getTableName, IcResiUserFormDTO::getList)); + boolean isDyzxh = false; + //判断是否是党员中心户 + if (formMap.containsKey("ic_party_member")) { + for (LinkedHashMap 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 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 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 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 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 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 wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(IcResiUserEntity::getHomeId, entity.getHomeId()); + wrapper.eq(IcResiUserEntity::getYhzgx, RelationshipEnum.SELF.getCode()); + List 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 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 tableMap = new HashMap<>(); - formDTO.forEach(d -> { - if (!"ic_resi_user".equals(d.getTableName())) { - for (LinkedHashMap 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 tableMap = new HashMap<>(); + formDTO.forEach(d -> { + if (!"ic_resi_user".equals(d.getTableName())) { + for (LinkedHashMap 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 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 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 hash : d.getList()) { - partyMemberDTO.setVolunteerCategory(hash.get("VOLUNTEER_CATEGORY")); + if ("ic_volunteer".equals(d.getTableName())) { + for (LinkedHashMap 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 changeIcResiUserBelongTo(TokenDto tokenDto, IcUserBelongToChangedFormDTO formDTO) { List resiUserIdList = baseDao.listUserIds(formDTO.getCustomerId(), formDTO.getSourceGridId());