企业同步

This commit is contained in:
zhangchenbiao
2023-06-05 11:34:44 +08:00
parent 09f651ed0d
commit 0576ed223a
77 changed files with 3365 additions and 149 deletions

View File

@@ -1,8 +1,15 @@
package com.cool.store.config.redis;
import com.cool.store.utils.RedisUtilPool;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
@@ -38,4 +45,29 @@ public class RedisUtilConfig {
redisUtil.setShardedJedisPool(new ShardedJedisPool(jedisPoolConfig, shards));
return redisUtil;
}
/**
* 模板序列化
* @Description 模板序列化
* @param redisConnectionFactory
* @return RedisTemplate
* @throws Exception
*/
@Bean(name = "customizeTemplate")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
Jackson2JsonRedisSerializer jacksonSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jacksonSerializer.setObjectMapper(objectMapper);
// 创建并配置自定义 RedisTemplateRedisOperator
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setValueSerializer(jacksonSerializer);
template.setHashValueSerializer(jacksonSerializer);
template.afterPropertiesSet();
return template;
}
}

View File

@@ -7,12 +7,17 @@ import com.cool.store.dto.enterprise.EnterpriseUserDTO;
import com.cool.store.dto.enterprise.SysDepartmentDTO;
import com.cool.store.dto.login.UserIdInfoDTO;
import com.cool.store.dto.response.ResultDTO;
import com.cool.store.entity.EnterpriseUserDO;
import com.cool.store.request.EnterpriseUserRequest;
import com.cool.store.utils.RestTemplateUtil;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
@@ -178,4 +183,49 @@ public class ISVHttpRequest {
}
return null;
}
public List<SysDepartmentDTO> getSubDepartments(String corpId, String appType, String parentId, Boolean fetchChild) {
String url = isvDomain + "/isv/corp/getSubDepartments";
HashMap requestMap = new HashMap();
requestMap.put("corpId", corpId);
requestMap.put("appType", appType);
requestMap.put("parentId", parentId);
requestMap.put("fetchChild", fetchChild);
ResponseEntity<ResultDTO> responseEntity = null;
try {
responseEntity = RestTemplateUtil.get(url, ResultDTO.class, requestMap);
log.info("url:{}, response:{}", url, JSONObject.toJSONString(responseEntity));
if(Objects.nonNull(responseEntity.getBody()) && responseEntity.getBody().isSuccess()){
return JSONObject.parseArray(JSONObject.toJSONString(responseEntity.getBody().getData()), SysDepartmentDTO.class);
}
} catch (Exception e) {
log.info("调用isv出错{}", e);
}
return null;
}
public List<EnterpriseUserRequest> getDeptUsers(String corpId, String deptId, String appType) {
List<EnterpriseUserDTO> departmentUsers = getDepartmentUsers(corpId, deptId, appType);
if (CollectionUtils.isEmpty(departmentUsers)){
return Lists.newArrayList();
}
List<EnterpriseUserRequest> userList = Lists.newArrayList();
for (EnterpriseUserDTO enterpriseUserDTO:departmentUsers) {
EnterpriseUserDO enterpriseUser = new EnterpriseUserDO();
enterpriseUser.setCreateTime(new Date());
enterpriseUser.setIsAdmin(false);
enterpriseUser.setRemark(enterpriseUserDTO.getRemark());
enterpriseUser.setUserId(enterpriseUserDTO.getUserId());
if (enterpriseUserDTO.getIsLeaderInDepts() != null) {
enterpriseUser.setIsLeaderInDepts(JSONObject.toJSONString(enterpriseUserDTO.getIsLeaderInDepts()));
}
EnterpriseUserRequest enterpriseUserRequest = new EnterpriseUserRequest();
enterpriseUserRequest.setEnterpriseUserDO(enterpriseUser);
if (CollectionUtils.isNotEmpty(enterpriseUserDTO.getDepartmentLists())) {
enterpriseUserRequest.setDepartment(JSONObject.toJSONString(enterpriseUserDTO.getDepartmentLists()));
}
userList.add(enterpriseUserRequest);
}
return userList;
}
}

View File

@@ -19,4 +19,6 @@ public interface EnterpriseInitService {
void enterpriseInit(String cropId, AppTypeEnum appType, String eid, String dbName, String openUserId);
void sendOpenSucceededMsg(String corpId, String appType, List<String> userList);
void sync(String eid, String userName, String userId, Long regionId);
}

View File

@@ -3,6 +3,7 @@ package com.cool.store.service;
import com.cool.store.dto.buser.SubordinateUserRangeDTO;
import com.cool.store.dto.enterprise.EnterpriseUserDTO;
import com.cool.store.entity.EnterpriseUserDO;
import com.cool.store.request.EnterpriseUserRequest;
import com.cool.store.vo.buser.EnterpriseUserPageVO;
import java.util.List;
@@ -34,4 +35,13 @@ public interface EnterpriseUserService {
*/
Map<String, String> getUserRegion(String enterpriseId, List<String> userIdList);
/**
* 更新用户的部门全路径
* @param user
* @param deptIdMap
*/
void updateUserDeptPath(EnterpriseUserRequest user, Map<String, String> deptIdMap);
EnterpriseUserDO selectByUserIdIgnoreActive(String enterpriseId, String userId);
}

View File

@@ -0,0 +1,21 @@
package com.cool.store.service;
import com.cool.store.entity.RegionDO;
import java.util.List;
/**
* @author zhangchenbiao
* @FileName: RegionService
* @Description:
* @date 2023-06-05 10:43
*/
public interface RegionService {
void saveRegionAndStore(String eid, RegionDO regionDO, String userId);
void removeRegions(String eid, List<Long> regionIds);
void deleteByStoreIds(String enterpriseId, List<String> storeIds, String userId);
}

View File

@@ -14,11 +14,13 @@ import com.cool.store.dto.usergroup.UserGroupDTO;
import com.cool.store.entity.*;
import com.cool.store.enums.SubordinateSourceEnum;
import com.cool.store.enums.UserSelectRangeEnum;
import com.cool.store.request.EnterpriseUserRequest;
import com.cool.store.service.AuthVisualService;
import com.cool.store.service.EnterpriseUserGroupService;
import com.cool.store.service.EnterpriseUserService;
import com.cool.store.vo.buser.EnterpriseUserPageVO;
import com.github.pagehelper.PageHelper;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
@@ -367,4 +369,33 @@ public class EnterpriseUserServiceImpl implements EnterpriseUserService {
});
return resultMap;
}
@Override
public void updateUserDeptPath(EnterpriseUserRequest user, Map<String, String> deptIdMap) {
List<String> departmentLists = user.getDepartmentLists();
//logger.info("设置用户部门全路径 start department:{},user:{},id:{}",department,user.getUnionid(),user.getId());
if (CollectionUtils.isNotEmpty(departmentLists)) {
//logger.info("into if else department ");
List<String> deptList = Lists.newArrayList();
departmentLists.forEach(deptId -> {
List<String> tmpList = Lists.newArrayList(deptId);
String parentId;
while ((parentId = deptIdMap.get(deptId)) != null && (!parentId.equals(deptId))) {
tmpList.add(parentId);
deptId = parentId;
}
String collect = Lists.reverse(tmpList).stream().map(String::valueOf).collect(Collectors.joining("/"));
String data = collect.startsWith("/") ? collect : "/" + collect;
data = data.endsWith("/") ? data : data + "/";
deptList.add(data);
});
user.setDepartments("[" + String.join(",", deptList) + "]");
user.getEnterpriseUserDO().setDepartments("[" + String.join(",", deptList) + "]");
}
}
@Override
public EnterpriseUserDO selectByUserIdIgnoreActive(String enterpriseId, String userId) {
return enterpriseUserDAO.selectByUserIdIgnoreActive(enterpriseId, userId);
}
}

View File

