Commit a621d903 by 徐高华

wx_user_id调整

parent c002d98b
......@@ -155,11 +155,10 @@ public class TestController extends WebBaseController {
continue;
}
String wxEnterpriseId = staff.getWxEnterpriseId();
String wxUserId = staff.getWxUserId();
String taskName = "刷新企业微信好友(" + staff.getStaffName() + ")";
String taskId = dealSyncOperationApiService.createWxFriendTaskSingle(staff.getWxEnterpriseId(), taskName, staffId, staff.getStaffName(), SyncTaskTypeEnum.FRIEND_SINGLE.getType());
if (StringUtils.isNotBlank(taskId)) {
dealSyncOperationApiService.dealWxFriendClerkSingle(taskId, wxUserId, staffId, wxEnterpriseId);
dealSyncOperationApiService.dealWxFriendClerkSingle(taskId, staffId, staffId, wxEnterpriseId);
}
}
return resultResponse(HaoBanErrCode.ERR_1);
......
......@@ -9,21 +9,6 @@ import java.util.List;
@Mapper
public interface HandoverExternalMapper {
/**
*/
int deleteByPrimaryKey(String handoverExternalId);
/**
*/
int insert(TabHandoverExternal record);
/**
*/
int insertSelective(TabHandoverExternal record);
/**
*/
TabHandoverExternal selectByPrimaryKey(String handoverExternalId);
/**
*/
......@@ -31,10 +16,6 @@ public interface HandoverExternalMapper {
/**
*/
int updateByPrimaryKey(TabHandoverExternal record);
/**
*/
int insertBatch(@Param("list") List<TabHandoverExternal> list);
/**
......
......@@ -72,7 +72,7 @@ public class ClerkMainStoreRelatedServiceImpl implements ClerkMainStoreRelatedSe
logger.info("刷新好友失败或正在刷新:{},{}", staffId, storeId);
return;
}
dealSyncOperationApiService.dealWxFriendClerkSingle(taskId, staff.getWxUserId(), staffId, wxEnterpriseId);
dealSyncOperationApiService.dealWxFriendClerkSingle(taskId, staffId, staffId, wxEnterpriseId);
logger.info("任务id:{}", taskId);
}
......
package com.gic.haoban.manage.service.service.out.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.gic.api.base.commons.Page;
import com.gic.clerk.api.dto.ClerkDTO;
import com.gic.clerk.api.service.ClerkService;
import com.gic.commons.util.GICMQClientUtil;
import com.gic.commons.util.ToolUtil;
import com.gic.enterprise.api.dto.StoreDTO;
import com.gic.enterprise.api.dto.StoreGroupDTO;
import com.gic.enterprise.api.service.StoreGroupService;
import com.gic.enterprise.api.service.StoreService;
import com.gic.haoban.base.api.common.BasePageInfo;
import com.gic.haoban.common.utils.EntityUtil;
import com.gic.haoban.manage.api.dto.*;
import com.gic.haoban.manage.api.enums.*;
import com.gic.haoban.manage.api.service.DealSyncOperationApiService;
import com.gic.haoban.manage.service.dao.mapper.StaffMapper;
import com.gic.haoban.manage.service.entity.*;
import com.gic.haoban.manage.service.service.*;
import com.gic.haoban.manage.service.task.BaseSyncOperation;
import com.gic.mq.sdk.GicMQClient;
import com.gic.redis.data.util.RedisUtil;
import com.gic.wechat.api.service.qywx.QywxDepartmentApiService;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* Created 2020/4/9.
*
* @author hua
*/
@Service
public class DealSyncOperationApiServiceImpl implements DealSyncOperationApiService {
private static final Logger logger = LoggerFactory.getLogger(DealSyncOperationApiServiceImpl.class);
@Autowired
private DepartmentService departmentService;
@Autowired
private StoreGroupService storeGroupService;
@Autowired
private PreDealService preDealService;
@Autowired
private SyncTaskService syncTaskService;
@Autowired
private StoreService storeService;
@Autowired
private Map<String, BaseSyncOperation> operationMap;
@Autowired
private StaffService staffService;
@Autowired
private StaffMapper staffMapper ;
@Autowired
private StaffDepartmentRelatedService staffDepartmentRelatedService;
@Autowired
private ClerkService clerkService;
@Autowired
private QywxDepartmentApiService qywxDepartmentApiService;
@Autowired
private WxEnterpriseService wxEnterpriseService;
@Autowired
private StaffClerkRelationService staffClerkRelationService;
@Autowired
private SecretSettingService secretSettingService;
@Autowired
private ClerkMainStoreRelatedService clerkMainStoreRelatedService;
private static final String LOCK_KEY = "sync_wx_lock_";
private static final String LOCK_SUCCESS_KEY = "sync_wx_success_lock_";
private static final String FRIEND_LOCK = "haoban_fresh_wx_friend_lock_";
private static final String FRIEND_TAG_LOCK = "haoban_sync_tag_lock_";
@Override
public void departmentDealMq(String params) {
DealParamMqDTO dealParamMqDTO = JSONObject.parseObject(params, DealParamMqDTO.class);
TabHaobanPreDealLog dataPre = preDealService.getByDataId(dealParamMqDTO.getTaskId(), dealParamMqDTO.getData(), dealParamMqDTO.getType() - 1, PreDealStatusEnum.all.getVal());
logger.info("好办同步处理mq处理开始:{},dataPre={}", params,JSON.toJSONString(dataPre));
if (dataPre == null) {
return;
}
Integer dataType = dataPre.getDataType();
logger.info("同步类型,dataType:{}",dataType);
if (dataType.equals(PreDealTypeEnum.dept.getVal())) {
logger.info("0 部门处理:{}", params);
operationMap.get("qywxDeptSyncOperation").dealSingleByMq(dealParamMqDTO, dataPre);
} else if (dataType.equals(PreDealTypeEnum.clerk.getVal())) {
logger.info("2 成员处理:{}", params);
operationMap.get("qywxStaffSyncOperation").dealSingleByMq(dealParamMqDTO, dataPre);
} else if (dataType.equals(PreDealTypeEnum.friend_clerk.getVal())) {
logger.info("6 好友导购处理:{}", params);
operationMap.get("friendClerkSyncNewOperation").dealSingleByMq(dealParamMqDTO, dataPre);
} else if (dataType.equals(PreDealTypeEnum.friend.getVal())) {
logger.info("8 第三方好友处理:{}", params);
operationMap.get("friendSyncNewOperation").dealSingleByMq(dealParamMqDTO, dataPre);
} else if (dataType.equals(PreDealTypeEnum.self_friend.getVal())) {
logger.info("7 自建好友处理:{}", params);
operationMap.get("selfFriendSyncNewOperation").dealSingleByMq(dealParamMqDTO, dataPre);
} else if (dataType.equals(PreDealTypeEnum.tag.getVal())) {
logger.info("10 会员标签处理:{}", params);
operationMap.get("friendTagSyncOperation").dealSingleByMq(dealParamMqDTO, dataPre);
} else if (dataType.equals(PreDealTypeEnum.tag_member.getVal())) {
logger.info("11 会员标签处理标签项:{}", params);
operationMap.get("friendMemberTagSyncOperation").dealSingleByMq(dealParamMqDTO, dataPre);
} else {
logger.info("不是正常数据类型:{}", params);
}
}
@Override
public void dealDepartment(String taskId, String wxEnterpriseId
, List<SyncSingleDealDTO> addList, List<SyncSingleDealDTO> editList) {
logger.info("初始开始:{}", taskId);
//处理修改
dealEidtSync(editList);
if (CollectionUtils.isEmpty(addList)) {
syncTaskService.updateTaskStatus(taskId, SyncTaskStatusEnum.compute.getVal());
unlockTask(wxEnterpriseId);
return;
}
logger.info("处理分组信息开始:{}", taskId);
dealAddSync(taskId, wxEnterpriseId, addList);
//加入队列处理
logger.info("初始化到队列:{}", taskId);
dealDepartmentInit(taskId, wxEnterpriseId, addList);
}
@Override
public void reDealDepartment(String taskId, int dataType) {
logger.info("开始重新同步:{}", taskId);
TabHaobanSyncTask task = syncTaskService.getSyncTask(taskId);
if (null == task) {
logger.info("任务不存在!{}", taskId);
return;
}
if ((!task.getStatusFlag().equals(SyncTaskStatusEnum.exception_close.getVal())) &&
(!task.getStatusFlag().equals(SyncTaskStatusEnum.exception_compute.getVal()))) {
logger.info("任务不在没有在异常状态!{}", taskId);
return;
}
int groupErrCount = preDealService.countExcepAndPreByTaskId(taskId, PreDealTypeEnum.dept.getVal());
int storeErrCount = preDealService.countExcepAndPreByTaskId(taskId, PreDealTypeEnum.store.getVal());
List<TabHaobanPreDealLog> list = null;
if (dataType == -1) {
if (groupErrCount > 0) {
dataType = PreDealTypeEnum.dept.getVal();
list = preDealService.queryDepartRebuildDealLog(taskId);
} else if (storeErrCount > 0) {
dataType = PreDealTypeEnum.store.getVal();
list = preDealService.listRebuildByTaskId(taskId, dataType);
} else {
dataType = PreDealTypeEnum.clerk.getVal();
list = preDealService.listRebuildByTaskId(taskId, dataType);
}
}
if (CollectionUtils.isEmpty(list)) {
unlockTask(task.getWxEnterpriseId());
return;
}
Set<String> midList = list.stream().map(TabHaobanPreDealLog::getDataId).collect(Collectors.toSet());
//根据类型获取状态
SyncTaskStatusEnum syncTaskStatusEnum = (dataType == PreDealTypeEnum.dept.getVal() ? SyncTaskStatusEnum.group_sync
: (dataType == PreDealTypeEnum.store.getVal() ? SyncTaskStatusEnum.store_sync : SyncTaskStatusEnum.clerk_sync));
logger.info("处理开始:类型:{}", syncTaskStatusEnum.getVal());
//处理预处理数据
preDealService.updateExceptionToPre(taskId);
dealDepartmentToMq(taskId, midList, syncTaskStatusEnum);
}
private String createBaseTask(String wxEnterpriseId, String taskName, String userId, String desc, int taskType) {
String key = "sync_create_task_" + wxEnterpriseId;
RedisUtil.lock(key, 10L);
String taskLock = getTaskLock(wxEnterpriseId);
if (StringUtils.isNotBlank(taskLock)) {
logger.info("【同步锁】taskLock={}", taskLock);
RedisUtil.unlock(key);
return null;
}
TabHaobanSyncTask tabHaobanSyncTask = new TabHaobanSyncTask();
tabHaobanSyncTask.setAddUser(userId);
tabHaobanSyncTask.setTaskName(taskName);
tabHaobanSyncTask.setTaskDesc(desc);
tabHaobanSyncTask.setWxEnterpriseId(wxEnterpriseId);
tabHaobanSyncTask.setStatusFlag(SyncTaskStatusEnum.init.getVal());
tabHaobanSyncTask.setTaskId(ToolUtil.randomUUID());
tabHaobanSyncTask.setTaskType(taskType);
syncTaskService.createTask(tabHaobanSyncTask);
lockTask(wxEnterpriseId, tabHaobanSyncTask.getTaskId());
RedisUtil.unlock(key);
return tabHaobanSyncTask.getTaskId();
}
@Override
public String createTask(String wxEnterpriseId, String taskName, String userId, String desc) {
return createBaseTask(wxEnterpriseId, taskName, userId, desc, 0);
}
@Override
public String createQywxTask(String wxEnterpriseId, String taskName, String userId, String desc) {
return createBaseTask(wxEnterpriseId, taskName, userId, desc, SyncTaskTypeEnum.QYWX_CONTACT.getType());
}
/**
* 处理修改数据
*
* @param editList
*/
private void dealEidtSync(List<SyncSingleDealDTO> editList) {
if (CollectionUtils.isEmpty(editList)) {
return;
}
//先处理修改的
editList.forEach(syncSingleDealDTO -> {
TabHaobanDepartment department = departmentService.selectById(syncSingleDealDTO.getDepartmentId());
if (!department.getParentDepartmentId().equals(syncSingleDealDTO.getParentDepartmentId())) {
department.setParentDepartmentId(syncSingleDealDTO.getParentDepartmentId());
departmentService.edit(EntityUtil.changeEntityByJSON(DepartmentDTO.class, department));
}
});
}
/**
* 执行新增同步
*
* @param taskId
* @param wxEnterpriseId
* @param addList
*/
private void dealAddSync(String taskId, String wxEnterpriseId, List<SyncSingleDealDTO> addList) {
Map<String, String> pMap = addList.stream().collect(Collectors.toMap(SyncSingleDealDTO::getRelatedId, SyncSingleDealDTO::getParentDepartmentId));
//获取企业与分组map
Map<String, List<String>> eidListMap = addList.stream().filter(dto -> {
String departmentId = dto.getDepartmentId();
TabHaobanDepartment department = departmentService.selectById(departmentId);
if (department != null) {
return false;
}
Integer storeFlag = dto.getStoreFlag();
return !storeFlag.equals(1);
}).collect(Collectors.groupingBy(SyncSingleDealDTO::getEnterpriseId
, Collectors.mapping(SyncSingleDealDTO::getRelatedId, Collectors.toList())));
//放入预处理表
eidListMap.forEach((k, v) -> {
//获取所有分组列表
List<StoreGroupDTO> groupDTOList = storeGroupService.listStoreGroupAndChildren(v.toArray(new String[]{}), k);
List<String> hasKey = new ArrayList<>();
List<TabHaobanPreDealLog> dealList = groupDTOList.stream().filter(dto -> {
return !hasKey.contains(dto.getStoreGroupId());
}).map(storeGroupDTO -> {
TabHaobanPreDealLog dealLog = new TabHaobanPreDealLog();
dealLog.setDataId(storeGroupDTO.getStoreGroupId());
if (pMap.containsKey(storeGroupDTO.getStoreGroupId())) {
dealLog.setpDataId(pMap.get(storeGroupDTO.getStoreGroupId()));
} else {
dealLog.setpDataId(storeGroupDTO.getParentGroupId());
}
dealLog.setDataType(PreDealTypeEnum.dept.getVal());
dealLog.setStatusFlag(0);
dealLog.setTaskId(taskId);
dealLog.setEnterpriseId(storeGroupDTO.getEnterpriseId());
dealLog.setWxEnterpriseId(wxEnterpriseId);
return dealLog;
}).collect(Collectors.toList());
preDealService.insert(dealList);
});
//处理门店信息
List<TabHaobanPreDealLog> storeList = addList.stream().filter(dto -> {
return dto.getStoreFlag() == 1;
}).map(dto -> {
TabHaobanPreDealLog dealLog = new TabHaobanPreDealLog();
dealLog.setDataId(dto.getRelatedId());
dealLog.setpDataId(dto.getParentDepartmentId());
dealLog.setDataType(1);
dealLog.setStatusFlag(0);
dealLog.setEnterpriseId(dto.getEnterpriseId());
dealLog.setTaskId(taskId);
dealLog.setWxEnterpriseId(wxEnterpriseId);
return dealLog;
}).collect(Collectors.toList());
preDealService.insert(storeList);
}
/**
* 初始化部门
*
* @param taskId
* @param wxEnterpriseId
* @param addList
*/
private void dealDepartmentInit(String taskId, String wxEnterpriseId, List<SyncSingleDealDTO> addList) {
Set<String> addListMid = addList.stream().filter(dto -> dto.getStoreFlag().equals(0)).map(dto -> dto.getRelatedId()).collect(Collectors.toSet());
if (CollectionUtils.isNotEmpty(addListMid)) {
dealDepartmentToMq(taskId, addListMid, SyncTaskStatusEnum.group_sync);
} else {
addListMid = addList.stream().filter(dto -> dto.getStoreFlag().equals(1)).map(dto -> dto.getRelatedId()).collect(Collectors.toSet());
dealDepartmentToMq(taskId, addListMid, SyncTaskStatusEnum.store_sync);
}
}
/**
* 放入mq处理部门数据
*
* @param taskId
* @param dealList
*/
private void dealDepartmentToMq(String taskId, Set<String> dealList, SyncTaskStatusEnum syncTaskStatusEnum) {
//预处理分组任务
syncTaskService.updateTaskStatus(taskId, syncTaskStatusEnum.getVal());
List<String> listRet = dealList.stream().map(relationId -> {
DealParamMqDTO dealParamMqDTO = new DealParamMqDTO();
dealParamMqDTO.setTaskId(taskId);
dealParamMqDTO.setData(relationId);
dealParamMqDTO.setType(syncTaskStatusEnum.getVal());
return JSONObject.toJSONString(dealParamMqDTO);
}).collect(Collectors.toList());
GicMQClient clientInstance = GICMQClientUtil.getClientInstance();
try {
clientInstance.sendBatchMessages("departmentSyncDealMq", listRet);
} catch (Exception e) {
logger.info("发送失败:{},{}", taskId, JSONObject.toJSONString(listRet));
e.printStackTrace();
}
}
public String lockTask(String wxEnterpriseId, String taskId) {
String key = LOCK_KEY + wxEnterpriseId;
Object cache = RedisUtil.getCache(key);
if (null == cache) {
RedisUtil.setCache(key, taskId, 5L, TimeUnit.DAYS);
return taskId;
}
return null;
}
@Override
public boolean closeTask(String wxEnterpriseId) {
String taskId = getTaskLock(wxEnterpriseId);
if (taskId != null) {
syncTaskService.updateTaskStatus(taskId, SyncTaskStatusEnum.exception_close.getVal());
unlockTask(wxEnterpriseId);
}
return true;
}
@Override
public void unlockTask(String wxEnterpriseId) {
String key = LOCK_KEY + wxEnterpriseId;
String taskId = (String) RedisUtil.getCache(key);
if (StringUtils.isNotBlank(taskId)) {
TabHaobanSyncTask syncTask = syncTaskService.getSyncTask(taskId);
if (syncTask.getStatusFlag().equals(SyncTaskStatusEnum.compute.getVal())) {
String sKey = LOCK_SUCCESS_KEY + wxEnterpriseId;
RedisUtil.setCache(sKey, taskId);
}
}
RedisUtil.delCache(key);
}
@Override
public String getTaskLock(String wxEnterpriseId) {
String key = LOCK_KEY + wxEnterpriseId;
return (String) RedisUtil.getCache(key);
}
@Override
public SyncCheckDTO getTaskCheck(String wxEnterpriseId) {
String taskId = getTaskLock(wxEnterpriseId);
SyncCheckDTO syncCheckDTO = new SyncCheckDTO();
String sKey = LOCK_SUCCESS_KEY + wxEnterpriseId;
if (null == taskId) {
taskId = (String) RedisUtil.getCache(sKey);
RedisUtil.delCache(sKey);
}
if (null == taskId) {
return syncCheckDTO;
}
TabHaobanSyncTask syncTask = syncTaskService.getSyncTask(taskId);
syncCheckDTO.setSyncStatus(syncTask.getStatusFlag());
PreDealLogInfoDTO dealLogInfoDTO = preDealService.getLastPreDataByTaskId(taskId);
if (dealLogInfoDTO == null) {
RedisUtil.delCache(sKey);
return syncCheckDTO;
}
//30分钟内没执行就重试 并在一天内
Date date = DateUtils.addMinutes(new Date(), -30);
Date dayDate = DateUtils.addDays(new Date(), -1);
if (dealLogInfoDTO != null && dealLogInfoDTO.getUpdateTime() != null
&& dealLogInfoDTO.getCreateTime() != null
&& dealLogInfoDTO.getUpdateTime().before(date)
&& syncTask.getUpdateTime().before(date)
&& syncTask.getCreateTime().after(dayDate)) {
logger.info("重试:{}", taskId);
syncTaskService.updateTaskStatus(taskId, SyncTaskStatusEnum.exception_close.getVal());
reDealDepartment(taskId, -1);
return syncCheckDTO;
}
int totalCount = preDealService.countByTaskId(taskId, -1, -1);
int groupErrCount = preDealService.countByTaskId(taskId, PreDealTypeEnum.dept.getVal(), PreDealStatusEnum.exception.getVal());
int storeErrCount = preDealService.countByTaskId(taskId, PreDealTypeEnum.store.getVal(), PreDealStatusEnum.exception.getVal());
int clerkErrCount = preDealService.countByTaskId(taskId, PreDealTypeEnum.clerk.getVal(), PreDealStatusEnum.exception.getVal());
int preCount = preDealService.countByTaskId(taskId, -1, PreDealStatusEnum.pre.getVal());
syncCheckDTO.setTotalDeal(totalCount);
syncCheckDTO.setGroupErrCount(groupErrCount);
syncCheckDTO.setStoreErrCount(storeErrCount);
syncCheckDTO.setStaffErrCount(clerkErrCount);
syncCheckDTO.setHasDeal(totalCount - preCount);
return syncCheckDTO;
}
@Override
public Page<SyncTaskDTO> listSyncTask(String wxEnterpriseId, BasePageInfo pageInfo) {
Page<SyncTaskDTO> page = syncTaskService.listTaskPage(wxEnterpriseId, pageInfo);
if (CollectionUtils.isEmpty(page.getResult())) {
return page;
}
List<SyncTaskDTO> result = page.getResult();
for (SyncTaskDTO dto : result) {
String addUser = dto.getAddUser();
TabHaobanStaff haobanStaff = staffService.selectById(addUser);
if (null != haobanStaff) {
dto.setUserName(haobanStaff.getStaffName());
} else {
dto.setUserName("系统管理员");
}
}
return page;
}
@Override
public Page<PreDealLogInfoDTO> listSyncTaskDetail(String wxEnterpriseId, String taskId, BasePageInfo pageInfo) {
TabHaobanSyncTask syncTask = syncTaskService.getSyncTask(taskId);
Page<PreDealLogInfoDTO> page = preDealService.listExceptionByTaskId(taskId, pageInfo);
if (CollectionUtils.isEmpty(page.getResult())) {
return page;
}
//gic同步微信
if (syncTask.getTaskType().equals(0)) {
List<PreDealLogInfoDTO> result = page.getResult();
for (PreDealLogInfoDTO dto : result) {
if (dto.getDataType().equals(PreDealTypeEnum.dept.getVal())) {
StoreGroupDTO midGroup = storeGroupService.getStoreGroupById(dto.getDataId());
if (midGroup != null) {
dto.setDataName(midGroup.getStoreGroupName());
dto.setChainName(midGroup.getStoreGroupNameLevel());
}
} else if (dto.getDataType().equals(PreDealTypeEnum.store.getVal())) {
StoreDTO store = storeService.getStore(dto.getDataId());
if (null != store) {
dto.setDataName(store.getStoreName());
dto.setChainName(store.getStoreGroupName());
dto.setDataCode(store.getStoreCode());
}
} else if (dto.getDataType().equals(PreDealTypeEnum.clerk.getVal())) {
ClerkDTO clerkDTO = clerkService.getClerkByClerkId(dto.getDataId());
if (null != clerkDTO) {
dto.setDataName(clerkDTO.getClerkName());
dto.setChainName(clerkDTO.getStoreName());
dto.setDataCode(clerkDTO.getClerkCode());
}
}
}
} else if (syncTask.getTaskType().equals(2)) {
List<PreDealLogInfoDTO> result = page.getResult();
for (PreDealLogInfoDTO dto : result) {
dto.setDataCode(dto.getDataId());
TabHaobanStaff staff = staffService.selectByUserIdAndEnterpriseId(dto.getpDataId(), wxEnterpriseId);
if (staff != null) {
dto.setDataName(staff.getStaffName());
}
}
} else {
List<PreDealLogInfoDTO> result = page.getResult();
for (PreDealLogInfoDTO dto : result) {
dto.setDataCode(dto.getDataId());
dto.setDataName(dto.getDataContent());
}
}
return page;
}
@Override
public String dealQywxDepartment(String taskId, String wxEnterpriseId) {
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
SecretSettingDTO secretSetting = secretSettingService.getSecretSetting(qwDTO.getWxEnterpriseId(), SecretTypeEnum.CUSTOMIZED_APP.getVal());
if (null == secretSetting || secretSetting.getCheckFlag() == 0) {
logger.info("没有配置secret");
syncTaskService.updateTaskStatus(taskId, SyncTaskStatusEnum.exception_close.getVal());
unlockTask(wxEnterpriseId);
return "没有配置secret";
}
List<com.gic.wechat.api.dto.qywx.DepartmentDTO> list = qywxDepartmentApiService.listSelfDepartment(qwDTO.getThirdCorpid(), secretSetting.getSecretVal(), 1);
if (CollectionUtils.isEmpty(list)) {
logger.info("没有数据同步");
syncTaskService.updateTaskStatus(taskId, SyncTaskStatusEnum.exception_close.getVal());
unlockTask(wxEnterpriseId);
return "没有数据同步或权限没设置全部";
}
List<TabHaobanPreDealLog> dealLogList = list.stream().map(dto -> {
TabHaobanPreDealLog dealLog = new TabHaobanPreDealLog();
dealLog.setDataId(dto.getId().toString());
dealLog.setpDataId(dto.getParentid().toString());
dealLog.setDataType(0);
dealLog.setStatusFlag(0);
dealLog.setTaskId(taskId);
dealLog.setDataContent(JSONObject.toJSONString(dto));
dealLog.setWxEnterpriseId(wxEnterpriseId);
return dealLog;
}).collect(Collectors.toList());
preDealService.insert(dealLogList);
HashSet<String> hashSet = new HashSet<>();
hashSet.add("1");
dealDepartmentToMq(taskId, hashSet, SyncTaskStatusEnum.group_sync);
return null;
}
@Override
public void cleanDiffrence(String wxEnterpriseId, String taskId) {
List<TabHaobanPreDealLog> groupList = preDealService.listByTaskId(taskId, PreDealTypeEnum.dept.getVal(), PreDealStatusEnum.computed.getVal());
List<TabHaobanPreDealLog> clerkList = preDealService.listByTaskId(taskId, PreDealTypeEnum.clerk.getVal(), PreDealStatusEnum.computed.getVal());
//清空staff
if (CollectionUtils.isNotEmpty(clerkList)) {
List<String> clerkIds = clerkList.stream().map(TabHaobanPreDealLog::getDataId).collect(Collectors.toList());
List<StaffDTO> retLists = staffService.listByUserIdsAndWxEnterpriseId(clerkIds, wxEnterpriseId);
List<String> staffIds = retLists.stream().map(StaffDTO::getStaffId).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(staffIds)) {
List<String> delStaffIds = staffService.listDelUserStaffId(wxEnterpriseId, staffIds);
if (CollectionUtils.isEmpty(delStaffIds)) {
logger.info("没有要删除的用户:{}--{}", wxEnterpriseId, taskId);
} else {
staffClerkRelationService.cleanStaffClerk(wxEnterpriseId, delStaffIds);
staffService.cleanStaff(wxEnterpriseId, delStaffIds);
staffDepartmentRelatedService.cleanStaffDepartment(wxEnterpriseId, delStaffIds);
}
}
}
//清空cleak
if (CollectionUtils.isNotEmpty(groupList)) {
List<String> groupIdList = groupList.stream().map(TabHaobanPreDealLog::getDataId).collect(Collectors.toList());
departmentService.cleanDepartment(wxEnterpriseId, groupIdList);
}
RedisUtil.delLocalCache("department-list-cache-" + wxEnterpriseId);
}
@Override
public String createWxFriendTask(String wxEnterpriseId, String taskName, String staffId, String desc) {
TabHaobanSyncTask tabHaobanSyncTask = new TabHaobanSyncTask();
tabHaobanSyncTask.setAddUser(staffId);
tabHaobanSyncTask.setTaskName(taskName);
tabHaobanSyncTask.setTaskDesc(desc);
tabHaobanSyncTask.setWxEnterpriseId(wxEnterpriseId);
tabHaobanSyncTask.setStatusFlag(SyncTaskStatusEnum.init.getVal());
tabHaobanSyncTask.setTaskId(ToolUtil.randomUUID());
tabHaobanSyncTask.setTaskType(2);
syncTaskService.createTask(tabHaobanSyncTask);
lockTask(wxEnterpriseId, tabHaobanSyncTask.getTaskId());
return tabHaobanSyncTask.getTaskId();
}
@Override
public void dealWxFriendClerk(String taskId, String wxEnterpriseId) {
//List<TabHaobanStaffClerkRelation> relationList = staffClerkRelationService.listByWxEnterpriseId(wxEnterpriseId);
List<TabHaobanStaff> list = this.staffMapper.listByWxEnterpriseId(wxEnterpriseId) ;
List<TabHaobanClerkMainStoreRelated> mainStoreList = clerkMainStoreRelatedService.listByWxEnterpriseId(wxEnterpriseId);
Map<String, TabHaobanClerkMainStoreRelated> map = mainStoreList.stream().collect(Collectors.toMap(TabHaobanClerkMainStoreRelated::getStaffId, s -> s));
List<TabHaobanPreDealLog> dealLogList = list.stream().map(dto -> {
TabHaobanPreDealLog dealLog = new TabHaobanPreDealLog();
dealLog.setDataId(dto.getWxUserId());
dealLog.setpDataId(dto.getStaffId());
dealLog.setDataType(PreDealTypeEnum.friend_clerk.getVal());
dealLog.setStatusFlag(0);
dealLog.setTaskId(taskId);
dealLog.setDataContent(JSONObject.toJSONString(dto));
dealLog.setWxEnterpriseId(wxEnterpriseId);
return dealLog;
}).collect(Collectors.toList());
preDealService.insert(dealLogList);
HashSet<String> hashSet = (HashSet<String>) dealLogList.stream().map(TabHaobanPreDealLog::getDataId).collect(Collectors.toSet());
dealFriendToMq(taskId, hashSet, SyncTaskStatusEnum.friend_clerk_sync);
}
@Override
public String createWxFriendTaskSingle(String wxEnterpriseId, String taskName, String staffId, String staffName, int syncTaskType) {
String lockKey = FRIEND_LOCK + "_lock_" + staffId;
String staffLockKey = FRIEND_LOCK + staffId;
RedisUtil.lock(lockKey, 2L);
Object cache = RedisUtil.getCache(staffLockKey);
if (null != cache) {
RedisUtil.unlock(lockKey);
logger.info("限制此操作,lockKey={}",staffLockKey);
return null;
}
TabHaobanSyncTask tabHaobanSyncTask = new TabHaobanSyncTask();
tabHaobanSyncTask.setAddUser(staffId);
tabHaobanSyncTask.setTaskName(SyncTaskTypeEnum.getTaskName(syncTaskType));
tabHaobanSyncTask.setTaskDesc(staffName);
tabHaobanSyncTask.setWxEnterpriseId(wxEnterpriseId);
tabHaobanSyncTask.setStatusFlag(SyncTaskStatusEnum.init.getVal());
tabHaobanSyncTask.setTaskId(ToolUtil.randomUUID());
tabHaobanSyncTask.setTaskType(syncTaskType);
syncTaskService.createTask(tabHaobanSyncTask);
RedisUtil.setCache(staffLockKey, tabHaobanSyncTask.getTaskId(), 1L, TimeUnit.HOURS);
RedisUtil.unlock(lockKey);
return tabHaobanSyncTask.getTaskId();
}
@Override
public void dealWxFriendClerkSingle(String taskId, String wxUserId, String staffId, String wxEnterpriseId) {
TabHaobanPreDealLog dealLog = new TabHaobanPreDealLog();
// 改成使用staffid
dealLog.setDataId(staffId);
dealLog.setpDataId(staffId);
dealLog.setDataType(PreDealTypeEnum.friend_clerk.getVal());
dealLog.setStatusFlag(0);
dealLog.setTaskId(taskId);
dealLog.setDataContent("刷新" + staffId);
dealLog.setWxEnterpriseId(wxEnterpriseId);
List<TabHaobanPreDealLog> dealLogList = new ArrayList<TabHaobanPreDealLog>();
dealLogList.add(dealLog);
preDealService.insert(dealLogList);
HashSet<String> hashSet = (HashSet<String>) dealLogList.stream().map(TabHaobanPreDealLog::getDataId).collect(Collectors.toSet());
dealDepartmentToMq(taskId, hashSet, SyncTaskStatusEnum.friend_clerk_sync);
}
@Override
public void dealWxFriendStore(String taskId, String storeId, String wxEnterpriseId) {
List<StaffClerkRelationDTO> clerkRelationDTOS = staffClerkRelationService.listBindByStoreId(wxEnterpriseId, storeId);
if (CollectionUtils.isEmpty(clerkRelationDTOS)) {
logger.info("没有要刷新的:{},{}", wxEnterpriseId, storeId);
return;
}
logger.info("查询到需要刷新的导购={},storeId={}",clerkRelationDTOS.size(),storeId);
List<TabHaobanPreDealLog> dealLogList = clerkRelationDTOS.stream().map(dto -> {
TabHaobanPreDealLog dealLog = new TabHaobanPreDealLog();
dealLog.setDataId(dto.getStaffId());
dealLog.setpDataId(dto.getStaffId());
dealLog.setDataType(PreDealTypeEnum.friend_clerk.getVal());
dealLog.setStatusFlag(0);
dealLog.setTaskId(taskId);
dealLog.setWxEnterpriseId(wxEnterpriseId);
return dealLog;
}).collect(Collectors.toList());
preDealService.insert(dealLogList);
Set<String> hashSet = dealLogList.stream().map(TabHaobanPreDealLog::getDataId).collect(Collectors.toSet());
dealDepartmentToMq(taskId, hashSet, SyncTaskStatusEnum.friend_clerk_sync);
}
@Override
public void quartWxFriendClerk(String res) {
List<TabHaobanSyncTask> taskList = syncTaskService.listTaskByType(2);
if (CollectionUtils.isNotEmpty(taskList)) {
for (TabHaobanSyncTask tabHaobanSyncTask : taskList) {
dealWxFriendClerk(tabHaobanSyncTask.getTaskId(), tabHaobanSyncTask.getWxEnterpriseId());
}
}
}
/**
* 放入mq处理部门数据
*
* @param taskId
* @param dealList
*/
private void dealFriendToMq(String taskId, Set<String> dealList, SyncTaskStatusEnum syncTaskStatusEnum) {
//预处理分组任务
syncTaskService.updateTaskStatus(taskId, syncTaskStatusEnum.getVal());
List<String> listRet = dealList.stream().map(relationId -> {
DealParamMqDTO dealParamMqDTO = new DealParamMqDTO();
dealParamMqDTO.setTaskId(taskId);
dealParamMqDTO.setData(relationId);
dealParamMqDTO.setType(syncTaskStatusEnum.getVal());
return JSONObject.toJSONString(dealParamMqDTO);
}).collect(Collectors.toList());
GicMQClient clientInstance = GICMQClientUtil.getClientInstance();
try {
clientInstance.sendBatchMessages("friendSyncDealMq", listRet);
} catch (Exception e) {
logger.info("发送失败:{},{}", taskId, JSONObject.toJSONString(listRet), e);
}
}
@Override
public boolean getFreshFriendSyncTask(String wxEnterpriseId, String staffId) {
String staffLockKey = FRIEND_LOCK + staffId;
Object cache = RedisUtil.getCache(staffLockKey);
return null != cache;
}
@Override
public String createTagTask(String wxEnterpriseId, String addUser, String memberTagId) {
String lockKey = FRIEND_TAG_LOCK + "_lock_" + memberTagId;
String staffLockKey = FRIEND_TAG_LOCK + memberTagId;
RedisUtil.lock(lockKey, 2L);
Object cache = RedisUtil.getCache(staffLockKey);
if (null != cache) {
RedisUtil.unlock(lockKey);
return null;
}
TabHaobanSyncTask tabHaobanSyncTask = new TabHaobanSyncTask();
tabHaobanSyncTask.setAddUser(addUser);
tabHaobanSyncTask.setTaskName(SyncTaskTypeEnum.MEMBER_TAG.getTaskName());
tabHaobanSyncTask.setTaskDesc(memberTagId);
tabHaobanSyncTask.setWxEnterpriseId(wxEnterpriseId);
tabHaobanSyncTask.setStatusFlag(SyncTaskStatusEnum.init.getVal());
tabHaobanSyncTask.setTaskId(ToolUtil.randomUUID());
tabHaobanSyncTask.setTaskType(SyncTaskTypeEnum.MEMBER_TAG.getType());
syncTaskService.createTask(tabHaobanSyncTask);
RedisUtil.setCache(staffLockKey, tabHaobanSyncTask.getTaskId(), 1L, TimeUnit.HOURS);
RedisUtil.unlock(lockKey);
return tabHaobanSyncTask.getTaskId();
}
@Override
public void dealTagTask(String wxEnterpriseId, String enterpriseId, List<String> tagIds, String taskId) {
TabHaobanSyncTask syncTask = syncTaskService.getSyncTask(taskId);
if (CollectionUtils.isEmpty(tagIds)) {
syncTaskService.updateTaskStatus(taskId, SyncTaskStatusEnum.compute.getVal());
return;
}
List<TabHaobanPreDealLog> dealLogList = tagIds.stream().map(tagId -> {
TabHaobanPreDealLog dealLog = new TabHaobanPreDealLog();
dealLog.setDataId(tagId);
dealLog.setpDataId(syncTask.getTaskDesc());
dealLog.setDataType(PreDealTypeEnum.friend_clerk.getVal());
dealLog.setStatusFlag(0);
dealLog.setTaskId(taskId);
dealLog.setWxEnterpriseId(wxEnterpriseId);
return dealLog;
}).collect(Collectors.toList());
preDealService.insert(dealLogList);
Set<String> hashSet = dealLogList.stream().map(TabHaobanPreDealLog::getDataId).collect(Collectors.toSet());
dealDepartmentToMq(taskId, hashSet, SyncTaskStatusEnum.tag);
}
}
package com.gic.haoban.manage.service.service.out.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.gic.api.base.commons.Page;
import com.gic.clerk.api.dto.ClerkDTO;
import com.gic.clerk.api.service.ClerkService;
import com.gic.commons.util.GICMQClientUtil;
import com.gic.commons.util.ToolUtil;
import com.gic.enterprise.api.dto.StoreDTO;
import com.gic.enterprise.api.dto.StoreGroupDTO;
import com.gic.enterprise.api.service.StoreGroupService;
import com.gic.enterprise.api.service.StoreService;
import com.gic.haoban.base.api.common.BasePageInfo;
import com.gic.haoban.common.utils.EntityUtil;
import com.gic.haoban.manage.api.dto.*;
import com.gic.haoban.manage.api.enums.*;
import com.gic.haoban.manage.api.service.DealSyncOperationApiService;
import com.gic.haoban.manage.service.dao.mapper.StaffMapper;
import com.gic.haoban.manage.service.entity.*;
import com.gic.haoban.manage.service.service.*;
import com.gic.haoban.manage.service.task.BaseSyncOperation;
import com.gic.mq.sdk.GicMQClient;
import com.gic.redis.data.util.RedisUtil;
import com.gic.wechat.api.service.qywx.QywxDepartmentApiService;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* Created 2020/4/9.
*
* @author hua
*/
@Service
public class DealSyncOperationApiServiceImpl implements DealSyncOperationApiService {
private static final Logger logger = LoggerFactory.getLogger(DealSyncOperationApiServiceImpl.class);
@Autowired
private DepartmentService departmentService;
@Autowired
private StoreGroupService storeGroupService;
@Autowired
private PreDealService preDealService;
@Autowired
private SyncTaskService syncTaskService;
@Autowired
private StoreService storeService;
@Autowired
private Map<String, BaseSyncOperation> operationMap;
@Autowired
private StaffService staffService;
@Autowired
private StaffMapper staffMapper ;
@Autowired
private StaffDepartmentRelatedService staffDepartmentRelatedService;
@Autowired
private ClerkService clerkService;
@Autowired
private QywxDepartmentApiService qywxDepartmentApiService;
@Autowired
private WxEnterpriseService wxEnterpriseService;
@Autowired
private StaffClerkRelationService staffClerkRelationService;
@Autowired
private SecretSettingService secretSettingService;
private static final String LOCK_KEY = "sync_wx_lock_";
private static final String LOCK_SUCCESS_KEY = "sync_wx_success_lock_";
private static final String FRIEND_LOCK = "haoban_fresh_wx_friend_lock_";
private static final String FRIEND_TAG_LOCK = "haoban_sync_tag_lock_";
@Override
public void departmentDealMq(String params) {
DealParamMqDTO dealParamMqDTO = JSONObject.parseObject(params, DealParamMqDTO.class);
TabHaobanPreDealLog dataPre = preDealService.getByDataId(dealParamMqDTO.getTaskId(), dealParamMqDTO.getData(), dealParamMqDTO.getType() - 1, PreDealStatusEnum.all.getVal());
logger.info("好办同步处理mq处理开始:{},dataPre={}", params,JSON.toJSONString(dataPre));
if (dataPre == null) {
return;
}
Integer dataType = dataPre.getDataType();
logger.info("同步类型,dataType:{}",dataType);
if (dataType.equals(PreDealTypeEnum.dept.getVal())) {
logger.info("0 部门处理:{}", params);
operationMap.get("qywxDeptSyncOperation").dealSingleByMq(dealParamMqDTO, dataPre);
} else if (dataType.equals(PreDealTypeEnum.clerk.getVal())) {
logger.info("2 成员处理:{}", params);
operationMap.get("qywxStaffSyncOperation").dealSingleByMq(dealParamMqDTO, dataPre);
} else if (dataType.equals(PreDealTypeEnum.friend_clerk.getVal())) {
logger.info("6 好友导购处理:{}", params);
operationMap.get("friendClerkSyncNewOperation").dealSingleByMq(dealParamMqDTO, dataPre);
} else if (dataType.equals(PreDealTypeEnum.friend.getVal())) {
logger.info("8 第三方好友处理:{}", params);
operationMap.get("friendSyncNewOperation").dealSingleByMq(dealParamMqDTO, dataPre);
} else if (dataType.equals(PreDealTypeEnum.self_friend.getVal())) {
logger.info("7 自建好友处理:{}", params);
operationMap.get("selfFriendSyncNewOperation").dealSingleByMq(dealParamMqDTO, dataPre);
} else if (dataType.equals(PreDealTypeEnum.tag.getVal())) {
logger.info("10 会员标签处理:{}", params);
operationMap.get("friendTagSyncOperation").dealSingleByMq(dealParamMqDTO, dataPre);
} else if (dataType.equals(PreDealTypeEnum.tag_member.getVal())) {
logger.info("11 会员标签处理标签项:{}", params);
operationMap.get("friendMemberTagSyncOperation").dealSingleByMq(dealParamMqDTO, dataPre);
} else {
logger.info("不是正常数据类型:{}", params);
}
}
@Override
public void dealDepartment(String taskId, String wxEnterpriseId
, List<SyncSingleDealDTO> addList, List<SyncSingleDealDTO> editList) {
logger.info("初始开始:{}", taskId);
//处理修改
dealEidtSync(editList);
if (CollectionUtils.isEmpty(addList)) {
syncTaskService.updateTaskStatus(taskId, SyncTaskStatusEnum.compute.getVal());
unlockTask(wxEnterpriseId);
return;
}
logger.info("处理分组信息开始:{}", taskId);
dealAddSync(taskId, wxEnterpriseId, addList);
//加入队列处理
logger.info("初始化到队列:{}", taskId);
dealDepartmentInit(taskId, wxEnterpriseId, addList);
}
@Override
public void reDealDepartment(String taskId, int dataType) {
logger.info("开始重新同步:{}", taskId);
TabHaobanSyncTask task = syncTaskService.getSyncTask(taskId);
if (null == task) {
logger.info("任务不存在!{}", taskId);
return;
}
if ((!task.getStatusFlag().equals(SyncTaskStatusEnum.exception_close.getVal())) &&
(!task.getStatusFlag().equals(SyncTaskStatusEnum.exception_compute.getVal()))) {
logger.info("任务不在没有在异常状态!{}", taskId);
return;
}
int groupErrCount = preDealService.countExcepAndPreByTaskId(taskId, PreDealTypeEnum.dept.getVal());
int storeErrCount = preDealService.countExcepAndPreByTaskId(taskId, PreDealTypeEnum.store.getVal());
List<TabHaobanPreDealLog> list = null;
if (dataType == -1) {
if (groupErrCount > 0) {
dataType = PreDealTypeEnum.dept.getVal();
list = preDealService.queryDepartRebuildDealLog(taskId);
} else if (storeErrCount > 0) {
dataType = PreDealTypeEnum.store.getVal();
list = preDealService.listRebuildByTaskId(taskId, dataType);
} else {
dataType = PreDealTypeEnum.clerk.getVal();
list = preDealService.listRebuildByTaskId(taskId, dataType);
}
}
if (CollectionUtils.isEmpty(list)) {
unlockTask(task.getWxEnterpriseId());
return;
}
Set<String> midList = list.stream().map(TabHaobanPreDealLog::getDataId).collect(Collectors.toSet());
//根据类型获取状态
SyncTaskStatusEnum syncTaskStatusEnum = (dataType == PreDealTypeEnum.dept.getVal() ? SyncTaskStatusEnum.group_sync
: (dataType == PreDealTypeEnum.store.getVal() ? SyncTaskStatusEnum.store_sync : SyncTaskStatusEnum.clerk_sync));
logger.info("处理开始:类型:{}", syncTaskStatusEnum.getVal());
//处理预处理数据
preDealService.updateExceptionToPre(taskId);
dealDepartmentToMq(taskId, midList, syncTaskStatusEnum);
}
private String createBaseTask(String wxEnterpriseId, String taskName, String userId, String desc, int taskType) {
String key = "sync_create_task_" + wxEnterpriseId;
RedisUtil.lock(key, 10L);
String taskLock = getTaskLock(wxEnterpriseId);
if (StringUtils.isNotBlank(taskLock)) {
logger.info("【同步锁】taskLock={}", taskLock);
RedisUtil.unlock(key);
return null;
}
TabHaobanSyncTask tabHaobanSyncTask = new TabHaobanSyncTask();
tabHaobanSyncTask.setAddUser(userId);
tabHaobanSyncTask.setTaskName(taskName);
tabHaobanSyncTask.setTaskDesc(desc);
tabHaobanSyncTask.setWxEnterpriseId(wxEnterpriseId);
tabHaobanSyncTask.setStatusFlag(SyncTaskStatusEnum.init.getVal());
tabHaobanSyncTask.setTaskId(ToolUtil.randomUUID());
tabHaobanSyncTask.setTaskType(taskType);
syncTaskService.createTask(tabHaobanSyncTask);
lockTask(wxEnterpriseId, tabHaobanSyncTask.getTaskId());
RedisUtil.unlock(key);
return tabHaobanSyncTask.getTaskId();
}
@Override
public String createTask(String wxEnterpriseId, String taskName, String userId, String desc) {
return createBaseTask(wxEnterpriseId, taskName, userId, desc, 0);
}
@Override
public String createQywxTask(String wxEnterpriseId, String taskName, String userId, String desc) {
return createBaseTask(wxEnterpriseId, taskName, userId, desc, SyncTaskTypeEnum.QYWX_CONTACT.getType());
}
/**
* 处理修改数据
*
* @param editList
*/
private void dealEidtSync(List<SyncSingleDealDTO> editList) {
if (CollectionUtils.isEmpty(editList)) {
return;
}
//先处理修改的
editList.forEach(syncSingleDealDTO -> {
TabHaobanDepartment department = departmentService.selectById(syncSingleDealDTO.getDepartmentId());
if (!department.getParentDepartmentId().equals(syncSingleDealDTO.getParentDepartmentId())) {
department.setParentDepartmentId(syncSingleDealDTO.getParentDepartmentId());
departmentService.edit(EntityUtil.changeEntityByJSON(DepartmentDTO.class, department));
}
});
}
/**
* 执行新增同步
*
* @param taskId
* @param wxEnterpriseId
* @param addList
*/
private void dealAddSync(String taskId, String wxEnterpriseId, List<SyncSingleDealDTO> addList) {
Map<String, String> pMap = addList.stream().collect(Collectors.toMap(SyncSingleDealDTO::getRelatedId, SyncSingleDealDTO::getParentDepartmentId));
//获取企业与分组map
Map<String, List<String>> eidListMap = addList.stream().filter(dto -> {
String departmentId = dto.getDepartmentId();
TabHaobanDepartment department = departmentService.selectById(departmentId);
if (department != null) {
return false;
}
Integer storeFlag = dto.getStoreFlag();
return !storeFlag.equals(1);
}).collect(Collectors.groupingBy(SyncSingleDealDTO::getEnterpriseId
, Collectors.mapping(SyncSingleDealDTO::getRelatedId, Collectors.toList())));
//放入预处理表
eidListMap.forEach((k, v) -> {
//获取所有分组列表
List<StoreGroupDTO> groupDTOList = storeGroupService.listStoreGroupAndChildren(v.toArray(new String[]{}), k);
List<String> hasKey = new ArrayList<>();
List<TabHaobanPreDealLog> dealList = groupDTOList.stream().filter(dto -> {
return !hasKey.contains(dto.getStoreGroupId());
}).map(storeGroupDTO -> {
TabHaobanPreDealLog dealLog = new TabHaobanPreDealLog();
dealLog.setDataId(storeGroupDTO.getStoreGroupId());
if (pMap.containsKey(storeGroupDTO.getStoreGroupId())) {
dealLog.setpDataId(pMap.get(storeGroupDTO.getStoreGroupId()));
} else {
dealLog.setpDataId(storeGroupDTO.getParentGroupId());
}
dealLog.setDataType(PreDealTypeEnum.dept.getVal());
dealLog.setStatusFlag(0);
dealLog.setTaskId(taskId);
dealLog.setEnterpriseId(storeGroupDTO.getEnterpriseId());
dealLog.setWxEnterpriseId(wxEnterpriseId);
return dealLog;
}).collect(Collectors.toList());
preDealService.insert(dealList);
});
//处理门店信息
List<TabHaobanPreDealLog> storeList = addList.stream().filter(dto -> {
return dto.getStoreFlag() == 1;
}).map(dto -> {
TabHaobanPreDealLog dealLog = new TabHaobanPreDealLog();
dealLog.setDataId(dto.getRelatedId());
dealLog.setpDataId(dto.getParentDepartmentId());
dealLog.setDataType(1);
dealLog.setStatusFlag(0);
dealLog.setEnterpriseId(dto.getEnterpriseId());
dealLog.setTaskId(taskId);
dealLog.setWxEnterpriseId(wxEnterpriseId);
return dealLog;
}).collect(Collectors.toList());
preDealService.insert(storeList);
}
/**
* 初始化部门
*
* @param taskId
* @param wxEnterpriseId
* @param addList
*/
private void dealDepartmentInit(String taskId, String wxEnterpriseId, List<SyncSingleDealDTO> addList) {
Set<String> addListMid = addList.stream().filter(dto -> dto.getStoreFlag().equals(0)).map(dto -> dto.getRelatedId()).collect(Collectors.toSet());
if (CollectionUtils.isNotEmpty(addListMid)) {
dealDepartmentToMq(taskId, addListMid, SyncTaskStatusEnum.group_sync);
} else {
addListMid = addList.stream().filter(dto -> dto.getStoreFlag().equals(1)).map(dto -> dto.getRelatedId()).collect(Collectors.toSet());
dealDepartmentToMq(taskId, addListMid, SyncTaskStatusEnum.store_sync);
}
}
/**
* 放入mq处理部门数据
*
* @param taskId
* @param dealList
*/
private void dealDepartmentToMq(String taskId, Set<String> dealList, SyncTaskStatusEnum syncTaskStatusEnum) {
//预处理分组任务
syncTaskService.updateTaskStatus(taskId, syncTaskStatusEnum.getVal());
List<String> listRet = dealList.stream().map(relationId -> {
DealParamMqDTO dealParamMqDTO = new DealParamMqDTO();
dealParamMqDTO.setTaskId(taskId);
dealParamMqDTO.setData(relationId);
dealParamMqDTO.setType(syncTaskStatusEnum.getVal());
return JSONObject.toJSONString(dealParamMqDTO);
}).collect(Collectors.toList());
GicMQClient clientInstance = GICMQClientUtil.getClientInstance();
try {
clientInstance.sendBatchMessages("departmentSyncDealMq", listRet);
} catch (Exception e) {
logger.info("发送失败:{},{}", taskId, JSONObject.toJSONString(listRet));
e.printStackTrace();
}
}
public String lockTask(String wxEnterpriseId, String taskId) {
String key = LOCK_KEY + wxEnterpriseId;
Object cache = RedisUtil.getCache(key);
if (null == cache) {
RedisUtil.setCache(key, taskId, 5L, TimeUnit.DAYS);
return taskId;
}
return null;
}
@Override
public boolean closeTask(String wxEnterpriseId) {
String taskId = getTaskLock(wxEnterpriseId);
if (taskId != null) {
syncTaskService.updateTaskStatus(taskId, SyncTaskStatusEnum.exception_close.getVal());
unlockTask(wxEnterpriseId);
}
return true;
}
@Override
public void unlockTask(String wxEnterpriseId) {
String key = LOCK_KEY + wxEnterpriseId;
String taskId = (String) RedisUtil.getCache(key);
if (StringUtils.isNotBlank(taskId)) {
TabHaobanSyncTask syncTask = syncTaskService.getSyncTask(taskId);
if (syncTask.getStatusFlag().equals(SyncTaskStatusEnum.compute.getVal())) {
String sKey = LOCK_SUCCESS_KEY + wxEnterpriseId;
RedisUtil.setCache(sKey, taskId);
}
}
RedisUtil.delCache(key);
}
@Override
public String getTaskLock(String wxEnterpriseId) {
String key = LOCK_KEY + wxEnterpriseId;
return (String) RedisUtil.getCache(key);
}
@Override
public SyncCheckDTO getTaskCheck(String wxEnterpriseId) {
String taskId = getTaskLock(wxEnterpriseId);
SyncCheckDTO syncCheckDTO = new SyncCheckDTO();
String sKey = LOCK_SUCCESS_KEY + wxEnterpriseId;
if (null == taskId) {
taskId = (String) RedisUtil.getCache(sKey);
RedisUtil.delCache(sKey);
}
if (null == taskId) {
return syncCheckDTO;
}
TabHaobanSyncTask syncTask = syncTaskService.getSyncTask(taskId);
syncCheckDTO.setSyncStatus(syncTask.getStatusFlag());
PreDealLogInfoDTO dealLogInfoDTO = preDealService.getLastPreDataByTaskId(taskId);
if (dealLogInfoDTO == null) {
RedisUtil.delCache(sKey);
return syncCheckDTO;
}
//30分钟内没执行就重试 并在一天内
Date date = DateUtils.addMinutes(new Date(), -30);
Date dayDate = DateUtils.addDays(new Date(), -1);
if (dealLogInfoDTO != null && dealLogInfoDTO.getUpdateTime() != null
&& dealLogInfoDTO.getCreateTime() != null
&& dealLogInfoDTO.getUpdateTime().before(date)
&& syncTask.getUpdateTime().before(date)
&& syncTask.getCreateTime().after(dayDate)) {
logger.info("重试:{}", taskId);
syncTaskService.updateTaskStatus(taskId, SyncTaskStatusEnum.exception_close.getVal());
reDealDepartment(taskId, -1);
return syncCheckDTO;
}
int totalCount = preDealService.countByTaskId(taskId, -1, -1);
int groupErrCount = preDealService.countByTaskId(taskId, PreDealTypeEnum.dept.getVal(), PreDealStatusEnum.exception.getVal());
int storeErrCount = preDealService.countByTaskId(taskId, PreDealTypeEnum.store.getVal(), PreDealStatusEnum.exception.getVal());
int clerkErrCount = preDealService.countByTaskId(taskId, PreDealTypeEnum.clerk.getVal(), PreDealStatusEnum.exception.getVal());
int preCount = preDealService.countByTaskId(taskId, -1, PreDealStatusEnum.pre.getVal());
syncCheckDTO.setTotalDeal(totalCount);
syncCheckDTO.setGroupErrCount(groupErrCount);
syncCheckDTO.setStoreErrCount(storeErrCount);
syncCheckDTO.setStaffErrCount(clerkErrCount);
syncCheckDTO.setHasDeal(totalCount - preCount);
return syncCheckDTO;
}
@Override
public Page<SyncTaskDTO> listSyncTask(String wxEnterpriseId, BasePageInfo pageInfo) {
Page<SyncTaskDTO> page = syncTaskService.listTaskPage(wxEnterpriseId, pageInfo);
if (CollectionUtils.isEmpty(page.getResult())) {
return page;
}
List<SyncTaskDTO> result = page.getResult();
for (SyncTaskDTO dto : result) {
String addUser = dto.getAddUser();
TabHaobanStaff haobanStaff = staffService.selectById(addUser);
if (null != haobanStaff) {
dto.setUserName(haobanStaff.getStaffName());
} else {
dto.setUserName("系统管理员");
}
}
return page;
}
@Override
public Page<PreDealLogInfoDTO> listSyncTaskDetail(String wxEnterpriseId, String taskId, BasePageInfo pageInfo) {
TabHaobanSyncTask syncTask = syncTaskService.getSyncTask(taskId);
Page<PreDealLogInfoDTO> page = preDealService.listExceptionByTaskId(taskId, pageInfo);
if (CollectionUtils.isEmpty(page.getResult())) {
return page;
}
//gic同步微信
if (syncTask.getTaskType().equals(0)) {
List<PreDealLogInfoDTO> result = page.getResult();
for (PreDealLogInfoDTO dto : result) {
if (dto.getDataType().equals(PreDealTypeEnum.dept.getVal())) {
StoreGroupDTO midGroup = storeGroupService.getStoreGroupById(dto.getDataId());
if (midGroup != null) {
dto.setDataName(midGroup.getStoreGroupName());
dto.setChainName(midGroup.getStoreGroupNameLevel());
}
} else if (dto.getDataType().equals(PreDealTypeEnum.store.getVal())) {
StoreDTO store = storeService.getStore(dto.getDataId());
if (null != store) {
dto.setDataName(store.getStoreName());
dto.setChainName(store.getStoreGroupName());
dto.setDataCode(store.getStoreCode());
}
} else if (dto.getDataType().equals(PreDealTypeEnum.clerk.getVal())) {
ClerkDTO clerkDTO = clerkService.getClerkByClerkId(dto.getDataId());
if (null != clerkDTO) {
dto.setDataName(clerkDTO.getClerkName());
dto.setChainName(clerkDTO.getStoreName());
dto.setDataCode(clerkDTO.getClerkCode());
}
}
}
} else if (syncTask.getTaskType().equals(2)) {
List<PreDealLogInfoDTO> result = page.getResult();
for (PreDealLogInfoDTO dto : result) {
dto.setDataCode(dto.getDataId());
TabHaobanStaff staff = staffService.selectByUserIdAndEnterpriseId(dto.getpDataId(), wxEnterpriseId);
if (staff != null) {
dto.setDataName(staff.getStaffName());
}
}
} else {
List<PreDealLogInfoDTO> result = page.getResult();
for (PreDealLogInfoDTO dto : result) {
dto.setDataCode(dto.getDataId());
dto.setDataName(dto.getDataContent());
}
}
return page;
}
@Override
public String dealQywxDepartment(String taskId, String wxEnterpriseId) {
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
SecretSettingDTO secretSetting = secretSettingService.getSecretSetting(qwDTO.getWxEnterpriseId(), SecretTypeEnum.CUSTOMIZED_APP.getVal());
if (null == secretSetting || secretSetting.getCheckFlag() == 0) {
logger.info("没有配置secret");
syncTaskService.updateTaskStatus(taskId, SyncTaskStatusEnum.exception_close.getVal());
unlockTask(wxEnterpriseId);
return "没有配置secret";
}
List<com.gic.wechat.api.dto.qywx.DepartmentDTO> list = qywxDepartmentApiService.listSelfDepartment(qwDTO.getThirdCorpid(), secretSetting.getSecretVal(), 1);
if (CollectionUtils.isEmpty(list)) {
logger.info("没有数据同步");
syncTaskService.updateTaskStatus(taskId, SyncTaskStatusEnum.exception_close.getVal());
unlockTask(wxEnterpriseId);
return "没有数据同步或权限没设置全部";
}
List<TabHaobanPreDealLog> dealLogList = list.stream().map(dto -> {
TabHaobanPreDealLog dealLog = new TabHaobanPreDealLog();
dealLog.setDataId(dto.getId().toString());
dealLog.setpDataId(dto.getParentid().toString());
dealLog.setDataType(0);
dealLog.setStatusFlag(0);
dealLog.setTaskId(taskId);
dealLog.setDataContent(JSONObject.toJSONString(dto));
dealLog.setWxEnterpriseId(wxEnterpriseId);
return dealLog;
}).collect(Collectors.toList());
preDealService.insert(dealLogList);
HashSet<String> hashSet = new HashSet<>();
hashSet.add("1");
dealDepartmentToMq(taskId, hashSet, SyncTaskStatusEnum.group_sync);
return null;
}
@Override
public void cleanDiffrence(String wxEnterpriseId, String taskId) {
List<TabHaobanPreDealLog> groupList = preDealService.listByTaskId(taskId, PreDealTypeEnum.dept.getVal(), PreDealStatusEnum.computed.getVal());
List<TabHaobanPreDealLog> clerkList = preDealService.listByTaskId(taskId, PreDealTypeEnum.clerk.getVal(), PreDealStatusEnum.computed.getVal());
//清空staff
if (CollectionUtils.isNotEmpty(clerkList)) {
List<String> clerkIds = clerkList.stream().map(TabHaobanPreDealLog::getDataId).collect(Collectors.toList());
List<StaffDTO> retLists = staffService.listByUserIdsAndWxEnterpriseId(clerkIds, wxEnterpriseId);
List<String> staffIds = retLists.stream().map(StaffDTO::getStaffId).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(staffIds)) {
List<String> delStaffIds = staffService.listDelUserStaffId(wxEnterpriseId, staffIds);
if (CollectionUtils.isEmpty(delStaffIds)) {
logger.info("没有要删除的用户:{}--{}", wxEnterpriseId, taskId);
} else {
staffClerkRelationService.cleanStaffClerk(wxEnterpriseId, delStaffIds);
staffService.cleanStaff(wxEnterpriseId, delStaffIds);
staffDepartmentRelatedService.cleanStaffDepartment(wxEnterpriseId, delStaffIds);
}
}
}
//清空cleak
if (CollectionUtils.isNotEmpty(groupList)) {
List<String> groupIdList = groupList.stream().map(TabHaobanPreDealLog::getDataId).collect(Collectors.toList());
departmentService.cleanDepartment(wxEnterpriseId, groupIdList);
}
RedisUtil.delLocalCache("department-list-cache-" + wxEnterpriseId);
}
@Override
public String createWxFriendTask(String wxEnterpriseId, String taskName, String staffId, String desc) {
TabHaobanSyncTask tabHaobanSyncTask = new TabHaobanSyncTask();
tabHaobanSyncTask.setAddUser(staffId);
tabHaobanSyncTask.setTaskName(taskName);
tabHaobanSyncTask.setTaskDesc(desc);
tabHaobanSyncTask.setWxEnterpriseId(wxEnterpriseId);
tabHaobanSyncTask.setStatusFlag(SyncTaskStatusEnum.init.getVal());
tabHaobanSyncTask.setTaskId(ToolUtil.randomUUID());
tabHaobanSyncTask.setTaskType(2);
syncTaskService.createTask(tabHaobanSyncTask);
lockTask(wxEnterpriseId, tabHaobanSyncTask.getTaskId());
return tabHaobanSyncTask.getTaskId();
}
@Override
public void dealWxFriendClerk(String taskId, String wxEnterpriseId) {
List<TabHaobanStaff> list = this.staffMapper.listByWxEnterpriseId(wxEnterpriseId) ;
List<TabHaobanPreDealLog> dealLogList = list.stream().map(dto -> {
TabHaobanPreDealLog dealLog = new TabHaobanPreDealLog();
dealLog.setDataId(dto.getStaffId());
dealLog.setpDataId(dto.getStaffId());
dealLog.setDataType(PreDealTypeEnum.friend_clerk.getVal());
dealLog.setStatusFlag(0);
dealLog.setTaskId(taskId);
dealLog.setDataContent(JSONObject.toJSONString(dto));
dealLog.setWxEnterpriseId(wxEnterpriseId);
return dealLog;
}).collect(Collectors.toList());
preDealService.insert(dealLogList);
HashSet<String> hashSet = (HashSet<String>) dealLogList.stream().map(TabHaobanPreDealLog::getDataId).collect(Collectors.toSet());
dealFriendToMq(taskId, hashSet, SyncTaskStatusEnum.friend_clerk_sync);
}
@Override
public String createWxFriendTaskSingle(String wxEnterpriseId, String taskName, String staffId, String staffName, int syncTaskType) {
String lockKey = FRIEND_LOCK + "_lock_" + staffId;
String staffLockKey = FRIEND_LOCK + staffId;
RedisUtil.lock(lockKey, 2L);
Object cache = RedisUtil.getCache(staffLockKey);
if (null != cache) {
RedisUtil.unlock(lockKey);
logger.info("限制此操作,lockKey={}",staffLockKey);
return null;
}
TabHaobanSyncTask tabHaobanSyncTask = new TabHaobanSyncTask();
tabHaobanSyncTask.setAddUser(staffId);
tabHaobanSyncTask.setTaskName(SyncTaskTypeEnum.getTaskName(syncTaskType));
tabHaobanSyncTask.setTaskDesc(staffName);
tabHaobanSyncTask.setWxEnterpriseId(wxEnterpriseId);
tabHaobanSyncTask.setStatusFlag(SyncTaskStatusEnum.init.getVal());
tabHaobanSyncTask.setTaskId(ToolUtil.randomUUID());
tabHaobanSyncTask.setTaskType(syncTaskType);
syncTaskService.createTask(tabHaobanSyncTask);
RedisUtil.setCache(staffLockKey, tabHaobanSyncTask.getTaskId(), 1L, TimeUnit.HOURS);
RedisUtil.unlock(lockKey);
return tabHaobanSyncTask.getTaskId();
}
@Override
public void dealWxFriendClerkSingle(String taskId, String wxUserId, String staffId, String wxEnterpriseId) {
TabHaobanPreDealLog dealLog = new TabHaobanPreDealLog();
// 改成使用staffid
dealLog.setDataId(staffId);
dealLog.setpDataId(staffId);
dealLog.setDataType(PreDealTypeEnum.friend_clerk.getVal());
dealLog.setStatusFlag(0);
dealLog.setTaskId(taskId);
dealLog.setDataContent("刷新" + staffId);
dealLog.setWxEnterpriseId(wxEnterpriseId);
List<TabHaobanPreDealLog> dealLogList = new ArrayList<TabHaobanPreDealLog>();
dealLogList.add(dealLog);
preDealService.insert(dealLogList);
HashSet<String> hashSet = (HashSet<String>) dealLogList.stream().map(TabHaobanPreDealLog::getDataId).collect(Collectors.toSet());
dealDepartmentToMq(taskId, hashSet, SyncTaskStatusEnum.friend_clerk_sync);
}
@Override
public void dealWxFriendStore(String taskId, String storeId, String wxEnterpriseId) {
List<StaffClerkRelationDTO> clerkRelationDTOS = staffClerkRelationService.listBindByStoreId(wxEnterpriseId, storeId);
if (CollectionUtils.isEmpty(clerkRelationDTOS)) {
logger.info("没有要刷新的:{},{}", wxEnterpriseId, storeId);
return;
}
logger.info("查询到需要刷新的导购={},storeId={}",clerkRelationDTOS.size(),storeId);
List<TabHaobanPreDealLog> dealLogList = clerkRelationDTOS.stream().map(dto -> {
TabHaobanPreDealLog dealLog = new TabHaobanPreDealLog();
dealLog.setDataId(dto.getStaffId());
dealLog.setpDataId(dto.getStaffId());
dealLog.setDataType(PreDealTypeEnum.friend_clerk.getVal());
dealLog.setStatusFlag(0);
dealLog.setTaskId(taskId);
dealLog.setWxEnterpriseId(wxEnterpriseId);
return dealLog;
}).collect(Collectors.toList());
preDealService.insert(dealLogList);
Set<String> hashSet = dealLogList.stream().map(TabHaobanPreDealLog::getDataId).collect(Collectors.toSet());
dealDepartmentToMq(taskId, hashSet, SyncTaskStatusEnum.friend_clerk_sync);
}
@Override
public void quartWxFriendClerk(String res) {
List<TabHaobanSyncTask> taskList = syncTaskService.listTaskByType(2);
if (CollectionUtils.isNotEmpty(taskList)) {
for (TabHaobanSyncTask tabHaobanSyncTask : taskList) {
dealWxFriendClerk(tabHaobanSyncTask.getTaskId(), tabHaobanSyncTask.getWxEnterpriseId());
}
}
}
/**
* 放入mq处理部门数据
*
* @param taskId
* @param dealList
*/
private void dealFriendToMq(String taskId, Set<String> dealList, SyncTaskStatusEnum syncTaskStatusEnum) {
//预处理分组任务
syncTaskService.updateTaskStatus(taskId, syncTaskStatusEnum.getVal());
List<String> listRet = dealList.stream().map(relationId -> {
DealParamMqDTO dealParamMqDTO = new DealParamMqDTO();
dealParamMqDTO.setTaskId(taskId);
dealParamMqDTO.setData(relationId);
dealParamMqDTO.setType(syncTaskStatusEnum.getVal());
return JSONObject.toJSONString(dealParamMqDTO);
}).collect(Collectors.toList());
GicMQClient clientInstance = GICMQClientUtil.getClientInstance();
try {
clientInstance.sendBatchMessages("friendSyncDealMq", listRet);
} catch (Exception e) {
logger.info("发送失败:{},{}", taskId, JSONObject.toJSONString(listRet), e);
}
}
@Override
public boolean getFreshFriendSyncTask(String wxEnterpriseId, String staffId) {
String staffLockKey = FRIEND_LOCK + staffId;
Object cache = RedisUtil.getCache(staffLockKey);
return null != cache;
}
@Override
public String createTagTask(String wxEnterpriseId, String addUser, String memberTagId) {
String lockKey = FRIEND_TAG_LOCK + "_lock_" + memberTagId;
String staffLockKey = FRIEND_TAG_LOCK + memberTagId;
RedisUtil.lock(lockKey, 2L);
Object cache = RedisUtil.getCache(staffLockKey);
if (null != cache) {
RedisUtil.unlock(lockKey);
return null;
}
TabHaobanSyncTask tabHaobanSyncTask = new TabHaobanSyncTask();
tabHaobanSyncTask.setAddUser(addUser);
tabHaobanSyncTask.setTaskName(SyncTaskTypeEnum.MEMBER_TAG.getTaskName());
tabHaobanSyncTask.setTaskDesc(memberTagId);
tabHaobanSyncTask.setWxEnterpriseId(wxEnterpriseId);
tabHaobanSyncTask.setStatusFlag(SyncTaskStatusEnum.init.getVal());
tabHaobanSyncTask.setTaskId(ToolUtil.randomUUID());
tabHaobanSyncTask.setTaskType(SyncTaskTypeEnum.MEMBER_TAG.getType());
syncTaskService.createTask(tabHaobanSyncTask);
RedisUtil.setCache(staffLockKey, tabHaobanSyncTask.getTaskId(), 1L, TimeUnit.HOURS);
RedisUtil.unlock(lockKey);
return tabHaobanSyncTask.getTaskId();
}
@Override
public void dealTagTask(String wxEnterpriseId, String enterpriseId, List<String> tagIds, String taskId) {
TabHaobanSyncTask syncTask = syncTaskService.getSyncTask(taskId);
if (CollectionUtils.isEmpty(tagIds)) {
syncTaskService.updateTaskStatus(taskId, SyncTaskStatusEnum.compute.getVal());
return;
}
List<TabHaobanPreDealLog> dealLogList = tagIds.stream().map(tagId -> {
TabHaobanPreDealLog dealLog = new TabHaobanPreDealLog();
dealLog.setDataId(tagId);
dealLog.setpDataId(syncTask.getTaskDesc());
dealLog.setDataType(PreDealTypeEnum.friend_clerk.getVal());
dealLog.setStatusFlag(0);
dealLog.setTaskId(taskId);
dealLog.setWxEnterpriseId(wxEnterpriseId);
return dealLog;
}).collect(Collectors.toList());
preDealService.insert(dealLogList);
Set<String> hashSet = dealLogList.stream().map(TabHaobanPreDealLog::getDataId).collect(Collectors.toSet());
dealDepartmentToMq(taskId, hashSet, SyncTaskStatusEnum.tag);
}
}
package com.gic.haoban.manage.service.service.out.impl;
import cn.hutool.core.convert.Convert;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.gic.commons.util.GICMQClientUtil;
import com.gic.commons.util.ToolUtil;
import com.gic.haoban.app.customer.enums.QywxTaskStatusEnum;
import com.gic.haoban.app.customer.service.api.service.QywxTagSyncApiService;
import com.gic.haoban.base.api.common.ServiceResponse;
import com.gic.haoban.common.utils.EntityUtil;
import com.gic.haoban.manage.api.dto.*;
import com.gic.haoban.manage.api.enums.QywxTagRelationSyncFlagEnum;
import com.gic.haoban.manage.api.enums.QywxTagRelationTypeEnum;
import com.gic.haoban.manage.api.service.QywxTagApiService;
import com.gic.haoban.manage.service.config.Config;
import com.gic.haoban.manage.service.entity.*;
import com.gic.haoban.manage.service.pojo.QywxSyncTagFormatPojo;
import com.gic.haoban.manage.service.service.ExternalClerkRelatedService;
import com.gic.haoban.manage.service.service.QywxTagService;
import com.gic.haoban.manage.service.service.StaffService;
import com.gic.haoban.manage.service.service.WxEnterpriseService;
import com.gic.member.api.dto.MemberTagDTO;
import com.gic.member.api.service.MemberTagService;
import com.gic.member.tag.api.dto.MemberTagItemDTO;
import com.gic.member.tag.api.service.MemberTagItemApiService;
import com.gic.mq.sdk.GicMQClient;
import com.gic.redis.data.util.RedisUtil;
import com.gic.wechat.api.dto.qywx.QywxTagDTO;
import com.gic.wechat.api.dto.qywx.QywxTagGroupDTO;
import com.gic.wechat.api.dto.qywx.response.QywxGetCorpTagListDTO;
import com.gic.wechat.api.dto.qywx.response.QywxResponseDTO;
import com.gic.wechat.api.service.qywx.QywxSuiteApiService;
import com.gic.wechat.api.service.qywx.QywxUserApiService;
import com.google.common.collect.Sets;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static org.slf4j.LoggerFactory.getLogger;
/**
* Created 2021/6/21.
*
* @author hua
*/
@Service
public class QywxTagApiServiceImpl implements QywxTagApiService {
private static final Logger logger = getLogger(QywxTagApiServiceImpl.class);
/**
* 限制次数
*/
private static final Integer MAX_TIMES = 3;
@Autowired
private QywxSuiteApiService qywxSuiteApiService;
@Autowired
private Config config;
@Autowired
private WxEnterpriseService wxEnterpriseService;
@Autowired
private QywxTagService qywxTagService;
@Autowired
private QywxUserApiService qywxUserApiService;
@Autowired
private ExternalClerkRelatedService externalClerkRelatedService;
@Autowired
private MemberTagService memberTagService;
@Autowired
private QywxTagSyncApiService qywxTagSyncApiService;
@Autowired
private MemberTagItemApiService memberTagItemApiService;
@Autowired
private StaffService staffService;
@Override
public void pullQywxTag(String wxEnterpriseId) {
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
if (null == qwDTO) {
logger.info("企业标签所在企业不存在");
return;
}
QywxGetCorpTagListDTO corpTagListResp = qywxSuiteApiService.getCorpTagList(qwDTO.getThirdCorpid(), config.getWxSuiteid(), null, -1);
if (corpTagListResp.getErrcode() != 0) {
logger.info("企业微信标签有问题:{}", wxEnterpriseId);
return;
}
//拉取保存所有标签
List<QywxTagGroupDTO> tagGroup = corpTagListResp.getTagGroup();
for (QywxTagGroupDTO groupDTO : tagGroup) {
qywxTagService.saveQywxTagByQywxGroupKey(wxEnterpriseId, groupDTO);
}
}
@Override
public ServiceResponse syncTagToQywx(String wxEnterpriseId, String enterpriseId, QywxTagInfoDTO infoDTO, List<QywxTagItemDTO> items) {
ServiceResponse ret = new ServiceResponse();
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
//调用企业微信接口保存
QywxGetCorpTagListDTO resp = this.saveQywxTag(qwDTO.getThirdCorpid(), infoDTO, items);
if (resp.getErrcode() != 0 && CollectionUtils.isEmpty(resp.getTagGroup())) {
logger.info("同步失败:{}", JSONObject.toJSONString(resp));
ret.setCode(resp.getErrcode());
ret.setMessage(resp.getErrmsg());
return ret;
}
//拉取保存所有标签
List<QywxTagGroupDTO> tagGroup = resp.getTagGroup();
QywxTagGroupDTO groupDTO = tagGroup.get(0);
//保存企业微信标签信息
Pair<TabQywxTag, List<TabQywxTagItem>> savePair = qywxTagService.saveQywxTagByQywxGroupKey(wxEnterpriseId, groupDTO);
if (null == savePair) {
logger.info("保存失败:{}", JSONObject.toJSONString(groupDTO));
ret.setCode(1);
ret.setMessage("保存企业微信标签失败");
return ret;
}
//保存关联关系
saveRelation(wxEnterpriseId, enterpriseId, infoDTO, items, savePair);
return ret;
}
/**
* 保存标签的关联关系
*
* @param wxEnterpriseId
* @param enterpriseId
* @param infoDTO
*/
private void saveRelation(String wxEnterpriseId, String enterpriseId, QywxTagInfoDTO infoDTO, List<QywxTagItemDTO> items, Pair<TabQywxTag, List<TabQywxTagItem>> localQywxTagPair) {
Map<String, QywxTagItemDTO> orgMap = items.stream().collect(Collectors.toMap(item -> item.getQywxTagName(), dto -> dto));
//设置关联关系
TabQywxTag groupKey = localQywxTagPair.getKey();
List<TabQywxTagItem> tabQywxTagItems = localQywxTagPair.getRight();
List<TabQywxTagRelation> saveRelationList = new ArrayList<>();
//如果存在qywxGroupKey 说明已经创建过了
if (StringUtils.isBlank(infoDTO.getQywxGroupKey())) {
TabQywxTagRelation groupRelation = new TabQywxTagRelation();
groupRelation.setEnterpriseId(enterpriseId);
groupRelation.setMemberTagId(infoDTO.getMemberTagId());
groupRelation.setQywxTagId(groupKey.getQywxTagId());
groupRelation.setRelationType(QywxTagRelationTypeEnum.TAG_GROUP.getType());
groupRelation.setStatusFlag(1);
groupRelation.setSyncFlag(QywxTagRelationSyncFlagEnum.PRE.getType());
groupRelation.setQywxTagRelationId(ToolUtil.randomUUID());
groupRelation.setWxEnterpriseId(wxEnterpriseId);
saveRelationList.add(groupRelation);
}
List<TabQywxTagRelation> itemList = tabQywxTagItems.stream().map(tab -> {
QywxTagItemDTO orgItem = orgMap.get(tab.getQywxTagName());
TabQywxTagRelation itemRelation = new TabQywxTagRelation();
itemRelation.setWxEnterpriseId(wxEnterpriseId);
itemRelation.setQywxTagRelationId(ToolUtil.randomUUID());
itemRelation.setSyncFlag(QywxTagRelationSyncFlagEnum.PRE.getType());
itemRelation.setStatusFlag(1);
itemRelation.setRelationType(QywxTagRelationTypeEnum.TAG_ITEM.getType());
itemRelation.setQywxTagId(groupKey.getQywxTagId());
itemRelation.setMemberTagId(infoDTO.getMemberTagId());
itemRelation.setEnterpriseId(enterpriseId);
itemRelation.setQywxTagItemId(tab.getQywxTagItemId());
itemRelation.setTagItemId(orgItem.getQywxTagKey());
return itemRelation;
}).collect(Collectors.toList());
saveRelationList.addAll(itemList);
qywxTagService.saveQywxRelation(saveRelationList);
}
/**
* 调用企业微信接口 保存标签
*
* @param wxEnterpriseDTO
* @param infoDTO
* @param items
* @return
*/
private QywxGetCorpTagListDTO saveQywxTag(String corpid, QywxTagInfoDTO infoDTO, List<QywxTagItemDTO> items) {
QywxTagGroupDTO qywxTagGroupDTO = new QywxTagGroupDTO();
qywxTagGroupDTO.setGroupName("GIC" + infoDTO.getQywxGroupName());
qywxTagGroupDTO.setOrder(infoDTO.getOrder());
qywxTagGroupDTO.setGroupId(infoDTO.getQywxGroupKey());
List<QywxTagDTO> tagItems = items.stream().map(item -> {
QywxTagDTO qywxTagDTO = new QywxTagDTO();
qywxTagDTO.setName(item.getQywxTagName());
qywxTagDTO.setOrder(item.getOrder());
return qywxTagDTO;
}).collect(Collectors.toList());
qywxTagGroupDTO.setTag(tagItems);
return qywxSuiteApiService.saveCorpTag(corpid, config.getWxSuiteid(), qywxTagGroupDTO);
}
@Override
public ServiceResponse closeSync(String wxEnterpriseId, String memberTagId) {
ServiceResponse resp = new ServiceResponse();
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
List<TabQywxTagRelation> tagRelations = qywxTagService.listQywxTagRelationByMemberTagId(wxEnterpriseId, memberTagId);
if (CollectionUtils.isEmpty(tagRelations)) {
return resp;
}
TabQywxTag tabQywxTag = qywxTagService.getQywxTagByQywxTagId(wxEnterpriseId, tagRelations.get(0).getQywxTagId());
//关闭同步
qywxTagService.closeSync(wxEnterpriseId, memberTagId);
List<String> delIds = new ArrayList<>();
delIds.add(tabQywxTag.getQywxGroupKey());
QywxResponseDTO responseDTO = qywxSuiteApiService.delCorpTag(qwDTO.getThirdCorpid(), config.getWxSuiteid(), delIds, 0);
logger.info("关闭同步:{}", JSONObject.toJSONString(responseDTO));
if (responseDTO.getErrcode() != 0) {
resp.setMessage(responseDTO.getErrmsg());
resp.setCode(responseDTO.getErrcode());
return resp;
}
qywxTagService.delQywxTag(tabQywxTag.getQywxGroupKey(), wxEnterpriseId);
return resp;
}
@Override
public ServiceResponse delGicTagItem(String wxEnterpriseId, String tagItemId) {
ServiceResponse resp = new ServiceResponse();
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
TabQywxTagRelation qywxTagRelation = qywxTagService.getQywxTagRelationByTagItemId(wxEnterpriseId, tagItemId);
if (null == qywxTagRelation) {
resp.setMessage("没有同步,无需删除");
return resp;
}
TabQywxTagItem qywxTagItem = qywxTagService.getQywxTagItemById(wxEnterpriseId, qywxTagRelation.getQywxTagItemId());
List<String> delIds = new ArrayList<>();
delIds.add(qywxTagItem.getQywxTagKey());
QywxResponseDTO responseDTO = qywxSuiteApiService.delCorpTag(qwDTO.getThirdCorpid(), config.getWxSuiteid(), delIds, 1);
logger.info("删除标签项:{}", JSONObject.toJSONString(responseDTO));
if (responseDTO.getErrcode() != 0) {
resp.setMessage(responseDTO.getErrmsg());
resp.setCode(responseDTO.getErrcode());
return resp;
}
//删除标签项 以及同步关系
qywxTagService.delQywxTagItemById(wxEnterpriseId, qywxTagItem.getQywxTagItemId());
qywxTagService.changeTagRelationStatus(qywxTagRelation.getQywxTagRelationId(), 0);
return resp;
}
@Override
public List<QywxTagRelationDTO> listAllByWxEnterpriseId(String wxEnterpriseId) {
List<TabQywxTagRelation> ret = qywxTagService.listAllQywxRelation(wxEnterpriseId);
return EntityUtil.changeEntityListByJSON(QywxTagRelationDTO.class, ret);
}
@Override
public void addQywxTag(QywxTagCallbackDTO callbackDTO) {
logger.info("企业微信新增标签回调:{}", JSONObject.toJSONString(callbackDTO));
if (!config.getWxSuiteid().equals(callbackDTO.getSuiteId())) {
logger.info("非第三方回调");
return;
}
TabHaobanWxEnterprise wxEnterpriseDto = wxEnterpriseService.getEnterpriseBycorpId(callbackDTO.getAuthCorpId());
if (null == wxEnterpriseDto) {
logger.info("企业不存在:{}", callbackDTO.getAuthCorpId());
return;
}
QywxTagRelationTypeEnum relationTypeEnum = QywxTagRelationTypeEnum.getByTagType(callbackDTO.getTagType());
if (relationTypeEnum == null) {
logger.error("未找到对应关系,{}", callbackDTO.getTagType());
return;
}
String wxEnterpriseId = wxEnterpriseDto.getWxEnterpriseId() ;
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
//标签组
if (Objects.equals(relationTypeEnum.getTagType(), QywxTagRelationTypeEnum.TAG_GROUP.getTagType())) {
logger.info("新增标签组无需操作:{}", callbackDTO.getTagId());
List<String> ids = new ArrayList<>();
ids.add(callbackDTO.getTagId());
QywxGetCorpTagListDTO tagDetail = qywxSuiteApiService.getCorpTagList(qwDTO.getThirdCorpid(), config.getWxSuiteid(), ids, QywxTagRelationTypeEnum.TAG_GROUP.getType());
if (tagDetail.getErrcode() != 0) {
logger.info("没有关联,无需操作:{}", JSONObject.toJSONString(tagDetail));
return;
}
QywxTagGroupDTO qywxTagGroupDTO = tagDetail.getTagGroup().get(0);
//保存标签项
qywxTagService.saveQywxTagByQywxGroupKey(wxEnterpriseDto.getWxEnterpriseId(), qywxTagGroupDTO);
//标签项
} else if (Objects.equals(relationTypeEnum.getTagType(), QywxTagRelationTypeEnum.TAG_ITEM.getTagType())) {
//查找对应的标签组 如果标签组关联了
List<String> ids = new ArrayList<>();
ids.add(callbackDTO.getTagId());
QywxGetCorpTagListDTO tagDetail = qywxSuiteApiService.getCorpTagList(qwDTO.getThirdCorpid(), config.getWxSuiteid(), ids, QywxTagRelationTypeEnum.TAG_ITEM.getType());
if (tagDetail.getErrcode() != 0) {
logger.info("查询失败,无需操作:{}", JSONObject.toJSONString(tagDetail));
return;
}
if (CollectionUtils.isEmpty(tagDetail.getTagGroup())) {
logger.info("标签组不存在:{}", JSONObject.toJSONString(tagDetail));
return;
}
QywxTagGroupDTO qywxTagGroupDTO = tagDetail.getTagGroup().get(0);
//保存标签项
qywxTagService.saveQywxTagByQywxGroupKey(wxEnterpriseDto.getWxEnterpriseId(), qywxTagGroupDTO);
}
}
@Override
public void delQywxTag(QywxTagCallbackDTO callbackDTO) {
logger.info("企业微信删除标签回调:{}", JSONObject.toJSONString(callbackDTO));
if (!config.getWxSuiteid().equals(callbackDTO.getSuiteId())) {
logger.info("非第三方回调");
return;
}
TabHaobanWxEnterprise wxEnterpriseDto = wxEnterpriseService.getEnterpriseBycorpId(callbackDTO.getAuthCorpId());
if (null == wxEnterpriseDto) {
logger.info("企业不存在:{}", callbackDTO.getAuthCorpId());
return;
}
QywxTagRelationTypeEnum relationTypeEnum = QywxTagRelationTypeEnum.getByTagType(callbackDTO.getTagType());
if (relationTypeEnum == null) {
logger.error("未找到对应关系,{}", callbackDTO.getTagType());
return;
}
//标签组
if (Objects.equals(relationTypeEnum.getTagType(), QywxTagRelationTypeEnum.TAG_GROUP.getTagType())) {
TabQywxTag qywxGroupKey = qywxTagService.getQywxTagByQywxGroupKey(wxEnterpriseDto.getWxEnterpriseId(), callbackDTO.getTagId());
if (null == qywxGroupKey) {
logger.info("原型不存在,不需要处理");
return;
}
List<TabQywxTagRelation> relations = qywxTagService.listQywxTagRelationByQywxTagId(wxEnterpriseDto.getWxEnterpriseId(), qywxGroupKey.getQywxTagId());
//没有同步的关系 删除保存企业微信标签
if (CollectionUtils.isEmpty(relations)) {
logger.info("删除保存的企业微信标签");
qywxTagService.delQywxTag(callbackDTO.getTagId(), wxEnterpriseDto.getWxEnterpriseId());
return;
}
TabQywxTagRelation relation = relations.stream().findFirst().get();
logger.info("删除标签组 关闭同步:{}", relation.getMemberTagId());
//删除同步 关闭同步
qywxTagService.closeSync(wxEnterpriseDto.getWxEnterpriseId(), relation.getMemberTagId());
qywxTagService.delQywxTag(callbackDTO.getTagId(), wxEnterpriseDto.getWxEnterpriseId());
saveCloseTask(qywxGroupKey.getQywxGroupName().substring(3), "-1", relation.getWxEnterpriseId(), relation.getEnterpriseId());
//标签项
} else if (Objects.equals(relationTypeEnum.getTagType(), QywxTagRelationTypeEnum.TAG_ITEM.getTagType())) {
TabQywxTagRelation qywxTagRelation = qywxTagService.getQywxTagRelationByQywxKey(wxEnterpriseDto.getWxEnterpriseId(), callbackDTO.getTagId(), QywxTagRelationTypeEnum.TAG_ITEM.getType());
if (null == qywxTagRelation) {
logger.info("没有关联,无需操作");
qywxTagService.delQywxTagItemById(wxEnterpriseDto.getWxEnterpriseId(), qywxTagRelation.getQywxTagItemId());
return;
}
logger.info("删除标签 关闭同步:{}", qywxTagRelation.getMemberTagId());
//删除同步 关闭同步
this.closeSync(wxEnterpriseDto.getWxEnterpriseId(), qywxTagRelation.getMemberTagId());
TabQywxTag tabQywxTag = qywxTagService.getQywxTagByQywxTagId(qywxTagRelation.getWxEnterpriseId(), qywxTagRelation.getQywxTagId());
saveCloseTask(tabQywxTag.getQywxGroupName(), "-1", qywxTagRelation.getWxEnterpriseId(), qywxTagRelation.getEnterpriseId());
}
}
private void saveCloseTask(String tagName, String staffId, String wxEnterpriseId, String enterpriseId) {
String content = tagName + "-关闭标签同步成功";
qywxTagSyncApiService.saveCloseTask(staffId, wxEnterpriseId, enterpriseId, content, QywxTaskStatusEnum.ALL_SUCCESS.getType());
}
@Override
public void editQywxTag(QywxTagCallbackDTO callbackDTO) {
logger.info("企业微信修改标签回调:{}", JSONObject.toJSONString(callbackDTO));
if (!config.getWxSuiteid().equals(callbackDTO.getSuiteId())) {
logger.info("非第三方回调");
return;
}
TabHaobanWxEnterprise wxEnterpriseDto = wxEnterpriseService.getEnterpriseBycorpId(callbackDTO.getAuthCorpId());
if (null == wxEnterpriseDto) {
logger.info("企业不存在:{}", callbackDTO.getAuthCorpId());
return;
}
QywxTagRelationTypeEnum relationTypeEnum = QywxTagRelationTypeEnum.getByTagType(callbackDTO.getTagType());
if (relationTypeEnum == null) {
logger.error("未找到对应关系,{}", callbackDTO.getTagType());
return;
}
String wxEnterpriseId = wxEnterpriseDto.getWxEnterpriseId() ;
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
//标签组
if (Objects.equals(relationTypeEnum.getTagType(), QywxTagRelationTypeEnum.TAG_GROUP.getTagType())) {
//判断是否存在关联 存在需要同步回去
TabQywxTagRelation relaton = qywxTagService.getQywxTagRelationByQywxKey(wxEnterpriseDto.getWxEnterpriseId(), callbackDTO.getTagId(), QywxTagRelationTypeEnum.TAG_GROUP.getType());
if (null == relaton) {
logger.info("原型不存在,不需要处理");
return;
}
//名称同步回去
TabQywxTag qywxGroupKey = qywxTagService.getQywxTagByQywxGroupKey(wxEnterpriseDto.getWxEnterpriseId(), callbackDTO.getTagId());
QywxTagDTO qywxTagDTO = new QywxTagDTO();
qywxTagDTO.setId(callbackDTO.getTagId());
qywxTagDTO.setName(qywxGroupKey.getQywxGroupName());
qywxTagDTO.setOrder(qywxGroupKey.getOrder());
qywxSuiteApiService.editCorpTagNameOrOrder(qwDTO.getThirdCorpid(), config.getWxSuiteid(), qywxTagDTO);
//标签项
} else if (Objects.equals(relationTypeEnum.getTagType(), QywxTagRelationTypeEnum.TAG_ITEM.getTagType())) {
TabQywxTagItem qywxTagItem = qywxTagService.getQywxTagItemByQywxItemKey(wxEnterpriseDto.getWxEnterpriseId(), callbackDTO.getTagId());
if (null == qywxTagItem) {
logger.info("没有关联,无需操作");
return;
}
List<TabQywxTagRelation> relations = qywxTagService.listQywxTagRelationByQywxTagId(wxEnterpriseDto.getWxEnterpriseId(), qywxTagItem.getQywxTagId());
if (CollectionUtils.isEmpty(relations)) {
logger.info("直接删除标签项");
qywxTagService.delQywxTagItemById(wxEnterpriseDto.getWxEnterpriseId(), qywxTagItem.getQywxTagItemId());
return;
}
//名称同步回去
QywxTagDTO qywxTagDTO = new QywxTagDTO();
qywxTagDTO.setId(callbackDTO.getTagId());
qywxTagDTO.setName(qywxTagItem.getQywxTagName());
qywxTagDTO.setOrder(qywxTagItem.getOrder());
qywxSuiteApiService.editCorpTagNameOrOrder(qwDTO.getThirdCorpid(), config.getWxSuiteid(), qywxTagDTO);
}
}
@Override
public ServiceResponse syncFriendTagToQywxByExternalUserId(String wxEnterpriseId, String enterpriseId, String externalUserId, List<String> tagItemIds) {
logger.info("同步好友标签到企业微信:{},{},{},{}", wxEnterpriseId, enterpriseId, externalUserId, JSONObject.toJSONString(tagItemIds));
ServiceResponse resp = new ServiceResponse();
//获取需要同步的标签
QywxSyncTagFormatPojo syncTagFormat = listSyncTagItems(wxEnterpriseId);
if (syncTagFormat == null) {
logger.info("没有需要同步的标签");
resp.setCode(2);
resp.setMessage("没有要同步的标签");
return resp;
}
//该会员要同步的打的企业微信标签 该商户下
Set<String> entQywxTagKeys = tagItemIds.stream().filter(tagItemId -> syncTagFormat.getGicToQywxTagItemIdMap().containsKey(tagItemId))
.map(tagItemId -> syncTagFormat.getGicToQywxTagItemIdMap().get(tagItemId)).collect(Collectors.toSet());
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
//查询外部联系人
String wxSuiteid = config.getWxSuiteid();
String externalUseridInfo = qywxUserApiService.getExternalUseridInfo(qwDTO.getThirdCorpid(), wxSuiteid, externalUserId);
if (StringUtils.isBlank(externalUseridInfo)) {
logger.info("好友不存在");
resp.setCode(3);
resp.setMessage("好友不存在");
return resp;
} else if (externalUseridInfo.equals("1")) {
logger.info("限制次数");
resp.setCode(45033);
resp.setMessage("getExternalUseridInfo接口次数限制");
return resp;
}
Map<String, Set<String>> externalTagMap = getExternalTagMap(externalUseridInfo, wxEnterpriseId);
if (null == externalTagMap) {
logger.info("没有好友需要同步");
resp.setCode(5);
resp.setMessage("没有好友需要同步");
return resp;
}
//商户下设置同步的企业微信标签keys
Set<String> entQywxTagSyncKeys = syncTagFormat.getEntQywxTagKeysMap().get(enterpriseId);
if (CollectionUtils.isEmpty(entQywxTagSyncKeys)) {
logger.info("该商户下没有标签");
resp.setCode(6);
resp.setMessage("该商户下没有标签");
return resp;
}
//同步好友
externalTagMap.forEach((wxUserId, haveTagKes) -> {
//该用户在该商户下打的标签
Sets.SetView<String> entHasSetQywxTagKeys = Sets.intersection(haveTagKes, entQywxTagSyncKeys);
//获取需要打的标签
Sets.SetView<String> needSetTags = Sets.difference(entQywxTagKeys, entHasSetQywxTagKeys);
//需要删除的标签
Sets.SetView<String> needDelTags = Sets.difference(entHasSetQywxTagKeys, entQywxTagKeys);
logger.info("该用户打标签:{}",wxUserId);
if (CollectionUtils.isEmpty(needDelTags) && CollectionUtils.isEmpty(needSetTags)) {
logger.info("不需要操作:{},{}", wxUserId, externalUserId);
return;
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("corpid", qwDTO.getThirdCorpid());
jsonObject.put("suiteId", wxSuiteid);
jsonObject.put("wxUserId", wxUserId);
jsonObject.put("externalUserId", externalUserId);
if (CollectionUtils.isNotEmpty(needSetTags)) {
jsonObject.put("needSetTags", StringUtils.join(needSetTags, ","));
}
if (CollectionUtils.isNotEmpty(needDelTags)) {
jsonObject.put("needDelTags", StringUtils.join(needDelTags, ","));
}
GicMQClient clientInstance = GICMQClientUtil.getClientInstance();
try {
logger.info("qywxMarkTagMq 该用户打标签:{}",jsonObject.toJSONString());
clientInstance.sendMessage("qywxMarkTagMq", jsonObject.toJSONString());
} catch (Exception e) {
logger.info("企微标签同步qywxMarkTagMq发送失败:{}", e.getMessage(), e);
}
});
return resp;
}
/**
* 获取以及同步的标签序列表
*/
private QywxSyncTagFormatPojo listSyncTagItems(String wxEnterpriseId) {
QywxSyncTagFormatPojo pojo = new QywxSyncTagFormatPojo();
List<TabQywxTagRelation> relations = qywxTagService.listAllQywxRelation(wxEnterpriseId);
if (CollectionUtils.isEmpty(relations)) {
return null;
}
//企业微信标签key 关联对应的 gic标签关系
Map<String, TabQywxTagRelation> relationMap = relations.stream().filter(dto -> dto.getRelationType() == QywxTagRelationTypeEnum.TAG_ITEM.getType()).collect(Collectors.toMap(dto -> dto.getQywxTagItemId(), dto -> dto));
if (MapUtils.isEmpty(relationMap)) {
return null;
}
List<String> syncTagItemsIds = relationMap.keySet().stream().collect(Collectors.toList());
//同步的标签项
List<TabQywxTagItem> tagItems = qywxTagService.listQywxTagItemByIds(wxEnterpriseId, syncTagItemsIds);
//企业微信标签id 对应的标签
Map<String, TabQywxTagItem> qywxTagItemMap = tagItems.stream().collect(Collectors.toMap(dto -> dto.getQywxTagItemId(), dto -> dto));
//企业微信标签与gic标签id的对应关系
Map<String, String> qywxToGicTagItemIdMap = syncTagItemsIds.stream().collect(Collectors.toMap(qywxTagId -> qywxTagItemMap.get(qywxTagId).getQywxTagKey(), qywxTagId -> relationMap.get(qywxTagId).getTagItemId()));
//gic标签与企业微信标签id的对应关系
Map<String, String> gicToQywxTagItemIdMap = syncTagItemsIds.stream().collect(Collectors.toMap(qywxTagId -> relationMap.get(qywxTagId).getTagItemId(), qywxTagId -> qywxTagItemMap.get(qywxTagId).getQywxTagKey()));
//gic商户对应的已经同步的gic标签项列表
Map<String, Set<String>> entGicTagItemIdMap = relations.stream().filter(dto -> dto.getRelationType() == QywxTagRelationTypeEnum.TAG_ITEM.getType())
.collect(Collectors.groupingBy(dto -> dto.getEnterpriseId(), Collectors.mapping(dto -> dto.getTagItemId(), Collectors.toSet())));
//gic商户对应的已经同步的企业微信表亲列表
Map<String, Set<String>> entQywxTagKeysMap = relations.stream().filter(dto -> dto.getRelationType() == QywxTagRelationTypeEnum.TAG_ITEM.getType())
.collect(Collectors.groupingBy(dto -> dto.getEnterpriseId(), Collectors.mapping(dto -> gicToQywxTagItemIdMap.get(dto.getTagItemId()), Collectors.toSet())));
pojo.setEntGicTagItemIdMap(entGicTagItemIdMap);
pojo.setEntQywxTagKeysMap(entQywxTagKeysMap);
pojo.setGicToQywxTagItemIdMap(gicToQywxTagItemIdMap);
pojo.setQywxToGicTagItemIdMap(qywxToGicTagItemIdMap);
return pojo;
}
@Override
public ServiceResponse syncQywxTagToGicByExternalUserId(String wxEnterpriseId, String externalUserId, String wxUserId) {
//刷新标签的时候不允许同步
ServiceResponse resp = new ServiceResponse();
//所有以及关联同步的标签
QywxSyncTagFormatPojo syncTagFormatPojo = listSyncTagItems(wxEnterpriseId);
if (syncTagFormatPojo == null) {
logger.info("没有需要同步的标签,wxUserId:{},externalUserId:{},wxId:{}", wxUserId, externalUserId, wxEnterpriseId);
resp.setMessage("没有需要同步的标签");
return resp;
}
//企业微信同步的标签key
Set<String> qywxTagKeys = syncTagFormatPojo.getQywxToGicTagItemIdMap().keySet();
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
//查询外部联系人
String externalUseridInfo = qywxUserApiService.getExternalUseridInfo(qwDTO.getThirdCorpid() , config.getWxSuiteid(), externalUserId);
if (StringUtils.isBlank(externalUseridInfo)) {
logger.info("好友不存在");
resp.setCode(2);
resp.setMessage("好友不存在");
return resp;
} else if (externalUseridInfo.equals("1")) {
logger.info("限制次数");
resp.setCode(45033);
resp.setMessage("限制次数");
return resp;
}
Map<String, Set<String>> externalTagMap = getExternalTagMap(externalUseridInfo, wxEnterpriseId);
if (MapUtils.isEmpty(externalTagMap)) {
logger.info("该用户没有不存在好友关系,获取不到关联导购打的标签,:externalUseridInfo:{}", externalUseridInfo);
resp.setMessage("该用户没有不存在好友关系,获取不到关联导购打的标签");
return resp;
}
//当前操作用户企业打的标签
Set<String> staffChangeTagKeys = externalTagMap.get(wxUserId);
if (CollectionUtils.isEmpty(staffChangeTagKeys)) {
logger.info("该用户没有不存在好友关系,获取不到关联导购打的标签,wxUserId:{}", wxUserId);
resp.setMessage("该用户没有不存在好友关系,获取不到关联导购打的标签");
return resp;
}
Sets.SetView<String> staffHasSetTagKeys = Sets.intersection(staffChangeTagKeys, qywxTagKeys);
//获取该外部联系人的所有会员
List<TabHaobanExternalClerkRelated> clerkRelateds = externalClerkRelatedService.listExternalByExternalUserid(wxEnterpriseId, externalUserId);
if (CollectionUtils.isEmpty(clerkRelateds)) {
logger.info("该用户没关联对应的好友:{}", externalUserId);
resp.setMessage("该用户没关联对应的好友");
return resp;
}
//企业下的企业微信标签对应关系
Map<String, Set<String>> entQywxTagKeysMap = syncTagFormatPojo.getEntQywxTagKeysMap();
Map<String, Set<String>> entGicTagItemIdMap = syncTagFormatPojo.getEntGicTagItemIdMap();
List<String> hasSaveMemberId = new ArrayList<>();
for (TabHaobanExternalClerkRelated clerkRelated : clerkRelateds) {
logger.info("需要处理的好友:{}", JSONObject.toJSONString(clerkRelated));
//该会员在该企业已经同步 无需同步
if (hasSaveMemberId.contains(clerkRelated.getMemberId())) {
continue;
}
hasSaveMemberId.add(clerkRelated.getMemberId());
//该会员所在企业下 配置的同步的标签列表
Set<String> entQywxSyncTagKeys = entQywxTagKeysMap.get(clerkRelated.getEnterpriseId());
Set<String> entQywxSyncTagItemIds = entGicTagItemIdMap.get(clerkRelated.getEnterpriseId());
if (CollectionUtils.isEmpty(entQywxSyncTagKeys)) {
logger.info("该企业下没有配置需要同步的:{},{}", externalUserId, clerkRelated.getEnterpriseId());
continue;
}
String memberId = externalClerkRelatedService.checkAndUpdateMemberByUnonId(clerkRelated.getEnterpriseId(), clerkRelated.getMemberId(), clerkRelated.getUnionid());
if (null == memberId) {
logger.info("会员不存在:{}", externalUserId);
continue;
}
//该会员打的标签
List<MemberTagDTO> gicItems = memberTagService.listMemberTag(clerkRelated.getEnterpriseId(), memberId);
Set<String> noSyncTagItemIds = new HashSet<>();
if (!CollectionUtils.isEmpty(gicItems)) {
noSyncTagItemIds = gicItems.stream().filter(item -> !entQywxSyncTagItemIds.contains(item.getTagsId())).map(dto -> dto.getTagsId()).collect(Collectors.toSet());
logger.info("没有同步的标签:{}", JSONObject.toJSONString(noSyncTagItemIds));
}
//该企业下会员需要设置的标签
Sets.SetView<String> entMemberNeedSetQywxKeys = Sets.intersection(staffHasSetTagKeys, entQywxSyncTagKeys);
Set<String> saveTagIds = entMemberNeedSetQywxKeys.stream().map(qywxKey -> syncTagFormatPojo.getQywxToGicTagItemIdMap().get(qywxKey)).collect(Collectors.toSet());
saveTagIds.addAll(noSyncTagItemIds);
logger.info("该企业会员需要打的标签:{}", JSONObject.toJSONString(entMemberNeedSetQywxKeys));
//更新标签 会自动同步
if (CollectionUtils.isEmpty(saveTagIds)) {
saveMemberTags(new HashSet<>(), clerkRelated.getEnterpriseId(), memberId, clerkRelated.getClerkId());
} else {
saveMemberTags(saveTagIds, clerkRelated.getEnterpriseId(), memberId, clerkRelated.getClerkId());
}
}
return resp;
}
private void saveMemberTags(Set<String> tagItemIds, String enterpriseId, String memberId, String clerkId) {
List<MemberTagDTO> list = tagItemIds.stream().map(tagId -> {
MemberTagDTO memberTagDTO = new MemberTagDTO();
memberTagDTO.setTagsId(tagId);
memberTagDTO.setEnterpriseId(enterpriseId);
memberTagDTO.setMemberId(memberId);
memberTagDTO.setClerkId(clerkId);
return memberTagDTO;
}).collect(Collectors.toList());
logger.info("会员打标签:{}", JSONObject.toJSONString(list));
if (CollectionUtils.isEmpty(list)) {
logger.info("会员打标签list为空");
return;
}
memberTagService.saveOrUpdateMemberTagHB(enterpriseId, list, memberId);
}
/**
* 获取企业微信的外部联系人的所有联系关系
*
* @param externalUseridInfo
* @return
*/
private Map<String, Set<String>> getExternalTagMap(String externalUseridInfo, String wxEnterpriseId) {
logger.info("externalUseridInfo:{}", externalUseridInfo);
Map<String, Set<String>> ret = new HashMap<>();
JSONObject jsonObject = JSONObject.parseObject(externalUseridInfo);
if (!jsonObject.containsKey("follow_user")) {
logger.info("没有相关的好友");
return null;
}
JSONArray followUser = jsonObject.getJSONArray("follow_user");
for (int i = 0; i < followUser.size(); i++) {
JSONObject midUser = followUser.getJSONObject(i);
String wxUserId = midUser.getString("userid");
//做兼容
TabHaobanStaff staff = staffService.selectByUserIdAndEnterpriseId(wxUserId, wxEnterpriseId);
if (staff != null) {
logger.info("旧wxUserId:{}", wxUserId);
wxUserId = staff.getWxUserId();
logger.info("新wxUserId:{}", wxUserId);
}
Set<String> midTagIds = new HashSet<>();
if (!midUser.containsKey("tags")) {
ret.put(wxUserId, midTagIds);
continue;
}
JSONArray tags = midUser.getJSONArray("tags");
for (int n = 0; n < tags.size(); n++) {
JSONObject tagMid = tags.getJSONObject(n);
String tagId = tagMid.getString("tag_id");
String tagType = tagMid.getString("type");
if (tagType.equals("1")) {
midTagIds.add(tagId);
}
}
ret.put(wxUserId, midTagIds);
}
return ret;
}
@Override
public void changeQywxTagStatus(String memberTagId, String wxEnterpriseId, int status) {
qywxTagService.changeRelationSyncFlagByMemberTagId(wxEnterpriseId, memberTagId, status);
}
@Override
public boolean saveRelation(String wxEnterpriseId, String enterpriseId, List<String> memberTagIds) {
if (CollectionUtils.isEmpty(memberTagIds)) {
return false;
}
return false;
}
@Override
public ServiceResponse renameQywxTag(String wxEnterpriseId, String id, String name, Integer type) {
ServiceResponse resp = new ServiceResponse();
String renameQywxKey = null;
Long order = null;
String relationId = null;
//标签组
if (type == QywxTagRelationTypeEnum.TAG_GROUP.getType()) {
TabQywxTag tabQywxTag = qywxTagService.getQywxTagByQywxTagId(wxEnterpriseId, id);
if (null == tabQywxTag) {
resp.setMessage("没有关联无需处理");
return resp;
}
renameQywxKey = tabQywxTag.getQywxGroupKey();
order = tabQywxTag.getOrder();
name = "GIC" + name;
relationId = tabQywxTag.getQywxTagId();
} else if (type == QywxTagRelationTypeEnum.TAG_ITEM.getType()) {
TabQywxTagItem qywxTagItem = qywxTagService.getQywxTagItemById(wxEnterpriseId, id);
if (null == qywxTagItem) {
resp.setMessage("没有关联无需处理");
return resp;
}
renameQywxKey = qywxTagItem.getQywxTagKey();
order = qywxTagItem.getOrder();
relationId = qywxTagItem.getQywxTagItemId();
}
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
//名称同步回去
QywxTagDTO qywxTagDTO = new QywxTagDTO();
qywxTagDTO.setId(renameQywxKey);
qywxTagDTO.setName(name);
qywxTagDTO.setOrder(order);
QywxResponseDTO responseDTO = qywxSuiteApiService.editCorpTagNameOrOrder(qwDTO.getThirdCorpid(), config.getWxSuiteid(), qywxTagDTO);
logger.info("同步名称:{}", JSONObject.toJSONString(responseDTO));
if (responseDTO.getErrcode() != 0) {
resp.setMessage(responseDTO.getErrmsg());
resp.setCode(responseDTO.getErrcode());
}
qywxTagService.saveQywxTagOrTagItemName(relationId, name, type);
return resp;
}
@Override
public List<QywxTagRelationDTO> listQywxTagRelationByMemberTagId(String wxEnterpriseId, String memberTagId) {
List<TabQywxTagRelation> tagRelations = qywxTagService.listQywxTagRelationByMemberTagId(wxEnterpriseId, memberTagId);
return EntityUtil.changeEntityListByJSON(QywxTagRelationDTO.class, tagRelations);
}
@Override
public QywxTagRelationDTO getQywxTagRelationByRelationId(String relationId) {
TabQywxTagRelation tagRelation = qywxTagService.getQywxTagRelationById(relationId);
return EntityUtil.changeEntityByJSON(QywxTagRelationDTO.class, tagRelation);
}
@Override
public QywxTagInfoDTO getQywxTagByQywxTagId(String qywxTagId) {
TabQywxTag tabQywxTag = qywxTagService.getQywxTagByQywxTagId(null, qywxTagId);
return EntityUtil.changeEntityByJSON(QywxTagInfoDTO.class, tabQywxTag);
}
@Override
public void updateQywxTagRelationSyncStatusByTagItemId(String wxEnterpriseId, String tagItemId) {
qywxTagService.changeRelationSyncFlagByTagItemId(wxEnterpriseId, tagItemId, 2);
}
@Override
public void checkQywxSync(String params) {
List<TabHaobanWxEnterprise> wxEnterprises = wxEnterpriseService.listAll();
wxEnterprises.forEach(wxEnterprise -> {
logger.info("企业:{}", wxEnterprise.getWxEnterpriseId());
try {
List<TabQywxTagRelation> tagRelations = qywxTagService.listAllQywxRelation(wxEnterprise.getWxEnterpriseId());
if (CollectionUtils.isEmpty(tagRelations)) {
logger.info("无需校验: 没有要同步的企业");
return;
}
QywxSyncTagFormatPojo pojo = this.listSyncTagItems(wxEnterprise.getWxEnterpriseId());
List<TabQywxTagRelation> qywxTagRelations = tagRelations.stream().filter(dto -> dto.getRelationType() == QywxTagRelationTypeEnum.TAG_GROUP.getType()).collect(Collectors.toList());
for (TabQywxTagRelation qywxTagRelation : qywxTagRelations) {
Map<String, Object> map = checkQywxSyncByQywxTag(qywxTagRelation, wxEnterprise, pojo);
if (MapUtils.isNotEmpty(map)) {
logger.error("企微与好办同步标签不相同:{}", JSON.toJSONString(map));
}
}
} catch (Exception e) {
logger.info("校验异常:{}", e);
}
});
}
/**
* 校验
*
* @param relation
* @param wxEnterprise
*/
private LinkedHashMap<String, Object> checkQywxSyncByQywxTag(TabQywxTagRelation relation, TabHaobanWxEnterprise wxEnterprise, QywxSyncTagFormatPojo pojo) {
LinkedHashMap<String, Object> ret = new LinkedHashMap<>();
boolean flag = false;
ret.put("hb标签id", relation.getQywxTagId());
TabQywxTag tabQywxTag = qywxTagService.getQywxTagByQywxTagId(relation.getWxEnterpriseId(), relation.getQywxTagId());
if (null == tabQywxTag) {
logger.info("数据库不存在该企业微信标签:{}", relation.getQywxTagId());
ret.put("描述", "标签数据库不存在:" + relation.getTagItemId());
return ret;
}
ret.put("名称(标签)", tabQywxTag.getQywxGroupName());
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(relation.getWxEnterpriseId()) ;
List<String> ids = new ArrayList<>();
ids.add(tabQywxTag.getQywxGroupKey());
QywxGetCorpTagListDTO tagDetail = qywxSuiteApiService.getCorpTagList(qwDTO.getThirdCorpid(), config.getWxSuiteid(), ids, QywxTagRelationTypeEnum.TAG_GROUP.getType());
if (tagDetail.getErrcode() != 0) {
logger.info("查询失败,无需操作:{}", JSONObject.toJSONString(tagDetail));
ret.put("描述", "查询失败:" + tagDetail.getErrmsg());
return ret;
}
if (CollectionUtils.isEmpty(tagDetail.getTagGroup())) {
logger.info("标签组不存在:{}", JSONObject.toJSONString(tagDetail));
ret.put("描述", "标签组不存在:" + tabQywxTag.getQywxGroupName());
return ret;
}
//获取该标签已经绑定的标签项key
Map<String, String> qywxToGicTagItemIdMap = pojo.getQywxToGicTagItemIdMap();
List<TabQywxTagItem> gicQywxSyncTagItems = qywxTagService.listByQywxTagId(wxEnterprise.getWxEnterpriseId(), relation.getQywxTagId());
Map<String, String> gicQywxTagNameMap = gicQywxSyncTagItems.stream().filter(tab -> qywxToGicTagItemIdMap.containsKey(tab.getQywxTagKey())).collect(Collectors.toMap(mid -> mid.getQywxTagKey(), mid -> mid.getQywxTagName()));
if (CollectionUtils.isEmpty(gicQywxSyncTagItems)) {
logger.info("gic同步企业微信标签异常");
ret.put("描述", "gic同步企业微信标签异常:" + tabQywxTag.getQywxGroupName());
return ret;
}
Set<String> gicQywxKeysSet = gicQywxTagNameMap.keySet();
//获取企业微信的标签项key
QywxTagGroupDTO qywxTagGroupDTO = tagDetail.getTagGroup().get(0);
List<QywxTagDTO> tagItems = qywxTagGroupDTO.getTag();
if (CollectionUtils.isEmpty(tagItems)) {
ret.put("描述", "企业微信标签项空:" + tabQywxTag.getQywxGroupName());
return ret;
}
Map<String, QywxTagDTO> qywxTagDTOMap = tagItems.stream().collect(Collectors.toMap(dto -> dto.getId(), dto -> dto));
Set<String> qywxKeysSet = qywxTagDTOMap.keySet();
//gic没有同步的标签项
Map<String, String> gicToQywxTagItemIdMap = pojo.getGicToQywxTagItemIdMap();
List<MemberTagItemDTO> gicTagItems = memberTagItemApiService.getItemListByTagId(relation.getMemberTagId());
Set<MemberTagItemDTO> noSyncTags = gicTagItems.stream().filter(dto -> !gicToQywxTagItemIdMap.containsKey(dto.getTagItemId())).collect(Collectors.toSet());
//在gic存在 企业微信不存在
Sets.SetView<String> qywxUnHaves = Sets.difference(gicQywxKeysSet, qywxKeysSet);
//企业微信存在 gic不存在
Sets.SetView<String> gicUnHaves = Sets.difference(qywxKeysSet, gicQywxKeysSet);
ret.put("现企微标签项", tagItems.stream().map(dto -> dto.getName()).collect(Collectors.joining("],[", "[", "]")));
ret.put("现gic标签项", gicTagItems.stream().map(dto -> dto.getTagItemName()).collect(Collectors.joining("],[", "[", "]")));
//企业微信缺少
if (!CollectionUtils.isEmpty(qywxUnHaves)) {
flag = true;
ret.put("标签项缺少(企微)", qywxUnHaves.stream().map(mid -> gicQywxTagNameMap.get(mid)).collect(Collectors.joining("],[", "[", "]")));
}
//未同步标签项
if (!CollectionUtils.isEmpty(noSyncTags)) {
flag = true;
ret.put("标签项未同步", noSyncTags.stream().map(mid -> mid.getTagItemName()).collect(Collectors.joining("],[", "[", "]")));
}
//gic缺少
if (!CollectionUtils.isEmpty(gicUnHaves)) {
flag = true;
ret.put("标签项缺少(gic)", gicUnHaves.stream().map(id -> qywxTagDTOMap.get(id).getName()).collect(Collectors.joining("],[", "[", "]")));
}
if (flag) {
return ret;
}
return null;
}
@Override
public void qywxMarkTag(String param) {
if (StringUtils.isBlank(param)) {
logger.info("标签数据为空");
return;
}
logger.info("企微标签同步:{}",param);
JSONObject jsonObject = JSON.parseObject(param);
String corpid = jsonObject.getString("corpid");
String suiteId = jsonObject.getString("suiteId");
String wxUserId = jsonObject.getString("wxUserId");
String externalUserId = jsonObject.getString("externalUserId");
String needSetTags = jsonObject.getString("needSetTags");
String needDelTags = jsonObject.getString("needDelTags");
String key = "HAOBAN:QYWX:TAG:" + wxUserId + externalUserId;
Integer currentTimes = Convert.toInt(RedisUtil.getCache(key), 0);
if (currentTimes > MAX_TIMES) {
logger.error("企微打标签超过最大次数,key:{}", key);
return;
}
List<String> needSetTagList = new ArrayList<>();
List<String> needDelTagList = new ArrayList<>();
if (StringUtils.isNotBlank(needSetTags)) {
needSetTagList = Arrays.asList(needSetTags.split(","));
}
if (StringUtils.isNotBlank(needDelTags)) {
needDelTagList = Arrays.asList(needDelTags.split(","));
}
QywxResponseDTO responseDTO = qywxUserApiService.markTag(corpid, suiteId, wxUserId, externalUserId, needSetTagList, needDelTagList);
logger.info("操作返回:{}", JSONObject.toJSONString(responseDTO));
if (responseDTO.getErrcode() != 0) {
logger.info("权限不对,重试三次:{},{}", wxUserId, externalUserId);
GicMQClient clientInstance = GICMQClientUtil.getClientInstance();
try {
clientInstance.sendMessage("qywxMarkTagMq", jsonObject.toJSONString(), 30);
} catch (Exception e) {
logger.info("企微标签同步qywxMarkTagMq发送失败:{}", e.getMessage(), e);
}
RedisUtil.setCache(key, currentTimes + 1, 2L, TimeUnit.HOURS);
}
}
}
package com.gic.haoban.manage.service.service.out.impl;
import cn.hutool.core.convert.Convert;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.gic.commons.util.GICMQClientUtil;
import com.gic.commons.util.ToolUtil;
import com.gic.haoban.app.customer.enums.QywxTaskStatusEnum;
import com.gic.haoban.app.customer.service.api.service.QywxTagSyncApiService;
import com.gic.haoban.base.api.common.ServiceResponse;
import com.gic.haoban.common.utils.EntityUtil;
import com.gic.haoban.manage.api.dto.*;
import com.gic.haoban.manage.api.enums.QywxTagRelationSyncFlagEnum;
import com.gic.haoban.manage.api.enums.QywxTagRelationTypeEnum;
import com.gic.haoban.manage.api.service.QywxTagApiService;
import com.gic.haoban.manage.service.config.Config;
import com.gic.haoban.manage.service.entity.*;
import com.gic.haoban.manage.service.pojo.QywxSyncTagFormatPojo;
import com.gic.haoban.manage.service.service.ExternalClerkRelatedService;
import com.gic.haoban.manage.service.service.QywxTagService;
import com.gic.haoban.manage.service.service.StaffService;
import com.gic.haoban.manage.service.service.WxEnterpriseService;
import com.gic.member.api.dto.MemberTagDTO;
import com.gic.member.api.service.MemberTagService;
import com.gic.member.tag.api.dto.MemberTagItemDTO;
import com.gic.member.tag.api.service.MemberTagItemApiService;
import com.gic.mq.sdk.GicMQClient;
import com.gic.redis.data.util.RedisUtil;
import com.gic.wechat.api.dto.qywx.QywxTagDTO;
import com.gic.wechat.api.dto.qywx.QywxTagGroupDTO;
import com.gic.wechat.api.dto.qywx.response.QywxGetCorpTagListDTO;
import com.gic.wechat.api.dto.qywx.response.QywxResponseDTO;
import com.gic.wechat.api.service.qywx.QywxSuiteApiService;
import com.gic.wechat.api.service.qywx.QywxUserApiService;
import com.google.common.collect.Sets;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static org.slf4j.LoggerFactory.getLogger;
/**
* Created 2021/6/21.
*
* @author hua
*/
@Service
public class QywxTagApiServiceImpl implements QywxTagApiService {
private static final Logger logger = getLogger(QywxTagApiServiceImpl.class);
/**
* 限制次数
*/
private static final Integer MAX_TIMES = 3;
@Autowired
private QywxSuiteApiService qywxSuiteApiService;
@Autowired
private Config config;
@Autowired
private WxEnterpriseService wxEnterpriseService;
@Autowired
private QywxTagService qywxTagService;
@Autowired
private QywxUserApiService qywxUserApiService;
@Autowired
private ExternalClerkRelatedService externalClerkRelatedService;
@Autowired
private MemberTagService memberTagService;
@Autowired
private QywxTagSyncApiService qywxTagSyncApiService;
@Autowired
private MemberTagItemApiService memberTagItemApiService;
@Autowired
private StaffService staffService;
@Override
public void pullQywxTag(String wxEnterpriseId) {
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
if (null == qwDTO) {
logger.info("企业标签所在企业不存在");
return;
}
QywxGetCorpTagListDTO corpTagListResp = qywxSuiteApiService.getCorpTagList(qwDTO.getThirdCorpid(), config.getWxSuiteid(), null, -1);
if (corpTagListResp.getErrcode() != 0) {
logger.info("企业微信标签有问题:{}", wxEnterpriseId);
return;
}
//拉取保存所有标签
List<QywxTagGroupDTO> tagGroup = corpTagListResp.getTagGroup();
for (QywxTagGroupDTO groupDTO : tagGroup) {
qywxTagService.saveQywxTagByQywxGroupKey(wxEnterpriseId, groupDTO);
}
}
@Override
public ServiceResponse syncTagToQywx(String wxEnterpriseId, String enterpriseId, QywxTagInfoDTO infoDTO, List<QywxTagItemDTO> items) {
ServiceResponse ret = new ServiceResponse();
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
//调用企业微信接口保存
QywxGetCorpTagListDTO resp = this.saveQywxTag(qwDTO.getThirdCorpid(), infoDTO, items);
if (resp.getErrcode() != 0 && CollectionUtils.isEmpty(resp.getTagGroup())) {
logger.info("同步失败:{}", JSONObject.toJSONString(resp));
ret.setCode(resp.getErrcode());
ret.setMessage(resp.getErrmsg());
return ret;
}
//拉取保存所有标签
List<QywxTagGroupDTO> tagGroup = resp.getTagGroup();
QywxTagGroupDTO groupDTO = tagGroup.get(0);
//保存企业微信标签信息
Pair<TabQywxTag, List<TabQywxTagItem>> savePair = qywxTagService.saveQywxTagByQywxGroupKey(wxEnterpriseId, groupDTO);
if (null == savePair) {
logger.info("保存失败:{}", JSONObject.toJSONString(groupDTO));
ret.setCode(1);
ret.setMessage("保存企业微信标签失败");
return ret;
}
//保存关联关系
saveRelation(wxEnterpriseId, enterpriseId, infoDTO, items, savePair);
return ret;
}
/**
* 保存标签的关联关系
*
* @param wxEnterpriseId
* @param enterpriseId
* @param infoDTO
*/
private void saveRelation(String wxEnterpriseId, String enterpriseId, QywxTagInfoDTO infoDTO, List<QywxTagItemDTO> items, Pair<TabQywxTag, List<TabQywxTagItem>> localQywxTagPair) {
Map<String, QywxTagItemDTO> orgMap = items.stream().collect(Collectors.toMap(item -> item.getQywxTagName(), dto -> dto));
//设置关联关系
TabQywxTag groupKey = localQywxTagPair.getKey();
List<TabQywxTagItem> tabQywxTagItems = localQywxTagPair.getRight();
List<TabQywxTagRelation> saveRelationList = new ArrayList<>();
//如果存在qywxGroupKey 说明已经创建过了
if (StringUtils.isBlank(infoDTO.getQywxGroupKey())) {
TabQywxTagRelation groupRelation = new TabQywxTagRelation();
groupRelation.setEnterpriseId(enterpriseId);
groupRelation.setMemberTagId(infoDTO.getMemberTagId());
groupRelation.setQywxTagId(groupKey.getQywxTagId());
groupRelation.setRelationType(QywxTagRelationTypeEnum.TAG_GROUP.getType());
groupRelation.setStatusFlag(1);
groupRelation.setSyncFlag(QywxTagRelationSyncFlagEnum.PRE.getType());
groupRelation.setQywxTagRelationId(ToolUtil.randomUUID());
groupRelation.setWxEnterpriseId(wxEnterpriseId);
saveRelationList.add(groupRelation);
}
List<TabQywxTagRelation> itemList = tabQywxTagItems.stream().map(tab -> {
QywxTagItemDTO orgItem = orgMap.get(tab.getQywxTagName());
TabQywxTagRelation itemRelation = new TabQywxTagRelation();
itemRelation.setWxEnterpriseId(wxEnterpriseId);
itemRelation.setQywxTagRelationId(ToolUtil.randomUUID());
itemRelation.setSyncFlag(QywxTagRelationSyncFlagEnum.PRE.getType());
itemRelation.setStatusFlag(1);
itemRelation.setRelationType(QywxTagRelationTypeEnum.TAG_ITEM.getType());
itemRelation.setQywxTagId(groupKey.getQywxTagId());
itemRelation.setMemberTagId(infoDTO.getMemberTagId());
itemRelation.setEnterpriseId(enterpriseId);
itemRelation.setQywxTagItemId(tab.getQywxTagItemId());
itemRelation.setTagItemId(orgItem.getQywxTagKey());
return itemRelation;
}).collect(Collectors.toList());
saveRelationList.addAll(itemList);
qywxTagService.saveQywxRelation(saveRelationList);
}
/**
* 调用企业微信接口 保存标签
*
* @param wxEnterpriseDTO
* @param infoDTO
* @param items
* @return
*/
private QywxGetCorpTagListDTO saveQywxTag(String corpid, QywxTagInfoDTO infoDTO, List<QywxTagItemDTO> items) {
QywxTagGroupDTO qywxTagGroupDTO = new QywxTagGroupDTO();
qywxTagGroupDTO.setGroupName("GIC" + infoDTO.getQywxGroupName());
qywxTagGroupDTO.setOrder(infoDTO.getOrder());
qywxTagGroupDTO.setGroupId(infoDTO.getQywxGroupKey());
List<QywxTagDTO> tagItems = items.stream().map(item -> {
QywxTagDTO qywxTagDTO = new QywxTagDTO();
qywxTagDTO.setName(item.getQywxTagName());
qywxTagDTO.setOrder(item.getOrder());
return qywxTagDTO;
}).collect(Collectors.toList());
qywxTagGroupDTO.setTag(tagItems);
return qywxSuiteApiService.saveCorpTag(corpid, config.getWxSuiteid(), qywxTagGroupDTO);
}
@Override
public ServiceResponse closeSync(String wxEnterpriseId, String memberTagId) {
ServiceResponse resp = new ServiceResponse();
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
List<TabQywxTagRelation> tagRelations = qywxTagService.listQywxTagRelationByMemberTagId(wxEnterpriseId, memberTagId);
if (CollectionUtils.isEmpty(tagRelations)) {
return resp;
}
TabQywxTag tabQywxTag = qywxTagService.getQywxTagByQywxTagId(wxEnterpriseId, tagRelations.get(0).getQywxTagId());
//关闭同步
qywxTagService.closeSync(wxEnterpriseId, memberTagId);
List<String> delIds = new ArrayList<>();
delIds.add(tabQywxTag.getQywxGroupKey());
QywxResponseDTO responseDTO = qywxSuiteApiService.delCorpTag(qwDTO.getThirdCorpid(), config.getWxSuiteid(), delIds, 0);
logger.info("关闭同步:{}", JSONObject.toJSONString(responseDTO));
if (responseDTO.getErrcode() != 0) {
resp.setMessage(responseDTO.getErrmsg());
resp.setCode(responseDTO.getErrcode());
return resp;
}
qywxTagService.delQywxTag(tabQywxTag.getQywxGroupKey(), wxEnterpriseId);
return resp;
}
@Override
public ServiceResponse delGicTagItem(String wxEnterpriseId, String tagItemId) {
ServiceResponse resp = new ServiceResponse();
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
TabQywxTagRelation qywxTagRelation = qywxTagService.getQywxTagRelationByTagItemId(wxEnterpriseId, tagItemId);
if (null == qywxTagRelation) {
resp.setMessage("没有同步,无需删除");
return resp;
}
TabQywxTagItem qywxTagItem = qywxTagService.getQywxTagItemById(wxEnterpriseId, qywxTagRelation.getQywxTagItemId());
List<String> delIds = new ArrayList<>();
delIds.add(qywxTagItem.getQywxTagKey());
QywxResponseDTO responseDTO = qywxSuiteApiService.delCorpTag(qwDTO.getThirdCorpid(), config.getWxSuiteid(), delIds, 1);
logger.info("删除标签项:{}", JSONObject.toJSONString(responseDTO));
if (responseDTO.getErrcode() != 0) {
resp.setMessage(responseDTO.getErrmsg());
resp.setCode(responseDTO.getErrcode());
return resp;
}
//删除标签项 以及同步关系
qywxTagService.delQywxTagItemById(wxEnterpriseId, qywxTagItem.getQywxTagItemId());
qywxTagService.changeTagRelationStatus(qywxTagRelation.getQywxTagRelationId(), 0);
return resp;
}
@Override
public List<QywxTagRelationDTO> listAllByWxEnterpriseId(String wxEnterpriseId) {
List<TabQywxTagRelation> ret = qywxTagService.listAllQywxRelation(wxEnterpriseId);
return EntityUtil.changeEntityListByJSON(QywxTagRelationDTO.class, ret);
}
@Override
public void addQywxTag(QywxTagCallbackDTO callbackDTO) {
logger.info("企业微信新增标签回调:{}", JSONObject.toJSONString(callbackDTO));
if (!config.getWxSuiteid().equals(callbackDTO.getSuiteId())) {
logger.info("非第三方回调");
return;
}
TabHaobanWxEnterprise wxEnterpriseDto = wxEnterpriseService.getEnterpriseBycorpId(callbackDTO.getAuthCorpId());
if (null == wxEnterpriseDto) {
logger.info("企业不存在:{}", callbackDTO.getAuthCorpId());
return;
}
QywxTagRelationTypeEnum relationTypeEnum = QywxTagRelationTypeEnum.getByTagType(callbackDTO.getTagType());
if (relationTypeEnum == null) {
logger.error("未找到对应关系,{}", callbackDTO.getTagType());
return;
}
String wxEnterpriseId = wxEnterpriseDto.getWxEnterpriseId() ;
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
//标签组
if (Objects.equals(relationTypeEnum.getTagType(), QywxTagRelationTypeEnum.TAG_GROUP.getTagType())) {
logger.info("新增标签组无需操作:{}", callbackDTO.getTagId());
List<String> ids = new ArrayList<>();
ids.add(callbackDTO.getTagId());
QywxGetCorpTagListDTO tagDetail = qywxSuiteApiService.getCorpTagList(qwDTO.getThirdCorpid(), config.getWxSuiteid(), ids, QywxTagRelationTypeEnum.TAG_GROUP.getType());
if (tagDetail.getErrcode() != 0) {
logger.info("没有关联,无需操作:{}", JSONObject.toJSONString(tagDetail));
return;
}
QywxTagGroupDTO qywxTagGroupDTO = tagDetail.getTagGroup().get(0);
//保存标签项
qywxTagService.saveQywxTagByQywxGroupKey(wxEnterpriseDto.getWxEnterpriseId(), qywxTagGroupDTO);
//标签项
} else if (Objects.equals(relationTypeEnum.getTagType(), QywxTagRelationTypeEnum.TAG_ITEM.getTagType())) {
//查找对应的标签组 如果标签组关联了
List<String> ids = new ArrayList<>();
ids.add(callbackDTO.getTagId());
QywxGetCorpTagListDTO tagDetail = qywxSuiteApiService.getCorpTagList(qwDTO.getThirdCorpid(), config.getWxSuiteid(), ids, QywxTagRelationTypeEnum.TAG_ITEM.getType());
if (tagDetail.getErrcode() != 0) {
logger.info("查询失败,无需操作:{}", JSONObject.toJSONString(tagDetail));
return;
}
if (CollectionUtils.isEmpty(tagDetail.getTagGroup())) {
logger.info("标签组不存在:{}", JSONObject.toJSONString(tagDetail));
return;
}
QywxTagGroupDTO qywxTagGroupDTO = tagDetail.getTagGroup().get(0);
//保存标签项
qywxTagService.saveQywxTagByQywxGroupKey(wxEnterpriseDto.getWxEnterpriseId(), qywxTagGroupDTO);
}
}
@Override
public void delQywxTag(QywxTagCallbackDTO callbackDTO) {
logger.info("企业微信删除标签回调:{}", JSONObject.toJSONString(callbackDTO));
if (!config.getWxSuiteid().equals(callbackDTO.getSuiteId())) {
logger.info("非第三方回调");
return;
}
TabHaobanWxEnterprise wxEnterpriseDto = wxEnterpriseService.getEnterpriseBycorpId(callbackDTO.getAuthCorpId());
if (null == wxEnterpriseDto) {
logger.info("企业不存在:{}", callbackDTO.getAuthCorpId());
return;
}
QywxTagRelationTypeEnum relationTypeEnum = QywxTagRelationTypeEnum.getByTagType(callbackDTO.getTagType());
if (relationTypeEnum == null) {
logger.error("未找到对应关系,{}", callbackDTO.getTagType());
return;
}
//标签组
if (Objects.equals(relationTypeEnum.getTagType(), QywxTagRelationTypeEnum.TAG_GROUP.getTagType())) {
TabQywxTag qywxGroupKey = qywxTagService.getQywxTagByQywxGroupKey(wxEnterpriseDto.getWxEnterpriseId(), callbackDTO.getTagId());
if (null == qywxGroupKey) {
logger.info("原型不存在,不需要处理");
return;
}
List<TabQywxTagRelation> relations = qywxTagService.listQywxTagRelationByQywxTagId(wxEnterpriseDto.getWxEnterpriseId(), qywxGroupKey.getQywxTagId());
//没有同步的关系 删除保存企业微信标签
if (CollectionUtils.isEmpty(relations)) {
logger.info("删除保存的企业微信标签");
qywxTagService.delQywxTag(callbackDTO.getTagId(), wxEnterpriseDto.getWxEnterpriseId());
return;
}
TabQywxTagRelation relation = relations.stream().findFirst().get();
logger.info("删除标签组 关闭同步:{}", relation.getMemberTagId());
//删除同步 关闭同步
qywxTagService.closeSync(wxEnterpriseDto.getWxEnterpriseId(), relation.getMemberTagId());
qywxTagService.delQywxTag(callbackDTO.getTagId(), wxEnterpriseDto.getWxEnterpriseId());
saveCloseTask(qywxGroupKey.getQywxGroupName().substring(3), "-1", relation.getWxEnterpriseId(), relation.getEnterpriseId());
//标签项
} else if (Objects.equals(relationTypeEnum.getTagType(), QywxTagRelationTypeEnum.TAG_ITEM.getTagType())) {
TabQywxTagRelation qywxTagRelation = qywxTagService.getQywxTagRelationByQywxKey(wxEnterpriseDto.getWxEnterpriseId(), callbackDTO.getTagId(), QywxTagRelationTypeEnum.TAG_ITEM.getType());
if (null == qywxTagRelation) {
logger.info("没有关联,无需操作");
qywxTagService.delQywxTagItemById(wxEnterpriseDto.getWxEnterpriseId(), qywxTagRelation.getQywxTagItemId());
return;
}
logger.info("删除标签 关闭同步:{}", qywxTagRelation.getMemberTagId());
//删除同步 关闭同步
this.closeSync(wxEnterpriseDto.getWxEnterpriseId(), qywxTagRelation.getMemberTagId());
TabQywxTag tabQywxTag = qywxTagService.getQywxTagByQywxTagId(qywxTagRelation.getWxEnterpriseId(), qywxTagRelation.getQywxTagId());
saveCloseTask(tabQywxTag.getQywxGroupName(), "-1", qywxTagRelation.getWxEnterpriseId(), qywxTagRelation.getEnterpriseId());
}
}
private void saveCloseTask(String tagName, String staffId, String wxEnterpriseId, String enterpriseId) {
String content = tagName + "-关闭标签同步成功";
qywxTagSyncApiService.saveCloseTask(staffId, wxEnterpriseId, enterpriseId, content, QywxTaskStatusEnum.ALL_SUCCESS.getType());
}
@Override
public void editQywxTag(QywxTagCallbackDTO callbackDTO) {
logger.info("企业微信修改标签回调:{}", JSONObject.toJSONString(callbackDTO));
if (!config.getWxSuiteid().equals(callbackDTO.getSuiteId())) {
logger.info("非第三方回调");
return;
}
TabHaobanWxEnterprise wxEnterpriseDto = wxEnterpriseService.getEnterpriseBycorpId(callbackDTO.getAuthCorpId());
if (null == wxEnterpriseDto) {
logger.info("企业不存在:{}", callbackDTO.getAuthCorpId());
return;
}
QywxTagRelationTypeEnum relationTypeEnum = QywxTagRelationTypeEnum.getByTagType(callbackDTO.getTagType());
if (relationTypeEnum == null) {
logger.error("未找到对应关系,{}", callbackDTO.getTagType());
return;
}
String wxEnterpriseId = wxEnterpriseDto.getWxEnterpriseId() ;
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
//标签组
if (Objects.equals(relationTypeEnum.getTagType(), QywxTagRelationTypeEnum.TAG_GROUP.getTagType())) {
//判断是否存在关联 存在需要同步回去
TabQywxTagRelation relaton = qywxTagService.getQywxTagRelationByQywxKey(wxEnterpriseDto.getWxEnterpriseId(), callbackDTO.getTagId(), QywxTagRelationTypeEnum.TAG_GROUP.getType());
if (null == relaton) {
logger.info("原型不存在,不需要处理");
return;
}
//名称同步回去
TabQywxTag qywxGroupKey = qywxTagService.getQywxTagByQywxGroupKey(wxEnterpriseDto.getWxEnterpriseId(), callbackDTO.getTagId());
QywxTagDTO qywxTagDTO = new QywxTagDTO();
qywxTagDTO.setId(callbackDTO.getTagId());
qywxTagDTO.setName(qywxGroupKey.getQywxGroupName());
qywxTagDTO.setOrder(qywxGroupKey.getOrder());
qywxSuiteApiService.editCorpTagNameOrOrder(qwDTO.getThirdCorpid(), config.getWxSuiteid(), qywxTagDTO);
//标签项
} else if (Objects.equals(relationTypeEnum.getTagType(), QywxTagRelationTypeEnum.TAG_ITEM.getTagType())) {
TabQywxTagItem qywxTagItem = qywxTagService.getQywxTagItemByQywxItemKey(wxEnterpriseDto.getWxEnterpriseId(), callbackDTO.getTagId());
if (null == qywxTagItem) {
logger.info("没有关联,无需操作");
return;
}
List<TabQywxTagRelation> relations = qywxTagService.listQywxTagRelationByQywxTagId(wxEnterpriseDto.getWxEnterpriseId(), qywxTagItem.getQywxTagId());
if (CollectionUtils.isEmpty(relations)) {
logger.info("直接删除标签项");
qywxTagService.delQywxTagItemById(wxEnterpriseDto.getWxEnterpriseId(), qywxTagItem.getQywxTagItemId());
return;
}
//名称同步回去
QywxTagDTO qywxTagDTO = new QywxTagDTO();
qywxTagDTO.setId(callbackDTO.getTagId());
qywxTagDTO.setName(qywxTagItem.getQywxTagName());
qywxTagDTO.setOrder(qywxTagItem.getOrder());
qywxSuiteApiService.editCorpTagNameOrOrder(qwDTO.getThirdCorpid(), config.getWxSuiteid(), qywxTagDTO);
}
}
@Override
public ServiceResponse syncFriendTagToQywxByExternalUserId(String wxEnterpriseId, String enterpriseId, String externalUserId, List<String> tagItemIds) {
logger.info("同步好友标签到企业微信:{},{},{},{}", wxEnterpriseId, enterpriseId, externalUserId, JSONObject.toJSONString(tagItemIds));
ServiceResponse resp = new ServiceResponse();
//获取需要同步的标签
QywxSyncTagFormatPojo syncTagFormat = listSyncTagItems(wxEnterpriseId);
if (syncTagFormat == null) {
logger.info("没有需要同步的标签");
resp.setCode(2);
resp.setMessage("没有要同步的标签");
return resp;
}
//该会员要同步的打的企业微信标签 该商户下
Set<String> entQywxTagKeys = tagItemIds.stream().filter(tagItemId -> syncTagFormat.getGicToQywxTagItemIdMap().containsKey(tagItemId))
.map(tagItemId -> syncTagFormat.getGicToQywxTagItemIdMap().get(tagItemId)).collect(Collectors.toSet());
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
//查询外部联系人
String wxSuiteid = config.getWxSuiteid();
String externalUseridInfo = qywxUserApiService.getExternalUseridInfo(qwDTO.getThirdCorpid(), wxSuiteid, externalUserId);
if (StringUtils.isBlank(externalUseridInfo)) {
logger.info("好友不存在");
resp.setCode(3);
resp.setMessage("好友不存在");
return resp;
} else if (externalUseridInfo.equals("1")) {
logger.info("限制次数");
resp.setCode(45033);
resp.setMessage("getExternalUseridInfo接口次数限制");
return resp;
}
Map<String, Set<String>> externalTagMap = getExternalTagMap(externalUseridInfo, wxEnterpriseId);
if (null == externalTagMap) {
logger.info("没有好友需要同步");
resp.setCode(5);
resp.setMessage("没有好友需要同步");
return resp;
}
//商户下设置同步的企业微信标签keys
Set<String> entQywxTagSyncKeys = syncTagFormat.getEntQywxTagKeysMap().get(enterpriseId);
if (CollectionUtils.isEmpty(entQywxTagSyncKeys)) {
logger.info("该商户下没有标签");
resp.setCode(6);
resp.setMessage("该商户下没有标签");
return resp;
}
//同步好友
externalTagMap.forEach((wxUserId, haveTagKes) -> {
//该用户在该商户下打的标签
Sets.SetView<String> entHasSetQywxTagKeys = Sets.intersection(haveTagKes, entQywxTagSyncKeys);
//获取需要打的标签
Sets.SetView<String> needSetTags = Sets.difference(entQywxTagKeys, entHasSetQywxTagKeys);
//需要删除的标签
Sets.SetView<String> needDelTags = Sets.difference(entHasSetQywxTagKeys, entQywxTagKeys);
logger.info("该用户打标签:{}",wxUserId);
if (CollectionUtils.isEmpty(needDelTags) && CollectionUtils.isEmpty(needSetTags)) {
logger.info("不需要操作:{},{}", wxUserId, externalUserId);
return;
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("corpid", qwDTO.getThirdCorpid());
jsonObject.put("suiteId", wxSuiteid);
jsonObject.put("wxUserId", wxUserId);
jsonObject.put("externalUserId", externalUserId);
if (CollectionUtils.isNotEmpty(needSetTags)) {
jsonObject.put("needSetTags", StringUtils.join(needSetTags, ","));
}
if (CollectionUtils.isNotEmpty(needDelTags)) {
jsonObject.put("needDelTags", StringUtils.join(needDelTags, ","));
}
GicMQClient clientInstance = GICMQClientUtil.getClientInstance();
try {
logger.info("qywxMarkTagMq 该用户打标签:{}",jsonObject.toJSONString());
clientInstance.sendMessage("qywxMarkTagMq", jsonObject.toJSONString());
} catch (Exception e) {
logger.info("企微标签同步qywxMarkTagMq发送失败:{}", e.getMessage(), e);
}
});
return resp;
}
/**
* 获取以及同步的标签序列表
*/
private QywxSyncTagFormatPojo listSyncTagItems(String wxEnterpriseId) {
QywxSyncTagFormatPojo pojo = new QywxSyncTagFormatPojo();
List<TabQywxTagRelation> relations = qywxTagService.listAllQywxRelation(wxEnterpriseId);
if (CollectionUtils.isEmpty(relations)) {
return null;
}
//企业微信标签key 关联对应的 gic标签关系
Map<String, TabQywxTagRelation> relationMap = relations.stream().filter(dto -> dto.getRelationType() == QywxTagRelationTypeEnum.TAG_ITEM.getType()).collect(Collectors.toMap(dto -> dto.getQywxTagItemId(), dto -> dto));
if (MapUtils.isEmpty(relationMap)) {
return null;
}
List<String> syncTagItemsIds = relationMap.keySet().stream().collect(Collectors.toList());
//同步的标签项
List<TabQywxTagItem> tagItems = qywxTagService.listQywxTagItemByIds(wxEnterpriseId, syncTagItemsIds);
//企业微信标签id 对应的标签
Map<String, TabQywxTagItem> qywxTagItemMap = tagItems.stream().collect(Collectors.toMap(dto -> dto.getQywxTagItemId(), dto -> dto));
//企业微信标签与gic标签id的对应关系
Map<String, String> qywxToGicTagItemIdMap = syncTagItemsIds.stream().collect(Collectors.toMap(qywxTagId -> qywxTagItemMap.get(qywxTagId).getQywxTagKey(), qywxTagId -> relationMap.get(qywxTagId).getTagItemId()));
//gic标签与企业微信标签id的对应关系
Map<String, String> gicToQywxTagItemIdMap = syncTagItemsIds.stream().collect(Collectors.toMap(qywxTagId -> relationMap.get(qywxTagId).getTagItemId(), qywxTagId -> qywxTagItemMap.get(qywxTagId).getQywxTagKey()));
//gic商户对应的已经同步的gic标签项列表
Map<String, Set<String>> entGicTagItemIdMap = relations.stream().filter(dto -> dto.getRelationType() == QywxTagRelationTypeEnum.TAG_ITEM.getType())
.collect(Collectors.groupingBy(dto -> dto.getEnterpriseId(), Collectors.mapping(dto -> dto.getTagItemId(), Collectors.toSet())));
//gic商户对应的已经同步的企业微信表亲列表
Map<String, Set<String>> entQywxTagKeysMap = relations.stream().filter(dto -> dto.getRelationType() == QywxTagRelationTypeEnum.TAG_ITEM.getType())
.collect(Collectors.groupingBy(dto -> dto.getEnterpriseId(), Collectors.mapping(dto -> gicToQywxTagItemIdMap.get(dto.getTagItemId()), Collectors.toSet())));
pojo.setEntGicTagItemIdMap(entGicTagItemIdMap);
pojo.setEntQywxTagKeysMap(entQywxTagKeysMap);
pojo.setGicToQywxTagItemIdMap(gicToQywxTagItemIdMap);
pojo.setQywxToGicTagItemIdMap(qywxToGicTagItemIdMap);
return pojo;
}
@Override
public ServiceResponse syncQywxTagToGicByExternalUserId(String wxEnterpriseId, String externalUserId, String wxUserId) {
//刷新标签的时候不允许同步
ServiceResponse resp = new ServiceResponse();
//所有以及关联同步的标签
QywxSyncTagFormatPojo syncTagFormatPojo = listSyncTagItems(wxEnterpriseId);
if (syncTagFormatPojo == null) {
logger.info("没有需要同步的标签,wxUserId:{},externalUserId:{},wxId:{}", wxUserId, externalUserId, wxEnterpriseId);
resp.setMessage("没有需要同步的标签");
return resp;
}
//企业微信同步的标签key
Set<String> qywxTagKeys = syncTagFormatPojo.getQywxToGicTagItemIdMap().keySet();
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
//查询外部联系人
String externalUseridInfo = qywxUserApiService.getExternalUseridInfo(qwDTO.getThirdCorpid() , config.getWxSuiteid(), externalUserId);
if (StringUtils.isBlank(externalUseridInfo)) {
logger.info("好友不存在");
resp.setCode(2);
resp.setMessage("好友不存在");
return resp;
} else if (externalUseridInfo.equals("1")) {
logger.info("限制次数");
resp.setCode(45033);
resp.setMessage("限制次数");
return resp;
}
Map<String, Set<String>> externalTagMap = getExternalTagMap(externalUseridInfo, wxEnterpriseId);
if (MapUtils.isEmpty(externalTagMap)) {
logger.info("该用户没有不存在好友关系,获取不到关联导购打的标签,:externalUseridInfo:{}", externalUseridInfo);
resp.setMessage("该用户没有不存在好友关系,获取不到关联导购打的标签");
return resp;
}
//当前操作用户企业打的标签
Set<String> staffChangeTagKeys = externalTagMap.get(wxUserId);
if (CollectionUtils.isEmpty(staffChangeTagKeys)) {
logger.info("该用户没有不存在好友关系,获取不到关联导购打的标签,wxUserId:{}", wxUserId);
resp.setMessage("该用户没有不存在好友关系,获取不到关联导购打的标签");
return resp;
}
Sets.SetView<String> staffHasSetTagKeys = Sets.intersection(staffChangeTagKeys, qywxTagKeys);
//获取该外部联系人的所有会员
List<TabHaobanExternalClerkRelated> clerkRelateds = externalClerkRelatedService.listExternalByExternalUserid(wxEnterpriseId, externalUserId);
if (CollectionUtils.isEmpty(clerkRelateds)) {
logger.info("该用户没关联对应的好友:{}", externalUserId);
resp.setMessage("该用户没关联对应的好友");
return resp;
}
//企业下的企业微信标签对应关系
Map<String, Set<String>> entQywxTagKeysMap = syncTagFormatPojo.getEntQywxTagKeysMap();
Map<String, Set<String>> entGicTagItemIdMap = syncTagFormatPojo.getEntGicTagItemIdMap();
List<String> hasSaveMemberId = new ArrayList<>();
for (TabHaobanExternalClerkRelated clerkRelated : clerkRelateds) {
logger.info("需要处理的好友:{}", JSONObject.toJSONString(clerkRelated));
//该会员在该企业已经同步 无需同步
if (hasSaveMemberId.contains(clerkRelated.getMemberId())) {
continue;
}
hasSaveMemberId.add(clerkRelated.getMemberId());
//该会员所在企业下 配置的同步的标签列表
Set<String> entQywxSyncTagKeys = entQywxTagKeysMap.get(clerkRelated.getEnterpriseId());
Set<String> entQywxSyncTagItemIds = entGicTagItemIdMap.get(clerkRelated.getEnterpriseId());
if (CollectionUtils.isEmpty(entQywxSyncTagKeys)) {
logger.info("该企业下没有配置需要同步的:{},{}", externalUserId, clerkRelated.getEnterpriseId());
continue;
}
String memberId = externalClerkRelatedService.checkAndUpdateMemberByUnonId(clerkRelated.getEnterpriseId(), clerkRelated.getMemberId(), clerkRelated.getUnionid());
if (null == memberId) {
logger.info("会员不存在:{}", externalUserId);
continue;
}
//该会员打的标签
List<MemberTagDTO> gicItems = memberTagService.listMemberTag(clerkRelated.getEnterpriseId(), memberId);
Set<String> noSyncTagItemIds = new HashSet<>();
if (!CollectionUtils.isEmpty(gicItems)) {
noSyncTagItemIds = gicItems.stream().filter(item -> !entQywxSyncTagItemIds.contains(item.getTagsId())).map(dto -> dto.getTagsId()).collect(Collectors.toSet());
logger.info("没有同步的标签:{}", JSONObject.toJSONString(noSyncTagItemIds));
}
//该企业下会员需要设置的标签
Sets.SetView<String> entMemberNeedSetQywxKeys = Sets.intersection(staffHasSetTagKeys, entQywxSyncTagKeys);
Set<String> saveTagIds = entMemberNeedSetQywxKeys.stream().map(qywxKey -> syncTagFormatPojo.getQywxToGicTagItemIdMap().get(qywxKey)).collect(Collectors.toSet());
saveTagIds.addAll(noSyncTagItemIds);
logger.info("该企业会员需要打的标签:{}", JSONObject.toJSONString(entMemberNeedSetQywxKeys));
//更新标签 会自动同步
if (CollectionUtils.isEmpty(saveTagIds)) {
saveMemberTags(new HashSet<>(), clerkRelated.getEnterpriseId(), memberId, clerkRelated.getClerkId());
} else {
saveMemberTags(saveTagIds, clerkRelated.getEnterpriseId(), memberId, clerkRelated.getClerkId());
}
}
return resp;
}
private void saveMemberTags(Set<String> tagItemIds, String enterpriseId, String memberId, String clerkId) {
List<MemberTagDTO> list = tagItemIds.stream().map(tagId -> {
MemberTagDTO memberTagDTO = new MemberTagDTO();
memberTagDTO.setTagsId(tagId);
memberTagDTO.setEnterpriseId(enterpriseId);
memberTagDTO.setMemberId(memberId);
memberTagDTO.setClerkId(clerkId);
return memberTagDTO;
}).collect(Collectors.toList());
logger.info("会员打标签:{}", JSONObject.toJSONString(list));
if (CollectionUtils.isEmpty(list)) {
logger.info("会员打标签list为空");
return;
}
memberTagService.saveOrUpdateMemberTagHB(enterpriseId, list, memberId);
}
/**
* 获取企业微信的外部联系人的所有联系关系
*
* @param externalUseridInfo
* @return
*/
private Map<String, Set<String>> getExternalTagMap(String externalUseridInfo, String wxEnterpriseId) {
logger.info("externalUseridInfo:{}", externalUseridInfo);
Map<String, Set<String>> ret = new HashMap<>();
JSONObject jsonObject = JSONObject.parseObject(externalUseridInfo);
if (!jsonObject.containsKey("follow_user")) {
logger.info("没有相关的好友");
return null;
}
JSONArray followUser = jsonObject.getJSONArray("follow_user");
for (int i = 0; i < followUser.size(); i++) {
JSONObject midUser = followUser.getJSONObject(i);
String wxUserId = midUser.getString("userid");
//做兼容
/* TabHaobanStaff staff = staffService.selectByUserIdAndEnterpriseId(wxUserId, wxEnterpriseId);
if (staff != null) {
logger.info("旧wxUserId:{}", wxUserId);
wxUserId = staff.getWxUserId();
logger.info("新wxUserId:{}", wxUserId);
}*/
Set<String> midTagIds = new HashSet<>();
if (!midUser.containsKey("tags")) {
ret.put(wxUserId, midTagIds);
continue;
}
JSONArray tags = midUser.getJSONArray("tags");
for (int n = 0; n < tags.size(); n++) {
JSONObject tagMid = tags.getJSONObject(n);
String tagId = tagMid.getString("tag_id");
String tagType = tagMid.getString("type");
if (tagType.equals("1")) {
midTagIds.add(tagId);
}
}
ret.put(wxUserId, midTagIds);
}
return ret;
}
@Override
public void changeQywxTagStatus(String memberTagId, String wxEnterpriseId, int status) {
qywxTagService.changeRelationSyncFlagByMemberTagId(wxEnterpriseId, memberTagId, status);
}
@Override
public boolean saveRelation(String wxEnterpriseId, String enterpriseId, List<String> memberTagIds) {
if (CollectionUtils.isEmpty(memberTagIds)) {
return false;
}
return false;
}
@Override
public ServiceResponse renameQywxTag(String wxEnterpriseId, String id, String name, Integer type) {
ServiceResponse resp = new ServiceResponse();
String renameQywxKey = null;
Long order = null;
String relationId = null;
//标签组
if (type == QywxTagRelationTypeEnum.TAG_GROUP.getType()) {
TabQywxTag tabQywxTag = qywxTagService.getQywxTagByQywxTagId(wxEnterpriseId, id);
if (null == tabQywxTag) {
resp.setMessage("没有关联无需处理");
return resp;
}
renameQywxKey = tabQywxTag.getQywxGroupKey();
order = tabQywxTag.getOrder();
name = "GIC" + name;
relationId = tabQywxTag.getQywxTagId();
} else if (type == QywxTagRelationTypeEnum.TAG_ITEM.getType()) {
TabQywxTagItem qywxTagItem = qywxTagService.getQywxTagItemById(wxEnterpriseId, id);
if (null == qywxTagItem) {
resp.setMessage("没有关联无需处理");
return resp;
}
renameQywxKey = qywxTagItem.getQywxTagKey();
order = qywxTagItem.getOrder();
relationId = qywxTagItem.getQywxTagItemId();
}
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
//名称同步回去
QywxTagDTO qywxTagDTO = new QywxTagDTO();
qywxTagDTO.setId(renameQywxKey);
qywxTagDTO.setName(name);
qywxTagDTO.setOrder(order);
QywxResponseDTO responseDTO = qywxSuiteApiService.editCorpTagNameOrOrder(qwDTO.getThirdCorpid(), config.getWxSuiteid(), qywxTagDTO);
logger.info("同步名称:{}", JSONObject.toJSONString(responseDTO));
if (responseDTO.getErrcode() != 0) {
resp.setMessage(responseDTO.getErrmsg());
resp.setCode(responseDTO.getErrcode());
}
qywxTagService.saveQywxTagOrTagItemName(relationId, name, type);
return resp;
}
@Override
public List<QywxTagRelationDTO> listQywxTagRelationByMemberTagId(String wxEnterpriseId, String memberTagId) {
List<TabQywxTagRelation> tagRelations = qywxTagService.listQywxTagRelationByMemberTagId(wxEnterpriseId, memberTagId);
return EntityUtil.changeEntityListByJSON(QywxTagRelationDTO.class, tagRelations);
}
@Override
public QywxTagRelationDTO getQywxTagRelationByRelationId(String relationId) {
TabQywxTagRelation tagRelation = qywxTagService.getQywxTagRelationById(relationId);
return EntityUtil.changeEntityByJSON(QywxTagRelationDTO.class, tagRelation);
}
@Override
public QywxTagInfoDTO getQywxTagByQywxTagId(String qywxTagId) {
TabQywxTag tabQywxTag = qywxTagService.getQywxTagByQywxTagId(null, qywxTagId);
return EntityUtil.changeEntityByJSON(QywxTagInfoDTO.class, tabQywxTag);
}
@Override
public void updateQywxTagRelationSyncStatusByTagItemId(String wxEnterpriseId, String tagItemId) {
qywxTagService.changeRelationSyncFlagByTagItemId(wxEnterpriseId, tagItemId, 2);
}
@Override
public void checkQywxSync(String params) {
List<TabHaobanWxEnterprise> wxEnterprises = wxEnterpriseService.listAll();
wxEnterprises.forEach(wxEnterprise -> {
logger.info("企业:{}", wxEnterprise.getWxEnterpriseId());
try {
List<TabQywxTagRelation> tagRelations = qywxTagService.listAllQywxRelation(wxEnterprise.getWxEnterpriseId());
if (CollectionUtils.isEmpty(tagRelations)) {
logger.info("无需校验: 没有要同步的企业");
return;
}
QywxSyncTagFormatPojo pojo = this.listSyncTagItems(wxEnterprise.getWxEnterpriseId());
List<TabQywxTagRelation> qywxTagRelations = tagRelations.stream().filter(dto -> dto.getRelationType() == QywxTagRelationTypeEnum.TAG_GROUP.getType()).collect(Collectors.toList());
for (TabQywxTagRelation qywxTagRelation : qywxTagRelations) {
Map<String, Object> map = checkQywxSyncByQywxTag(qywxTagRelation, wxEnterprise, pojo);
if (MapUtils.isNotEmpty(map)) {
logger.error("企微与好办同步标签不相同:{}", JSON.toJSONString(map));
}
}
} catch (Exception e) {
logger.info("校验异常:{}", e);
}
});
}
/**
* 校验
*
* @param relation
* @param wxEnterprise
*/
private LinkedHashMap<String, Object> checkQywxSyncByQywxTag(TabQywxTagRelation relation, TabHaobanWxEnterprise wxEnterprise, QywxSyncTagFormatPojo pojo) {
LinkedHashMap<String, Object> ret = new LinkedHashMap<>();
boolean flag = false;
ret.put("hb标签id", relation.getQywxTagId());
TabQywxTag tabQywxTag = qywxTagService.getQywxTagByQywxTagId(relation.getWxEnterpriseId(), relation.getQywxTagId());
if (null == tabQywxTag) {
logger.info("数据库不存在该企业微信标签:{}", relation.getQywxTagId());
ret.put("描述", "标签数据库不存在:" + relation.getTagItemId());
return ret;
}
ret.put("名称(标签)", tabQywxTag.getQywxGroupName());
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(relation.getWxEnterpriseId()) ;
List<String> ids = new ArrayList<>();
ids.add(tabQywxTag.getQywxGroupKey());
QywxGetCorpTagListDTO tagDetail = qywxSuiteApiService.getCorpTagList(qwDTO.getThirdCorpid(), config.getWxSuiteid(), ids, QywxTagRelationTypeEnum.TAG_GROUP.getType());
if (tagDetail.getErrcode() != 0) {
logger.info("查询失败,无需操作:{}", JSONObject.toJSONString(tagDetail));
ret.put("描述", "查询失败:" + tagDetail.getErrmsg());
return ret;
}
if (CollectionUtils.isEmpty(tagDetail.getTagGroup())) {
logger.info("标签组不存在:{}", JSONObject.toJSONString(tagDetail));
ret.put("描述", "标签组不存在:" + tabQywxTag.getQywxGroupName());
return ret;
}
//获取该标签已经绑定的标签项key
Map<String, String> qywxToGicTagItemIdMap = pojo.getQywxToGicTagItemIdMap();
List<TabQywxTagItem> gicQywxSyncTagItems = qywxTagService.listByQywxTagId(wxEnterprise.getWxEnterpriseId(), relation.getQywxTagId());
Map<String, String> gicQywxTagNameMap = gicQywxSyncTagItems.stream().filter(tab -> qywxToGicTagItemIdMap.containsKey(tab.getQywxTagKey())).collect(Collectors.toMap(mid -> mid.getQywxTagKey(), mid -> mid.getQywxTagName()));
if (CollectionUtils.isEmpty(gicQywxSyncTagItems)) {
logger.info("gic同步企业微信标签异常");
ret.put("描述", "gic同步企业微信标签异常:" + tabQywxTag.getQywxGroupName());
return ret;
}
Set<String> gicQywxKeysSet = gicQywxTagNameMap.keySet();
//获取企业微信的标签项key
QywxTagGroupDTO qywxTagGroupDTO = tagDetail.getTagGroup().get(0);
List<QywxTagDTO> tagItems = qywxTagGroupDTO.getTag();
if (CollectionUtils.isEmpty(tagItems)) {
ret.put("描述", "企业微信标签项空:" + tabQywxTag.getQywxGroupName());
return ret;
}
Map<String, QywxTagDTO> qywxTagDTOMap = tagItems.stream().collect(Collectors.toMap(dto -> dto.getId(), dto -> dto));
Set<String> qywxKeysSet = qywxTagDTOMap.keySet();
//gic没有同步的标签项
Map<String, String> gicToQywxTagItemIdMap = pojo.getGicToQywxTagItemIdMap();
List<MemberTagItemDTO> gicTagItems = memberTagItemApiService.getItemListByTagId(relation.getMemberTagId());
Set<MemberTagItemDTO> noSyncTags = gicTagItems.stream().filter(dto -> !gicToQywxTagItemIdMap.containsKey(dto.getTagItemId())).collect(Collectors.toSet());
//在gic存在 企业微信不存在
Sets.SetView<String> qywxUnHaves = Sets.difference(gicQywxKeysSet, qywxKeysSet);
//企业微信存在 gic不存在
Sets.SetView<String> gicUnHaves = Sets.difference(qywxKeysSet, gicQywxKeysSet);
ret.put("现企微标签项", tagItems.stream().map(dto -> dto.getName()).collect(Collectors.joining("],[", "[", "]")));
ret.put("现gic标签项", gicTagItems.stream().map(dto -> dto.getTagItemName()).collect(Collectors.joining("],[", "[", "]")));
//企业微信缺少
if (!CollectionUtils.isEmpty(qywxUnHaves)) {
flag = true;
ret.put("标签项缺少(企微)", qywxUnHaves.stream().map(mid -> gicQywxTagNameMap.get(mid)).collect(Collectors.joining("],[", "[", "]")));
}
//未同步标签项
if (!CollectionUtils.isEmpty(noSyncTags)) {
flag = true;
ret.put("标签项未同步", noSyncTags.stream().map(mid -> mid.getTagItemName()).collect(Collectors.joining("],[", "[", "]")));
}
//gic缺少
if (!CollectionUtils.isEmpty(gicUnHaves)) {
flag = true;
ret.put("标签项缺少(gic)", gicUnHaves.stream().map(id -> qywxTagDTOMap.get(id).getName()).collect(Collectors.joining("],[", "[", "]")));
}
if (flag) {
return ret;
}
return null;
}
@Override
public void qywxMarkTag(String param) {
if (StringUtils.isBlank(param)) {
logger.info("标签数据为空");
return;
}
logger.info("企微标签同步:{}",param);
JSONObject jsonObject = JSON.parseObject(param);
String corpid = jsonObject.getString("corpid");
String suiteId = jsonObject.getString("suiteId");
String wxUserId = jsonObject.getString("wxUserId");
String externalUserId = jsonObject.getString("externalUserId");
String needSetTags = jsonObject.getString("needSetTags");
String needDelTags = jsonObject.getString("needDelTags");
String key = "HAOBAN:QYWX:TAG:" + wxUserId + externalUserId;
Integer currentTimes = Convert.toInt(RedisUtil.getCache(key), 0);
if (currentTimes > MAX_TIMES) {
logger.error("企微打标签超过最大次数,key:{}", key);
return;
}
List<String> needSetTagList = new ArrayList<>();
List<String> needDelTagList = new ArrayList<>();
if (StringUtils.isNotBlank(needSetTags)) {
needSetTagList = Arrays.asList(needSetTags.split(","));
}
if (StringUtils.isNotBlank(needDelTags)) {
needDelTagList = Arrays.asList(needDelTags.split(","));
}
QywxResponseDTO responseDTO = qywxUserApiService.markTag(corpid, suiteId, wxUserId, externalUserId, needSetTagList, needDelTagList);
logger.info("操作返回:{}", JSONObject.toJSONString(responseDTO));
if (responseDTO.getErrcode() != 0) {
logger.info("权限不对,重试三次:{},{}", wxUserId, externalUserId);
GicMQClient clientInstance = GICMQClientUtil.getClientInstance();
try {
clientInstance.sendMessage("qywxMarkTagMq", jsonObject.toJSONString(), 30);
} catch (Exception e) {
logger.info("企微标签同步qywxMarkTagMq发送失败:{}", e.getMessage(), e);
}
RedisUtil.setCache(key, currentTimes + 1, 2L, TimeUnit.HOURS);
}
}
}
......@@ -836,6 +836,9 @@ public class StaffApiServiceImpl implements StaffApiService {
//获取微信信息
String wxUserId = staff.getWxUserId();
if(qwDTO.needOpenUserIdDk()) {
wxUserId = staff.getWxOpenUseId() ;
}
UserDTO user = qywxUserApiService.getSelfWorkWxUser(qwDTO.getDkCorpid(), secretSetting.getSecretVal(), wxUserId);
if (null == user) {
logger.info("企业微信用户不存在:wxEnterpriseId:{}:wxUserId:{}", wxEnterpriseId, wxUserId);
......
......@@ -373,7 +373,7 @@ public class HmLinkApiServiceImpl implements HmLinkApiService {
remarkMap.put("dthmKey", dthmKey);
if (null != dthmKey) {
WxEnterpriseQwDTO qwDTO = this.wxEnterpriseService.getQwInfo(wxEnterpriseId) ;
ServiceResponse<String> addResp = this.addQrcode(hm, dthmKey, qwDTO.getThirdCorpid(), retDTO);
ServiceResponse<String> addResp = this.addQrcode(hm, dthmKey, qwDTO, retDTO);
if (!addResp.isSuccess()) {
remarkMap.put("sm", "创建动态活码失败,取单人活码");
if (StringUtils.isBlank(hm.getWxQrcode())) {
......@@ -425,7 +425,7 @@ public class HmLinkApiServiceImpl implements HmLinkApiService {
}
// 创建活码
private ServiceResponse<String> addQrcode(HmQrcodeBO hm, String key, String corpid, HmLinkWxaDTO retDTO) {
private ServiceResponse<String> addQrcode(HmQrcodeBO hm, String key, WxEnterpriseQwDTO qwDTO, HmLinkWxaDTO retDTO) {
String limitQrcode = this.limitIp(hm);
if (StringUtils.isNotEmpty(limitQrcode)) {
return ServiceResponse.failure(HaoBanErrCode.ERR_OTHER.getCode(), "超限制数");
......@@ -439,11 +439,15 @@ public class HmLinkApiServiceImpl implements HmLinkApiService {
paramsDTO.setState("DT" + key);
TabHaobanStaff tabHaobanStaff = staffService.selectById(hm.getStaffId());
if (tabHaobanStaff != null) {
paramsDTO.setUser(Arrays.asList(tabHaobanStaff.getWxUserId()));
if(qwDTO.needOpenUserId3th()) {
paramsDTO.setUser(Arrays.asList(tabHaobanStaff.getWxOpenUseId()));
}else {
paramsDTO.setUser(Arrays.asList(tabHaobanStaff.getWxUserId()));
}
}
QywxExternalcontactResultDTO wxResp = qywxUserApiService.addContactWay(corpid, config.getWxSuiteid(),
QywxExternalcontactResultDTO wxResp = qywxUserApiService.addContactWay(qwDTO.getThirdCorpid(), config.getWxSuiteid(),
paramsDTO);
log.info("创建动态活码参数corpid={},app={},param={},返回={}", corpid, config.getWxSuiteid(), JSON.toJSONString(paramsDTO),
log.info("创建动态活码参数corpid={},app={},param={},返回={}", qwDTO.getThirdCorpid(), config.getWxSuiteid(), JSON.toJSONString(paramsDTO),
JSON.toJSONString(wxResp));
if (null != wxResp && 0 == wxResp.getErrcode()) {
retDTO.setHmQrcode(wxResp.getQr_code());
......@@ -452,7 +456,7 @@ public class HmLinkApiServiceImpl implements HmLinkApiService {
qo.setWxConfigId(wxResp.getConfig_id());
qo.setWxQrcode(wxResp.getQr_code());
qo.setRelationId(key);
qo.setCorpid(corpid);
qo.setCorpid(qwDTO.getThirdCorpid());
this.hmQrcodeTempService.save(qo);
return ServiceResponse.success(wxResp.getQr_code());
}
......
......@@ -30,133 +30,7 @@
haoban_friend_flag, external_head_url, status_flag, handover_transfer_id, takeover_time,
transfer_status, transfer_time, create_time, update_time
</sql>
<select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from tab_haoban_handover_external
where handover_external_id = #{handoverExternalId,jdbcType=VARCHAR}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.String">
delete from tab_haoban_handover_external
where handover_external_id = #{handoverExternalId,jdbcType=VARCHAR}
</delete>
<insert id="insert" parameterType="com.gic.haoban.manage.service.entity.TabHandoverExternal">
insert into tab_haoban_handover_external (handover_external_id, wx_enterprise_id,
staff_id, user_id, external_user_id,
external_user_name,relation_id, haoban_friend_flag, external_head_url,
status_flag, handover_transfer_id, takeover_time,
transfer_status, transfer_time, create_time,
update_time)
values (#{handoverExternalId,jdbcType=VARCHAR}, #{wxEnterpriseId,jdbcType=VARCHAR},
#{staffId,jdbcType=VARCHAR}, #{userId,jdbcType=VARCHAR}, #{externalUserId,jdbcType=VARCHAR},
#{externalUserName,jdbcType=VARCHAR},#{relationId}, #{haobanFriendFlag,jdbcType=INTEGER}, #{externalHeadUrl,jdbcType=VARCHAR},
#{statusFlag,jdbcType=INTEGER}, #{handoverTransferId,jdbcType=VARCHAR}, #{takeoverTime,jdbcType=TIMESTAMP},
#{transferStatus}, #{transferTime,jdbcType=TIMESTAMP}, #{createTime,jdbcType=TIMESTAMP},
#{updateTime,jdbcType=TIMESTAMP})
</insert>
<insert id="insertSelective" parameterType="com.gic.haoban.manage.service.entity.TabHandoverExternal">
insert into tab_haoban_handover_external
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="handoverExternalId != null">
handover_external_id,
</if>
<if test="wxEnterpriseId != null">
wx_enterprise_id,
</if>
<if test="staffId != null">
staff_id,
</if>
<if test="userId != null">
user_id,
</if>
<if test="externalUserId != null">
external_user_id,
</if>
<if test="externalUserName != null">
external_user_name,
</if>
<if test="relationId != null">
relation_id,
</if>
<if test="haobanFriendFlag != null">
haoban_friend_flag,
</if>
<if test="externalHeadUrl != null">
external_head_url,
</if>
<if test="statusFlag != null">
status_flag,
</if>
<if test="handoverTransferId != null">
handover_transfer_id,
</if>
<if test="takeoverTime != null">
takeover_time,
</if>
<if test="transferStatus != null">
transfer_status,
</if>
<if test="transferTime != null">
transfer_time,
</if>
<if test="createTime != null">
create_time,
</if>
<if test="updateTime != null">
update_time,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="handoverExternalId != null">
#{handoverExternalId,jdbcType=VARCHAR},
</if>
<if test="wxEnterpriseId != null">
#{wxEnterpriseId,jdbcType=VARCHAR},
</if>
<if test="staffId != null">
#{staffId,jdbcType=VARCHAR},
</if>
<if test="userId != null">
#{userId,jdbcType=VARCHAR},
</if>
<if test="externalUserId != null">
#{externalUserId,jdbcType=VARCHAR},
</if>
<if test="externalUserName != null">
#{externalUserName,jdbcType=VARCHAR},
</if>
<if test="relationId != null">
#{relationId,jdbcType=VARCHAR},
</if>
<if test="haobanFriendFlag != null">
#{haobanFriendFlag,jdbcType=INTEGER},
</if>
<if test="externalHeadUrl != null">
#{externalHeadUrl,jdbcType=VARCHAR},
</if>
<if test="statusFlag != null">
#{statusFlag,jdbcType=INTEGER},
</if>
<if test="handoverTransferId != null">
#{handoverTransferId,jdbcType=VARCHAR},
</if>
<if test="takeoverTime != null">
#{takeoverTime,jdbcType=TIMESTAMP},
</if>
<if test="transferStatus != null">
#{transferStatus},
</if>
<if test="transferTime != null">
#{transferTime,jdbcType=TIMESTAMP},
</if>
<if test="createTime != null">
#{createTime,jdbcType=TIMESTAMP},
</if>
<if test="updateTime != null">
#{updateTime,jdbcType=TIMESTAMP},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.gic.haoban.manage.service.entity.TabHandoverExternal">
update tab_haoban_handover_external
<set>
......@@ -208,25 +82,6 @@
</set>
where handover_external_id = #{handoverExternalId,jdbcType=VARCHAR}
</update>
<update id="updateByPrimaryKey" parameterType="com.gic.haoban.manage.service.entity.TabHandoverExternal">
update tab_haoban_handover_external
set wx_enterprise_id = #{wxEnterpriseId,jdbcType=VARCHAR},
staff_id = #{staffId,jdbcType=VARCHAR},
user_id = #{userId,jdbcType=VARCHAR},
external_user_id = #{externalUserId,jdbcType=VARCHAR},
external_user_name = #{externalUserName,jdbcType=VARCHAR},
relation_id = #{relationId,jdbcType=VARCHAR},
haoban_friend_flag = #{haobanFriendFlag,jdbcType=INTEGER},
external_head_url = #{externalHeadUrl,jdbcType=VARCHAR},
status_flag = #{statusFlag,jdbcType=INTEGER},
handover_transfer_id = #{handoverTransferId,jdbcType=VARCHAR},
takeover_time = #{takeoverTime,jdbcType=TIMESTAMP},
transfer_status = #{transferStatus},
transfer_time = #{transferTime,jdbcType=TIMESTAMP},
create_time = #{createTime,jdbcType=TIMESTAMP},
update_time = #{updateTime,jdbcType=TIMESTAMP}
where handover_external_id = #{handoverExternalId,jdbcType=VARCHAR}
</update>
<insert id="insertBatch">
insert into tab_haoban_handover_external (handover_external_id, wx_enterprise_id,
......
......@@ -1225,6 +1225,9 @@ public class ClerkController extends WebBaseController {
return RestResponse.failure(String.valueOf(code), HaoBanErrCode.ERR_400002.getMsg());
}
String wxUserId = staffDTO.getWxUserId();
if(qwDTO.needOpenUserId3th()) {
wxUserId = staffDTO.getWxOpenUseId() ;
}
String openid = qywxUserApiService.getSelfOpenIdByUserId(qwDTO.getThirdCorpid(), config.getWxSuiteid(), wxUserId);
if (StringUtils.isBlank(openid)) {
int code = HaoBanErrCode.ERR_600003.getCode();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment