Commit 20ccfe64 by fudahua

Merge branch 'up-4.15'

# Conflicts:
#	haoban-manage3-service/src/main/java/com/gic/haoban/manage/service/service/out/impl/MemberUnionidRelatedApiServiceImpl.java
parents ddd14eee 648e8cd4
package com.gic.haoban.manage.api.dto;
import java.io.Serializable;
import java.util.Date;
/**
* Created 2021/3/22.
*
* @author hua
*/
public class FriendStoreInfoDTO implements Serializable {
private String storeId;
private String storeCode;
private String storeName;
private String clerkId;
private String clerkCode;
private String clerkName;
private String clerkPhoneNumber;
private String addFriendTime;
private String wxUserId;
public String getStoreId() {
return storeId;
}
public void setStoreId(String storeId) {
this.storeId = storeId;
}
public String getStoreCode() {
return storeCode;
}
public void setStoreCode(String storeCode) {
this.storeCode = storeCode;
}
public String getStoreName() {
return storeName;
}
public void setStoreName(String storeName) {
this.storeName = storeName;
}
public String getClerkId() {
return clerkId;
}
public void setClerkId(String clerkId) {
this.clerkId = clerkId;
}
public String getClerkCode() {
return clerkCode;
}
public void setClerkCode(String clerkCode) {
this.clerkCode = clerkCode;
}
public String getClerkName() {
return clerkName;
}
public void setClerkName(String clerkName) {
this.clerkName = clerkName;
}
public String getClerkPhoneNumber() {
return clerkPhoneNumber;
}
public void setClerkPhoneNumber(String clerkPhoneNumber) {
this.clerkPhoneNumber = clerkPhoneNumber;
}
public String getAddFriendTime() {
return addFriendTime;
}
public void setAddFriendTime(String addFriendTime) {
this.addFriendTime = addFriendTime;
}
public String getWxUserId() {
return wxUserId;
}
public void setWxUserId(String wxUserId) {
this.wxUserId = wxUserId;
}
@Override
public String toString() {
return "FriendStoreInfoDTO{" +
"storeId='" + storeId + '\'' +
", storeCode='" + storeCode + '\'' +
", storeName='" + storeName + '\'' +
", clerkId='" + clerkId + '\'' +
", clerkCode='" + clerkCode + '\'' +
", clerkName='" + clerkName + '\'' +
", clerkPhoneNumber='" + clerkPhoneNumber + '\'' +
", addFriendTime='" + addFriendTime + '\'' +
", wxUserId='" + wxUserId + '\'' +
'}';
}
}
package com.gic.haoban.manage.api.enums;
/**
* Created by hua on 2021/3/22.
*/
public enum SyncTaskTypeEnum {
QYWX_CONTACT(1, "后门同步企业微信架构"),
FRIEND_SINGLE(4, "单个成员刷新好友"),
FRIEND_STORE(5, "刷新门店好友"),;
private int type;
private String taskName;
SyncTaskTypeEnum(int type, String taskName) {
this.type = type;
this.taskName = taskName;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public static String getTaskName(int taskType) {
SyncTaskTypeEnum[] values = SyncTaskTypeEnum.values();
for (SyncTaskTypeEnum value : values) {
if (value.getType() == taskType) {
return value.getTaskName();
}
}
return null;
}
}
......@@ -137,10 +137,9 @@ public interface DealSyncOperationApiService {
* @param wxEnterpriseId
* @param taskName
* @param staffId
* @param desc
* @return
*/
public String createWxFriendSingleTask(String wxEnterpriseId, String taskName, String staffId, String staffName);
public String createWxFriendTaskSingle(String wxEnterpriseId, String taskName, String staffId, String staffName, int syncTaskType);
/**
* 单个导购刷新
......@@ -150,7 +149,16 @@ public interface DealSyncOperationApiService {
* @param wxEnterpriseId
*/
public void dealWxFriendClerkSingle(String taskId, String wxUserId, String staffId,String wxEnterpriseId);
/**
/**
* 单个导购刷新
*
* @param taskId
* @param wxEnterpriseId
*/
public void dealWxFriendStore(String taskId, String storeId, String wxEnterpriseId);
/**
* 定时
* @param res
*/
......
......@@ -6,10 +6,8 @@ import java.util.List;
import com.gic.api.base.commons.JSONResponse;
import com.gic.api.base.commons.Page;
import com.gic.haoban.base.api.common.BasePageInfo;
import com.gic.haoban.manage.api.dto.ExternalClerkRelatedDTO;
import com.gic.haoban.manage.api.dto.ExternalUserDTO;
import com.gic.haoban.manage.api.dto.MemberStoreDTO;
import com.gic.haoban.manage.api.dto.MemberUnionidRelatedDTO;
import com.gic.haoban.base.api.common.ServiceResponse;
import com.gic.haoban.manage.api.dto.*;
public interface MemberUnionidRelatedApiService {
......@@ -19,6 +17,13 @@ public interface MemberUnionidRelatedApiService {
void delMemberUnionidRelated(MemberUnionidRelatedDTO dto);
/**
* 处理外部联系人异步
*
* @param params
*/
void dealQywxExternalUser(String params);
ExternalClerkRelatedDTO getByMemberId(String staffId, String memberId);
List<MemberUnionidRelatedDTO> getByWxUserIdAndWxEnterpriseId(String wxUserId, String wxEnterpriseId);
......@@ -58,4 +63,22 @@ public interface MemberUnionidRelatedApiService {
ExternalUserDTO getExternalUseridInfo(String wxEnterpriseId, String wxUserId, String externalUserId);
/**
* 清理外部联系人
*
* @param wxEnterpriseId
* @param wxUserId
* @param externalUserIds
*/
void cleanNoExsitFriendNew(String wxEnterpriseId, String wxUserId, List<String> externalUserIds);
/**
* 根据会员的unionid 获取好友导购列表
*
* @param enterpriseId
* @param unionId
* @return
*/
ServiceResponse<List<FriendStoreInfoDTO>> listFriendClerkByMemberUnionid(String enterpriseId, String unionId);
}
......@@ -24,12 +24,14 @@ public interface MemberUnionidRelatedMapper {
int cleanByCid(@Param("cid") String cid);
MemberUnionidRelated getByUnionId(@Param("wxUserId")String wxUserId, @Param("unionid")String unionid);
MemberUnionidRelated getByUnionId(@Param("wxEnterpriseId") String wxEnterpriseId, @Param("wxUserId") String wxUserId, @Param("unionid") String unionid);
MemberUnionidRelated getByMemberId(@Param("wxUserId")String wxUserId, @Param("memberId")String memberId);
void deleteByUnionidAndUserId(@Param("externalUserid")String externalUserid,@Param("wxUserId") String wxUserId);
void delMemberUnionidRelatedBatch(@Param("wxEnterpriseId") String wxEnterpriseId, @Param("externalUserids") List<String> externalUserid, @Param("wxUserId") String wxUserId);
List<MemberUnionidRelated> getByWxUserIdAndWxEnterpriseId(@Param("wxUserId")String wxUserId, @Param("wxEnterpriseId")String wxEnterpriseId);
List<MemberUnionidRelated> listByEnterpriseIdAndDate(@Param("enterpriseId")String enterpriseId,@Param("date")Date date);
......
......@@ -181,7 +181,20 @@ public interface PreDealLogMapper {
* @return
*/
int updateFriendStatusByDataId(@Param("taskId")String taskId, @Param("dataId")String dataId, @Param("status")int status, @Param("reason")String reason, @Param("dataContent")String dataContent);
/**
/**
* 更新状态
*
* @param taskId
* @param dataId
* @param status
* @param reason
* @param dataContent
* @return
*/
int updateFriendStatusAndRelationKeyByDataId(@Param("taskId") String taskId, @Param("dataId") String dataId, @Param("status") int status, @Param("reason") String reason, @Param("dataContent") String dataContent, @Param("relationKey") String relationKey);
/**
*
* @param taskId
* @param pDataId
......@@ -196,6 +209,34 @@ public interface PreDealLogMapper {
*/
List<TabHaobanPreDealLog> listByPDataIdAndTaskId(@Param("taskId")String taskId, @Param("pDataId")String wxUserId);
/**
* 根据关联键获取字段
*
* @param taskId
* @param relationKey
* @return
*/
TabHaobanPreDealLog getByRelationKey(@Param("taskId") String taskId, @Param("dataType") int dataType, @Param("relationKey") String relationKey);
/**
* 校验任务
*
* @param taskId
* @param dataType
* @return
*/
public int checkTaskFriend(@Param("taskId") String taskId, @Param("pDataId") String pDataId, @Param("dataType") int dataType);
/**
* 获取dataid 根据父id
*
* @param taskId
* @param pDataId
* @return
*/
List<String> listReDataIdByPDataId(@Param("taskId") String taskId, @Param("dataId") String pDataId
, @Param("dataType") int dataType);
}
\ No newline at end of file
......@@ -25,6 +25,8 @@ public interface TabHaobanExternalClerkRelatedMapper {
void delByUserIdAndExternalUserId(TabHaobanExternalClerkRelated record);
void delByUserIdAndExternalUserIdBatch(@Param("wxUserId") String wxUserId, @Param("wxEnterpriseId") String wxEnterpriseId, @Param("externalUserIds") List<String> externalUserIds);
void delByClerkIdAndStaffId(@Param("clerkId")String clerkId, @Param("staffId")String staffId);
void cleanStaffRelated(@Param("wxEnterpriseId")String wxEnterpriseId, @Param("staffIds")List<String> staffIds);
......@@ -43,4 +45,13 @@ public interface TabHaobanExternalClerkRelatedMapper {
List<TabHaobanExternalClerkRelated> listByWxEnterpriseIdAndWxUserIds(@Param("userIdList")List<String> userIdList, @Param("wxEnterpriseId")String wxEnterpriseId);
TabHaobanExternalClerkRelated getByMemberId(@Param("wxUserId")String wxUserId, @Param("memberId")String memberId);
/**
* 外部联系人的unionid
*
* @param enterpriseId
* @param unionId
* @return
*/
List<TabHaobanExternalClerkRelated> listExternalByUnionId(@Param("enterpriseId") String enterpriseId, @Param("unionId") String unionId);
}
\ No newline at end of file
......@@ -87,4 +87,6 @@ public interface TabHaobanStaffClerkRelationMapper {
List<TabHaobanStaffClerkRelation> listByWxEnterpriseId(@Param("wxEnterpriseId")String wxEnterpriseId);
List<TabHaobanStaffClerkRelation> pageByWxEnterpriseId(@Param("wxEnterpriseId")String wxEnterpriseId);
List<TabHaobanStaffClerkRelation> listBindByStoreId(@Param("wxEnterpriseId") String wxEnterpriseId, @Param("storeId") String storeId);
}
\ No newline at end of file
......@@ -61,8 +61,18 @@ public class TabHaobanPreDealLog implements Serializable {
private String dataContent;
private String relationKey;
private String reason;
public String getRelationKey() {
return relationKey;
}
public void setRelationKey(String relationKey) {
this.relationKey = relationKey;
}
public String getReason() {
return reason;
}
......
package com.gic.haoban.manage.service.exception;
/**
* Created 2021/3/31.
*
* @author hua
*/
public class WxApiLimitException extends RuntimeException {
public WxApiLimitException(String message) {
super(message);
}
}
package com.gic.haoban.manage.service.pojo;
import com.gic.haoban.manage.api.dto.MemberUnionidRelatedDTO;
import java.io.Serializable;
/**
* Created 2021/4/2.
*
* @author hua
*/
public class DealQywxExternalUserPojo implements Serializable {
public enum DealType {
//删除
del(0),
//新增
add(1);
private int type;
DealType(int type) {
this.type = type;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}
// 0 删除 1新增
private int type;
private MemberUnionidRelatedDTO data;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public MemberUnionidRelatedDTO getData() {
return data;
}
public void setData(MemberUnionidRelatedDTO data) {
this.data = data;
}
}
package com.gic.haoban.manage.service.pojo;
import java.io.Serializable;
/**
* Created 2021/3/18.
*
* @author hua
*/
public class ExternalUserIdWxUserIdPojo implements Serializable {
private String externalUserId;
private String wxUserId;
public ExternalUserIdWxUserIdPojo(String externalUserId, String wxUserId) {
this.externalUserId = externalUserId;
this.wxUserId = wxUserId;
}
public String getExternalUserId() {
return externalUserId;
}
public void setExternalUserId(String externalUserId) {
this.externalUserId = externalUserId;
}
public String getWxUserId() {
return wxUserId;
}
public void setWxUserId(String wxUserId) {
this.wxUserId = wxUserId;
}
}
......@@ -12,6 +12,15 @@ public interface ExternalClerkRelatedService {
void delByUserIdAndExternalUserId(MemberUnionidRelatedDTO dto);
/**
* 删除会员与导购的关联关系
*
* @param wxEnterpriseId
* @param wxUserId
* @param externalUserids
*/
void delByUserIdAndExternalUserIdBatch(String wxEnterpriseId, String wxUserId, List<String> externalUserids);
void delByClerkIdAndStaffId(String clerkId, String staffId);
void cleanStaffRelated(String wxEnterpriseId, List<String> staffIds);
......@@ -24,4 +33,13 @@ public interface ExternalClerkRelatedService {
ExternalClerkRelatedDTO getByMemberId(String wxUserId, String memberId);
/**
* 根据unionid获取外部联系人的绑定导购
*
* @param enterpriseId
* @param unionId
* @return
*/
List<TabHaobanExternalClerkRelated> listExternalByUnionId(String enterpriseId, String unionId);
}
......@@ -7,7 +7,7 @@ import com.gic.haoban.manage.service.entity.MemberUnionidRelated;
public interface MemberUnionRelatedService {
MemberUnionidRelatedDTO getByUnionId(String wxUserId, String unionid);
MemberUnionidRelatedDTO getByUnionId(String wxEnterpriseId, String wxUserId, String unionid);
MemberUnionidRelatedDTO getByMemberId(String wxUserId, String memberId);
......@@ -15,6 +15,15 @@ public interface MemberUnionRelatedService {
void delMemberUnionidRelated(MemberUnionidRelatedDTO dto);
/**
* 删除外部联系人关系
*
* @param wxEnterpriseId
* @param wxUserId
* @param externalUserids
*/
void delMemberUnionidRelatedBatch(String wxEnterpriseId, String wxUserId, List<String> externalUserids);
List<MemberUnionidRelatedDTO> getByWxUserIdAndWxEnterpriseId(String wxUserId, String wxEnterpriseId);
MemberUnionidRelatedDTO getByParams(String wxUserId, String enterpriseId, String name, String createTime);
......
......@@ -168,7 +168,19 @@ public interface PreDealService {
* @param dataContent
*/
public boolean updateFriendStatusByDataId(String taskId, String dataId, int status, String reason, String dataContent);
/**
/**
* 更新好友成功状态
*
* @param taskId
* @param dataId
* @param status
* @param reason
* @param dataContent
*/
public boolean updateFriendStatusByDataId(String taskId, String dataId, int status, String reason, String dataContent, String relationKey);
/**
* 根据父任务判断子任务是否全部完成
* @param taskId
* @param pDataId
......@@ -182,5 +194,40 @@ public interface PreDealService {
* @return
*/
public List<TabHaobanPreDealLog> listByPDataIdAndTaskId(String taskId, String wxUserId);
/**
* 根据唯一key 获取用户
*
* @param taskId
* @param dataType
* @param relationKey
* @return
*/
public TabHaobanPreDealLog getByRelationKey(String taskId, Integer dataType, String relationKey);
/**
* 获取任务是否有在同步中 好友
*
* @param dataType
* @return
*/
public boolean checkFriendTask(String taskId, int dataType);
/**
* 获取任务是否有在同步中 好友
*
* @param dataType
* @return
*/
public boolean checkFriendTaskByPDataId(String taskId, String pDataId, int dataType);
/**
* 根据父数据id 所有dataid
*
* @param pDataId
* @return
*/
public List<String> listReDataIdByPDataId(String taskId, String pDataId, Integer dataType);
}
......@@ -85,5 +85,14 @@ public interface StaffClerkRelationService {
Page<StaffClerkRelationDTO> pageByWxEnterpriseId(String wxEnterpriseId, BasePageInfo pageInfo);
/**
* 根据门店获取门店的绑定列表
*
* @param wxEnterpriseId
* @param storeId
* @return
*/
List<StaffClerkRelationDTO> listBindByStoreId(String wxEnterpriseId, String storeId);
}
......@@ -44,6 +44,11 @@ public class ExternalClerkRelatedServiceImpl implements ExternalClerkRelatedServ
}
@Override
public void delByUserIdAndExternalUserIdBatch(String wxEnterpriseId, String wxUserId, List<String> externalUserids) {
mapper.delByUserIdAndExternalUserIdBatch(wxUserId, wxEnterpriseId, externalUserids);
}
@Override
public void delByClerkIdAndStaffId(String clerkId, String staffId) {
mapper.delByClerkIdAndStaffId(clerkId,staffId);
}
......@@ -79,4 +84,8 @@ public class ExternalClerkRelatedServiceImpl implements ExternalClerkRelatedServ
return EntityUtil.changeEntityByJSON(ExternalClerkRelatedDTO.class, mapper.getByMemberId(wxUserId,memberId));
}
@Override
public List<TabHaobanExternalClerkRelated> listExternalByUnionId(String enterpriseId, String unionId) {
return mapper.listExternalByUnionId(enterpriseId, unionId);
}
}
......@@ -22,8 +22,8 @@ public class MemberUnionRelatedServiceImpl implements MemberUnionRelatedService
private MemberUnionidRelatedMapper mapper;
@Override
public MemberUnionidRelatedDTO getByUnionId(String wxUserId, String unionid) {
return EntityUtil.changeEntityByJSON(MemberUnionidRelatedDTO.class,mapper.getByUnionId(wxUserId,unionid));
public MemberUnionidRelatedDTO getByUnionId(String wxEnterpriseId, String wxUserId, String unionid) {
return EntityUtil.changeEntityByJSON(MemberUnionidRelatedDTO.class, mapper.getByUnionId(wxEnterpriseId, wxUserId, unionid));
}
@Override
public MemberUnionidRelatedDTO getByMemberId(String wxUserId, String memberId) {
......@@ -45,6 +45,11 @@ public class MemberUnionRelatedServiceImpl implements MemberUnionRelatedService
}
@Override
public void delMemberUnionidRelatedBatch(String wxEnterpriseId, String wxUserId, List<String> externalUserids) {
mapper.delMemberUnionidRelatedBatch(wxEnterpriseId, externalUserids, wxUserId);
}
@Override
public List<MemberUnionidRelatedDTO> getByWxUserIdAndWxEnterpriseId(String wxUserId, String wxEnterpriseId) {
return EntityUtil.changeEntityListByJSON(MemberUnionidRelatedDTO.class, mapper.getByWxUserIdAndWxEnterpriseId(wxUserId,wxEnterpriseId));
}
......
......@@ -173,8 +173,14 @@ public class PreDealServiceImpl implements PreDealService {
}
@Override
public boolean checkStaffTaskByTaskIdAndPDataId(String taskId, String pDataId) {
@Override
public boolean updateFriendStatusByDataId(String taskId, String dataId, int status, String reason, String dataContent, String relationKey) {
int i = preDealLogMapper.updateFriendStatusAndRelationKeyByDataId(taskId, dataId, status, reason, dataContent, relationKey);
return i >= 0;
}
@Override
public boolean checkStaffTaskByTaskIdAndPDataId(String taskId, String pDataId) {
return preDealLogMapper.countFailStaffTaskByTaskIdAndPDataId(taskId,pDataId) == 0;
}
......@@ -182,4 +188,26 @@ public class PreDealServiceImpl implements PreDealService {
public List<TabHaobanPreDealLog> listByPDataIdAndTaskId(String taskId, String wxUserId) {
return preDealLogMapper.listByPDataIdAndTaskId(taskId,wxUserId);
}
@Override
public TabHaobanPreDealLog getByRelationKey(String taskId, Integer dataType, String relationKey) {
return preDealLogMapper.getByRelationKey(taskId, dataType, relationKey);
}
@Override
public boolean checkFriendTask(String taskId, int dataType) {
int i = preDealLogMapper.checkTaskFriend(taskId, null, dataType);
return i == 0;
}
@Override
public boolean checkFriendTaskByPDataId(String taskId, String pDataId, int dataType) {
int i = preDealLogMapper.checkTaskFriend(taskId, pDataId, dataType);
return i == 0;
}
@Override
public List<String> listReDataIdByPDataId(String taskId, String pDataId, Integer dataType) {
return preDealLogMapper.listReDataIdByPDataId(taskId, pDataId, dataType);
}
}
......@@ -245,4 +245,10 @@ public class StaffClerkRelationServiceImpl implements StaffClerkRelationService
Page<StaffClerkRelationDTO> retPage = PageUtil.changePageHelperToCurrentPage(new PageInfo<>(clerkBindList), StaffClerkRelationDTO.class);
return retPage;
}
@Override
public List<StaffClerkRelationDTO> listBindByStoreId(String wxEnterpriseId, String storeId) {
List<TabHaobanStaffClerkRelation> ret = mapper.listBindByStoreId(wxEnterpriseId, storeId);
return EntityUtil.changeEntityListNew(StaffClerkRelationDTO.class, ret);
}
}
......@@ -17,10 +17,7 @@ import com.gic.haoban.base.api.common.ServiceResponse;
import com.gic.haoban.common.utils.EntityUtil;
import com.gic.haoban.common.utils.PageUtil;
import com.gic.haoban.manage.api.dto.*;
import com.gic.haoban.manage.api.enums.PreDealStatusEnum;
import com.gic.haoban.manage.api.enums.PreDealTypeEnum;
import com.gic.haoban.manage.api.enums.SecretTypeEnum;
import com.gic.haoban.manage.api.enums.SyncTaskStatusEnum;
import com.gic.haoban.manage.api.enums.*;
import com.gic.haoban.manage.api.service.ClerkMainStoreRelatedApiService;
import com.gic.haoban.manage.api.service.DealSyncOperationApiService;
import com.gic.haoban.manage.api.service.DepartmentApiService;
......@@ -111,6 +108,8 @@ public class DealSyncOperationApiServiceImpl implements DealSyncOperationApiServ
private static final String LOCK_SUCCESS_KEY = "sync_wx_success_lock_";
private static final String FRIEND_LOCK = "haoban_fresh_wx_friend_lock_";
@Override
public void departmentDealMq(String params) {
logger.info("mq处理中:{}", params);
......@@ -145,14 +144,14 @@ public class DealSyncOperationApiServiceImpl implements DealSyncOperationApiServ
}
}else if(dataPre.getDataType().equals(PreDealTypeEnum.friend_clerk.getVal())){
logger.info("好友导购处理:{}", params);
operationMap.get("friendClerkSyncOperation").dealSingleByMq(dealParamMqDTO, dataPre);
operationMap.get("friendClerkSyncNewOperation").dealSingleByMq(dealParamMqDTO, dataPre);
}else if(dataPre.getDataType().equals(PreDealTypeEnum.friend.getVal())){
operationMap.get("friendSyncOperation").dealSingleByMq(dealParamMqDTO, dataPre);
logger.info("好友处理:{}", params);
operationMap.get("friendSyncNewOperation").dealSingleByMq(dealParamMqDTO, dataPre);
logger.info("好友处理:{}", params);
}else if(dataPre.getDataType().equals(PreDealTypeEnum.self_friend.getVal())){
operationMap.get("selfFriendSyncOperation").dealSingleByMq(dealParamMqDTO, dataPre);
logger.info("好友处理:{}", params);
operationMap.get("selfFriendSyncNewOperation").dealSingleByMq(dealParamMqDTO, dataPre);
logger.info("好友处理:{}", params);
} else if(dataPre.getDataType().equals(PreDealTypeEnum.friend_merge.getVal())){
operationMap.get("friendMergeSyncOperation").dealSingleByMq(dealParamMqDTO, dataPre);
......@@ -263,7 +262,7 @@ public class DealSyncOperationApiServiceImpl implements DealSyncOperationApiServ
@Override
public String createQywxTask(String wxEnterpriseId, String taskName, String userId, String desc) {
return createBaseTask(wxEnterpriseId, taskName, userId, desc, 1);
return createBaseTask(wxEnterpriseId, taskName, userId, desc, SyncTaskTypeEnum.QYWX_CONTACT.getType());
}
......@@ -694,17 +693,27 @@ public class DealSyncOperationApiServiceImpl implements DealSyncOperationApiServ
}
@Override
public String createWxFriendSingleTask(String wxEnterpriseId, String taskName, String staffId, String staffName) {
TabHaobanSyncTask tabHaobanSyncTask = new TabHaobanSyncTask();
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);
return null;
}
TabHaobanSyncTask tabHaobanSyncTask = new TabHaobanSyncTask();
tabHaobanSyncTask.setAddUser(staffId);
tabHaobanSyncTask.setTaskName(taskName);
tabHaobanSyncTask.setTaskName(SyncTaskTypeEnum.getTaskName(syncTaskType));
tabHaobanSyncTask.setTaskDesc(staffName);
tabHaobanSyncTask.setWxEnterpriseId(wxEnterpriseId);
tabHaobanSyncTask.setStatusFlag(SyncTaskStatusEnum.init.getVal());
tabHaobanSyncTask.setTaskId(ToolUtil.randomUUID());
tabHaobanSyncTask.setTaskType(4);
tabHaobanSyncTask.setTaskType(syncTaskType);
syncTaskService.createTask(tabHaobanSyncTask);
RedisUtil.setCache(staffLockKey, tabHaobanSyncTask.getTaskId(), 1L, TimeUnit.HOURS);
RedisUtil.unlock(lockKey);
return tabHaobanSyncTask.getTaskId();
}
......@@ -726,9 +735,30 @@ public class DealSyncOperationApiServiceImpl implements DealSyncOperationApiServ
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;
}
List<TabHaobanPreDealLog> dealLogList = clerkRelationDTOS.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.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) {
@Override
public void quartWxFriendClerk(String res) {
List<TabHaobanSyncTask> taskList = syncTaskService.listTaskByType(2);
if(CollectionUtils.isNotEmpty(taskList)){
for (TabHaobanSyncTask tabHaobanSyncTask : taskList) {
......
package com.gic.haoban.manage.service.service.out.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.gic.haoban.manage.api.dto.*;
import com.gic.haoban.manage.api.enums.SecretTypeEnum;
import com.gic.haoban.manage.service.service.*;
import com.gic.wechat.api.dto.qywx.QywxIinkExternalMessageDTO;
import com.gic.wechat.api.dto.qywx.QywxImageExternalMessageDTO;
import com.gic.wechat.api.dto.qywx.QywxTextExternalMessageDTO;
import com.gic.wechat.api.service.qywx.QywxSuiteApiService;
import com.gic.wechat.api.service.qywx.QywxUserApiService;
import com.github.pagehelper.PageHelper;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.gic.api.base.commons.JSONResponse;
import com.gic.api.base.commons.Page;
import com.gic.clerk.api.dto.ClerkDTO;
import com.gic.clerk.api.service.ClerkService;
import com.gic.clerk.api.service.PowerService;
import com.gic.commons.util.DateUtil;
import com.gic.commons.util.EntityUtil;
import com.gic.commons.util.MD5Utils;
import com.gic.commons.util.Md5Util;
import com.gic.commons.util.StringUtil;
import com.gic.enterprise.api.dto.StoreDTO;
import com.gic.enterprise.api.service.StoreService;
import com.gic.haoban.base.api.common.BasePageInfo;
import com.gic.haoban.common.utils.PageUtil;
import com.gic.haoban.contacts.manage.api.dto.SearchDataDTO;
import com.gic.haoban.manage.api.service.DepartmentApiService;
import com.gic.haoban.manage.api.service.MaterialApiService;
import com.gic.haoban.manage.api.service.MemberUnionidRelatedApiService;
import com.gic.haoban.manage.api.service.StaffDepartmentRelatedApiService;
import com.gic.haoban.manage.api.service.WxEnterpriseApiService;
import com.gic.haoban.manage.service.config.Config;
import com.gic.haoban.manage.service.dao.mapper.MemberUnionidRelatedMapper;
import com.gic.haoban.manage.service.entity.MemberUnionidRelated;
import com.gic.haoban.manage.service.entity.TabHaobanClerkMainStoreRelated;
import com.gic.haoban.manage.service.entity.TabHaobanExternalClerkRelated;
import com.gic.haoban.manage.service.entity.TabHaobanStaff;
import com.gic.haoban.manage.service.entity.TabHaobanStaffDepartmentRelated;
import com.gic.haoban.manage.service.entity.TabHaobanWxEnterprise;
import com.gic.haoban.manage.service.entity.TabHaobanWxEnterpriseRelated;
import com.gic.haoban.manage.service.pojo.ExternalUserPojo;
import com.gic.haoban.manage.service.util.EmojiFilterUtil;
import com.gic.member.api.dto.MemberDTO;
import com.gic.member.api.service.MemberOpenCardBusinessService;
import com.gic.member.api.service.MemberService;
import com.gic.redis.data.anno.RedisLock;
import com.gic.redis.data.util.RedisUtil;
import com.gic.search.engine.api.constant.MemberDataEnum;
import com.gic.search.engine.api.constant.OperateEnum;
import com.gic.search.engine.api.dto.ESResponseQueryBatch;
import com.gic.search.engine.api.dto.ESResponseQuerySingle;
import com.gic.search.engine.api.dto.dynamic.DynamicSearchDTO;
import com.gic.search.engine.api.filter.NewNodeAddUtil;
import com.gic.search.engine.api.service.dynamic.ESDataDynamicOperationApiService;
@Service
public class MemberUnionidRelatedApiServiceImpl implements MemberUnionidRelatedApiService{
private static final Logger log = LogManager.getLogger(MemberUnionidRelatedApiServiceImpl.class);
@Autowired
private MemberUnionRelatedService memberUnionRelatedService;
@Autowired
private StaffService staffService;
@Autowired
private QywxUserApiService qywxUserApiService;
@Autowired
private com.gic.enterprise.api.service.StoreGroupService gicDepartmentService;
@Autowired
private MemberService memberService;
@Autowired
private WxEnterpriseRelatedService wxEnterpriseRelatedService;
@Autowired
private WxEnterpriseService wxEnterpriseService;
private static final String SELF_APP = "selfSuiteId";
@Autowired
private MemberOpenCardBusinessService memberOpenCardBusinessService;
@Autowired
private ClerkService clerkService;
@Autowired
private DepartmentApiService departmentApiService;
@Autowired
private MemberUnionidRelatedMapper memberUnionidRelatedMapper;
@Autowired
private StaffDepartmentRelatedService staffDepartmentRelatedService;
@Autowired
private ESDataDynamicOperationApiService eSDataDynamicOperationApiService;
@Autowired
private ClerkMainStoreRelatedService clerkMainStoreRelatedService;
@Autowired
private StoreService storeService;
@Autowired
private Config config;
@Autowired
private QywxSuiteApiService qywxSuiteApiService;
@Autowired
private MaterialApiService materialApiService;
@Autowired
private SecretSettingService secretSettingService;
@Autowired
private StaffClerkRelationService staffClerkRelationService;
@Autowired
private ExternalClerkRelatedService externalClerkRelatedService;
@Autowired
private PowerService powerService;
@Override
public List<MemberStoreDTO> listByExTernalUseridAndWxUserId(String externalUserid, String wxUserId) {
List<TabHaobanExternalClerkRelated> list = externalClerkRelatedService.listByExTernalUseridAndWxUserId(externalUserid, wxUserId);
List<MemberStoreDTO> result = new ArrayList<>();
if(CollectionUtil.isEmpty(list)){
return null;
}
String wxEnterpriseId = list.get(0).getWxEnterpriseId();
TabHaobanStaff haobanStaff = staffService.selectByUserIdAndEnterpriseId(wxUserId, wxEnterpriseId);
if (null == haobanStaff) {
log.info("staff不存在");
return null;
}
List<StaffClerkRelationDTO> clerkRelationDTOS = staffClerkRelationService.listBindCodeByStaffId(null, haobanStaff.getStaffId());
if(CollectionUtil.isEmpty(clerkRelationDTOS)){
log.info("staff关联门店不存在1");
return null;
}
// //1、查该staff的门店id
// List<TabHaobanStaffDepartmentRelated> relatedIds = staffDepartmentRelatedService.listByWxUserId(wxUserId);
// if(CollectionUtil.isEmpty(relatedIds)){
// log.info("staff关联部门不存在1");
// return null;
// }
// List<String> departmentIds = relatedIds.stream().map(s->s.getDepartmentId()).collect(Collectors.toList());
// if(CollectionUtil.isEmpty(departmentIds)){
// log.info("staff部门不存在1");
// return null;
// }
// List<DepartmentDTO> stores = departmentApiService.listByDepartmentIds(departmentIds, 1);
// if(CollectionUtil.isEmpty(stores)){
// log.info("staff关联门店不存在1");
// return null;
// }
List<String> storeIds = clerkRelationDTOS.stream().filter(s->(s.getStoreId()!=null || "".equals(s.getStoreId()))).map(s->s.getStoreId()).collect(Collectors.toList());
if(CollectionUtil.isEmpty(storeIds)){
log.info("staff关联门店不存在2");
return null;
}
//2、获取member的storeId
for(TabHaobanExternalClerkRelated tab : list){
String memberId = tab.getMemberId();
if(StringUtils.isEmpty(memberId)){
continue ;
}
String gicEnterpriseId = tab.getEnterpriseId();
JSONObject searchJson = new JSONObject();
searchJson = NewNodeAddUtil.addNewNodeForAnd(MemberDataEnum.member_memberId.getCode(), OperateEnum.OPERATE_EQ.getValue(), memberId,searchJson);
DynamicSearchDTO dynamicSearchDTO = new DynamicSearchDTO();
dynamicSearchDTO.setEnterpriseId(gicEnterpriseId);
dynamicSearchDTO.setColumnCategoryCode("member");
dynamicSearchDTO.setSearchJson(searchJson);
dynamicSearchDTO.setBegin(0);
dynamicSearchDTO.setRecordNumber(1);
log.info("gicEnterpriseId=========>{},searchJson=========={}",gicEnterpriseId,searchJson);
ESResponseQueryBatch responseQuery = eSDataDynamicOperationApiService.queryDataBatch(dynamicSearchDTO, false, null);
if(null == responseQuery){
log.info("会员不存在1");
continue;
}
List<JSONObject> res = responseQuery.getRes();
if(CollectionUtil.isEmpty(res)){
log.info("会员不存在2");
continue;
}
String storeId = "";
for (JSONObject jsonObject : res) {
storeId = jsonObject.get("storeId") == null?"":jsonObject.get("storeId").toString();
}
if(StringUtils.isEmpty(storeId)){
log.info("会员门店不存在");
continue;
}
String[] memberStoreIds =storeId.split(" ");
List<String> memberStoreIdList = Arrays.asList(memberStoreIds);
if(CollectionUtil.isEmpty(memberStoreIdList)){
log.info("会员门店不存在");
continue;
}
log.info("memberStoreIdList===============>{}",JSONObject.toJSONString(memberStoreIdList));
log.info("storeIds===============>{}",JSONObject.toJSONString(storeIds));
//取交集(解决不支持的报错现象)
List list3= new ArrayList(memberStoreIdList);
List list4= new ArrayList(storeIds);
list3.retainAll(list4);
if(CollectionUtil.isEmpty(list3)){
continue;
}else{
for(Object resultStoreId : list3){
MemberStoreDTO dto = new MemberStoreDTO();
dto.setMemberId(memberId);
dto.setStoreId(resultStoreId.toString());
result.add(dto);
}
}
}
return result;
}
@Override
public MemberUnionidRelatedDTO getByUnionId(String staffId, String unionid) {
TabHaobanStaff staff = staffService.selectById(staffId);
if(staff == null){
return null;
}
log.info("【查询会员】wxUserId={},unionid={}",staff.getWxUserId(),unionid);
return memberUnionRelatedService.getByUnionId(staff.getWxUserId(),unionid);
}
@Override
public String addMemberUnionidRelated(MemberUnionidRelatedDTO dto) {
return addMemberUnionidRelatedNew(dto);
}
@Override
public String addMemberUnionidRelatedNew(MemberUnionidRelatedDTO dto) {
//拼装参数
dto = getMemberUnionidRelatedDTO(dto);
if(dto == null){
return "";
}
//加锁
String key = "external" + dto.getWxEnterpriseId() + "_"+ dto.getWxUserId() + "_" + dto.getExternalName() + "_" + dto.getAddCreateTime();
RedisUtil.lock(key,3l);
//新增成员和外部联系人的关系
String memberUnionId = insertMemberUnionIdRelated(dto);
//新增导购和外部联系人关系
dto.setMemberUnionidRelatedId(memberUnionId);
insertExternalClerkRelated(dto);
//解锁
RedisUtil.unlock(key);
return memberUnionId;
}
private void insertExternalClerkRelated(MemberUnionidRelatedDTO dto) {
String wxUserId = dto.getWxUserId();
String wxEnterpriseId = dto.getWxEnterpriseId();
String name = dto.getExternalName();
String createTime = dto.getAddCreateTime();
String externalUserId = dto.getExternalUserid();
String avatar = dto.getAvatar();
String unionId = dto.getUnionid();
if(StringUtils.isAnyBlank(wxUserId,wxEnterpriseId,name,createTime,unionId)){
log.info("【新增外部联系人】wxUserId={},wxEnterpriseId={},name={},createTime={},avatar={},unionId={}",wxUserId,wxEnterpriseId,name,createTime,avatar,unionId);
return;
}
TabHaobanStaff staff = staffService.selectByUserIdAndEnterpriseId(wxUserId, wxEnterpriseId);
if(staff == null){
return;
}
String staffId = staff.getStaffId();
MemberDTO member = null;
TabHaobanClerkMainStoreRelated r = clerkMainStoreRelatedService.selectByWxEnterpriseIdAndStoreId(staffId,wxEnterpriseId);
if(r == null){
log.info("【新增外部联系人】主门店为空");
return;
}
String storeId = r.getStoreId();
StaffClerkRelationDTO staffClerkRelationDTO = staffClerkRelationService.getOneBindByStoreId(staffId,storeId);
if(staffClerkRelationDTO == null){
log.info("【新增外币联系人】导购和clerk关联为空");
return;
}
//新增导购和外部联系人关系
String clerkCode = staffClerkRelationDTO.getClerkCode();
ClerkDTO clerk = clerkService.getClerkByClerkCode(staffClerkRelationDTO.getEnterpriseId(), clerkCode);
log.info("【新增外部联系人】clerkCode={},unionid:{}",clerkCode,unionId);
if(clerk == null){
log.info("【新增外币联系人】导购为空");
return;
}
String qrcodeParam = clerk.getQrcodeParam();
if(StringUtils.isBlank(qrcodeParam)){
powerService.saveClerkQrCode(clerk.getClerkId());
clerk = clerkService.getClerkByClerkCode(staffClerkRelationDTO.getEnterpriseId(), clerkCode);
qrcodeParam = clerk.getQrcodeParam();
}
if(clerk != null && StringUtils.isNotBlank(qrcodeParam)&&StringUtils.isNotBlank(unionId)){
log.info("【新增外部联系人会员】enterpriseId={},unionId={},name={},avatar={},QrcodeParam={}",staffClerkRelationDTO.getEnterpriseId(),unionId,name,avatar,qrcodeParam);
member = memberOpenCardBusinessService.getMemberByQywxChannelParam(staffClerkRelationDTO.getEnterpriseId(),unionId,"",name,avatar,qrcodeParam);
}
TabHaobanExternalClerkRelated exsitDTO = externalClerkRelatedService.getByParams(wxUserId, wxEnterpriseId,name,createTime);
String key = wxUserId+wxEnterpriseId+name+createTime;
if(exsitDTO == null){
RedisUtil.lock(key,1L);
exsitDTO = externalClerkRelatedService.getByParams(wxUserId, wxEnterpriseId,name,createTime);
RedisUtil.unlock(key);
}
if(exsitDTO == null){
TabHaobanExternalClerkRelated related = new TabHaobanExternalClerkRelated();
related.setAddCreateTime(createTime);
related.setClerkId(staffClerkRelationDTO.getClerkId());
related.setEnterpriseId(staffClerkRelationDTO.getEnterpriseId());
related.setExternalName(name);
related.setExternalUserId(externalUserId);
related.setStaffId(staffId);
related.setMemberUnionidRelatedId(dto.getMemberUnionidRelatedId());
related.setStoreId(r.getStoreId());
related.setUnionid(unionId);
related.setWxEnterpriseId(wxEnterpriseId);
related.setWxUserId(wxUserId);
if(member != null){
related.setMemberId(member.getMemberId());
}
externalClerkRelatedService.insert(related);
}else{
if(member != null){
exsitDTO.setMemberId(member.getMemberId());
}
exsitDTO.setMemberUnionidRelatedId(dto.getMemberUnionidRelatedId());
exsitDTO.setExternalUserId(externalUserId);
exsitDTO.setUnionid(unionId);
exsitDTO.setStoreId(storeId);
exsitDTO.setEnterpriseId(staffClerkRelationDTO.getEnterpriseId());
exsitDTO.setClerkId(staffClerkRelationDTO.getClerkId());
externalClerkRelatedService.update(exsitDTO);
}
}
private String insertMemberUnionIdRelated(MemberUnionidRelatedDTO dto) {
if(dto == null){
return "";
}
String wxUserId = dto.getWxUserId();
String wxEnterpriseId = dto.getWxEnterpriseId();
String name = dto.getExternalName();
String createTime = dto.getAddCreateTime();
if(StringUtils.isAnyBlank(wxUserId,wxEnterpriseId,name,createTime)){
log.info("【新增外部联系人】wxUserId={},wxEnterpriseId={},name={},createTime={}",wxUserId,wxEnterpriseId,name,createTime);
return "";
}
MemberUnionidRelatedDTO exsitDTO = memberUnionRelatedService.getByParams(wxUserId, wxEnterpriseId,name,createTime);
String uuid = "";
if(exsitDTO == null){
uuid = memberUnionRelatedService.addMemberUnionidRelated(dto);
}else{
//如果是自建更新uuid
exsitDTO.setSelfExternalUserid(dto.getSelfExternalUserid());
exsitDTO.setUnionid(dto.getUnionid());
//更新对外联系人id
exsitDTO.setExternalUserid(dto.getExternalUserid());
memberUnionRelatedService.update(exsitDTO);
uuid = exsitDTO.getMemberUnionidRelatedId();
MemberUnionidRelatedDTO fullDTO = memberUnionRelatedService.getByParams(wxUserId, wxEnterpriseId,name,createTime);
dto.setExternalUserid(fullDTO.getExternalUserid());
dto.setUnionid(fullDTO.getUnionid());
}
return uuid;
}
private MemberUnionidRelatedDTO getMemberUnionidRelatedDTO(MemberUnionidRelatedDTO dto){
log.info("【新增外部联系人回调】dto={}",JSON.toJSONString(dto));
String corpId = dto.getCorpid();
TabHaobanWxEnterprise wxEnterprise = wxEnterpriseService.getEnterpriseBycorpId(corpId);
if(wxEnterprise == null){
return null;
}
String wxEnterpriseId = wxEnterprise.getWxEnterpriseId();
String userId = dto.getWxUserId();
String suiteid = dto.getSuiteid();
String unionIdJson = "";
if(SELF_APP.equals(suiteid)){
SecretSettingDTO secretSetting = secretSettingService.getSecretSetting(wxEnterpriseId, SecretTypeEnum.CONTACT_CUSTOMER.getVal());
if (null == secretSetting) {
log.info("没有配置secret");
return null;
}
unionIdJson = qywxUserApiService.getCorpSelfExternalUseridInfo(dto.getCorpid(), secretSetting.getSecretVal(), dto.getExternalUserid());
}else{
unionIdJson = qywxUserApiService.getExternalUseridInfo(dto.getCorpid(), dto.getSuiteid(), dto.getExternalUserid());
}
if(StringUtils.isBlank(unionIdJson)){
log.info("【新增外部联系人回调】unionIdJson=null");
return null;
}
log.info("【新增外部联系人回调】unionIdJson={}",JSON.toJSONString(unionIdJson));
ExternalUserPojo pojo = getExternalUserPojo(unionIdJson,userId,wxEnterpriseId);
String name = pojo.getName();
String createTime = pojo.getAddCreateTime();
dto.setWxEnterpriseId(wxEnterpriseId);
dto.setExternalName(name);
dto.setAddCreateTime(createTime);
dto.setAvatar(pojo.getAvatar());
String externalUserId = null;
String selfExternalUserId = null;
String unionId = null;
if(SELF_APP.equals(suiteid)){
unionId = pojo.getUnionId();
selfExternalUserId = dto.getExternalUserid();
}else{
externalUserId = dto.getExternalUserid();
}
dto.setUnionid(unionId);
dto.setSelfExternalUserid(selfExternalUserId);
dto.setExternalUserid(externalUserId);
return dto;
}
private ExternalUserPojo getExternalUserPojo(String unionIdJson,String userId1,String wxEnterpriseId) {
ExternalUserPojo pojo = new ExternalUserPojo();
String unionId = "";
String follow_user = "";
String createTime = "";
String userId = "";
String avatar = "";
String relaName = "";
if(StringUtils.isNotBlank(unionIdJson)){
JSONObject jo = JSON.parseObject(unionIdJson);
String external_contact = jo.getString("external_contact");
if(StringUtils.isNotBlank(external_contact)){
JSONObject jt = JSON.parseObject(external_contact);
unionId = jt.getString("unionid");
relaName = EmojiFilterUtil.filterEmojiLast(jt.getString("name"), true);
if(StringUtils.isBlank(relaName)){
relaName = "--";
}
avatar = jt.getString("avatar");
}
follow_user = jo.getString("follow_user");
if(StringUtils.isNotBlank(follow_user)){
JSONArray j = JSON.parseArray(follow_user);
for (Object object : j) {
String followJson = JSON.toJSONString(object);
JSONObject follow = JSON.parseObject(followJson);
userId = follow.getString("userid");
if(userId.equals(userId1)){
createTime = follow.getString("createtime");
}
}
}
}
pojo.setAddCreateTime(createTime);
pojo.setAvatar(avatar);
pojo.setName(relaName);
pojo.setUnionId(unionId);
pojo.setWxEnterpriseId(wxEnterpriseId);
return pojo;
}
@Override
public String add(String wxEnterpriseId,String selfExternalUserId,String userId,String storeId) {
WxEnterpriseDTO wxEnterprise = wxEnterpriseService.selectById(wxEnterpriseId);
if(wxEnterprise == null){
return "";
}
TabHaobanStaff staff = staffService.selectByUserIdAndEnterpriseId(userId, wxEnterpriseId);
if(staff == null){
return "";
}
SecretSettingDTO secretSetting = secretSettingService.getSecretSetting(wxEnterpriseId, SecretTypeEnum.CONTACT_CUSTOMER.getVal());
if (null == secretSetting) {
log.info("没有配置secret");
return "";
}
String unionIdJson = qywxUserApiService.getCorpSelfExternalUseridInfo(wxEnterprise.getCorpid(), secretSetting.getSecretVal(), selfExternalUserId);
ExternalUserPojo pojo = getExternalUserPojo(unionIdJson,userId,wxEnterpriseId);
String unionId = pojo.getUnionId();
String name = pojo.getName();
String createTime = pojo.getAddCreateTime();
MemberUnionidRelatedDTO dto = new MemberUnionidRelatedDTO();
String externalUserId = getExternalUserId(wxEnterprise, userId, createTime, name);
dto.setExternalUserid(externalUserId);
dto.setWxEnterpriseId(wxEnterpriseId);
dto.setUnionid(unionId);
dto.setExternalName(name);
dto.setAddCreateTime(createTime);
dto.setWxUserId(userId);
dto.setAvatar(pojo.getAvatar());
if(StringUtils.isBlank(unionId)){
return "";
}
dto.setSuiteid(secretSetting.getSecretVal());
MemberUnionidRelatedDTO exsitDTO = memberUnionRelatedService.getByParams(userId, wxEnterpriseId,name,createTime);
String uuid = "";
if(exsitDTO == null){
dto.setUnionid(unionId);
//更新对外联系人id
dto.setSelfExternalUserid(selfExternalUserId);
uuid = memberUnionRelatedService.addMemberUnionidRelated(dto);
}else{
exsitDTO.setExternalUserid(externalUserId);
exsitDTO.setUnionid(unionId);
//更新对外联系人id
exsitDTO.setSelfExternalUserid(selfExternalUserId);
memberUnionRelatedService.update(exsitDTO);
uuid = exsitDTO.getMemberUnionidRelatedId();
//return "";
}
//新增门店和导购的关联关系
insertExternalClerkRelated(dto);
return uuid;
}
private String getExternalUserId(WxEnterpriseDTO wxEnterprise,String userId1,String createTime,String name){
log.info("新增外部联系人】corpid={},suiteId={},userId1={}",wxEnterprise.getCorpid(),config.getWxSuiteid(),userId1);
String wxRes = qywxUserApiService.listExternalUserid(wxEnterprise.getCorpid(), config.getWxSuiteid(), userId1);
String externalUserId = "";
log.info("【新增外部联系人】wxRes={}",wxRes);
if(StringUtils.isNotBlank(wxRes)){
JSONArray jsonArr = JSON.parseArray(wxRes);
String wxName = "";
for (Object externalUserid : jsonArr) {
String uJ = qywxUserApiService.getExternalUseridInfo(wxEnterprise.getCorpid(), config.getWxSuiteid(), externalUserid.toString());
log.info("【新增外部联系人】uJ={}",uJ);
if(StringUtils.isNotBlank(uJ)){
JSONObject jo = JSON.parseObject(uJ);
String external_contact = jo.getString("external_contact");
String uj_follow_user = jo.getString("follow_user");
JSONObject jt = null;
if(StringUtils.isNotBlank(external_contact)){
jt = JSON.parseObject(external_contact);
wxName = EmojiFilterUtil.filterEmojiLast(jt.getString("name"), true);
if(StringUtils.isBlank(wxName)){
wxName = "--";
}
}
if(StringUtils.isNotBlank(uj_follow_user)){
JSONArray j = JSON.parseArray(uj_follow_user);
String uj_userId = "";
for (Object object : j) {
String followJson = JSON.toJSONString(object);
JSONObject follow = JSON.parseObject(followJson);
uj_userId = follow.getString("userid");
log.info("【新增外部联系人】createTime={},name={},followCreateTime={},wxName={}",createTime,name,follow.getString("createtime"),wxName);
if(uj_userId.equals(userId1) && createTime.equals(follow.getString("createtime")) && name.equals(wxName)){
if(jt != null){
externalUserId = jt.getString("external_userid");
break;
}
}
}
}
}
if(StringUtils.isNotBlank(externalUserId)){
break;
}
}
}
return externalUserId;
}
@Override
public void delMemberUnionidRelated(MemberUnionidRelatedDTO dto) {
externalClerkRelatedService.delByUserIdAndExternalUserId(dto);
memberUnionRelatedService.delMemberUnionidRelated(dto);
}
@Override
public ExternalClerkRelatedDTO getByMemberId(String staffId, String memberId) {
TabHaobanStaff staff = staffService.selectById(staffId);
if(staff == null){
return null;
}
log.info("【查询会员】wxUserId={},unionid={}",staff.getWxUserId(),memberId);
return externalClerkRelatedService.getByMemberId(staff.getWxUserId(),memberId);
}
@Override
public List<MemberUnionidRelatedDTO> getByWxUserIdAndWxEnterpriseId(String wxUserId, String wxEnterpriseId) {
List<MemberUnionidRelatedDTO> list = memberUnionRelatedService.getByWxUserIdAndWxEnterpriseId(wxUserId,wxEnterpriseId);
return list;
}
@Override
public List<MemberUnionidRelatedDTO> listByEnterpriseIdAndDate( String enterpriseId,Date date) {
List<MemberUnionidRelated> list = memberUnionidRelatedMapper.listByEnterpriseIdAndDate(enterpriseId,date);
return EntityUtil.changeEntityListByJSON(MemberUnionidRelatedDTO.class,list);
}
@Override
public void freshWxFrend(String wxEnterpriseId, String wxUserId,String storeId) {
log.info("【刷下好友】wxUserId={}",wxUserId);
WxEnterpriseDTO enterprise = wxEnterpriseService.selectById(wxEnterpriseId);
String wxRes = qywxUserApiService.listExternalUserid(enterprise.getCorpid(), config.getWxSuiteid(), wxUserId);
List<MemberUnionidRelatedDTO> list = this.getByWxUserIdAndWxEnterpriseId(wxUserId, wxEnterpriseId);
List<String> externalUserIdList = list.stream().map(external->external.getExternalUserid())
.collect(Collectors.toList());
JSONArray externalArr = JSON.parseArray(wxRes);
for (String externalUserId : externalUserIdList) {
if(!externalArr.contains(externalUserId)){
//删除成员和外部联系人关系
MemberUnionidRelatedDTO dto = new MemberUnionidRelatedDTO();
dto.setExternalUserid(externalUserId);
dto.setWxUserId(wxUserId);
memberUnionRelatedService.delMemberUnionidRelated(dto);
//删除导购和外部联系人关系
externalClerkRelatedService.delByUserIdAndExternalUserId(dto);
}
}
SecretSettingDTO secretSetting = secretSettingService.getSecretSetting(wxEnterpriseId, SecretTypeEnum.CONTACT_CUSTOMER.getVal());
if (null == secretSetting||secretSetting.getCheckFlag()==0) {
log.info("没有配置客户联系secret:{}",wxEnterpriseId);
return;
}
String res = qywxUserApiService.listSelfExternalUserid(enterprise.getCorpid(), secretSetting.getSecretVal(), wxUserId);
log.info("【刷下好友】res={}",res);
if(StringUtils.isBlank(res)){
return;
}
JSONArray jsonArr = JSON.parseArray(res);
if(jsonArr.size() == 0) {
return;
}
for (Object object : jsonArr) {
this.add(wxEnterpriseId, object.toString(), wxUserId,storeId);
}
}
@Override
public void mqFreshWxFrend(String res){
JSONObject json = JSON.parseObject(res);
String wxEnterpriseId = json.getString("wxEnterpriseId");
String wxUserId = json.getString("wxUserId");
String storeId = json.getString("storeId");
log.info("【刷下微信好友】wxEnterpriseId={}.wxUserId={},storeId={}",wxEnterpriseId,wxUserId,storeId);
if(StringUtils.isAnyBlank(wxEnterpriseId,wxUserId,storeId)){
return ;
}
freshWxFrend(wxEnterpriseId, wxUserId, storeId);
}
@Override
public void cleanByCid(String cid) {
if (StringUtils.isNotBlank(cid)) {
TabHaobanWxEnterprise wxEnterprise = wxEnterpriseService.getEnterpriseBycorpId(cid);
if (null != wxEnterprise) {
memberUnionRelatedService.clean(wxEnterprise.getWxEnterpriseId());
}
}else {
memberUnionRelatedService.clean(null);
}
}
@Override
public Page<MemberUnionidRelatedDTO> pageMemberUnionByParams(List<String> userIdList, List<String> sendMemberIds,
String enterpriseId, BasePageInfo pageInfo) {
PageHelper.startPage(pageInfo.getPageNum(), pageInfo.getPageSize());
return PageUtil.changePageHelperToCurrentPage(memberUnionRelatedService.pageMemberUnionByParams(userIdList,sendMemberIds,enterpriseId),MemberUnionidRelatedDTO.class);
}
@Override
public String sendMessage(String wxEnterpriseId,String userId,List<String> extendUserList,String materialId){
WxEnterpriseDTO enterprise = wxEnterpriseService.selectById(wxEnterpriseId);
MaterialDTO material = materialApiService.selectMaterialById(materialId);
if(material == null){
return "";
}
JSONResponse jp = null;
if(material.getMaterialType() == 2 || material.getMaterialType() == 4 || material.getMaterialType() == 5){
Date wxLastTime = material.getWxLastUploadTime();
String maerialId = material.getMediaId();
if(DateUtil.addDay(wxLastTime, 3).getTime() < System.currentTimeMillis()){
maerialId = materialApiService.reUpdalodMetail(materialId);
}
QywxImageExternalMessageDTO dto = new QywxImageExternalMessageDTO();
dto.setMediaId(maerialId);
dto.setChatType("single");
dto.setExternalUserid(extendUserList);
dto.setSenderUserId(userId);
log.info("【发送消息】dto = {}",JSON.toJSONString(dto));
jp = qywxSuiteApiService.sendExternalMessage(enterprise.getCorpid(), config.getWxSuiteid(), dto);
}else if(material.getMaterialType() == 1){
QywxTextExternalMessageDTO dto = new QywxTextExternalMessageDTO();
dto.setChatType("single");
dto.setExternalUserid(extendUserList);
dto.setSenderUserId(userId);
dto.setText(material.getMaterialContent());
log.info("【发送消息】dto = {}",JSON.toJSONString(dto));
jp = qywxSuiteApiService.sendExternalMessage(enterprise.getCorpid(), config.getWxSuiteid(), dto);
}else if(material.getMaterialType() == 3){
QywxIinkExternalMessageDTO dto = new QywxIinkExternalMessageDTO();
dto.setChatType("single");
dto.setExternalUserid(extendUserList);
dto.setSenderUserId(userId);
dto.setDesc(material.getMaterialDesc());
dto.setPicurl(material.getWxImgUrl());
dto.setTitle(material.getMaterialTitle());
dto.setUrl(material.getLink());
log.info("【发送消息】dto = {}",JSON.toJSONString(dto));
jp = qywxSuiteApiService.sendExternalMessage(enterprise.getCorpid(), config.getWxSuiteid(), dto);
}
log.info("【发送消息】jp = {}",JSON.toJSONString(jp));
Map<String,Object> returnMap = jp.getReturnMap();
return returnMap.get("msgid") == null?"":returnMap.get("msgid").toString();
}
@Override
public JSONResponse getMessageStatus(String wxEnterpriseId, String wxMessageId) {
WxEnterpriseDTO enterprise = wxEnterpriseService.selectById(wxEnterpriseId);
if(enterprise == null){
return null;
}
JSONResponse jp = qywxSuiteApiService.resultExternalMessage(enterprise.getCorpid(), config.getWxSuiteid(), wxMessageId);
return jp;
}
@Override
public List<MemberUnionidRelatedDTO> getByWxUserIdListAndWxEnterpriseId(List<String> userIdList,
String wxEnterpriseId) {
return EntityUtil.changeEntityListByJSON(MemberUnionidRelatedDTO.class, memberUnionidRelatedMapper.getByWxUserIdListAndWxEnterpriseId(userIdList,wxEnterpriseId));
}
@Override
public void cleanNoExsitFriend(String wxEnterpriseId, String wxUserId, String wxRes) {
log.info("【清除不存在的好友】wxEnterpriseId={},wxUserId={}",wxEnterpriseId,wxUserId);
WxEnterpriseDTO enterprise = wxEnterpriseService.selectById(wxEnterpriseId);
//String wxRes = qywxUserApiService.listExternalUserid(enterprise.getCorpid(), config.getWxSuiteid(), wxUserId);
List<MemberUnionidRelatedDTO> list = this.getByWxUserIdAndWxEnterpriseId(wxUserId, wxEnterpriseId);
List<String> externalUserIdList = list.stream().map(external->external.getExternalUserid())
.collect(Collectors.toList());
if(StringUtils.isBlank(wxRes)){
log.info("【清除不存在的好友不存在】wxEnterpriseId={},wxUserId={}",wxEnterpriseId,wxUserId);
return;
}
JSONArray externalArr = JSON.parseArray(wxRes);
for (String externalUserId : externalUserIdList) {
if(!externalArr.contains(externalUserId)){
//删除成员和外部联系人关系
MemberUnionidRelatedDTO dto = new MemberUnionidRelatedDTO();
dto.setExternalUserid(externalUserId);
dto.setWxUserId(wxUserId);
memberUnionRelatedService.delMemberUnionidRelated(dto);
//删除导购和外部联系人关系
externalClerkRelatedService.delByUserIdAndExternalUserId(dto);
}
}
}
@Override
public List<String> listSelfExterialList(String wxEnterpriseId, String wxUserId) {
try {
log.info("【查询自建应用好友】wxEnterpriseId={},wxUserId={}",wxEnterpriseId,wxUserId);
WxEnterpriseDTO enterprise = wxEnterpriseService.selectById(wxEnterpriseId);
List<String> list = new ArrayList<>();
SecretSettingDTO secretSetting = secretSettingService.getSecretSetting(wxEnterpriseId, SecretTypeEnum.CONTACT_CUSTOMER.getVal());
if (null == secretSetting||secretSetting.getCheckFlag()==0) {
log.info("没有配置客户联系secret:{}",wxEnterpriseId);
return list;
}
String res = qywxUserApiService.listSelfExternalUserid(enterprise.getCorpid(), secretSetting.getSecretVal(), wxUserId);
log.info("【查询自建应用】res={}",res);
if(StringUtils.isBlank(res)){
return list;
}
JSONArray jsonArr = JSON.parseArray(res);
if(jsonArr.size() == 0) {
return list;
}
for (Object object : jsonArr) {
list.add(object.toString());
}
return list;
} catch (Exception e) {
log.info("错误={}",e);
}
return null;
}
@Override
public List<String> listExterialList(String wxEnterpriseId, String wxUserId) {
log.info("【获取第三方应用好友】wxEnterpriseId={},wxUserId={}",wxEnterpriseId,wxUserId);
WxEnterpriseDTO enterprise = wxEnterpriseService.selectById(wxEnterpriseId);
// String wxRes = qywxUserApiService.listExternalUserid(enterprise.getCorpid(), "wwb3ef71aa8c6d9c06", wxUserId);
String wxRes = qywxUserApiService.listExternalUserid(enterprise.getCorpid(), config.getWxSuiteid(), wxUserId);
List<String> list = new ArrayList<>();
log.info("【查询第三方应用】res={}",wxRes);
if(StringUtils.isBlank(wxRes)){
return list;
}
JSONArray jsonArr = JSON.parseArray(wxRes);
if(jsonArr.size() == 0) {
return list;
}
for (Object object : jsonArr) {
list.add(object.toString());
}
return list;
}
@Override
public ExternalUserDTO getCorpSelfExternalUseridInfo(String wxEnterpriseId,String wxUserId, String externalUserId) {
WxEnterpriseDTO wxEnterprise = wxEnterpriseService.selectById(wxEnterpriseId);
if(wxEnterprise == null){
log.info("企业不存在");
return null;
}
SecretSettingDTO secretSetting = secretSettingService.getSecretSetting(wxEnterpriseId, SecretTypeEnum.CONTACT_CUSTOMER.getVal());
if (null == secretSetting) {
log.info("没有配置secret");
return null;
}
String unionIdJson = qywxUserApiService.getCorpSelfExternalUseridInfo(wxEnterprise.getCorpid(), secretSetting.getSecretVal(), externalUserId);
if(StringUtils.isBlank(unionIdJson)){
log.info("好友不存在");
return null;
}
ExternalUserPojo pojo = getExternalUserPojo(unionIdJson, wxUserId, wxEnterpriseId);
return EntityUtil.changeEntityByJSON(ExternalUserDTO.class, pojo);
}
@Override
public ExternalUserDTO getExternalUseridInfo(String wxEnterpriseId,String wxUserId, String externalUserId) {
WxEnterpriseDTO wxEnterprise = wxEnterpriseService.selectById(wxEnterpriseId);
if(wxEnterprise == null){
log.info("企业不存在");
return null;
}
// String uJ = qywxUserApiService.getExternalUseridInfo(wxEnterprise.getCorpid(), "wwb3ef71aa8c6d9c06", externalUserId);
String uJ = qywxUserApiService.getExternalUseridInfo(wxEnterprise.getCorpid(), config.getWxSuiteid(), externalUserId);
if(StringUtils.isBlank(uJ)){
log.info("好友不存在");
return null;
}
String name = "";
String createTime = "";
String avatar = "";
if(StringUtils.isNotBlank(uJ)){
JSONObject jo = JSON.parseObject(uJ);
String external_contact = jo.getString("external_contact");
String uj_follow_user = jo.getString("follow_user");
JSONObject jt = null;
if(StringUtils.isNotBlank(external_contact)){
jt = JSON.parseObject(external_contact);
name = EmojiFilterUtil.filterEmojiLast(jt.getString("name"), true);
if(StringUtils.isBlank(name)){
name = "--";
}
avatar = jt.getString("avatar");
}
if(StringUtils.isNotBlank(uj_follow_user)){
JSONArray j = JSON.parseArray(uj_follow_user);
String uj_userId = "";
for (Object object : j) {
String followJson = JSON.toJSONString(object);
JSONObject follow = JSON.parseObject(followJson);
uj_userId = follow.getString("userid");
if(uj_userId.equals(wxUserId)){
if(jt != null){
externalUserId = jt.getString("external_userid");
createTime = follow.getString("createtime");
break;
}
}
}
}
}
ExternalUserPojo pojo = new ExternalUserPojo();
pojo.setExternalUserId(externalUserId);
pojo.setName(name);
pojo.setAddCreateTime(createTime);
pojo.setWxEnterpriseId(wxEnterpriseId);
pojo.setAvatar(avatar);
return EntityUtil.changeEntityByJSON(ExternalUserDTO.class, pojo);
}
@Override
public String addExternal(ExternalUserDTO dto) {
String wxUserId = dto.getWxUserId();
String wxEnterpriseId = dto.getWxEnterpriseId();
String name = StringUtils.isBlank(dto.getName())?"--":dto.getName();
String createTime = dto.getAddCreateTime();
String unionId = dto.getUnionId();
String externalUserId = dto.getExternalUserId();
String memberId = dto.getMemberId();
String storeId = dto.getStoreId();
String enterpriseId = dto.getEnterpriseId();
String staffId = dto.getStaffId();
String avatar = dto.getAvatar();
String clerkId = dto.getClerkId();
if(StringUtils.isAnyBlank(wxUserId,wxEnterpriseId,name,createTime,unionId,externalUserId,memberId,storeId,enterpriseId,staffId,clerkId)){
log.info("【新增外部联系人】wxUserId={},wxEnterpriseId={},name={},createTime={},unionId ={},externalUserId ={},memberId ={},storeId ={},enterpriseId ={},staffId={},clerkId={}"
+ "",wxUserId,wxEnterpriseId,name,createTime,unionId,externalUserId,memberId,storeId,enterpriseId,staffId,clerkId);
return "参数不对";
}
MemberUnionidRelatedDTO exsitDTO = memberUnionRelatedService.getByParams(wxUserId, wxEnterpriseId,name,createTime);
String uuid = "";
if(exsitDTO == null){
exsitDTO = new MemberUnionidRelatedDTO();
exsitDTO.setAvatar(avatar);
exsitDTO.setExternalUserid(externalUserId);
exsitDTO.setAddCreateTime(createTime);
exsitDTO.setEnterpriseId(enterpriseId);
exsitDTO.setExternalName(name);
exsitDTO.setExternalUserid(externalUserId);
exsitDTO.setWxEnterpriseId(wxEnterpriseId);
exsitDTO.setWxUserId(wxUserId);
exsitDTO.setUnionid(unionId);
uuid = memberUnionRelatedService.addMemberUnionidRelated(exsitDTO);
}else{
uuid = exsitDTO.getMemberUnionidRelatedId();
exsitDTO.setAvatar(avatar);
exsitDTO.setExternalUserid(externalUserId);
exsitDTO.setUnionid(unionId);
exsitDTO.setAddCreateTime(createTime);
exsitDTO.setExternalName(name);
memberUnionRelatedService.update(exsitDTO);
}
TabHaobanExternalClerkRelated external = externalClerkRelatedService.getByParams(wxUserId, wxEnterpriseId,name,createTime);
if(external == null){
TabHaobanExternalClerkRelated related = new TabHaobanExternalClerkRelated();
related.setAddCreateTime(createTime);
related.setClerkId(clerkId);
related.setEnterpriseId(enterpriseId);
related.setExternalName(name);
related.setExternalUserId(externalUserId);
related.setStaffId(staffId);
related.setMemberUnionidRelatedId(uuid);
related.setStoreId(storeId);
related.setUnionid(unionId);
related.setWxEnterpriseId(wxEnterpriseId);
related.setWxUserId(wxUserId);
related.setMemberId(memberId);
externalClerkRelatedService.insert(related);
}else{
external.setMemberId(memberId);
external.setMemberUnionidRelatedId(uuid);
external.setExternalUserId(externalUserId);
external.setUnionid(unionId);
external.setStoreId(storeId);
external.setEnterpriseId(enterpriseId);
external.setClerkId(clerkId);
externalClerkRelatedService.update(external);
}
return "";
}
}
package com.gic.haoban.manage.service.service.out.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.gic.commons.util.*;
import com.gic.haoban.base.api.common.ServiceResponse;
import com.gic.haoban.manage.api.dto.*;
import com.gic.haoban.manage.api.enums.SecretTypeEnum;
import com.gic.haoban.manage.service.exception.WxApiLimitException;
import com.gic.haoban.manage.service.pojo.DealQywxExternalUserPojo;
import com.gic.haoban.manage.service.service.*;
import com.gic.mq.sdk.GicMQClient;
import com.gic.wechat.api.dto.qywx.QywxIinkExternalMessageDTO;
import com.gic.wechat.api.dto.qywx.QywxImageExternalMessageDTO;
import com.gic.wechat.api.dto.qywx.QywxTextExternalMessageDTO;
import com.gic.wechat.api.service.qywx.QywxSuiteApiService;
import com.gic.wechat.api.service.qywx.QywxUserApiService;
import com.github.pagehelper.PageHelper;
import java.util.*;
import java.util.stream.Collectors;
import com.google.common.collect.Sets;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.gic.api.base.commons.JSONResponse;
import com.gic.api.base.commons.Page;
import com.gic.clerk.api.dto.ClerkDTO;
import com.gic.clerk.api.service.ClerkService;
import com.gic.clerk.api.service.PowerService;
import com.gic.enterprise.api.dto.StoreDTO;
import com.gic.enterprise.api.service.StoreService;
import com.gic.haoban.base.api.common.BasePageInfo;
import com.gic.haoban.common.utils.PageUtil;
import com.gic.haoban.contacts.manage.api.dto.SearchDataDTO;
import com.gic.haoban.manage.api.service.DepartmentApiService;
import com.gic.haoban.manage.api.service.MaterialApiService;
import com.gic.haoban.manage.api.service.MemberUnionidRelatedApiService;
import com.gic.haoban.manage.api.service.StaffDepartmentRelatedApiService;
import com.gic.haoban.manage.api.service.WxEnterpriseApiService;
import com.gic.haoban.manage.service.config.Config;
import com.gic.haoban.manage.service.dao.mapper.MemberUnionidRelatedMapper;
import com.gic.haoban.manage.service.entity.MemberUnionidRelated;
import com.gic.haoban.manage.service.entity.TabHaobanClerkMainStoreRelated;
import com.gic.haoban.manage.service.entity.TabHaobanExternalClerkRelated;
import com.gic.haoban.manage.service.entity.TabHaobanStaff;
import com.gic.haoban.manage.service.entity.TabHaobanStaffDepartmentRelated;
import com.gic.haoban.manage.service.entity.TabHaobanWxEnterprise;
import com.gic.haoban.manage.service.entity.TabHaobanWxEnterpriseRelated;
import com.gic.haoban.manage.service.pojo.ExternalUserPojo;
import com.gic.haoban.manage.service.util.EmojiFilterUtil;
import com.gic.member.api.dto.MemberDTO;
import com.gic.member.api.service.MemberOpenCardBusinessService;
import com.gic.member.api.service.MemberService;
import com.gic.redis.data.anno.RedisLock;
import com.gic.redis.data.util.RedisUtil;
import com.gic.search.engine.api.constant.MemberDataEnum;
import com.gic.search.engine.api.constant.OperateEnum;
import com.gic.search.engine.api.dto.ESResponseQueryBatch;
import com.gic.search.engine.api.dto.ESResponseQuerySingle;
import com.gic.search.engine.api.dto.dynamic.DynamicSearchDTO;
import com.gic.search.engine.api.filter.NewNodeAddUtil;
import com.gic.search.engine.api.service.dynamic.ESDataDynamicOperationApiService;
@Service
public class MemberUnionidRelatedApiServiceImpl implements MemberUnionidRelatedApiService{
private static final Logger log = LogManager.getLogger(MemberUnionidRelatedApiServiceImpl.class);
@Autowired
private MemberUnionRelatedService memberUnionRelatedService;
@Autowired
private StaffService staffService;
@Autowired
private QywxUserApiService qywxUserApiService;
@Autowired
private com.gic.enterprise.api.service.StoreGroupService gicDepartmentService;
@Autowired
private MemberService memberService;
@Autowired
private WxEnterpriseRelatedService wxEnterpriseRelatedService;
@Autowired
private WxEnterpriseService wxEnterpriseService;
private static final String SELF_APP = "selfSuiteId";
@Autowired
private MemberOpenCardBusinessService memberOpenCardBusinessService;
@Autowired
private ClerkService clerkService;
@Autowired
private DepartmentApiService departmentApiService;
@Autowired
private MemberUnionidRelatedMapper memberUnionidRelatedMapper;
@Autowired
private StaffDepartmentRelatedService staffDepartmentRelatedService;
@Autowired
private ESDataDynamicOperationApiService eSDataDynamicOperationApiService;
@Autowired
private ClerkMainStoreRelatedService clerkMainStoreRelatedService;
@Autowired
private StoreService storeService;
@Autowired
private Config config;
@Autowired
private QywxSuiteApiService qywxSuiteApiService;
@Autowired
private MaterialApiService materialApiService;
@Autowired
private SecretSettingService secretSettingService;
@Autowired
private StaffClerkRelationService staffClerkRelationService;
@Autowired
private ExternalClerkRelatedService externalClerkRelatedService;
@Autowired
private PowerService powerService;
@Override
public void dealQywxExternalUser(String params) {
log.info("回调:{}", params);
DealQywxExternalUserPojo externalUserPojo = JSONObject.parseObject(params, DealQywxExternalUserPojo.class);
if (externalUserPojo.getType() == DealQywxExternalUserPojo.DealType.del.getType()) {
this.delMemberUnionidRelatedProcess(externalUserPojo.getData());
} else if (externalUserPojo.getType() == DealQywxExternalUserPojo.DealType.add.getType()) {
this.addMemberUnionidRelatedNew(externalUserPojo.getData());
}
}
@Override
public List<MemberStoreDTO> listByExTernalUseridAndWxUserId(String externalUserid, String wxUserId) {
List<TabHaobanExternalClerkRelated> list = externalClerkRelatedService.listByExTernalUseridAndWxUserId(externalUserid, wxUserId);
List<MemberStoreDTO> result = new ArrayList<>();
if(CollectionUtil.isEmpty(list)){
return null;
}
String wxEnterpriseId = list.get(0).getWxEnterpriseId();
TabHaobanStaff haobanStaff = staffService.selectByUserIdAndEnterpriseId(wxUserId, wxEnterpriseId);
if (null == haobanStaff) {
log.info("staff不存在");
return null;
}
List<StaffClerkRelationDTO> clerkRelationDTOS = staffClerkRelationService.listBindCodeByStaffId(null, haobanStaff.getStaffId());
if(CollectionUtil.isEmpty(clerkRelationDTOS)){
log.info("staff关联门店不存在1");
return null;
}
// //1、查该staff的门店id
// List<TabHaobanStaffDepartmentRelated> relatedIds = staffDepartmentRelatedService.listByWxUserId(wxUserId);
// if(CollectionUtil.isEmpty(relatedIds)){
// log.info("staff关联部门不存在1");
// return null;
// }
// List<String> departmentIds = relatedIds.stream().map(s->s.getDepartmentId()).collect(Collectors.toList());
// if(CollectionUtil.isEmpty(departmentIds)){
// log.info("staff部门不存在1");
// return null;
// }
// List<DepartmentDTO> stores = departmentApiService.listByDepartmentIds(departmentIds, 1);
// if(CollectionUtil.isEmpty(stores)){
// log.info("staff关联门店不存在1");
// return null;
// }
List<String> storeIds = clerkRelationDTOS.stream().filter(s->(s.getStoreId()!=null || "".equals(s.getStoreId()))).map(s->s.getStoreId()).collect(Collectors.toList());
if(CollectionUtil.isEmpty(storeIds)){
log.info("staff关联门店不存在2");
return null;
}
//2、获取member的storeId
for(TabHaobanExternalClerkRelated tab : list){
String memberId = tab.getMemberId();
if(StringUtils.isEmpty(memberId)){
continue ;
}
String gicEnterpriseId = tab.getEnterpriseId();
JSONObject searchJson = new JSONObject();
searchJson = NewNodeAddUtil.addNewNodeForAnd(MemberDataEnum.member_memberId.getCode(), OperateEnum.OPERATE_EQ.getValue(), memberId,searchJson);
DynamicSearchDTO dynamicSearchDTO = new DynamicSearchDTO();
dynamicSearchDTO.setEnterpriseId(gicEnterpriseId);
dynamicSearchDTO.setColumnCategoryCode("member");
dynamicSearchDTO.setSearchJson(searchJson);
dynamicSearchDTO.setBegin(0);
dynamicSearchDTO.setRecordNumber(1);
log.info("gicEnterpriseId=========>{},searchJson=========={}",gicEnterpriseId,searchJson);
ESResponseQueryBatch responseQuery = eSDataDynamicOperationApiService.queryDataBatch(dynamicSearchDTO, false, null);
if(null == responseQuery){
log.info("会员不存在1");
continue;
}
List<JSONObject> res = responseQuery.getRes();
if(CollectionUtil.isEmpty(res)){
log.info("会员不存在2");
continue;
}
String storeId = "";
for (JSONObject jsonObject : res) {
storeId = jsonObject.get("storeId") == null?"":jsonObject.get("storeId").toString();
}
if(StringUtils.isEmpty(storeId)){
log.info("会员门店不存在");
continue;
}
String[] memberStoreIds =storeId.split(" ");
List<String> memberStoreIdList = Arrays.asList(memberStoreIds);
if(CollectionUtil.isEmpty(memberStoreIdList)){
log.info("会员门店不存在");
continue;
}
log.info("memberStoreIdList===============>{}",JSONObject.toJSONString(memberStoreIdList));
log.info("storeIds===============>{}",JSONObject.toJSONString(storeIds));
//取交集(解决不支持的报错现象)
List list3= new ArrayList(memberStoreIdList);
List list4= new ArrayList(storeIds);
list3.retainAll(list4);
if(CollectionUtil.isEmpty(list3)){
continue;
}else{
for(Object resultStoreId : list3){
MemberStoreDTO dto = new MemberStoreDTO();
dto.setMemberId(memberId);
dto.setStoreId(resultStoreId.toString());
result.add(dto);
}
}
}
return result;
}
@Override
public MemberUnionidRelatedDTO getByUnionId(String staffId, String unionid) {
TabHaobanStaff staff = staffService.selectById(staffId);
if(staff == null){
return null;
}
log.info("【查询会员】wxUserId={},unionid={}",staff.getWxUserId(),unionid);
return memberUnionRelatedService.getByUnionId(staff.getWxEnterpriseId(), staff.getWxUserId(), unionid);
}
@Override
public String addMemberUnionidRelated(MemberUnionidRelatedDTO dto) {
DealQywxExternalUserPojo dealQywxExternalUserPojo = new DealQywxExternalUserPojo();
dealQywxExternalUserPojo.setType(DealQywxExternalUserPojo.DealType.add.getType());
dealQywxExternalUserPojo.setData(dto);
GicMQClient instance = GICMQClientUtil.getClientInstance();
try {
instance.sendMessage("dealQywxExternalUserMq", JSONObject.toJSONString(dealQywxExternalUserPojo));
} catch (Exception e) {
log.info("异步处理异常:{}", e);
}
return null;
}
@Override
public String addMemberUnionidRelatedNew(MemberUnionidRelatedDTO dto) {
//解析组装信息
dto = getMemberUnionidRelatedDTONew(dto);
if (null == dto) {
log.info("没处理完成-等下一次处理");
return null;
}
insertExternalClerkRelatedNew(dto);
return dto.getMemberUnionidRelatedId();
}
@Deprecated
private void insertExternalClerkRelated(MemberUnionidRelatedDTO dto) {
log.info("新增外部联系人开始:{}", JSONObject.toJSONString(dto));
String wxUserId = dto.getWxUserId();
String wxEnterpriseId = dto.getWxEnterpriseId();
String name = dto.getExternalName();
String createTime = dto.getAddCreateTime();
String externalUserId = dto.getExternalUserid();
String avatar = dto.getAvatar();
String unionId = dto.getUnionid();
if(StringUtils.isAnyBlank(wxUserId,wxEnterpriseId,name,createTime,unionId)){
log.info("【新增外部联系人】wxUserId={},wxEnterpriseId={},name={},createTime={},avatar={},unionId={}",wxUserId,wxEnterpriseId,name,createTime,avatar,unionId);
return;
}
TabHaobanStaff staff = staffService.selectByUserIdAndEnterpriseId(wxUserId, wxEnterpriseId);
if(staff == null){
return;
}
String staffId = staff.getStaffId();
MemberDTO member = null;
TabHaobanClerkMainStoreRelated r = clerkMainStoreRelatedService.selectByWxEnterpriseIdAndStoreId(staffId,wxEnterpriseId);
if(r == null){
log.info("【新增外部联系人】主门店为空");
return;
}
String storeId = r.getStoreId();
StaffClerkRelationDTO staffClerkRelationDTO = staffClerkRelationService.getOneBindByStoreId(staffId,storeId);
if(staffClerkRelationDTO == null){
log.info("【新增外币联系人】导购和clerk关联为空");
return;
}
//新增导购和外部联系人关系
String clerkCode = staffClerkRelationDTO.getClerkCode();
ClerkDTO clerk = clerkService.getClerkByClerkCode(staffClerkRelationDTO.getEnterpriseId(), clerkCode);
log.info("【新增外部联系人】clerkCode={},unionid:{}",clerkCode,unionId);
if(clerk == null){
log.info("【新增外币联系人】导购为空");
return;
}
String qrcodeParam = clerk.getQrcodeParam();
if(StringUtils.isBlank(qrcodeParam)){
powerService.saveClerkQrCode(clerk.getClerkId());
clerk = clerkService.getClerkByClerkCode(staffClerkRelationDTO.getEnterpriseId(), clerkCode);
qrcodeParam = clerk.getQrcodeParam();
}
if(clerk != null && StringUtils.isNotBlank(qrcodeParam)&&StringUtils.isNotBlank(unionId)){
log.info("【新增外部联系人会员】enterpriseId={},unionId={},name={},avatar={},QrcodeParam={}",staffClerkRelationDTO.getEnterpriseId(),unionId,name,avatar,qrcodeParam);
member = memberOpenCardBusinessService.getMemberByQywxChannelParam(staffClerkRelationDTO.getEnterpriseId(), unionId, "", name, avatar, qrcodeParam);
}
TabHaobanExternalClerkRelated exsitDTO = externalClerkRelatedService.getByParams(wxUserId, wxEnterpriseId,name,createTime);
String key = wxUserId+wxEnterpriseId+name+createTime;
if(exsitDTO == null){
RedisUtil.lock(key,1L);
exsitDTO = externalClerkRelatedService.getByParams(wxUserId, wxEnterpriseId,name,createTime);
RedisUtil.unlock(key);
}
if(exsitDTO == null){
TabHaobanExternalClerkRelated related = new TabHaobanExternalClerkRelated();
related.setAddCreateTime(createTime);
related.setClerkId(staffClerkRelationDTO.getClerkId());
related.setEnterpriseId(staffClerkRelationDTO.getEnterpriseId());
related.setExternalName(name);
related.setExternalUserId(externalUserId);
related.setStaffId(staffId);
related.setMemberUnionidRelatedId(dto.getMemberUnionidRelatedId());
related.setStoreId(r.getStoreId());
related.setUnionid(unionId);
related.setWxEnterpriseId(wxEnterpriseId);
related.setWxUserId(wxUserId);
if(member != null){
related.setMemberId(member.getMemberId());
}
externalClerkRelatedService.insert(related);
}else{
if(member != null){
exsitDTO.setMemberId(member.getMemberId());
}
exsitDTO.setMemberUnionidRelatedId(dto.getMemberUnionidRelatedId());
exsitDTO.setExternalUserId(externalUserId);
exsitDTO.setUnionid(unionId);
exsitDTO.setStoreId(storeId);
exsitDTO.setEnterpriseId(staffClerkRelationDTO.getEnterpriseId());
exsitDTO.setClerkId(staffClerkRelationDTO.getClerkId());
externalClerkRelatedService.update(exsitDTO);
}
}
private void insertExternalClerkRelatedNew(MemberUnionidRelatedDTO dto) {
String wxUserId = dto.getWxUserId();
String wxEnterpriseId = dto.getWxEnterpriseId();
String name = dto.getExternalName();
String createTime = dto.getAddCreateTime();
String externalUserId = dto.getExternalUserid();
String avatar = dto.getAvatar();
String unionId = dto.getUnionid();
if (StringUtils.isAnyBlank(wxUserId, wxEnterpriseId, name, createTime, unionId)) {
log.info("【新增外部联系人】wxUserId={},wxEnterpriseId={},name={},createTime={},avatar={},unionId={}", wxUserId, wxEnterpriseId, name, createTime, avatar, unionId);
return;
}
TabHaobanStaff staff = staffService.selectByUserIdAndEnterpriseId(wxUserId, wxEnterpriseId);
if (staff == null) {
log.info("staff不存在:{},{}", dto.getUnionid(), dto.getWxUserId());
return;
}
String staffId = staff.getStaffId();
TabHaobanClerkMainStoreRelated mainStoreRelated = clerkMainStoreRelatedService.selectByWxEnterpriseIdAndStoreId(staffId, wxEnterpriseId);
if (mainStoreRelated == null) {
log.info("【新增外部联系人】主门店为空:{}", staffId);
return;
}
StaffClerkRelationDTO staffClerkRelationDTO = staffClerkRelationService.getOneBindByStoreId(staffId, mainStoreRelated.getStoreId());
if (staffClerkRelationDTO == null) {
log.info("【新增外币联系人】导购和clerk关联为空");
return;
}
//新增导购和外部联系人关系
String clerkCode = staffClerkRelationDTO.getClerkCode();
ClerkDTO clerk = clerkService.getClerkByClerkCode(staffClerkRelationDTO.getEnterpriseId(), clerkCode);
log.info("【新增外部联系人】clerkCode={},unionid:{}", clerkCode, unionId);
if (clerk == null) {
log.info("【新增外币联系人】导购为空:{},{}", clerkCode, unionId);
return;
}
String qrcodeParam = clerk.getQrcodeParam();
if (StringUtils.isBlank(qrcodeParam)) {
powerService.saveClerkQrCode(clerk.getClerkId());
clerk = clerkService.getClerkByClerkCode(staffClerkRelationDTO.getEnterpriseId(), clerkCode);
qrcodeParam = clerk.getQrcodeParam();
}
if (StringUtils.isBlank(qrcodeParam)) {
log.info("不能生产导购二维码:{}", JSONObject.toJSONString(clerk));
return;
}
log.info("【新增外部联系人会员】enterpriseId={},unionId={},name={},avatar={},QrcodeParam={}", staffClerkRelationDTO.getEnterpriseId(), unionId, name, avatar, qrcodeParam);
MemberDTO member = memberOpenCardBusinessService.getMemberByQywxChannelParam(staffClerkRelationDTO.getEnterpriseId(), unionId, "", name, avatar, qrcodeParam);
if (member == null) {
log.info("生产会员memnerid失败:{}", unionId);
return;
}
List<TabHaobanExternalClerkRelated> externalClerkRelateds = externalClerkRelatedService.listByExTernalUseridAndWxUserId(dto.getExternalUserid(), dto.getWxUserId());
if (CollectionUtils.isEmpty(externalClerkRelateds)) {
log.info("新增TabHaobanExternalClerkRelated");
TabHaobanExternalClerkRelated related = new TabHaobanExternalClerkRelated();
related.setAddCreateTime(createTime);
related.setClerkId(staffClerkRelationDTO.getClerkId());
related.setEnterpriseId(staffClerkRelationDTO.getEnterpriseId());
related.setExternalName(name);
related.setExternalUserId(externalUserId);
related.setStaffId(staffId);
related.setMemberUnionidRelatedId(dto.getMemberUnionidRelatedId());
related.setStoreId(staffClerkRelationDTO.getStoreId());
related.setUnionid(unionId);
related.setWxEnterpriseId(wxEnterpriseId);
related.setWxUserId(wxUserId);
related.setMemberId(member.getMemberId());
externalClerkRelatedService.insert(related);
} else {
log.info("更新TabHaobanExternalClerkRelated");
TabHaobanExternalClerkRelated exsitDTO = externalClerkRelateds.get(0);
exsitDTO.setMemberId(member.getMemberId());
exsitDTO.setMemberUnionidRelatedId(dto.getMemberUnionidRelatedId());
exsitDTO.setExternalUserId(externalUserId);
exsitDTO.setUnionid(unionId);
exsitDTO.setStoreId(staffClerkRelationDTO.getStoreId());
exsitDTO.setEnterpriseId(staffClerkRelationDTO.getEnterpriseId());
exsitDTO.setClerkId(staffClerkRelationDTO.getClerkId());
externalClerkRelatedService.update(exsitDTO);
}
}
@Deprecated
private String insertMemberUnionIdRelated(MemberUnionidRelatedDTO dto) {
if(dto == null){
return "";
}
String wxUserId = dto.getWxUserId();
String wxEnterpriseId = dto.getWxEnterpriseId();
String name = dto.getExternalName();
String createTime = dto.getAddCreateTime();
if(StringUtils.isAnyBlank(wxUserId,wxEnterpriseId,name,createTime)){
log.info("【新增外部联系人】wxUserId={},wxEnterpriseId={},name={},createTime={}",wxUserId,wxEnterpriseId,name,createTime);
return "";
}
MemberUnionidRelatedDTO exsitDTO = memberUnionRelatedService.getByParams(wxUserId, wxEnterpriseId,name,createTime);
String uuid = "";
if(exsitDTO == null){
uuid = memberUnionRelatedService.addMemberUnionidRelated(dto);
}else{
//如果是自建更新uuid
exsitDTO.setSelfExternalUserid(dto.getSelfExternalUserid());
exsitDTO.setUnionid(dto.getUnionid());
//更新对外联系人id
exsitDTO.setExternalUserid(dto.getExternalUserid());
memberUnionRelatedService.update(exsitDTO);
uuid = exsitDTO.getMemberUnionidRelatedId();
MemberUnionidRelatedDTO fullDTO = memberUnionRelatedService.getByParams(wxUserId, wxEnterpriseId,name,createTime);
dto.setExternalUserid(fullDTO.getExternalUserid());
dto.setUnionid(fullDTO.getUnionid());
}
return uuid;
}
@Deprecated
private MemberUnionidRelatedDTO getMemberUnionidRelatedDTO(MemberUnionidRelatedDTO dto){
log.info("【新增外部联系人回调】dto={}",JSON.toJSONString(dto));
String corpId = dto.getCorpid();
TabHaobanWxEnterprise wxEnterprise = wxEnterpriseService.getEnterpriseBycorpId(corpId);
if(wxEnterprise == null){
return null;
}
String wxEnterpriseId = wxEnterprise.getWxEnterpriseId();
String userId = dto.getWxUserId();
String suiteid = dto.getSuiteid();
String unionIdJson = "";
if(SELF_APP.equals(suiteid)){
SecretSettingDTO secretSetting = secretSettingService.getSecretSetting(wxEnterpriseId, SecretTypeEnum.CONTACT_CUSTOMER.getVal());
if (null == secretSetting) {
log.info("没有配置secret");
return null;
}
unionIdJson = qywxUserApiService.getCorpSelfExternalUseridInfo(dto.getCorpid(), secretSetting.getSecretVal(), dto.getExternalUserid());
}else{
unionIdJson = qywxUserApiService.getExternalUseridInfo(dto.getCorpid(), dto.getSuiteid(), dto.getExternalUserid());
}
if(StringUtils.isBlank(unionIdJson)){
log.info("【新增外部联系人回调】unionIdJson=null");
return null;
}
log.info("【新增外部联系人回调】unionIdJson={}",JSON.toJSONString(unionIdJson));
ExternalUserPojo pojo = getExternalUserPojo(unionIdJson,userId,wxEnterpriseId);
String name = pojo.getName();
String createTime = pojo.getAddCreateTime();
dto.setWxEnterpriseId(wxEnterpriseId);
dto.setExternalName(name);
dto.setAddCreateTime(createTime);
dto.setAvatar(pojo.getAvatar());
String externalUserId = null;
String selfExternalUserId = null;
String unionId = null;
if(SELF_APP.equals(suiteid)){
unionId = pojo.getUnionId();
selfExternalUserId = dto.getExternalUserid();
}else{
externalUserId = dto.getExternalUserid();
}
dto.setUnionid(unionId);
dto.setSelfExternalUserid(selfExternalUserId);
dto.setExternalUserid(externalUserId);
return dto;
}
/**
* 组装数据
*
* @param dto
* @return
*/
public MemberUnionidRelatedDTO getMemberUnionidRelatedDTONew(MemberUnionidRelatedDTO dto) {
log.info("【新增外部联系人回调】dto={}", JSON.toJSONString(dto));
String corpId = dto.getCorpid();
TabHaobanWxEnterprise wxEnterprise = wxEnterpriseService.getEnterpriseBycorpId(corpId);
if (wxEnterprise == null) {
return null;
}
String wxEnterpriseId = wxEnterprise.getWxEnterpriseId();
String userId = dto.getWxUserId();
String suiteid = dto.getSuiteid();
ExternalUserDTO externalUserDTO;
if (SELF_APP.equals(suiteid)) {
externalUserDTO = this.getCorpSelfExternalUseridInfo(wxEnterpriseId, userId, dto.getExternalUserid());
} else {
externalUserDTO = this.getExternalUseridInfo(wxEnterpriseId, userId, dto.getExternalUserid());
}
if (externalUserDTO == null) {
log.info("【新增外部联系人回调】unionIdJson=null");
return null;
}
dto.setWxEnterpriseId(wxEnterpriseId);
dto.setExternalName(externalUserDTO.getName());
dto.setAddCreateTime(externalUserDTO.getAddCreateTime());
dto.setAvatar(externalUserDTO.getAvatar());
if (SELF_APP.equals(suiteid)) {
dto.setUnionid(externalUserDTO.getUnionId());
dto.setSelfExternalUserid(externalUserDTO.getExternalUserId());
} else {
dto.setExternalUserid(externalUserDTO.getExternalUserId());
}
String key = "external" + dto.getWxEnterpriseId() + "_" + dto.getWxUserId() + "_" + dto.getExternalName() + "_" + dto.getAddCreateTime();
String lockKey = key + "-lock";
RedisUtil.lock(lockKey, 3L);
String memberUnionidRelatedId = (String) RedisUtil.getCache(key);
if (memberUnionidRelatedId != null) {
MemberUnionidRelated memberUnionidRelated = memberUnionidRelatedMapper.selectByPrimaryKey(memberUnionidRelatedId);
dto.setUnionid(dto.getUnionid() == null ? memberUnionidRelated.getUnionid() : dto.getUnionid());
dto.setExternalUserid(dto.getExternalUserid() == null ? memberUnionidRelated.getExternalUserid() : dto.getExternalUserid());
dto.setSelfExternalUserid(dto.getSelfExternalUserid() == null ? memberUnionidRelated.getSelfExternalUserid() : dto.getSelfExternalUserid());
dto.setMemberUnionidRelatedId(memberUnionidRelatedId);
memberUnionRelatedService.update(dto);
RedisUtil.unlock(lockKey);
return dto;
} else {
memberUnionidRelatedId = memberUnionRelatedService.addMemberUnionidRelated(dto);
RedisUtil.setCache(key, memberUnionidRelatedId, 60L);
RedisUtil.unlock(lockKey);
return null;
}
}
private ExternalUserPojo getExternalUserPojo(String unionIdJson,String userId1,String wxEnterpriseId) {
ExternalUserPojo pojo = new ExternalUserPojo();
String unionId = "";
String follow_user = "";
String createTime = "";
String userId = "";
String avatar = "";
String relaName = "";
String externalUserId = "";
if(StringUtils.isNotBlank(unionIdJson)){
JSONObject jo = JSON.parseObject(unionIdJson);
String external_contact = jo.getString("external_contact");
if(StringUtils.isNotBlank(external_contact)){
JSONObject jt = JSON.parseObject(external_contact);
unionId = jt.getString("unionid");
relaName = EmojiFilterUtil.filterEmojiLast(jt.getString("name"), true);
if(StringUtils.isBlank(relaName)){
relaName = "--";
}
avatar = jt.getString("avatar");
externalUserId = jt.getString("external_userid");
}
follow_user = jo.getString("follow_user");
if(StringUtils.isNotBlank(follow_user)){
JSONArray j = JSON.parseArray(follow_user);
for (Object object : j) {
String followJson = JSON.toJSONString(object);
JSONObject follow = JSON.parseObject(followJson);
userId = follow.getString("userid");
if(userId.equals(userId1)){
createTime = follow.getString("createtime");
}
}
}
}
pojo.setAddCreateTime(createTime);
pojo.setAvatar(avatar);
pojo.setName(relaName);
pojo.setUnionId(unionId);
pojo.setExternalUserId(externalUserId);
pojo.setWxEnterpriseId(wxEnterpriseId);
return pojo;
}
@Override
public String add(String wxEnterpriseId,String selfExternalUserId,String userId,String storeId) {
WxEnterpriseDTO wxEnterprise = wxEnterpriseService.selectById(wxEnterpriseId);
if(wxEnterprise == null){
return "";
}
TabHaobanStaff staff = staffService.selectByUserIdAndEnterpriseId(userId, wxEnterpriseId);
if(staff == null){
return "";
}
SecretSettingDTO secretSetting = secretSettingService.getSecretSetting(wxEnterpriseId, SecretTypeEnum.CONTACT_CUSTOMER.getVal());
if (null == secretSetting) {
log.info("没有配置secret");
return "";
}
String unionIdJson = qywxUserApiService.getCorpSelfExternalUseridInfo(wxEnterprise.getCorpid(), secretSetting.getSecretVal(), selfExternalUserId);
ExternalUserPojo pojo = getExternalUserPojo(unionIdJson,userId,wxEnterpriseId);
String unionId = pojo.getUnionId();
String name = pojo.getName();
String createTime = pojo.getAddCreateTime();
MemberUnionidRelatedDTO dto = new MemberUnionidRelatedDTO();
String externalUserId = getExternalUserId(wxEnterprise, userId, createTime, name);
dto.setExternalUserid(externalUserId);
dto.setWxEnterpriseId(wxEnterpriseId);
dto.setUnionid(unionId);
dto.setExternalName(name);
dto.setAddCreateTime(createTime);
dto.setWxUserId(userId);
dto.setAvatar(pojo.getAvatar());
if(StringUtils.isBlank(unionId)){
return "";
}
dto.setSuiteid(secretSetting.getSecretVal());
MemberUnionidRelatedDTO exsitDTO = memberUnionRelatedService.getByParams(userId, wxEnterpriseId,name,createTime);
String uuid = "";
if(exsitDTO == null){
dto.setUnionid(unionId);
//更新对外联系人id
dto.setSelfExternalUserid(selfExternalUserId);
uuid = memberUnionRelatedService.addMemberUnionidRelated(dto);
}else{
exsitDTO.setExternalUserid(externalUserId);
exsitDTO.setUnionid(unionId);
//更新对外联系人id
exsitDTO.setSelfExternalUserid(selfExternalUserId);
memberUnionRelatedService.update(exsitDTO);
uuid = exsitDTO.getMemberUnionidRelatedId();
//return "";
}
//新增门店和导购的关联关系
insertExternalClerkRelated(dto);
return uuid;
}
private String getExternalUserId(WxEnterpriseDTO wxEnterprise,String userId1,String createTime,String name){
log.info("新增外部联系人】corpid={},suiteId={},userId1={}",wxEnterprise.getCorpid(),config.getWxSuiteid(),userId1);
String wxRes = qywxUserApiService.listExternalUserid(wxEnterprise.getCorpid(), config.getWxSuiteid(), userId1);
String externalUserId = "";
log.info("【新增外部联系人】wxRes={}",wxRes);
if(StringUtils.isNotBlank(wxRes)){
JSONArray jsonArr = JSON.parseArray(wxRes);
String wxName = "";
for (Object externalUserid : jsonArr) {
String uJ = qywxUserApiService.getExternalUseridInfo(wxEnterprise.getCorpid(), config.getWxSuiteid(), externalUserid.toString());
log.info("【新增外部联系人】uJ={}",uJ);
if(StringUtils.isNotBlank(uJ)){
JSONObject jo = JSON.parseObject(uJ);
String external_contact = jo.getString("external_contact");
String uj_follow_user = jo.getString("follow_user");
JSONObject jt = null;
if(StringUtils.isNotBlank(external_contact)){
jt = JSON.parseObject(external_contact);
wxName = EmojiFilterUtil.filterEmojiLast(jt.getString("name"), true);
if(StringUtils.isBlank(wxName)){
wxName = "--";
}
}
if(StringUtils.isNotBlank(uj_follow_user)){
JSONArray j = JSON.parseArray(uj_follow_user);
String uj_userId = "";
for (Object object : j) {
String followJson = JSON.toJSONString(object);
JSONObject follow = JSON.parseObject(followJson);
uj_userId = follow.getString("userid");
log.info("【新增外部联系人】createTime={},name={},followCreateTime={},wxName={}",createTime,name,follow.getString("createtime"),wxName);
if(uj_userId.equals(userId1) && createTime.equals(follow.getString("createtime")) && name.equals(wxName)){
if(jt != null){
externalUserId = jt.getString("external_userid");
break;
}
}
}
}
}
if(StringUtils.isNotBlank(externalUserId)){
break;
}
}
}
return externalUserId;
}
@Override
public void delMemberUnionidRelated(MemberUnionidRelatedDTO dto) {
DealQywxExternalUserPojo dealQywxExternalUserPojo = new DealQywxExternalUserPojo();
dealQywxExternalUserPojo.setType(DealQywxExternalUserPojo.DealType.del.getType());
dealQywxExternalUserPojo.setData(dto);
GicMQClient instance = GICMQClientUtil.getClientInstance();
try {
instance.sendMessage("dealQywxExternalUserMq", JSONObject.toJSONString(dealQywxExternalUserPojo));
} catch (Exception e) {
log.info("异步处理异常:{}", e);
}
}
private void delMemberUnionidRelatedProcess(MemberUnionidRelatedDTO dto) {
externalClerkRelatedService.delByUserIdAndExternalUserId(dto);
memberUnionRelatedService.delMemberUnionidRelated(dto);
}
@Override
public ExternalClerkRelatedDTO getByMemberId(String staffId, String memberId) {
TabHaobanStaff staff = staffService.selectById(staffId);
if(staff == null){
return null;
}
log.info("【查询会员】wxUserId={},unionid={}",staff.getWxUserId(),memberId);
return externalClerkRelatedService.getByMemberId(staff.getWxUserId(),memberId);
}
@Override
public List<MemberUnionidRelatedDTO> getByWxUserIdAndWxEnterpriseId(String wxUserId, String wxEnterpriseId) {
List<MemberUnionidRelatedDTO> list = memberUnionRelatedService.getByWxUserIdAndWxEnterpriseId(wxUserId,wxEnterpriseId);
return list;
}
@Override
public List<MemberUnionidRelatedDTO> listByEnterpriseIdAndDate( String enterpriseId,Date date) {
List<MemberUnionidRelated> list = memberUnionidRelatedMapper.listByEnterpriseIdAndDate(enterpriseId,date);
return EntityUtil.changeEntityListByJSON(MemberUnionidRelatedDTO.class,list);
}
@Override
public void freshWxFrend(String wxEnterpriseId, String wxUserId,String storeId) {
log.info("【刷下好友】wxUserId={}",wxUserId);
WxEnterpriseDTO enterprise = wxEnterpriseService.selectById(wxEnterpriseId);
String wxRes = qywxUserApiService.listExternalUserid(enterprise.getCorpid(), config.getWxSuiteid(), wxUserId);
List<MemberUnionidRelatedDTO> list = this.getByWxUserIdAndWxEnterpriseId(wxUserId, wxEnterpriseId);
List<String> externalUserIdList = list.stream().map(external->external.getExternalUserid())
.collect(Collectors.toList());
JSONArray externalArr = JSON.parseArray(wxRes);
for (String externalUserId : externalUserIdList) {
if(!externalArr.contains(externalUserId)){
//删除成员和外部联系人关系
MemberUnionidRelatedDTO dto = new MemberUnionidRelatedDTO();
dto.setExternalUserid(externalUserId);
dto.setWxUserId(wxUserId);
memberUnionRelatedService.delMemberUnionidRelated(dto);
//删除导购和外部联系人关系
externalClerkRelatedService.delByUserIdAndExternalUserId(dto);
}
}
SecretSettingDTO secretSetting = secretSettingService.getSecretSetting(wxEnterpriseId, SecretTypeEnum.CONTACT_CUSTOMER.getVal());
if (null == secretSetting||secretSetting.getCheckFlag()==0) {
log.info("没有配置客户联系secret:{}",wxEnterpriseId);
return;
}
String res = qywxUserApiService.listSelfExternalUserid(enterprise.getCorpid(), secretSetting.getSecretVal(), wxUserId);
log.info("【刷下好友】res={}",res);
if(StringUtils.isBlank(res)){
return;
}
JSONArray jsonArr = JSON.parseArray(res);
if(jsonArr.size() == 0) {
return;
}
for (Object object : jsonArr) {
this.add(wxEnterpriseId, object.toString(), wxUserId,storeId);
}
}
@Override
public void mqFreshWxFrend(String res){
JSONObject json = JSON.parseObject(res);
String wxEnterpriseId = json.getString("wxEnterpriseId");
String wxUserId = json.getString("wxUserId");
String storeId = json.getString("storeId");
log.info("【刷下微信好友】wxEnterpriseId={}.wxUserId={},storeId={}",wxEnterpriseId,wxUserId,storeId);
if(StringUtils.isAnyBlank(wxEnterpriseId,wxUserId,storeId)){
return ;
}
freshWxFrend(wxEnterpriseId, wxUserId, storeId);
}
@Override
public void cleanByCid(String cid) {
if (StringUtils.isNotBlank(cid)) {
TabHaobanWxEnterprise wxEnterprise = wxEnterpriseService.getEnterpriseBycorpId(cid);
if (null != wxEnterprise) {
memberUnionRelatedService.clean(wxEnterprise.getWxEnterpriseId());
}
}else {
memberUnionRelatedService.clean(null);
}
}
@Override
public Page<MemberUnionidRelatedDTO> pageMemberUnionByParams(List<String> userIdList, List<String> sendMemberIds,
String enterpriseId, BasePageInfo pageInfo) {
PageHelper.startPage(pageInfo.getPageNum(), pageInfo.getPageSize());
return PageUtil.changePageHelperToCurrentPage(memberUnionRelatedService.pageMemberUnionByParams(userIdList,sendMemberIds,enterpriseId),MemberUnionidRelatedDTO.class);
}
@Override
public String sendMessage(String wxEnterpriseId,String userId,List<String> extendUserList,String materialId){
WxEnterpriseDTO enterprise = wxEnterpriseService.selectById(wxEnterpriseId);
MaterialDTO material = materialApiService.selectMaterialById(materialId);
if(material == null){
return "";
}
JSONResponse jp = null;
if(material.getMaterialType() == 2 || material.getMaterialType() == 4 || material.getMaterialType() == 5){
Date wxLastTime = material.getWxLastUploadTime();
String maerialId = material.getMediaId();
if(DateUtil.addDay(wxLastTime, 3).getTime() < System.currentTimeMillis()){
maerialId = materialApiService.reUpdalodMetail(materialId);
}
QywxImageExternalMessageDTO dto = new QywxImageExternalMessageDTO();
dto.setMediaId(maerialId);
dto.setChatType("single");
dto.setExternalUserid(extendUserList);
dto.setSenderUserId(userId);
log.info("【发送消息】dto = {}",JSON.toJSONString(dto));
jp = qywxSuiteApiService.sendExternalMessage(enterprise.getCorpid(), config.getWxSuiteid(), dto);
}else if(material.getMaterialType() == 1){
QywxTextExternalMessageDTO dto = new QywxTextExternalMessageDTO();
dto.setChatType("single");
dto.setExternalUserid(extendUserList);
dto.setSenderUserId(userId);
dto.setText(material.getMaterialContent());
log.info("【发送消息】dto = {}",JSON.toJSONString(dto));
jp = qywxSuiteApiService.sendExternalMessage(enterprise.getCorpid(), config.getWxSuiteid(), dto);
}else if(material.getMaterialType() == 3){
QywxIinkExternalMessageDTO dto = new QywxIinkExternalMessageDTO();
dto.setChatType("single");
dto.setExternalUserid(extendUserList);
dto.setSenderUserId(userId);
dto.setDesc(material.getMaterialDesc());
dto.setPicurl(material.getWxImgUrl());
dto.setTitle(material.getMaterialTitle());
dto.setUrl(material.getLink());
log.info("【发送消息】dto = {}",JSON.toJSONString(dto));
jp = qywxSuiteApiService.sendExternalMessage(enterprise.getCorpid(), config.getWxSuiteid(), dto);
}
log.info("【发送消息】jp = {}",JSON.toJSONString(jp));
Map<String,Object> returnMap = jp.getReturnMap();
return returnMap.get("msgid") == null?"":returnMap.get("msgid").toString();
}
@Override
public JSONResponse getMessageStatus(String wxEnterpriseId, String wxMessageId) {
WxEnterpriseDTO enterprise = wxEnterpriseService.selectById(wxEnterpriseId);
if(enterprise == null){
return null;
}
JSONResponse jp = qywxSuiteApiService.resultExternalMessage(enterprise.getCorpid(), config.getWxSuiteid(), wxMessageId);
return jp;
}
@Override
public List<MemberUnionidRelatedDTO> getByWxUserIdListAndWxEnterpriseId(List<String> userIdList,
String wxEnterpriseId) {
return EntityUtil.changeEntityListByJSON(MemberUnionidRelatedDTO.class, memberUnionidRelatedMapper.getByWxUserIdListAndWxEnterpriseId(userIdList,wxEnterpriseId));
}
@Override
public void cleanNoExsitFriend(String wxEnterpriseId, String wxUserId, String wxRes) {
log.info("【清除不存在的好友】wxEnterpriseId={},wxUserId={}",wxEnterpriseId,wxUserId);
WxEnterpriseDTO enterprise = wxEnterpriseService.selectById(wxEnterpriseId);
//String wxRes = qywxUserApiService.listExternalUserid(enterprise.getCorpid(), config.getWxSuiteid(), wxUserId);
List<MemberUnionidRelatedDTO> list = this.getByWxUserIdAndWxEnterpriseId(wxUserId, wxEnterpriseId);
List<String> externalUserIdList = list.stream().map(external->external.getExternalUserid())
.collect(Collectors.toList());
if(StringUtils.isBlank(wxRes)){
log.info("【清除不存在的好友不存在】wxEnterpriseId={},wxUserId={}",wxEnterpriseId,wxUserId);
return;
}
JSONArray externalArr = JSON.parseArray(wxRes);
for (String externalUserId : externalUserIdList) {
if(!externalArr.contains(externalUserId)){
//删除成员和外部联系人关系
MemberUnionidRelatedDTO dto = new MemberUnionidRelatedDTO();
dto.setExternalUserid(externalUserId);
dto.setWxUserId(wxUserId);
memberUnionRelatedService.delMemberUnionidRelated(dto);
//删除导购和外部联系人关系
externalClerkRelatedService.delByUserIdAndExternalUserId(dto);
}
}
}
@Override
public List<String> listSelfExterialList(String wxEnterpriseId, String wxUserId) {
try {
log.info("【查询自建应用好友】wxEnterpriseId={},wxUserId={}",wxEnterpriseId,wxUserId);
WxEnterpriseDTO enterprise = wxEnterpriseService.selectById(wxEnterpriseId);
List<String> list = new ArrayList<>();
SecretSettingDTO secretSetting = secretSettingService.getSecretSetting(wxEnterpriseId, SecretTypeEnum.CONTACT_CUSTOMER.getVal());
if (null == secretSetting||secretSetting.getCheckFlag()==0) {
log.info("没有配置客户联系secret:{}",wxEnterpriseId);
return list;
}
String res = qywxUserApiService.listSelfExternalUserid(enterprise.getCorpid(), secretSetting.getSecretVal(), wxUserId);
log.info("【查询自建应用】res={}",res);
if (res != null && res.equals("1")) {
log.info("代表需要重试");
return null;
}
if(StringUtils.isBlank(res)){
return list;
}
JSONArray jsonArr = JSON.parseArray(res);
if(jsonArr.size() == 0) {
return list;
}
for (Object object : jsonArr) {
list.add(object.toString());
}
return list;
} catch (Exception e) {
log.info("错误={}",e);
}
return null;
}
@Override
public List<String> listExterialList(String wxEnterpriseId, String wxUserId) {
log.info("【获取第三方应用好友】wxEnterpriseId={},wxUserId={}",wxEnterpriseId,wxUserId);
WxEnterpriseDTO enterprise = wxEnterpriseService.selectById(wxEnterpriseId);
// String wxRes = qywxUserApiService.listExternalUserid(enterprise.getCorpid(), "wwb3ef71aa8c6d9c06", wxUserId);
String wxRes = qywxUserApiService.listExternalUserid(enterprise.getCorpid(), config.getWxSuiteid(), wxUserId);
List<String> list = new ArrayList<>();
log.info("【查询第三方应用】res={}",wxRes);
if (wxRes != null && wxRes.equals("1")) {
log.info("代表需要重试");
return null;
}
if(StringUtils.isBlank(wxRes)){
return list;
}
JSONArray jsonArr = JSON.parseArray(wxRes);
if(jsonArr.size() == 0) {
return list;
}
for (Object object : jsonArr) {
list.add(object.toString());
}
return list;
}
@Override
public ExternalUserDTO getCorpSelfExternalUseridInfo(String wxEnterpriseId,String wxUserId, String externalUserId) {
WxEnterpriseDTO wxEnterprise = wxEnterpriseService.selectById(wxEnterpriseId);
if(wxEnterprise == null){
log.info("企业不存在");
return null;
}
SecretSettingDTO secretSetting = secretSettingService.getSecretSetting(wxEnterpriseId, SecretTypeEnum.CONTACT_CUSTOMER.getVal());
if (null == secretSetting) {
log.info("没有配置secret");
return null;
}
String unionIdJson = qywxUserApiService.getCorpSelfExternalUseridInfo(wxEnterprise.getCorpid(), secretSetting.getSecretVal(), externalUserId);
if(StringUtils.isBlank(unionIdJson)){
log.info("好友不存在");
return null;
} else if (unionIdJson.equals("1")) {
log.info("接口调用被限制");
throw new WxApiLimitException("getCorpSelfExternalUseridInfo接口调用被限制");
}
ExternalUserPojo pojo = getExternalUserPojo(unionIdJson, wxUserId, wxEnterpriseId);
return EntityUtil.changeEntityByJSON(ExternalUserDTO.class, pojo);
}
@Override
public ExternalUserDTO getExternalUseridInfo(String wxEnterpriseId,String wxUserId, String externalUserId) {
WxEnterpriseDTO wxEnterprise = wxEnterpriseService.selectById(wxEnterpriseId);
if(wxEnterprise == null){
log.info("企业不存在");
return null;
}
// String uJ = qywxUserApiService.getExternalUseridInfo(wxEnterprise.getCorpid(), "wwb3ef71aa8c6d9c06", externalUserId);
String uJ = qywxUserApiService.getExternalUseridInfo(wxEnterprise.getCorpid(), config.getWxSuiteid(), externalUserId);
if(StringUtils.isBlank(uJ)){
log.info("好友不存在");
return null;
} else if (uJ.equals("1")) {
log.info("限制次数");
throw new WxApiLimitException("getExternalUseridInfo接口次数限制");
}
String name = "";
String createTime = "";
String avatar = "";
if(StringUtils.isNotBlank(uJ)){
JSONObject jo = JSON.parseObject(uJ);
String external_contact = jo.getString("external_contact");
String uj_follow_user = jo.getString("follow_user");
JSONObject jt = null;
if(StringUtils.isNotBlank(external_contact)){
jt = JSON.parseObject(external_contact);
name = EmojiFilterUtil.filterEmojiLast(jt.getString("name"), true);
if(StringUtils.isBlank(name)){
name = "--";
}
avatar = jt.getString("avatar");
}
if(StringUtils.isNotBlank(uj_follow_user)){
JSONArray j = JSON.parseArray(uj_follow_user);
String uj_userId = "";
for (Object object : j) {
String followJson = JSON.toJSONString(object);
JSONObject follow = JSON.parseObject(followJson);
uj_userId = follow.getString("userid");
if(uj_userId.equals(wxUserId)){
if(jt != null){
externalUserId = jt.getString("external_userid");
createTime = follow.getString("createtime");
break;
}
}
}
}
}
ExternalUserPojo pojo = new ExternalUserPojo();
pojo.setExternalUserId(externalUserId);
pojo.setName(name);
pojo.setAddCreateTime(createTime);
pojo.setWxEnterpriseId(wxEnterpriseId);
pojo.setAvatar(avatar);
return EntityUtil.changeEntityByJSON(ExternalUserDTO.class, pojo);
}
@Override
public String addExternal(ExternalUserDTO dto) {
String wxUserId = dto.getWxUserId();
String wxEnterpriseId = dto.getWxEnterpriseId();
String name = StringUtils.isBlank(dto.getName())?"--":dto.getName();
String createTime = dto.getAddCreateTime();
String unionId = dto.getUnionId();
String externalUserId = dto.getExternalUserId();
String memberId = dto.getMemberId();
String storeId = dto.getStoreId();
String enterpriseId = dto.getEnterpriseId();
String staffId = dto.getStaffId();
String avatar = dto.getAvatar();
String clerkId = dto.getClerkId();
if(StringUtils.isAnyBlank(wxUserId,wxEnterpriseId,name,createTime,unionId,externalUserId,memberId,storeId,enterpriseId,staffId,clerkId)){
log.info("【新增外部联系人】wxUserId={},wxEnterpriseId={},name={},createTime={},unionId ={},externalUserId ={},memberId ={},storeId ={},enterpriseId ={},staffId={},clerkId={}"
+ "",wxUserId,wxEnterpriseId,name,createTime,unionId,externalUserId,memberId,storeId,enterpriseId,staffId,clerkId);
return "参数不对";
}
MemberUnionidRelatedDTO exsitDTO = memberUnionRelatedService.getByUnionId(wxEnterpriseId, wxUserId, unionId);
String uuid = "";
if(exsitDTO == null){
exsitDTO = new MemberUnionidRelatedDTO();
exsitDTO.setAvatar(avatar);
exsitDTO.setExternalUserid(externalUserId);
exsitDTO.setAddCreateTime(createTime);
exsitDTO.setEnterpriseId(enterpriseId);
exsitDTO.setExternalName(name);
exsitDTO.setExternalUserid(externalUserId);
exsitDTO.setWxEnterpriseId(wxEnterpriseId);
exsitDTO.setWxUserId(wxUserId);
exsitDTO.setUnionid(unionId);
uuid = memberUnionRelatedService.addMemberUnionidRelated(exsitDTO);
}else{
uuid = exsitDTO.getMemberUnionidRelatedId();
exsitDTO.setAvatar(avatar);
exsitDTO.setExternalUserid(externalUserId);
exsitDTO.setUnionid(unionId);
exsitDTO.setAddCreateTime(createTime);
exsitDTO.setExternalName(name);
memberUnionRelatedService.update(exsitDTO);
}
List<TabHaobanExternalClerkRelated> clerkRelateds = externalClerkRelatedService.listByExTernalUseridAndWxUserId(externalUserId, wxUserId);
if (CollectionUtils.isEmpty(clerkRelateds)) {
TabHaobanExternalClerkRelated related = new TabHaobanExternalClerkRelated();
related.setAddCreateTime(createTime);
related.setClerkId(clerkId);
related.setEnterpriseId(enterpriseId);
related.setExternalName(name);
related.setExternalUserId(externalUserId);
related.setStaffId(staffId);
related.setMemberUnionidRelatedId(uuid);
related.setStoreId(storeId);
related.setUnionid(unionId);
related.setWxEnterpriseId(wxEnterpriseId);
related.setWxUserId(wxUserId);
related.setMemberId(memberId);
externalClerkRelatedService.insert(related);
}else{
TabHaobanExternalClerkRelated external = clerkRelateds.get(0);
external.setMemberId(memberId);
external.setMemberUnionidRelatedId(uuid);
external.setExternalUserId(externalUserId);
external.setExternalName(name);
external.setUnionid(unionId);
external.setStoreId(storeId);
external.setEnterpriseId(enterpriseId);
external.setClerkId(clerkId);
external.setStaffId(staffId);
external.setMemberId(memberId);
externalClerkRelatedService.update(external);
}
return "";
}
@Override
public void cleanNoExsitFriendNew(String wxEnterpriseId, String wxUserId, List<String> externalUserIds) {
log.info("【清除不存在的好友】wxEnterpriseId={},wxUserId={}", wxEnterpriseId, wxUserId);
//查询所有的外部联系人
List<MemberUnionidRelatedDTO> list = memberUnionRelatedService.getByWxUserIdAndWxEnterpriseId(wxUserId, wxEnterpriseId);
if (CollectionUtils.isEmpty(list)) {
log.info("改导购下没有外部联系人,无需清理外部联系人:{},{}", wxUserId, wxEnterpriseId);
return;
}
Set<String> externalUserIdList = list.stream().map(external -> external.getExternalUserid())
.collect(Collectors.toSet());
Sets.SetView<String> delExternalUserIds = Sets.difference(new HashSet<>(externalUserIds), externalUserIdList);
if (CollectionUtils.isEmpty(delExternalUserIds)) {
log.info("没有需要删除逇外部联系人:{},{}", wxUserId, wxEnterpriseId);
return;
}
//删除成员与union的关联关系
memberUnionRelatedService.delMemberUnionidRelatedBatch(wxEnterpriseId, wxUserId, new ArrayList<>(delExternalUserIds));
//删除导购和外部联系人关系
externalClerkRelatedService.delByUserIdAndExternalUserIdBatch(wxEnterpriseId, wxUserId, new ArrayList<>(delExternalUserIds));
}
@Override
public ServiceResponse<List<FriendStoreInfoDTO>> listFriendClerkByMemberUnionid(String enterpriseId, String unionId) {
ServiceResponse<List<FriendStoreInfoDTO>> resp = new ServiceResponse<>();
if (StringUtils.isAnyBlank(enterpriseId, unionId)) {
resp.setMessage("参数有误");
resp.setCode(2);
return resp;
}
List<TabHaobanExternalClerkRelated> relateds = externalClerkRelatedService.listExternalByUnionId(enterpriseId, unionId);
if (CollectionUtils.isEmpty(relateds)) {
return resp;
}
//导购信息
Set<String> clerkIds = relateds.stream().map(dto -> dto.getClerkId()).collect(Collectors.toSet());
log.info("获取clerkIds:{}", JSONObject.toJSONString(clerkIds));
List<ClerkDTO> clerkDTOS = clerkService.getClerkByIds(clerkIds);
if (CollectionUtils.isEmpty(clerkDTOS)) {
log.info("没有有效的导购");
return resp;
}
Map<String, ClerkDTO> clerkMap = clerkDTOS.stream().collect(Collectors.toMap(ClerkDTO::getClerkId, dto -> dto));
//门店信息
List<String> storeIds = relateds.stream().map(dto -> dto.getStoreId()).collect(Collectors.toList());
log.info("门店storeIds:{}", JSONObject.toJSONString(storeIds));
List<StoreDTO> storeDTOS = storeService.queryStore(storeIds);
if (CollectionUtils.isEmpty(storeDTOS)) {
log.info("没有关联的门店");
return resp;
}
Map<String, StoreDTO> storeMap = storeDTOS.stream().collect(Collectors.toMap(StoreDTO::getStoreId, dto -> dto));
//组装
log.info("组装返回的好友导购信息:{}", unionId);
List<FriendStoreInfoDTO> ret = relateds.stream().map(related -> {
ClerkDTO clerkDTO = clerkMap.get(related.getClerkId());
StoreDTO storeDTO = storeMap.get(related.getStoreId());
FriendStoreInfoDTO friendStoreInfoDTO = new FriendStoreInfoDTO();
friendStoreInfoDTO.setAddFriendTime(related.getAddCreateTime());
friendStoreInfoDTO.setClerkId(related.getClerkId());
friendStoreInfoDTO.setStoreId(related.getStoreId());
friendStoreInfoDTO.setWxUserId(related.getWxUserId());
friendStoreInfoDTO.setStoreCode(storeDTO != null ? storeDTO.getStoreCode() : null);
friendStoreInfoDTO.setStoreName(storeDTO != null ? storeDTO.getStoreName() : null);
friendStoreInfoDTO.setClerkCode(clerkDTO != null ? clerkDTO.getClerkCode() : null);
friendStoreInfoDTO.setClerkName(clerkDTO != null ? clerkDTO.getClerkName() : null);
friendStoreInfoDTO.setClerkPhoneNumber(clerkDTO != null ? clerkDTO.getPhoneNumber() : null);
return friendStoreInfoDTO;
}).collect(Collectors.toList());
resp.setResult(ret);
return resp;
}
}
......@@ -3,6 +3,7 @@ package com.gic.haoban.manage.service.task;
import com.alibaba.fastjson.JSONObject;
import com.gic.clerk.api.dto.ClerkDTO;
import com.gic.clerk.api.service.ClerkService;
import com.gic.dubbo.entity.ProviderLocalTag;
import com.gic.enterprise.api.service.StoreGroupService;
import com.gic.enterprise.api.service.StoreService;
import com.gic.haoban.base.api.common.ServiceResponse;
......@@ -77,8 +78,8 @@ public class QywxClerkSyncOperation implements BaseSyncOperation {
}
} catch (Exception e) {
e.printStackTrace();
logger.info("微信成员同步失败:", JSONObject.toJSONString(dataPre));
reason="同步异常";
logger.info("微信成员同步失败:{}", e);
reason = "同步异常:";
dealFlag = false;
} finally {
if (!dealFlag) {
......
......@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.gic.commons.util.EntityUtil;
import com.gic.commons.util.GICMQClientUtil;
import com.gic.dubbo.entity.ProviderLocalTag;
import com.gic.enterprise.api.dto.StoreDTO;
import com.gic.enterprise.api.dto.StoreGroupDTO;
import com.gic.enterprise.api.service.StoreGroupService;
......@@ -147,9 +148,9 @@ public class QywxGroupSyncOperation implements BaseSyncOperation {
}
} catch (Exception e) {
resultFlag = false;
reason = "处理异常";
reason = "处理异常:";
e.printStackTrace();
logger.info("处理异常");
logger.info("处理异常:{}", e);
} finally {
if (!resultFlag) {
dealException(dealParamMqDTO.getTaskId(), dealParamMqDTO.getData(), dataPre.getEnterpriseId(), reason);
......
package com.gic.haoban.manage.service.task.friend;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.gic.commons.util.GICMQClientUtil;
import com.gic.haoban.manage.api.dto.DealParamMqDTO;
import com.gic.haoban.manage.api.enums.PreDealStatusEnum;
import com.gic.haoban.manage.api.enums.PreDealTypeEnum;
import com.gic.haoban.manage.api.enums.SyncTaskStatusEnum;
import com.gic.haoban.manage.api.service.MemberUnionidRelatedApiService;
import com.gic.haoban.manage.service.entity.TabHaobanPreDealLog;
import com.gic.haoban.manage.service.entity.TabHaobanSyncTask;
import com.gic.haoban.manage.service.service.PreDealService;
import com.gic.haoban.manage.service.service.SyncTaskService;
import com.gic.haoban.manage.service.task.BaseSyncOperation;
import com.gic.mq.sdk.GicMQClient;
import com.gic.redis.data.util.RedisUtil;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Service
public class FriendClerkSyncNewOperation implements BaseSyncOperation {
private static final Logger logger = LoggerFactory.getLogger(FriendClerkSyncNewOperation.class);
@Autowired
private PreDealService preDealService;
@Autowired
private MemberUnionidRelatedApiService memberUnionidRelatedApiService;
@Autowired
private SyncTaskService syncTaskService;
private static final String FRIEND_LOCK = "haoban_fresh_wx_friend_lock_";
private static final String TRY_AGAIN = "haoban_fresh_wx_friend_again_";
@Override
public void dealSingleByMq(DealParamMqDTO dealParamMqDTO, TabHaobanPreDealLog dataPre) {
logger.info("dealParamMqDTO={},dataPre={}", JSON.toJSONString(dealParamMqDTO), JSON.toJSONString(dataPre));
String reason = "";
boolean dealFlag = true;
String taskId = dealParamMqDTO.getTaskId();
try {
String wxEnterpriseId = dataPre.getWxEnterpriseId();
String wxUserId = dataPre.getDataId();
//获取所有外部联系人的外部联系人ids
List<String> selfUserIdList = memberUnionidRelatedApiService.listSelfExterialList(wxEnterpriseId, wxUserId);
logger.info("selfUserIdList={}", JSONObject.toJSONString(selfUserIdList));
if (null == selfUserIdList) {
logger.info("自建应用调用第三方接口进入重试");
dealFlag = tryAgainToMq(dataPre);
reason = "重试次数过多";
return;
}
if (CollectionUtils.isEmpty(selfUserIdList)) {
logger.info("改用户没有外部联系人:{}", JSONObject.toJSONString(dataPre));
dealFlag = false;
reason = "该用户没有外部联系人";
return;
}
//第三方服务商的外部联系人
List<String> userIdList = memberUnionidRelatedApiService.listExterialList(wxEnterpriseId, wxUserId);
if (null == selfUserIdList) {
dealFlag = tryAgainToMq(dataPre);
reason = "重试次数过多";
logger.info("第三方服务商外部联系人调用失败进入重试:{}", dataPre.getDataId());
return;
}
if (CollectionUtils.isEmpty(userIdList)) {
logger.info("改用户没有外部联系人2:{}", JSONObject.toJSONString(dataPre));
dealFlag = false;
reason = "该用户没有外部联系人";
return;
}
//清理外部联系人
memberUnionidRelatedApiService.cleanNoExsitFriendNew(wxEnterpriseId, wxUserId, userIdList);
//写入外部联系人的处理队列
List<TabHaobanPreDealLog> dealLogList = selfUserIdList.stream().map(externalUserId -> {
TabHaobanPreDealLog dealLog = new TabHaobanPreDealLog();
dealLog.setDataId(externalUserId + "-" + dataPre.getDataId());
dealLog.setpDataId(dataPre.getDataId());
dealLog.setDataType(PreDealTypeEnum.self_friend.getVal());
dealLog.setStatusFlag(0);
dealLog.setTaskId(dataPre.getTaskId());
dealLog.setDataContent(externalUserId);
dealLog.setWxEnterpriseId(wxEnterpriseId);
return dealLog;
}).collect(Collectors.toList());
preDealService.insert(dealLogList);
//写入外部联系人的处理队列
List<TabHaobanPreDealLog> thirddealLogList = userIdList.stream().map(externalUserId -> {
TabHaobanPreDealLog dealLog = new TabHaobanPreDealLog();
dealLog.setDataId(externalUserId + "-" + dataPre.getDataId());
dealLog.setpDataId(dataPre.getDataId());
dealLog.setDataType(PreDealTypeEnum.friend.getVal());
dealLog.setStatusFlag(0);
dealLog.setTaskId(dataPre.getTaskId());
dealLog.setDataContent(externalUserId);
dealLog.setWxEnterpriseId(wxEnterpriseId);
return dealLog;
}).collect(Collectors.toList());
preDealService.insert(thirddealLogList);
//成功更新状态
dealSuccess(dealParamMqDTO.getTaskId(), dealParamMqDTO.getData(), dataPre.getEnterpriseId(), dataPre.getWxEnterpriseId());
} catch (Exception e) {
e.printStackTrace();
logger.info("同步失败:{},{}", JSONObject.toJSONString(dataPre), e);
reason = "成员好友处理异常";
dealFlag = false;
} finally {
if (!dealFlag) {
dealException(dealParamMqDTO.getTaskId(), dealParamMqDTO.getData(), dataPre.getEnterpriseId(), reason);
}
}
}
/**
* 重试机制
*
* @param dataPre
* @return
*/
private boolean tryAgainToMq(TabHaobanPreDealLog dataPre) {
logger.info("需要重试:{}", dataPre.getDataId());
String key = TRY_AGAIN + dataPre.getTaskId() + ":" + dataPre.getDataId();
Object cache = RedisUtil.getCache(key);
if (null == cache) {
RedisUtil.setCache(key, 1, 2L, TimeUnit.HOURS);
} else {
Integer count = Integer.valueOf(cache.toString());
RedisUtil.setCache(key, count + 1);
if (count > 4) {
return false;
}
}
HashSet<String> reTrysIds = new HashSet<>();
reTrysIds.add(dataPre.getDataId());
dealDepartmentToMq(dataPre.getTaskId(), reTrysIds, SyncTaskStatusEnum.friend_clerk_sync);
return true;
}
@Override
public void dealException(String taskId, String dataId, String enterpriseId, String reason) {
preDealService.updateStatusByDataId(taskId, dataId, PreDealStatusEnum.exception.getVal(), reason);
checkDepartmentTask(taskId);
}
@Override
public void dealSuccess(String taskId, String dataId, String enterpriseId, String wxEnterpriseId) {
preDealService.updateStatusByDataId(taskId, dataId, PreDealStatusEnum.dealing.getVal(), "预处理中");
List<String> dataIds = preDealService.listReDataIdByPDataId(taskId, dataId, PreDealTypeEnum.self_friend.getVal());
logger.info("{}:处理的数据:{}", dataId, JSONObject.toJSONString(dataIds));
dealDepartmentToMq(taskId, new HashSet<>(dataIds), SyncTaskStatusEnum.self_friend_sync);
checkDepartmentTask(taskId);
}
@Override
public void checkDepartmentTask(String taskId) {
boolean b = preDealService.checkFriendTask(taskId, PreDealTypeEnum.friend_clerk.getVal());
if (!b) {
return;
}
logger.info("好友同步成功:{}", taskId);
String key = "haoban_sync_friend_task_" + taskId;
RedisUtil.lock(key, 3L);
TabHaobanSyncTask syncTask = syncTaskService.getSyncTask(taskId);
if (syncTask.getStatusFlag() == SyncTaskStatusEnum.compute.getVal()
|| syncTask.getStatusFlag() == SyncTaskStatusEnum.exception_compute.getVal()) {
logger.info("已经处理成功:{}", taskId);
return;
}
int errCount = preDealService.countByTaskId(taskId, -1, PreDealStatusEnum.exception.getVal());
if (errCount > 0) {
syncTaskService.updateTaskStatus(taskId, SyncTaskStatusEnum.exception_compute.getVal());
} else {
syncTaskService.updateTaskStatus(taskId, SyncTaskStatusEnum.compute.getVal());
}
String staffLockKey = FRIEND_LOCK + syncTask.getAddUser();
RedisUtil.delCache(staffLockKey);
RedisUtil.unlock(key);
}
/**
* 放入mq处理部门数据
*
* @param taskId
* @param dealList
*/
private void dealDepartmentToMq(String taskId, Set<String> dealList, SyncTaskStatusEnum syncTaskStatusEnum) {
//预处理分组任务
syncTaskService.updateTaskStatus(taskId, syncTaskStatusEnum.getVal());
List<String> ret = dealList.stream().map(relationId -> {
DealParamMqDTO dealParamMqDTO = new DealParamMqDTO();
dealParamMqDTO.setData(relationId);
dealParamMqDTO.setTaskId(taskId);
dealParamMqDTO.setType(syncTaskStatusEnum.getVal());
return JSONObject.toJSONString(dealParamMqDTO);
}).collect(Collectors.toList());
GicMQClient clientInstance = GICMQClientUtil.getClientInstance();
try {
clientInstance.sendBatchMessages("departmentSyncDealMq", ret);
} catch (Exception e) {
logger.info("发送失败:{},{}", taskId);
e.printStackTrace();
}
}
}
package com.gic.haoban.manage.service.task.friend;
import cn.hutool.crypto.SecureUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.gic.clerk.api.dto.ClerkDTO;
import com.gic.clerk.api.service.ClerkService;
import com.gic.clerk.api.service.PowerService;
import com.gic.commons.util.GICMQClientUtil;
import com.gic.haoban.manage.api.dto.*;
import com.gic.haoban.manage.api.enums.PreDealStatusEnum;
import com.gic.haoban.manage.api.enums.PreDealTypeEnum;
import com.gic.haoban.manage.api.enums.SyncTaskStatusEnum;
import com.gic.haoban.manage.api.service.ClerkMainStoreRelatedApiService;
import com.gic.haoban.manage.api.service.MemberUnionidRelatedApiService;
import com.gic.haoban.manage.api.service.StaffApiService;
import com.gic.haoban.manage.service.entity.TabHaobanPreDealLog;
import com.gic.haoban.manage.service.exception.WxApiLimitException;
import com.gic.haoban.manage.service.service.PreDealService;
import com.gic.haoban.manage.service.service.StaffClerkRelationService;
import com.gic.haoban.manage.service.service.SyncTaskService;
import com.gic.haoban.manage.service.task.BaseSyncOperation;
import com.gic.member.api.dto.MemberDTO;
import com.gic.member.api.service.MemberOpenCardBusinessService;
import com.gic.mq.sdk.GicMQClient;
import com.gic.redis.data.util.RedisUtil;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
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;
@Service
public class FriendSyncNewOperation implements BaseSyncOperation {
private static final Logger logger = LoggerFactory.getLogger(FriendSyncNewOperation.class);
@Autowired
private PreDealService preDealService;
@Autowired
private MemberUnionidRelatedApiService memberUnionidRelatedApiService;
@Autowired
private SyncTaskService syncTaskService;
@Autowired
private ClerkMainStoreRelatedApiService clerkMainStoreRelatedApiService;
@Autowired
private StaffApiService staffApiService;
@Autowired
private StaffClerkRelationService staffClerkRelationService;
@Autowired
private ClerkService clerkService;
@Autowired
private PowerService powerService;
@Autowired
private MemberOpenCardBusinessService memberOpenCardBusinessService;
@Autowired
private FriendClerkSyncNewOperation friendClerkSyncNewOperation;
private static final String TRY_AGAIN = "haoban_fresh_wx_friend_again_";
@Override
public void dealSingleByMq(DealParamMqDTO dealParamMqDTO, TabHaobanPreDealLog dataPre) {
logger.info("第三方好友合并:{}", JSONObject.toJSONString(dataPre));
String reason = "成功";
boolean dealFlag = true;
String relationKey = "-1";
try {
String wxEnterpriseId = dataPre.getWxEnterpriseId();
String wxUserId = dataPre.getpDataId();
String taskId = dealParamMqDTO.getTaskId();
String externalUserId = dataPre.getDataContent();
if (dataPre.getStatusFlag() != PreDealStatusEnum.pre.getVal()) {
logger.info("已经处理过,无需重复处理:{}", JSONObject.toJSONString(dataPre));
return;
}
ExternalUserDTO externalUserDTO = memberUnionidRelatedApiService.getExternalUseridInfo(wxEnterpriseId, wxUserId, externalUserId);
if (externalUserDTO == null) {
dealFlag = false;
reason = "好友不存在";
return;
}
//relationkey
relationKey = SecureUtil.md5(wxUserId + "_" + externalUserDTO.getName() + "_" + externalUserDTO.getAddCreateTime());
logger.info("relationKey:{},{}", relationKey, externalUserDTO.getExternalUserId());
// 根据关联键relationkey查看自建应用 是否有数据
TabHaobanPreDealLog selfPre = preDealService.getByRelationKey(taskId, PreDealTypeEnum.self_friend.getVal(), relationKey);
if (null == selfPre) {
logger.info("用户的自建应用不存在该数据:{},{}", JSONObject.toJSONString(dataPre), JSONObject.toJSONString(externalUserDTO));
dealFlag = false;
reason = "用户的自建应用不存在该数据:" + relationKey;
return;
}
ExternalUserDTO selfUserData = JSON.parseObject(selfPre.getDataContent(), ExternalUserDTO.class);
externalUserDTO.setUnionId(selfUserData.getUnionId());
//序列化数据
String ret = dealMerge(externalUserDTO, dataPre);
if (StringUtils.isNotBlank(ret)) {
logger.info("好友创建失败:{},{}", ret, JSONObject.toJSONString(externalUserDTO));
dealFlag = false;
reason = ret + ":" + relationKey;
return;
}
//更新状态
preDealService.updateFriendStatusByDataId(taskId, dataPre.getDataId(), PreDealStatusEnum.computed.getVal(), reason, externalUserDTO.getMemberId(), relationKey);
dealSuccess(taskId, dataPre.getDataId(), dataPre.getpDataId(), wxEnterpriseId);
} catch (WxApiLimitException e) {
logger.info("接口次数限制:{}", JSONObject.toJSONString(dataPre));
dealFlag = tryAgainToMq(dataPre);
reason = "接口重试超出限制";
} catch (Exception e) {
e.printStackTrace();
logger.info("同步失败:{},{}", JSONObject.toJSONString(dataPre), e);
reason = "第三方好友处理异常";
dealFlag = false;
} finally {
if (!dealFlag) {
dealException(dealParamMqDTO.getTaskId(), dataPre.getDataId(), dataPre.getpDataId(), reason, relationKey);
}
}
}
/**
* 重试机制
*
* @param dataPre
* @return
*/
private boolean tryAgainToMq(TabHaobanPreDealLog dataPre) {
logger.info("需要重试friend:{}", dataPre.getDataId());
String key = TRY_AGAIN + dataPre.getTaskId() + ":" + dataPre.getDataId();
Object cache = RedisUtil.getCache(key);
if (null == cache) {
RedisUtil.setCache(key, 1, 2L, TimeUnit.HOURS);
} else {
Integer count = Integer.valueOf(cache.toString());
RedisUtil.setCache(key, count + 1);
if (count > 4) {
return false;
}
}
HashSet<String> reTrysIds = new HashSet<>();
reTrysIds.add(dataPre.getDataId());
dealDepartmentToMq(dataPre.getTaskId(), reTrysIds, SyncTaskStatusEnum.friend_sync);
return true;
}
private String dealMerge(ExternalUserDTO externalUserDTO, TabHaobanPreDealLog dataPre) {
String wxEnterpriseId = dataPre.getWxEnterpriseId();
String wxUserId = dataPre.getpDataId();
String taskId = dataPre.getTaskId();
//staff信息
StaffDTO staff = staffApiService.selectByUserIdAndEnterpriseId(wxUserId, wxEnterpriseId);
if (staff == null) {
return "成员不存在";
}
ClerkMainStoreRelatedDTO mainStore = clerkMainStoreRelatedApiService.getWxEnterpriseIdAndStaffId(wxEnterpriseId, staff.getStaffId());
if (mainStore == null) {
return "主门店不存在";
}
StaffClerkRelationDTO staffClerkRelationDTO = staffClerkRelationService.getOneBindByStoreId(staff.getStaffId(), mainStore.getStoreId());
if (staffClerkRelationDTO == null) {
return "未绑定导购";
}
externalUserDTO.setWxEnterpriseId(wxEnterpriseId);
externalUserDTO.setEnterpriseId(staffClerkRelationDTO.getEnterpriseId());
externalUserDTO.setStoreId(mainStore.getStoreId());
externalUserDTO.setClerkId(staffClerkRelationDTO.getClerkId());
externalUserDTO.setWxUserId(wxUserId);
externalUserDTO.setStaffId(staffClerkRelationDTO.getStaffId());
String clerkCode = staffClerkRelationDTO.getClerkCode();
ClerkDTO clerk = clerkService.getClerkByClerkCode(staffClerkRelationDTO.getEnterpriseId(), clerkCode);
if (clerk == null) {
return "导购不存在:" + clerkCode;
}
String qrcodeParam = clerk.getQrcodeParam();
if (StringUtils.isBlank(qrcodeParam)) {
powerService.saveClerkQrCode(clerk.getClerkId());
clerk = clerkService.getClerkByClerkCode(staffClerkRelationDTO.getEnterpriseId(), clerkCode);
qrcodeParam = clerk.getQrcodeParam();
}
if (StringUtils.isBlank(qrcodeParam)) {
return "导购码不存在:" + clerkCode;
}
MemberDTO member = null;
if (clerk != null && StringUtils.isNotBlank(qrcodeParam) && StringUtils.isNotBlank(externalUserDTO.getUnionId())) {
member = memberOpenCardBusinessService.getMemberByQywxChannelParam(staffClerkRelationDTO.getEnterpriseId(),
externalUserDTO.getUnionId(), "", externalUserDTO.getName(), externalUserDTO.getAvatar(), qrcodeParam);
}
if (member == null) {
return "会员不存在:" + externalUserDTO.getUnionId();
}
externalUserDTO.setMemberId(member.getMemberId());
return memberUnionidRelatedApiService.addExternal(externalUserDTO);
}
public void dealException(String taskId, String dataId, String pDataId, String reason, String relationKey) {
preDealService.updateFriendStatusByDataId(taskId, dataId, PreDealStatusEnum.exception.getVal(), reason, null, relationKey);
checkDepartmentTask(taskId, pDataId);
}
@Override
public void dealException(String taskId, String dataId, String pDataId, String reason) {
return;
}
@Override
public void dealSuccess(String taskId, String dataId, String pDataId, String wxEnterpriseId) {
//校验成功是否都
checkDepartmentTask(taskId, pDataId);
}
/**
* 自定义处理流程
*
* @param taskId
* @param pDataId
*/
public void checkDepartmentTask(String taskId, String pDataId) {
//校验是否都已经处理完成
boolean b = preDealService.checkFriendTaskByPDataId(taskId, pDataId, PreDealTypeEnum.friend.getVal());
if (!b) {
return;
}
logger.info("同步第三方服务商好友结束:{},{}", taskId, pDataId);
String key = "haoban_sync_third_friend_task_" + taskId + ":" + pDataId;
String lockKey = "haoban_sync_third_friend_task_lock_" + taskId + ":" + pDataId;
RedisUtil.lock(lockKey, 3L);
Object hasDealCheck = RedisUtil.getCache(key);
if (hasDealCheck != null) {
logger.info("重复提交结束第三方好友:{}", pDataId);
RedisUtil.unlock(lockKey);
return;
}
RedisUtil.setCache(key, pDataId, 30L, TimeUnit.SECONDS);
TabHaobanPreDealLog preDealLog = preDealService.getByDataId(taskId, pDataId, PreDealTypeEnum.friend_clerk.getVal(), PreDealStatusEnum.dealing.getVal());
if (preDealLog != null) {
preDealService.updateStatusByDataId(taskId, pDataId, PreDealTypeEnum.friend_clerk.getVal(), PreDealStatusEnum.computed.getVal(), "成功");
this.checkDepartmentTask(taskId);
}
RedisUtil.unlock(lockKey);
}
@Override
public void checkDepartmentTask(String taskId) {
friendClerkSyncNewOperation.checkDepartmentTask(taskId);
}
/**
* 放入mq处理部门数据
*
* @param taskId
* @param dealList
*/
private void dealDepartmentToMq(String taskId, Set<String> dealList, SyncTaskStatusEnum syncTaskStatusEnum) {
//预处理分组任务
syncTaskService.updateTaskStatus(taskId, syncTaskStatusEnum.getVal());
List<String> ret = dealList.stream().map(relationId -> {
DealParamMqDTO dealParamMqDTO = new DealParamMqDTO();
dealParamMqDTO.setData(relationId);
dealParamMqDTO.setTaskId(taskId);
dealParamMqDTO.setType(syncTaskStatusEnum.getVal());
return JSONObject.toJSONString(dealParamMqDTO);
}).collect(Collectors.toList());
GicMQClient clientInstance = GICMQClientUtil.getClientInstance();
try {
clientInstance.sendBatchMessages("departmentSyncDealMq", ret);
} catch (Exception e) {
logger.info("发送失败:{},{}", taskId);
e.printStackTrace();
}
}
}
package com.gic.haoban.manage.service.task.friend;
import cn.hutool.crypto.SecureUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.gic.commons.util.GICMQClientUtil;
import com.gic.haoban.manage.api.dto.DealParamMqDTO;
import com.gic.haoban.manage.api.dto.ExternalUserDTO;
import com.gic.haoban.manage.api.enums.PreDealStatusEnum;
import com.gic.haoban.manage.api.enums.PreDealTypeEnum;
import com.gic.haoban.manage.api.enums.SyncTaskStatusEnum;
import com.gic.haoban.manage.api.service.MemberUnionidRelatedApiService;
import com.gic.haoban.manage.service.entity.TabHaobanPreDealLog;
import com.gic.haoban.manage.service.exception.WxApiLimitException;
import com.gic.haoban.manage.service.service.PreDealService;
import com.gic.haoban.manage.service.service.SyncTaskService;
import com.gic.haoban.manage.service.task.BaseSyncOperation;
import com.gic.mq.sdk.GicMQClient;
import com.gic.redis.data.util.RedisUtil;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Service
public class SelfFriendSyncNewOperation implements BaseSyncOperation {
private static final Logger logger = LoggerFactory.getLogger(SelfFriendSyncNewOperation.class);
@Autowired
private PreDealService preDealService;
@Autowired
private MemberUnionidRelatedApiService memberUnionidRelatedApiService;
@Autowired
private SyncTaskService syncTaskService;
@Autowired
private FriendClerkSyncNewOperation friendClerkSyncNewOperation;
private static final String TRY_AGAIN = "haoban_fresh_wx_friend_again_";
@Override
public void dealSingleByMq(DealParamMqDTO dealParamMqDTO, TabHaobanPreDealLog dataPre) {
logger.info("自建好友处理:{}", JSONObject.toJSONString(dataPre));
String reason = "成功";
boolean dealFlag = true;
try {
String wxEnterpriseId = dataPre.getWxEnterpriseId();
String wxUserId = dataPre.getpDataId();
String taskId = dealParamMqDTO.getTaskId();
String externalUserId = dataPre.getDataContent();
ExternalUserDTO pojo = memberUnionidRelatedApiService.getCorpSelfExternalUseridInfo(wxEnterpriseId, wxUserId, externalUserId);
if (pojo == null) {
logger.info("外部联系人好友不存在:{}", JSONObject.toJSONString(dataPre));
dealException(taskId, dataPre.getDataId(), null, "好友不存在");
return;
}
//自有应用信息
JSONObject json = new JSONObject();
json.put("name", pojo.getName());
json.put("unionId", pojo.getUnionId());
json.put("addCreateTime", pojo.getAddCreateTime());
//relationkey
String relationKey = SecureUtil.md5(wxUserId + "_" + pojo.getName() + "_" + pojo.getAddCreateTime());
//更新状态
preDealService.updateFriendStatusByDataId(taskId, dataPre.getDataId(), PreDealStatusEnum.computed.getVal(), reason, json.toJSONString(), relationKey);
dealSuccess(taskId, dataPre.getDataId(), null, wxEnterpriseId);
} catch (WxApiLimitException e) {
logger.info("接口次数限制:{}", JSONObject.toJSONString(dataPre));
dealFlag = tryAgainToMq(dataPre);
reason = "getCorpSelfExternalUseridInfo重试次数过多";
} catch (Exception e) {
e.printStackTrace();
logger.info("同步失败:{},{}", JSONObject.toJSONString(dataPre), e);
reason = "自建应用好友处理异常";
dealFlag = false;
} finally {
if (!dealFlag) {
dealException(dealParamMqDTO.getTaskId(), dataPre.getDataId(), dataPre.getpDataId(), reason);
}
}
}
@Override
public void dealException(String taskId, String dataId, String pDataId, String reason) {
preDealService.updateStatusByDataId(taskId, dataId, PreDealStatusEnum.exception.getVal(), reason);
checkDepartmentTask(taskId, pDataId);
}
@Override
public void dealSuccess(String taskId, String dataId, String dataContent, String wxEnterpriseId) {
TabHaobanPreDealLog data = preDealService.getByDataId(taskId, dataId, PreDealTypeEnum.self_friend.getVal(), -1);
//校验成功是否都
checkDepartmentTask(taskId, data.getpDataId());
}
/**
* 重试机制
*
* @param dataPre
* @return
*/
private boolean tryAgainToMq(TabHaobanPreDealLog dataPre) {
logger.info("需要重试self:{}", dataPre.getDataId());
String key = TRY_AGAIN + dataPre.getTaskId() + ":" + dataPre.getDataId();
Object cache = RedisUtil.getCache(key);
if (null == cache) {
RedisUtil.setCache(key, 1, 2L, TimeUnit.HOURS);
} else {
Integer count = Integer.valueOf(cache.toString());
RedisUtil.setCache(key, count + 1);
if (count > 4) {
return false;
}
}
HashSet<String> reTrysIds = new HashSet<>();
reTrysIds.add(dataPre.getDataId());
dealDepartmentToMq(dataPre.getTaskId(), reTrysIds, SyncTaskStatusEnum.self_friend_sync);
return true;
}
/**
* 自定义处理流程
*
* @param taskId
* @param pDataId
*/
public void checkDepartmentTask(String taskId, String pDataId) {
//校验是否都已经处理完成
boolean b = preDealService.checkFriendTaskByPDataId(taskId, pDataId, PreDealTypeEnum.self_friend.getVal());
if (!b) {
return;
}
logger.info("同步第三方服务商好友开始:{},{}", taskId, pDataId);
String key = "haoban_sync_self_friend_task_" + taskId + ":" + pDataId;
String lockKey = "haoban_sync_self_friend_task_lock_" + taskId + ":" + pDataId;
RedisUtil.lock(lockKey, 3L);
Object hasDealCheck = RedisUtil.getCache(key);
if (hasDealCheck != null) {
logger.info("重复提交处理第三方好友:{}", pDataId);
RedisUtil.unlock(lockKey);
return;
}
RedisUtil.setCache(key, pDataId, 30L, TimeUnit.SECONDS);
List<String> dataIds = preDealService.listReDataIdByPDataId(taskId, pDataId, PreDealTypeEnum.friend.getVal());
if (CollectionUtils.isEmpty(dataIds)) {
//更新父级别
preDealService.updateStatusByDataId(taskId, pDataId, PreDealTypeEnum.friend_clerk.getVal(), PreDealStatusEnum.computed.getVal(), "成功");
//校验异常
this.checkDepartmentTask(taskId);
} else {
dealDepartmentToMq(taskId, new HashSet<>(dataIds), SyncTaskStatusEnum.friend_sync);
}
RedisUtil.unlock(lockKey);
}
@Override
public void checkDepartmentTask(String taskId) {
friendClerkSyncNewOperation.checkDepartmentTask(taskId);
}
/**
* 放入mq处理部门数据
*
* @param taskId
* @param dealList
*/
private void dealDepartmentToMq(String taskId, Set<String> dealList, SyncTaskStatusEnum syncTaskStatusEnum) {
//预处理分组任务
syncTaskService.updateTaskStatus(taskId, syncTaskStatusEnum.getVal());
List<String> ret = dealList.stream().map(relationId -> {
DealParamMqDTO dealParamMqDTO = new DealParamMqDTO();
dealParamMqDTO.setData(relationId);
dealParamMqDTO.setTaskId(taskId);
dealParamMqDTO.setType(syncTaskStatusEnum.getVal());
return JSONObject.toJSONString(dealParamMqDTO);
}).collect(Collectors.toList());
GicMQClient clientInstance = GICMQClientUtil.getClientInstance();
try {
clientInstance.sendBatchMessages("departmentSyncDealMq", ret);
} catch (Exception e) {
logger.info("发送失败:{},{}", taskId);
e.printStackTrace();
}
}
public static void main(String[] args) {
String res = "{'clerkId':'b160eb9a3daf4b3da936b678f1b06744','enterpriseId':'ff8080815dacd3a2015dacd3ef5c0000','externalUserId':'wm59NLDQAAY5Q4pABXAfaTJ6mORvpw','name':'hzw','storeId':'ff8080815695df44015697ada25b0102','wxEnterpriseId':'ca66a01b79474c40b3e7c7f93";
System.err.println(JSON.parseObject(res, ExternalUserDTO.class));
}
}
......@@ -161,9 +161,7 @@
<if test="createTime != null" >
create_time = #{createTime,jdbcType=TIMESTAMP},
</if>
<if test="updateTime != null" >
update_time = #{updateTime,jdbcType=TIMESTAMP},
</if>
update_time = now()
</set>
where member_unionid_related_id = #{memberUnionidRelatedId,jdbcType=VARCHAR}
</update>
......@@ -200,6 +198,7 @@
<include refid="Base_Column_List" />
from tab_haoban_member_unionid_related
where wx_user_id = #{wxUserId}
and wx_enterprise_id=#{wxEnterpriseId}
and status_flag = 1
and unionid = #{unionid}
limit 1
......@@ -221,6 +220,18 @@
where external_userid = #{externalUserid,jdbcType=VARCHAR}
and wx_user_id = #{wxUserId}
</update>
<update id="delMemberUnionidRelatedBatch" parameterType="com.gic.haoban.manage.service.entity.MemberUnionidRelated">
update tab_haoban_member_unionid_related
set status_flag = 0
where
wx_enterprise_id=#{wxEnterpriseId}
and wx_user_id = #{wxUserId}
and external_userid in
<foreach collection="externalUserids" open="(" close=")" separator="," item="item">
#{item}
</foreach>
</update>
<select id="getByWxUserIdAndWxEnterpriseId" resultMap="BaseResultMap" parameterType="java.lang.String" >
select
......
......@@ -355,6 +355,21 @@
</set>
where data_id = #{dataId,jdbcType=INTEGER} and task_id=#{taskId}
</update>
<update id="updateFriendStatusAndRelationKeyByDataId">
update tab_haoban_pre_deal_log
<set>
status_flag = #{status,jdbcType=INTEGER},
reason=#{reason},
<if test="dataContent !=null">
data_content = #{dataContent},
</if>
relation_key=#{relationKey},
update_time = now()
</set>
where data_id = #{dataId,jdbcType=INTEGER} and task_id=#{taskId}
</update>
<select id="countFailStaffTaskByTaskIdAndPDataId" resultType="integer">
select
......@@ -373,4 +388,33 @@
where task_id = #{taskId}
and p_data_id =#{pDataId}
</select>
<select id="getByRelationKey" resultMap="BaseResultMap">
select
<include refid="Base_Column_List_data"/>
from tab_haoban_pre_deal_log
where task_id = #{taskId}
and relation_key =#{relationKey}
and data_type =#{dataType}
</select>
<select id="checkTaskFriend" resultType="Integer">
select
count(*)
from tab_haoban_pre_deal_log
where task_id = #{taskId}
<if test="pDataId!=null">
and p_data_id=#{pDataId}
</if>
and data_type=#{dataType}
and status_flag in(0,1)
</select>
<select id="listReDataIdByPDataId" resultType="String">
select
data_id
from tab_haoban_pre_deal_log
where task_id = #{taskId} and p_data_id=#{dataId} and data_type=#{dataType}
and status_flag in(0,1,3)
</select>
</mapper>
\ No newline at end of file
......@@ -239,6 +239,22 @@
and wx_user_id = #{wxUserId}
and status_flag = 1
</update>
<update id="delByUserIdAndExternalUserIdBatch"
parameterType="com.gic.haoban.manage.service.entity.TabHaobanExternalClerkRelated">
update tab_haoban_external_clerk_related
set
status_flag = 2,
update_time = now()
where
wx_enterprise_id=#{wxEnterpriseId}
and wx_user_id = #{wxUserId}
and status_flag = 1
and external_user_id in
<foreach collection="externalUserIds" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</update>
<update id="delByClerkIdAndStaffId" parameterType="com.gic.haoban.manage.service.entity.TabHaobanExternalClerkRelated" >
update tab_haoban_external_clerk_related
......@@ -343,4 +359,13 @@
and external_user_id is not null
limit 1
</select>
<select id="listExternalByUnionId" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from tab_haoban_external_clerk_related
where enterprise_id = #{enterpriseId}
and unionid = #{unionId}
and status_flag = 1
</select>
</mapper>
\ No newline at end of file
......@@ -375,5 +375,12 @@
where wx_enterprise_id = #{wxEnterpriseId,jdbcType=VARCHAR}
and status_flag =1
</select>
<select id="listBindByStoreId" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from tab_haoban_staff_clerk_relation
where wx_enterprise_id = #{wxEnterpriseId,jdbcType=VARCHAR}
and store_id=#{storeId}
and status_flag =1
</select>
</mapper>
\ No newline at end of file
......@@ -61,11 +61,18 @@ public class DealSyncTest {
@Test
public void test() {
dealSyncOperationApiService.test("ca66a01b79474c40b3e7c7f93daf1a3b", "49da12164c584fe8aabbb1094b25cfa5");
// ConcurrencyTester tester = ThreadUtil.concurrencyTest(10, () -> {
// List<String> res = memberUnionidRelatedApiService.listSelfExterialList("ca66a01b79474c40b3e7c7f93daf1a3b", "QiuWenMin");
// System.out.println(JSON.toJSONString(res));
// });
// dealSyncOperationApiService.test("ca66a01b79474c40b3e7c7f93daf1a3b", "49da12164c584fe8aabbb1094b25cfa5");
String str = "yepingyan||taoguangsheng||chennaikang||shaojiawen||yejia||wangjianfeng||wuxianghong||zhangmengdi||chenliang||1033a9ee238140c6a1583bc1cc05567a||e8a6560f17364e5d90fddd50c67baf52||60d2533e0fbc4b9fa4bde758171559b5||85a842a9daed414db85f53b93a684d47||deb2e2ad924f47fda530361a57a2070d||5a3793a4afc74a36a9c0a3cb2a1c9736||760d3af094664f02aa268cb41bfe3978||053003311ede477980cb8b97374e7005||0501be9ed34b4dfdaa74396f1f32514e||4c0461e8ec7145c8b1a228cc910393ab||5623623f1aae4a889cf60e6943f203dc||26b9fc69df6e44499884f775d815c7a2||4cd623e4f52d4ce3bd00acfc50991ff1||d17e0a36f1fd49048f1841b6eaa97cb7||cb188cc31b2c4b80af201e574d64eb37||0395ccfbca7543b7bb3093d7440a3f8f||6a84f35f9afd4e7894536ae000db3524||808e4d3152594ff592cc6baaa5f5650c||0197cca6898a4d1ebd365a9b54975e70||85366595188||95b6aabef90548168f7876bb695ac1b9||d6a5e64220834ef49f8514bb3726a30c||1c589b0e64ad426c948151b9b49f717f||554cc5bb6c3441edbbc667b217fe58cc||d9961b52cf9446f7b449f69429fa0889||8748b6095d23483b8ec45acff3443dda||17cfb61638e143289fb4ced4ef1e6f2e||279c33469a024131821f3568651848ec||5386237c5fe84864bee5e0d87f46acde||f8a4256454924ef481a51f4440eabd54||014b4dbce85940c49a402faa4606a7ef||87c419a151a64cef8d13d9964985cdb9||2590cd60cc364daebfa8321d3f3a3d9e||de2c33f2e8924ff884e0073ca2f2f711||cb512fe8adeb429fb5a99b444622d9e9||b498c162fec1487ca8d90c8208fb24c0||86917b76f1e341ad8d5862c2f4178a69||edde56b16fc741ff8b5345dc89f6ebe2||133a8b8e00b141c999691556994845f8||97e31402568c4084b7b2d17a109805d1||ba60284fb2294c8d8a2dfdc13e631224||2f73268b8ae94a50adc9be13948813f7||71af618e8b4c4d47b3d934d592bc27ac||8abec5614cc94544bf84d24e20c0f1c3||949d2191c3b74e1089e41dc19eef7f66||b6d091fa70bb461c99e50ed8a2e5f846||4d4d8a06b41245b48e8633efa32b56ed||57af656016e542c19a0ea207b6810264||a95524a9c3c94d77b7ba522ac697c889||f2cd9549515242239b52f389111ba003||afd07576885044668f7c6e88be80a54e||6318f71b46894644ab40a3dd2ce388b2||f73a4a768d0b4f78969704078302b676||7d6c41b297fa4341abed436c5d64048f||8927dc75226e481e98dee5b148a61be0||7fc33d65fa2d4822923cb6fa8ee6d7d5||37bea30fa18a44d68d341c34ae681c0c||fffc57772b6446f7b6b563c0c5e518d4||5c2406d8d742479196f0392f786c69c1||0e51b089f4b34d3d9a29d56d3d016c62||befaa12c69944ea4bbc1cd34f19aef40||cd28fd64b08a4db095c528a942f4c7fc||6d97f56f1e75434db49ce1e162c13c28||66672dc67c7a4dbcae2ae29e9698c31a||fc1b59cdab764da483749628bc91ea72||ee362b734411416ba44cb249714b6885||f5c98c7c087d4083bef0c748aad9ba90||8585cd13c42e4b33b021593f562d7619||31208ce7c16347a1afacfb50602c9ca1||7211ef07565d4d8ba8c45565c7d201dc||e6a1734037cc4b998aea57052eb31786||8db5edbdcf734b27a0bc2fa2fa420e5c||2294cc939f0b488690d7e95c7981e658||be2be0043b264b8c93808edf36e81d63||ca0f57a1f95146b4b9b0103800b03f10||80d248b51edc43d3959cc478e77b9de5||8e441d5ee59241b5b8a64ead1dd03daa||e1827273133247c4a17d65c9df4c2894||95fc56b9839a42878cbe7106e7bc9ff2||f8d893fd85844e199cc17fdce79f62b6||f23077c76a144507a5f5a91aa15e865e||f5c1321841da43c5b4ab8edf267c9e69||b2c5d9232e034eb69424fa238ea7f375||14a2c914e09045a59827a633f98fa5dc||64d58369915b4a69bb8306cddd41dd3a||39030ddf0a1e4db299085474b9809fa7||0817f586f81a4117b924b017f7a58718||32b4c694454f4ec0bb767f518b8be301||48c2b0ff0e234ef799cc067a05677cc7||b74bc661bf5547b5a962f8e0b2c7563d||4a8c6d8bb109414aab17983ae18459b2||a7778844a42b4df0834763481a401073||7df43c26decd4b9cae3ee957bd05ac52||6dacc32a48a940899dfc1be5378373b6||7edd8a500fde4b8db4393e514d0dc215||0140063f60ad458a9b35c32e80401834||af5151a9eb3f4563b9d20be1e682593e||fabc111e771340d5b7224973e2a3fa5d||f935cded097641519b1ef47fa8ec3687||3f410f5e6cf7498e969232f774691a59||ea236caa8ca0480cae6575512433286c||10a3ebd8d21942d8a55aac22da0d984b||19b0ec31274040d8b06845a6d7505028||7fa79a52aad6492db78f233d379fc526||07cac1d1f977484f919c1a1c84c0c4cb||03cb98bfabad4eb3886ea08003879412||015844c6a25e41ff9f2b1859dac6148e||aab1b82a96024584b706542be157c683||9510b742fb024efbb29002b1e6f78a3b||a618df6d09b74ada91ddcf362b0a2459||0a5c4b8aa6584ffbaf4fcab312b83e72||07e85dba485140d3899f481b7902ad03||999ebb3c09ea422086ae400bb0e4291e||fece2bfda3754029a97897fd7bcd15ba||5a8d2b7613394af588b7b98f4731b294||f9a8d038d6e349a5aff297208ac117f7||24a80b4c78924cb9b75a5649221a90fe||81057b5a7a5c4a3f83e31cc97a493c72||6b4461647e144969a68a39fdc54a728c||681170032ac84ca39dcc7ac5374a0bd4||1f6fea78cd244c239b8a6bbd76560f61||dd65cdd7594f4590b0addb80b08e23e7||44efc4fd2a7c4f0388ab038a7105a251||3f0bc6b120f54febb3fbfb242a6597b6||476f26533d5f4ffda54f9ac26073dd27||b151c6057d5545899b2a6261940327ef||d273990f0fd5436ea92b8aceae0e1915||7199240e63e047979523a7b7126b3763||699f8f67450e4d89b69eea35968f15cb||4c2924d70c7140488ba6d2e7146c48b7||cba0a50d125e4569af4982270fcd44d2||99ba985aa3e24188a2427a9674c2cee7||1ba154236289422eafc1494fb2cd5447||d850f273b8e94baea24e5a5c1e02c0ec||cd09819332b34b69af57d5bbbf242879||93d52e81a9d04166a441cc5bd8d528e9||80011bbeb65242b0b2947e3ce2d9a5e8||7cb4799a81bb42818868a9eca56ae364||9b1adf4c531547f5810837fe2ce871f3||fa7ba91175504d6486f3a14fbb54defb||b5b56dfc08d44d92a2968b7bfc9898cd||68c2a2b9c9af4d5ab5225f12eeca6afa||10421da78e3b47688103b59d9925fa05||d95fed7490a54c20af0710f1978bf614||b383dfb32c2f4871b38d47329ba436fe||fbb3c70fed1b4624aba506492c0261cd||22e74e0843004767bb26e9e0a575ea3a||6ca5062bf688459aacb2c3cc9a3c0c61||7b666e3eb28d4b809d76eb91cc8597f0||a49a7c9de5104fdf82df8a67dad41568||a0b37271746d4f61a7a25787ad221027||71cd6fbc9da54e9d8a1992172d92bee5||7ad527490c6a4ebe9093f45525340fd9||928640e07d4748a996d43024e3373aef||cacb6b3bf53e4766933665e8f5961f28||d23a0456250b4f86bfae673300cb38e2||b6e9e751a0b54a5cbef9e3a737f265a7||75d12123136a4da6b6134cdb5ca0e8f5||5a2851a0484e47d2a249785ba40f346d||3cb82820fdc9473fb104d725bf4924b4||dbe3002e90d44a52af0407584fdda2ea||0b3fd2002a424c5293ca8ec4c60bc977||0c1f60a0713d4791abdb94b425acc831||0758f5c6f4d34d3abc84962c81925ff8||caead448c45348c3b2d06df665ed0b43||babd7c07416247a08215df6e17e50733||18df396b8c0c417fbd79959faa528709||0d349f252c5d4527aee68a077baf11d1||70dbb5c3959e42e3bd4cf49f8d2b21a1||a27eed8d234240fb9c121211a2ffbfbf||8e0b5404bd3d4b95ad0a9fda7eafe5fd||9dffdaf42d6c4eb6a6e11255c5fadec2||00305613607f4cbb866cbc37b0bfede9||549b335ae8444bd6a3f12d7b2ecf82b1||d563bb9c21b148e9bcf3cb543662a6f6||2215b3679edd41b18212c28e7b392f80||a636c81d9442466c9a3c8c49e56db824||6a3ab6e564d344c0851139770ecd6762||9882c0d508d24a6faf6fddc2beb02c3c||2c55ce0fee3147119eec42bd8782af11||7aca61c45ffb4141b192c7c22aef7d2b||e218d4fc639f459193d8ef15476126a7||acf423a33d3d45c8b9a0ef893448795c||cbd99ad437ee4044845a0f6895b9453a||3975792146174b81bdce4bc7c4dbe517||04ab7c92e3a34a6caf33f80b3b938fe3||15eef83ce12142bcb8082005634292a2||41cae2681efa4437b27db6ee5aad939e||93b603f08902496e96ef3170c445bc54||9a42f047ebd34c3bb16eceb04f46ad94||058efe8f0e2041cd844a427714ac69b1||fa50138b9b8d49d8bf260885407cc9ef||bee4d5a331e541489c57e0403aff3c14||34efab9a18e64629be64bdda9fcb774a||a022810578794fd1be090e1ddb7850ea||5d23bea235d04487b3eefe64034d7fda||b8c5e55dcf0044d0b91f51a498c7c3b7||0bfb4a4625f0425c8242096acf9bc8a3||d71d62e137824bf8825f980e5574d2b5||db5af88546df4dae8fc3ea0f08cb6bc3||ca7cc04116614dcfae20c5dca061eb77||2d57998e8713452e93d2123da51b3c91||ac5a25b5179d4a8e84c8419026838a3f||36d15a3860cd493e9ba0c63d312a7ca8||cb0e00bed21c48c6894aa36b4cda6b2d||e9c096b95d7d47e0bb5103e66f1da2f3||d9b310ffca4e4561bfade2ead90e0a2d||2d761edec80b4119bb083686b348b21c||578ae551e59f42bda4ca48a130d76f5d||f25f6085ef6e4c0cb8014dbc4d0ddcd0||7e8751338e2248f589fe2163b2ae5a7b||5c1333648d2d42f2b2aa2011b9ffade9||76731c48496c4bffb3896b1918bfa3d0||f3642a263d674655ae1f9a7603e4ccb1||39133cd83c3a40b2adfd298404f5fab4||66efa290b15f4c08b28e7541cf933e2f||d672d66b04144b3cb6cbfca091c020e6||cb8169ebaae8481a8c5d4f6c1b22b142||586edbe496a747b18adc89ffc878cbab||f89d6b872fd040a9b6b3720076be24ff||8358c9d0c77f4ac091afd16cc1745ac5||d09c0eee96ac4461b1c1ff063cbca2af||82ad349d742f413f9c8c9ac5aa2d16ae||798db872fefe4addb1aa4efab993619f||775d0fa3641f4af2aa81f6889baa66ae||1eda003b63df48e6b8e8983aef1ace3f||336c8fad4859446abeaffc666ea0034d||c9aad1386f79409e9957a8ecc3426808||9ed8a8a0ad7e47edb387824822125b6b||d50969c86ae648f8af35ec29d9236379||afdf59e627e04e669207c1ba5a158426||e543b1c837314ff7919b911360726f33||41255ecec07747c4aaa12d0f4f763899||ad36dac9c0a7446bb63f92017099e5f7||e85ab29db71f4c3b8042b2f4059a4ac4||b897e51938f74d0e8357f5d3a73b6bb5||8ea2de06b14d4b358f11954ad36c15ed||219ac16136cf4b96b9756f69b9ae2b47||a74a1fe3b0804d6d83d2b1ed9a738996||9554e4f2d4154c06b35e9773806c1ab8||e73042840f994782b3c6470dd18a00a6||97c0a9a22a57465893534cb2a81766fb||cbeae827ba474a049d87f2d58096886f||76044e1707e942188f8af63b97a6f94e||97696bdba4484dfbb57def84f6195e50||b5c26472151d4c30a64f9955c3423dbc||ee6b2783d4954a1ca8bc247eb94b230e||ba7ecfc2837b438b872424cd5e0bfb72||899c6b944b2b444888ec08358bbeca7b||59d1eba6196d49278e4c380637434a53||97dec846fdd84280955d40f2e600d9ac||ae6de9e7c8774d499e5a7b670bdbedab||589a90409e584af5a7075904ad82a1ed||0d37ff8411d345bb9865ffd5b83df6b1||de27337c7183428bb365434dde67540e||ddb9462dfe384b1cac8dbc479c763509||586bf05203264df08a3ddb421b92fa13||8995fc636a26431f97fd95c1ffdb4914||3075e0c16569406184882a838101d895||ce6a630816fa4ff984db113288bdf1e8||4212642359404be885019d440889715a||3e8fa0da58184f94b7aba8e0772bc827||ecbcccd916bc44efb13a9c3f8f9d8161||0da8510241f640efbe443d964bee44ca||c886c0dbc7ff4b298a129a92616dfe79||9af0f5d24bd049339adb4c0e59f5a060||a7c47d1d913e449f954db18a6283fd5a||8e37f686502447599d3854a15fbb8ae5||ac64e5483d0f4344aadc39275824d687||88521354a4da4d1aa2f77186fdb54a89||9484a47b88084155973168cec9411d83||0c5a8a111c114b4391ba8a09f0f6ecc9||65b915cede2849c195ffa529f2ffdea1||05ebbc6fd10c4a2c8d6c39d1551ab7b8||f788aa33aecb43f18c08733bfc011a35||dfcca957bc814522b835b7cf55fff881||d84c1d854e0d473ea5c4f1d227db4cfe||5fa2a064c37d4e81b3ad69376ee2b2f1||74afac17a97548b8a7626427872a9ae0||8588f4747e1e4aa78b601e1fe3ba6ea4||06608784722d4ac4a44cd9d4147a89c7||c8bb92abf38949ff83cd5aaa4ae8407f||ea76f01ddec54c229e7f5d0af867e858||be28e4d2bcfb48cb81310d5e656af70e||de474557d8174c94905c81996890307e||799276a5c4e7451a86e77e09a85f1ca7||7648dcd80d724d7f9b2a633f95d4755c||c850338443094f5caaecc018ebf8d12a||edf10fda182d42649ae26f4c06375b3e||bec9e09c35c14a029f57693bd7b9f123||93eeff4394c24537975714c722a21538||5a3e092713a74425aa535d418776be7c||2cd9ad01cc6f427f84e5bcad2a6d8a20||bf168d8698ce4c90b9e92d64a49769bb||28cff42995fa4715992dbc7d4d51e54e||9ffab45c54bf4a1e8d0c15324af65def||DaoMi||niweizhong||81637ab67fd34698b26a0c84e57fb586||Jing||NiZhuanNvWang||e75fdc4bd465447f93500c94974d890a||842272ad140b4bebb09e74dfe35a1c3c||da41bf5e46544387a759744cea5e246a||ba86d976c2bc4bc6830d8a2fbedc4c4d||b384daa0ea33478b9420a9024ac2a73d||4fcced4527d24399815cc9fae33cf520||niweizhong1||8d09b2b788d44024ba00b75555829aab||311d11e804834115b32effca449bf344||239440e576ae498eaa355db03b40a359||826511a8c600414e82e6fc40ecb73091||7e0d277f5b3949bd850ffa41043fe94d||dbff4317ecff4d4daefe5328b0b1cc4b||300ea525053e4b53bf41ede2818a2843||4cb68f1c6637483dac5fb1b66fba1fb9||4422836b40cb48958165d66c3674772a||aea36f9a07f7441a8a65aa83a4c4f3ba||530fea4b44784875bdc1b22f95fd3e34||c95842ec1daa44dd93452efc98b0bd30||534cef2dd45c4f3987eec2ebb64b7b59||bc243d8115084d06a8638781ce1c464a||7c22c617875546e7997dd6f7e48ca122||702fd097e6c042eba95c29687046ab99||af4945ebc21d4d439526940221a65d6d||fae4414b9cb149f581a55d6f9bce6e7e||c0336c92864d4d26b9a5730d7090e945||aea46b0ad5a042908813338e676ad877||0a948550dbfd4caa91ca67e8f0290c64||8f8d07caa1964477a40057191c102170||b8fbefaaa83b4609a30b0d6c70b83cf6||83027b9db3dd466781f2ebd2918d07ba||71e411071ba44bb9a31ae59c690b45dd||b6abe9e5b60040fb87737af823d1e83a||605111ff896d491bb1e02fbf48bca00b||ecfd3f7a78ca4ddf833e3367e1d975dd||ff58b504b63a49dfa419978699556f12||a5b6ba045b884fef826e71aa5ac4eb83||5454884535fd402d8cd9476a5d8d3518||257e541a782848a6ab785968a4f09167||e1fd8563e9bc4f4abddc873691ce5667||75d368cf564d45c7a1c68673529c9517||c833339a311e4800b76357a5d798e99b||98daffb2f1864025bbde03d12421b3cc||f9cddf17dee34143a6d4cd982748922d||12ff0514985d433ba4a37cdd52d9a671||6aa0554079044d289976a58acdf3a90b||fdbf05bcffbb493ab3a240f09f2b6e4c||31d9126ca13340a6b3883a7717e6babd||a5cc23be2b834459b3887c5f51d6b4c0||56de1864ec3a4681853c4db5e83c0af0||ea96e22fa5be470db076f8bb42c047d3||b999e85e12c0403d8bc49c81ac9556eb||e30ea5d6efe249fbb59bf8db89994dac||f3617631f8574c1d82762b3c1609a393||45a8d654cd7648d69f54a844b0d7adb5||b81fed2d9f3c4093b70440dea7cd5ee9||1cdbcab1d6274f8f834319a30bd8c61c||18af85032c7747b0929cb51d4fd71f5e||ea36dacba6454a3789fc2ff195bd0e91||a1a03dd8448a4b5fb3206e4806523127||34c0e62a714e4be99ecd21449d0bb91f||ba996646249d4c1890270f17a80289ef||6f47bd244e0842f39e4d2e26fccd4882||9c10c1b3a1f64ac3ae69645c72ead06b||a06ff1bd53304dc4972365db3489bf19||84f0eb84578a4239ad83a20665b41fb2||792b180fa959405aaf9b0a40756cc074||a54a8cf734714ba5b92c827b23553a1b||2c6aa2625fd245cbb8abe629e5bf7831||5d319cc9d2be403cb1a762f002e599ae||8b7c0b4a75c9406b99b24820ff82191c||1f616f086823498bbb301ef59e0040e9||ec0b2f879755443aa15a71378110bc1d||27c6770b84b945d3971689a8c8810b00||f62182a37a054d69b170edd70e0518b5||20be22b288e8462b8c73b335924ecf73||ff7f0226278d47dcbb50c6344e8d6934||4e5ad54450644d44ad5c3dfc576b10bd||8084a2bc89eb4c84b41e30f59256a87c||a9cb6a0072b44a27b525079bcced1e8c||fde8ae4a13004c5b9ee1640e23bc1897||a7a23b58021f487597d1c80f694e2e2e||fed96eeecf874f7e8838254188944408||2299adbb0974456696c48fd6b81c378d||69ab423e932a44468223b05280e4fafe||7642dc4946a243f498a90e1b3857f5a4||982d4406d79a4bb4a61c97bc0365214c||6222d8255ee24bb889b865ad436ef8c2||45be0631645b4a1882f026fa3d2d2dfe||475b41e508ce4d638ea084f81c325fb5||9ecbb79b36a24252a0586228f3d3083c||f22faaef58be42858cbacb9ff9da800a||0aa5f83a291d4aa7ba8d4086915880ce||dabc53b452be4489b3e18a05b308f804||03e38aab6a804e78b95d309fa86b16f7||367cafd3a2374b778fd422970139e524||d01ac22eb1654a9da7753b257d7fb4a4||d3c89f38a5b3430c8232de55ebda30bc||48502e88c7634fd08db8d6805ccc7363||47576041020e47f497f946286ca77f47||c49cf412ea324f96b45ea7a115784fd6||e0fd386f532d490fa7fd2c096c7b39a1||507149fe42a74c7e8bbffad8979ae9d1||f636656b9f5243abb8f6ced135cd621f||3858da6bd5af4a9893bff132fbe46ac7||aee3752323054508a1c90bbf6cb80f9e||3a4090a41eab46c492e96f6b2e648eb7||7eb942cb4e58410982da35d47256422b||294bc70386904ce1a7fda5be14a20fb1||a4af8c884a4d405a8238b736cbe0fc21||dda20f0da0fb4812b56114a728b64190||ca75d30846424ebca5a51f79cb4bb2e7||862f3a38dd5840cba8500d2a59978722||88b5b9869f194f74907ee569792d3d54||543b08411e4b49adbec8624f9a6f5312||679d94e8e9314d7fa91365a11c7ed2c8||ea054a9055dc41668f61d53f71e68b7c||5b2e3efa32f8436bbaf0a9f695c02816||635a1682c6ba46fb95307413848ee6ba||29a76c6a4a6f43c5b71748c2738b3c3b||f6d46444bc9a4a2bb851497aaee27a78||65864af4280b4005b927476aa292d0d1||0fde3e5f79eb40d3b049f2481d4842bf||94244996bfa34c5b92a0d54295c9006e||dc8796ff0d4c4d2f91f744dc6892cb2f||05d7435e380f49698527d14d2fd1f844||362ba60dadf94a05b75dd52534188bb8||220f77530c944b5896c168dad23d903b||bb9d19c00d9c474ea53e30cbf7d1588e||144546c5a0d247a9900dd6a66ad8a1a0||39355b7e5bb94fae98c7ce54e1070c1a||9412384e179b496a9fc13818f67d60bd||5e8fe52031604159ab19f1985c2426ab||88c19a5e794548cebfb86ad8107e2377||10e7cb2e11bf43cba2460115232bb786||65621a4de96944a4b9e26263b9b1a114||8053185f6e1e4621842a325a491ac319||87cc068d582a49bcb583407f6607b946||993021ff177b4b66ae5e872ba2911184||9a13d2c9c74c4deab8f1fb52ff9339cc||c93291fad04541dba9ecb530af94d2cd||f330128f93b64cc09fb5ca8bafb1c36d||34295e97630c4205867e1753dc70f424||163abb196d1c44e99cee5fff0afff95a||45a3a51edacc414e9745766e66111cfd||c93ef08bfec04716b8c466c7469ac5f4||92e0e642e0a94f89afc49e89ba9f0b85||b58e1da4a15144e7b19b21fa2d3c238a||9030bac59e494da1afa7ee60b0526049||034e4bc479884e4bbc7e3c9e7ca164cd||12b39532617e47439748f2a8c98849b9||77b0431a372740f89ab2e334000f4c56||0819ebfe2dd0437dbdb50d86b82038a1||apple||1300000003||13000000004||13000000005||13000000006||13000000007||13000000008||a0ebf8b880284f48843a53028e591bee||d594fab192ad4e05b1be0d0dc545a286||b99e008fe0604434be878bf538939bc1||75af46085fff42a586fa4bb9cdc62d81||a8e66762075b41f99c718d98fd9907d6||d29b03052cb149de8a7648d0dbe1aeeb||5df4290abf614d57b914c42aace94f23||ce60b6218c13449284204ae1b9d566b7||81d2d6a3790d44669f5735abc20e7a6c||c92ed7f9933e4afe8fea199ca5084dad||c7ea4ca3be794553a076a7ec7c419f4a||5c9df482e773463e98dff755c2224c73||3273c6c8dde94874a06e64e25d6f7a95||511bdf383ca14816a29ce239a62679d1||0f76c21b93b641c0bb6599a23895ad84||4e5fd450d46a4d2cbf81e5c866e36417||a96b2115bda3413cb3de8be94679f952||a508e4b09b2141a69272a9d3e87b3fd3||CongYangXianMinLiangMaoGongSiLiJinLin||234243wsssw||be191efb9084458d906d7ec629f33e17||2224324sdftgret90||YiCengJing||5c8ebf4464b64ae8bd6c925cc19885e5||afc05c871ae04dd2bf357aecec57117c||b4aec1bb874a44af86b7a9c9aa25cb09||ff188b68bf264e5e9bdc1c7a7698de00||d3bd9f282439452e91a583adb930d2cc||a7273d6dde0640d393aa507ed891a81e||a67595000089494e820b01b4c5808962||589f6255c6584be7985cfb5289f6118c||3152ef42d7e34ee199ea596e1f4d15d9||bd8fbad3e2fb411581b0104d10fdf2e4||d2772d6125e84c1d9c2098fa67ae9ed1||3db29a5211394ca39f8755907784ef66||46439d60e9b241abaa3a9ba4689feff7||BaiSeSuDa||9b0810a99f442188af5e7a08bbae6664||ebffcb3ad86444e89512a47e809b72c4||zhl||6bd8db0277814280acf06fdb2767979d||8780badc46c54179852a373a6eddd5e6||ef8ccda25fc947db80a6e9cad0b6d5a6||b5b7070e5016407ab7d7d4e241c92dcb||aad9df53ec9e441dbe609aa2a2e1ec2b||6fbe1abeb44e477690ab89e5fda42fdb||c642ddae62b445efad4d8bbcf09b0875||369dabc48c8f411285353f70d74a964f||f31e5f0b47514a689ba7c6fe65e71f26||83cc05c827b946419c081c6a56855d98||fec9b7bcebc4493d92602d14a629281e||e9697f868bb541f2868e5d4a000d0fc4||d56859b154e54054921fda5ac6f849a4||572ab76c2c7149ca85c7263695bbf1d4||823add1ccde6453d8c1cdb7294e44d86||34c2878f3b6c469db1419f70498eda60||08795cfe5e044ecb995021d6f0ffaef7||4130490f6d424dc7901173cd61163832||5a55093cd3ae4397861cd39107fb5e5e||f10e8de1ccf04e5faa83cb228afdc4a9||c3909442c5a049cab5590f0446346643||zh15158019721||zh15658037030||2341578784||833f6e6445584b00bfd8a0112f8e3b48||536c4cdd71f04e499643d71c119db847||277e2d02a73a40cc92609c9ea67c7682||34038950338c46ea981e6edda3668b8c||d79e62c7969e43a5bb6b158b7222ca6f||4ab9625e71b844248a6fe255475b75a5||ChenXiaoRou||AXiao||Song||cammmmm1||wendy||XianChen||e1f42777a76ed6d94e80b87fc1e09ff5||lanting||ZaDiLe||NiZi13587548366||111111111111111111122||18758285875||zh18030146944||LuEr||HuanXi||d41d8cd98f00b204e9800998ecf8427e||emoji||min||sasa||LiangRenMeng||a.XiaoPangZhi||zh15158716336||LW01||ximei||12||1d9c0170f5ab2c799f2b4c1ac7859cc9||alina||YiZhiMao||15757150876||13989473881||YuanNiZuiHouYeNengTaShangXueShan||234324baishan||cengjin||kongwen116||1111111||HuangJinRong111||zh15869193754||alex||dingdang||ZengYing||HeYuQing||faywang||BoJunBaoZheng||XiaoChengZi||cocokou.||MiaoJie||YanWei||tmac||andy||littlechen||d41d8cd98f00b204e9800998ecf8427e01||ACaileonard||AiMi||ADeng||XiaoBoGe||JiaoJiao||alex01||feynman||c.||Shen||ZaiBuYunDongChengZhuLe||XiaoHei||AiHua||ZhuYanPinglita||e6797283781a4af4d285826372a5f650||JiuEr||jolie||LanLan||l_ch||nina||s.||YeKongZhongZuiLiangDeXing||Nie||MeiLing||FanXiQie||d41d8cd98f00b204e9800998ecf8427e03||ChenSiWeikenneth||hu-Lei||littleLan||javan||YangJun||jeffrey-ACheng||jarron||d41d8cd98f00b204e9800998ecf8427e04||3590cb8af0bbb9e78c343b52b93773c9||hiJing||GeShouDeXiaoSongShu||d41d8cd98f00b204e9800998ecf8427e06||audrey||YaoYaoYao||Jiao||a-jdvHangZhouChengXiYinTaiCheng||aTianTian||5058f1af8388633f609cadb75a75dc9d\",\"shawn||4f4431cd1ceca4aa1e1897c24b3f6c3c||53cdc0a710a3d1772cdcd1f6fc89b949||yesterdayisawalionkissadeer||gracehuang||d41d8cd98f00b204e9800998ecf8427e05||jdvHangZhouLeDiGangDian||LianShangFengDeQiu||l||yamii||YiZhiDaNiao||ZhongLiangJinLanYunDiRenXiang||ALiang||rayhu||ZhangYiDa||gugu||jdv-ChenTingHao||jeremyguan.||b6548d0b4d924b14919ad5f8370061e3||WuChengCheng@||GaoKui||YeSi.||WuShengZhiXi||DaDaDaDaDa||YeManRen||fcc||zh13758106974||234324||23456678723423||WuTianLongbesos||mr.Jiong||YaTou||zh18502066231||zh18628218679||XuWeiWuRao||alun||234234asdd||fuguang||9ae4c4f1277340a186b16a17d937c72c";
String[] split = StringUtils.split(str, "||");
ConcurrencyTester tester = ThreadUtil.concurrencyTest(20, () -> {
int v = (int) (Math.random() * 100);
String wuserId = split[v];
List<String> res = memberUnionidRelatedApiService.listExterialList("ca66a01b79474c40b3e7c7f93daf1a3b", wuserId);
System.out.println(wuserId + "-----" + JSON.toJSONString(res));
});
long interval = tester.getInterval();
System.out.println(interval);
//
// ExecutorService pool = Executors. newCachedThreadPool();
// List<String> res = memberUnionidRelatedApiService.listSelfExterialList("ca66a01b79474c40b3e7c7f93daf1a3b", "QiuWenMin");
......
import java.util.List;
import com.gic.haoban.manage.service.entity.TabHaobanPreDealLog;
import org.apache.commons.lang3.StringUtils;
public class test {
public static void main(String[] args) {
//插入不存在的我们pre表的企业微信数据
int pageSize = 500;
int count = 345;
int pre = count/pageSize+1;
int yushu = count%pageSize;
if(yushu==0){
pre = pre- 1;
}
int i= 0;
while(i<pre){
System.out.println("这是第{}次,进入"+i);
i++;
int fromIndex = (i-1)*pageSize;
int toIndex = (count-fromIndex) > pageSize ? (fromIndex+pageSize):count;
System.out.println("fromIndex=============>"+fromIndex);
System.out.println("toIndex=============>"+toIndex);
String key = "3.2.1";
String[] split = key.split(".");
}
}
System.out.println(split[1]);
//
// //插入不存在的我们pre表的企业微信数据
// int pageSize = 500;
// int count = 345;
// int pre = count/pageSize+1;
// int yushu = count%pageSize;
// if(yushu==0){
// pre = pre- 1;
// }
// int i= 0;
// while(i<pre){
// System.out.println("这是第{}次,进入"+i);
// i++;
// int fromIndex = (i-1)*pageSize;
// int toIndex = (count-fromIndex) > pageSize ? (fromIndex+pageSize):count;
//
// System.out.println("fromIndex=============>"+fromIndex);
// System.out.println("toIndex=============>"+toIndex);
//
// }
}
}
......@@ -261,6 +261,12 @@ public class ApplicationController extends WebBaseController{
return resultResponse(HaoBanErrCode.ERR_0, this.qywxUserApiService.getExternalUseridInfo(corpid, suiteid, userid));
}
@RequestMapping("get-external-unionid")
@IgnoreLogin
public Object userInfoUninid(String corpid, String suiteid, String unionid) {
return resultResponse(HaoBanErrCode.ERR_0, this.qywxUserApiService.getExternalUseridByUnionid(corpid, suiteid, unionid));
}
@RequestMapping("sync-qywx")
@IgnoreLogin
public Object syncQywx(){
......
package com.gic.haoban.manage.web.controller;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import com.gic.haoban.common.utils.StringUtil;
import com.gic.haoban.manage.web.vo.SdkVersionLimitVo;
import com.gic.redis.data.util.RedisUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
......@@ -26,6 +31,10 @@ public class ApplicationController extends WebBaseController{
private ApplicationApiService applicationApiService;
@Autowired
private ApplicationSettingApiService applicationSettingApiService;
private static final String SDKVERSION_KEY = "haoban-wx-sdk-version";
@RequestMapping("application-list")
public HaobanResponse applicationList(String wxEnterpriseId) {
......@@ -63,4 +72,43 @@ public class ApplicationController extends WebBaseController{
}
@RequestMapping("sdk-version-check")
public HaobanResponse sdkVersionCheck(String skdVersion) {
if (StringUtils.isBlank(skdVersion)) {
return resultResponse(HaoBanErrCode.ERR_2);
}
SdkVersionLimitVo sdkVersionLimitVo = new SdkVersionLimitVo();
Object cache = RedisUtil.getCache(SDKVERSION_KEY);
if (null == cache) {
return resultResponse(HaoBanErrCode.ERR_1, sdkVersionLimitVo);
}
String limitSdkVersion = cache.toString();
sdkVersionLimitVo.setLimitSdkVersion(limitSdkVersion);
String[] limitSdk = StringUtils.split(limitSdkVersion, ".");
String[] versionSplit = StringUtils.split(skdVersion, ".");
int checkFlag = checkNum(Integer.valueOf(limitSdk[0]), Integer.valueOf(versionSplit[0]));
if (checkFlag != 0) {
sdkVersionLimitVo.setCheckFlag(checkFlag > 0 ? true : false);
return resultResponse(HaoBanErrCode.ERR_1, sdkVersionLimitVo);
}
checkFlag = checkNum(Integer.valueOf(limitSdk[1]), Integer.valueOf(versionSplit[1]));
if (checkFlag != 0) {
sdkVersionLimitVo.setCheckFlag(checkFlag > 0 ? true : false);
return resultResponse(HaoBanErrCode.ERR_1, sdkVersionLimitVo);
}
checkFlag = checkNum(Integer.valueOf(limitSdk[2]), Integer.valueOf(versionSplit[2]));
if (checkFlag != 0) {
sdkVersionLimitVo.setCheckFlag(checkFlag > 0 ? true : false);
return resultResponse(HaoBanErrCode.ERR_1, sdkVersionLimitVo);
}
return resultResponse(HaoBanErrCode.ERR_1, sdkVersionLimitVo);
}
private int checkNum(int limit, int cur) {
return cur > limit ? 1 : (cur == limit ? 0 : -1);
}
}
......@@ -9,7 +9,6 @@ import com.gic.clerk.api.service.ClerkNewService;
import com.gic.clerk.api.service.ClerkService;
import com.gic.commons.util.DateUtil;
import com.gic.commons.util.EntityUtil;
import com.gic.commons.util.GICMQClientUtil;
import com.gic.enterprise.api.dto.EnterpriseDTO;
import com.gic.enterprise.api.dto.StoreDTO;
import com.gic.enterprise.api.service.EnterpriseService;
......@@ -23,7 +22,6 @@ import com.gic.haoban.manage.api.enums.*;
import com.gic.haoban.manage.api.service.*;
import com.gic.haoban.manage.web.anno.HttpLimit;
import com.gic.haoban.manage.web.errCode.HaoBanErrCode;
import com.gic.haoban.manage.web.utils.RouterConstant;
import com.gic.haoban.manage.web.vo.*;
import com.gic.redis.data.util.RedisUtil;
import org.apache.commons.lang3.StringUtils;
......@@ -31,6 +29,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
......@@ -382,7 +381,8 @@ public class ClerkController extends WebBaseController{
//刷新微信好友
@RequestMapping("/fresh-wx-friend")
public HaobanResponse freshWxFrend(String staffId,String storeId,String wxEnterpriseId,String staffDepartmentRelatedId,String wxUserId) {
public HaobanResponse freshWxFrend(String staffId, String storeId, String wxEnterpriseId, String staffDepartmentRelatedId, String wxUserId
, @RequestParam(defaultValue = "0") Integer flushType) {
StaffDTO staff = staffApiService.selectById(staffId);
String yyyyMM = DateUtil.dateToStr(new Date(), "yyyyMM");
if(staff == null){
......@@ -390,30 +390,28 @@ public class ClerkController extends WebBaseController{
}
String key = "haoban_fresh_wx_friend" + yyyyMM + staffId;
Integer count = RedisUtil.getCache(key) == null ? 0 : (Integer)RedisUtil.getCache(key);
if(count == null || count < 4){
RedisUtil.setCache(key,count + 1,31 * 24 * 60 * 60l);
JSONObject json = new JSONObject();
json.put("wxUserId", staff.getWxUserId());
json.put("wxEnterpriseId", wxEnterpriseId);
json.put("storeId", storeId);
// logger.info("【刷下微信好友】{},{},{}",RouterConstant.FRESH_WX_FRIEND_SERVICENAME,RouterConstant.INIT_FRESH_WX_FRIEND_METHODNAME,json.toJSONString());
if (count != null && count >= 4) {
logger.info("次数超出限制:{}", staffId);
return resultResponse(HaoBanErrCode.ERR_10011);
}
RedisUtil.setCache(key, count + 1, 31 * 24 * 60 * 60L);
if (flushType == 0) {
String taskName = "刷新企业微信好友("+staff.getStaffName()+")";
String taskId = dealSyncOperationApiService.createWxFriendSingleTask(wxEnterpriseId, taskName, staffId, staff.getStaffName());
String taskId = dealSyncOperationApiService.createWxFriendTaskSingle(wxEnterpriseId, taskName, staffId, staff.getStaffName(), SyncTaskTypeEnum.FRIEND_SINGLE.getType());
if(StringUtils.isNotBlank(taskId)){
dealSyncOperationApiService.dealWxFriendClerkSingle(taskId,wxUserId,staffId,wxEnterpriseId);
}else{
return resultResponse(HaoBanErrCode.ERR_999);
return resultResponse(HaoBanErrCode.ERR_10022);
}
} else {
String taskName = "刷新门店好友";
String taskId = dealSyncOperationApiService.createWxFriendTaskSingle(wxEnterpriseId, taskName, staffId, staff.getStaffName(), SyncTaskTypeEnum.FRIEND_STORE.getType());
if (StringUtils.isNotBlank(taskId)) {
dealSyncOperationApiService.dealWxFriendStore(taskId, storeId, wxEnterpriseId);
} else {
return resultResponse(HaoBanErrCode.ERR_10022);
}
// try {
// GICMQClientUtil.getClientInstance().sendCommonMessage(RouterConstant.ROUTERTYPE, json.toJSONString(),
// RouterConstant.FRESH_WX_FRIEND_SERVICENAME, RouterConstant.INIT_FRESH_WX_FRIEND_METHODNAME);
// } catch (Exception e) {
// logger.info(e.getMessage(),e);
// }
// memberUnionidRelatedApiService.freshWxFrend(wxEnterpriseId, staff.getWxUserId(),storeId);
}else{
return resultResponse(HaoBanErrCode.ERR_10011);
}
return resultResponse(HaoBanErrCode.ERR_1);
}
......
......@@ -200,27 +200,29 @@ public enum HaoBanErrCode {
ERR_10012(10012,"手机号格式不正确"),
ERR_10013(10013,"code已经存在"),
ERR_10014(10014,"请输入手机号"),
ERR_10015(10015,"素材不存在"),
ERR_10016(10016,"导购不存在"),
ERR_10017(10017,"审核记录不存在"),
ERR_10018(10018,"审核记录已存在"),
ERR_10019(10019,"没有配置secret"),
ERR_10020(10020,"该用户已在该门店绑定过code"),
ERR_10021(10021,"待审核中存在code或该手机号"),
ERR_10022(10022, "已有刷新在执行中,请不要重复刷新"),
ERR_11122(11122,"手机号已存在"),
ERR_999(999, "操作失败"),
ERR_DEFINE(-888, "自定义错误"),
ERR_OTHER(-999, "未知错误code");
private int code;
private String msg;
......
package com.gic.haoban.manage.web.vo;
import java.io.Serializable;
/**
* Created 2021/3/24.
*
* @author hua
*/
public class SdkVersionLimitVo implements Serializable {
private String limitSdkVersion;
private boolean checkFlag = true;
public String getLimitSdkVersion() {
return limitSdkVersion;
}
public void setLimitSdkVersion(String limitSdkVersion) {
this.limitSdkVersion = limitSdkVersion;
}
public boolean isCheckFlag() {
return checkFlag;
}
public void setCheckFlag(boolean checkFlag) {
this.checkFlag = checkFlag;
}
}
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