@@ -0,0 +1,151 @@
package com.cool.store.service.impl;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.cool.store.dao.RegionDAO;
import com.cool.store.dao.StoreDAO;
import com.cool.store.dao.UserAuthMappingDAO;
import com.cool.store.dto.region.RegionStoreNumMsgDTO;
import com.cool.store.entity.RegionDO;
import com.cool.store.entity.StoreDO;
import com.cool.store.enums.RegionTypeEnum;
import com.cool.store.enums.RocketMqTagEnum;
import com.cool.store.enums.StoreIsDeleteEnum;
import com.cool.store.enums.UserAuthMappingTypeEnum;
import com.cool.store.mq.producer.SimpleMessageService;
import com.cool.store.service.RegionService;
import com.cool.store.utils.RedisConstantUtil;
import com.cool.store.utils.RedisUtil;
import com.cool.store.utils.UUIDUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.ListUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Calendar;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author zhangchenbiao
* @FileName: RegionServiceImpl
* @Description:
* @date 2023-06-05 10:43
*/
@Service
public class RegionServiceImpl implements RegionService {
@Resource
private RedisUtil redisUtil;
@Resource
private RedisConstantUtil redisConstantUtil;
@Resource
private StoreDAO storeDAO;
@Resource
private RegionDAO regionDAO;
@Resource
private UserAuthMappingDAO userAuthMappingDAO;
@Resource
private SimpleMessageService simpleMessageService;
@Transactional(rollbackFor = Exception.class)
@Override
public void saveRegionAndStore(String eid, RegionDO regionDO, String userId) {
String storeKey = redisConstantUtil.getSyncStoreKey(eid);
String storeId = null;
if(regionDO.getStoreRange()){
StoreDO storeDO = storeDAO.getStoreBySynId(eid, regionDO.getSynDingDeptId());
if(storeDO != null && StringUtils.isNotBlank(storeDO.getStoreId())){
storeId = storeDO.getStoreId();
}else {
storeId = UUIDUtils.get32UUID();
}
}
regionDO.setStoreId(storeId);
regionDO.setRegionType(RegionTypeEnum.PATH.getType());
RegionDO oldRegion = regionDAO.getBySynDingDeptId(eid, regionDO.getSynDingDeptId());
boolean isAdd = oldRegion == null;
if (isAdd) {
if(regionDO.getStoreRange()){
regionDO.setStoreId(storeId);
regionDO.setRegionType(RegionTypeEnum.STORE.getType());
}
regionDAO.ignoreInsert(eid, regionDO);
} else {
if(regionDO.getStoreRange()){
regionDO.setRegionType(RegionTypeEnum.STORE.getType());
}
regionDAO.updateSyncRegion(eid, regionDO);
}
if (regionDO.getStoreRange()) {
StoreDO store = new StoreDO();
store.setStoreName(regionDO.getName());
store.setRegionPath(regionDO.getFullRegionPath());
store.setIsDelete(StoreIsDeleteEnum.EFFECTIVE.getValue());
store.setRegionId(Long.valueOf(regionDO.getParentId()));
store.setSource("sync");
store.setStoreAddress(regionDO.getAddress());
store.setLocationAddress(regionDO.getAddress());
store.setStoreNum(regionDO.getStoreCode());
store.setLatitude(regionDO.getLatitude());
store.setLongitude(regionDO.getLongitude());
store.setStoreId(storeId);
String id = redisUtil.hashGetString(storeKey, regionDO.getSynDingDeptId());
if (StringUtils.isNotBlank(id)) {
store.setId(Long.valueOf(id));
//删除对应的已有redis key缓存
redisUtil.delete(storeKey, regionDO.getSynDingDeptId());
store.setUpdateName(userId);
store.setUpdateTime(System.currentTimeMillis());
storeDAO.updateStore(eid, store);
} else {
store.setIsLock("not_locked");
store.setStoreStatus("open");
store.setSynDingDeptId(regionDO.getSynDingDeptId());
store.setCreateName(userId);
store.setCreateTime(System.currentTimeMillis());
storeDAO.insertStore(eid, store);
}
}
}
@Override
public void removeRegions(String eid, List<Long> regionIds) {
regionDAO.removeRegion(eid, regionIds);
}
@Override
public void deleteByStoreIds(String enterpriseId, List<String> storeIds, String userId) {
//获取门店基本信息
List<StoreDO> storeList = storeDAO.getStoreListByStoreIds(enterpriseId, storeIds);
if (CollectionUtils.isEmpty(storeList)) {
return;
}
// 删除门店绑定的权限
userAuthMappingDAO.deleteAuthMappingByIdAndType(enterpriseId, storeIds, UserAuthMappingTypeEnum.STORE.getCode());
// 删除门店本身
storeDAO.deleteStoreByStoreIds(enterpriseId, storeIds, userId, Calendar.getInstance().getTimeInMillis());
//更新区域内的门店数量
List<Long> regionIdList = ListUtils.emptyIfNull(storeList)
.stream()
.map(StoreDO::getRegionId)
.collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(regionIdList)) {
List<RegionDO> regionDOList = regionDAO.listStoreRegionByIds(enterpriseId, regionIdList);
List<Long> updateRegionIdList = ListUtils.emptyIfNull(regionDOList)
.stream()
.map(data -> StrUtil.splitTrim(data.getFullRegionPath(), "/"))
.flatMap(Collection::stream)
.map(Long::valueOf)
.collect(Collectors.toList());
simpleMessageService.send(JSONObject.toJSONString(new RegionStoreNumMsgDTO(enterpriseId, updateRegionIdList)), RocketMqTagEnum.REGION_STORE_NUM_UPDATE);
}
}
}