企业同步
This commit is contained in:
@@ -61,11 +61,26 @@
|
||||
<orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.4.6" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.google.guava:guava:20.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.aliyun.openservices:ons-client:1.8.8.3.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:3.0.4" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.2.6.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.2.6.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.2.6.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.2.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.2.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.2.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.2.2.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.48.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.48.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.48.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.48.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.48.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.48.Final" level="project" />
|
||||
<orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.3.4.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" />
|
||||
<orderEntry type="module" module-name="coolstore-partner-dao" />
|
||||
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:3.0.2" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.4.2" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.2.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.2.5.RELEASE" level="project" />
|
||||
<orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.18" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:3.6.1" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.alibaba:druid-spring-boot-starter:1.1.20" level="project" />
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user