Commit a7114ae8 by 王祖波

Merge branch 'feature-recommend3' into developer

parents c319f2a2 7d4e90ec
package com.gic.haoban.manage.api.dto.send;
import com.gic.haoban.manage.api.dto.anaylsis.ClerkShareGoodsLogDTO;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* Created by wangzubo on 2025/3/25.
......@@ -60,6 +63,11 @@ public class DealQwSendDTO implements Serializable {
*/
private String enterpriseId;
/**
* 商品分享信息
*/
private List<ClerkShareGoodsLogDTO> shareGoodsList;
public FinishQwSendBO() {
}
......@@ -119,6 +127,14 @@ public class DealQwSendDTO implements Serializable {
public void setEnterpriseId(String enterpriseId) {
this.enterpriseId = enterpriseId;
}
public List<ClerkShareGoodsLogDTO> getShareGoodsList() {
return shareGoodsList;
}
public void setShareGoodsList(List<ClerkShareGoodsLogDTO> shareGoodsList) {
this.shareGoodsList = shareGoodsList;
}
}
public static class QwSendMsgBO implements Serializable {
......
......@@ -4,22 +4,24 @@ import org.apache.commons.lang3.StringUtils;
public enum ContactFollowTypeEnum {
PRIVATE_PHONE(1, "私人电话","私人电话"),
WECHAT_SESSION(2, "企微会话","企微会话"),
PRODUCT(3, "发送商品","商品"),
WECHAT_GROUP_SEND(4, "企微群发","企微群发"),
CONTACT(5, "标记建联","标记了建联"),
AUTO_CONTACT(6, "系统自动标记","系统自动标记"),
MATERIAL(7, "营销素材","营销素材");
PRIVATE_PHONE(1, "私人电话","私人电话",null),
WECHAT_SESSION(2, "企微会话","企微会话",null),
PRODUCT(3, "发送商品","商品",ContactAutoTypeEnum.GOODS_RECOMMEND.getCode()),
WECHAT_GROUP_SEND(4, "企微群发","企微群发",null),
CONTACT(5, "标记建联","标记了建联",null),
AUTO_CONTACT(6, "系统自动标记","系统自动标记",null),
MATERIAL(7, "营销素材","营销素材",ContactAutoTypeEnum.MATERIAL.getCode());
private final int code;
private final String description;
private final String textMatch;
private final Integer contactAutoType;
ContactFollowTypeEnum(int code, String description,String textMatch) {
ContactFollowTypeEnum(int code, String description,String textMatch,Integer contactAutoType) {
this.code = code;
this.description = description;
this.textMatch = textMatch;
this.contactAutoType = contactAutoType;
}
public String getTextMatch() {
......@@ -34,6 +36,10 @@ public enum ContactFollowTypeEnum {
return description;
}
public Integer getContactAutoType() {
return contactAutoType;
}
public static ContactFollowTypeEnum fromCode(int code) {
for (ContactFollowTypeEnum type : values()) {
if (type.code == code) {
......
......@@ -78,6 +78,11 @@ public class ContactFollowBatchQDTO implements Serializable {
private String memberId;
/**
* 外部联系人id
*/
private String externalUserId;
/**
* 跟进时间
*/
private Date followTime;
......@@ -90,6 +95,12 @@ public class ContactFollowBatchQDTO implements Serializable {
this.followTime = followTime;
}
public MemberFollow(String memberId, String externalUserId, Date followTime) {
this.memberId = memberId;
this.externalUserId = externalUserId;
this.followTime = followTime;
}
public String getMemberId() {
return memberId;
}
......@@ -98,6 +109,14 @@ public class ContactFollowBatchQDTO implements Serializable {
this.memberId = memberId;
}
public String getExternalUserId() {
return externalUserId;
}
public void setExternalUserId(String externalUserId) {
this.externalUserId = externalUserId;
}
public Date getFollowTime() {
return followTime;
}
......
......@@ -8,6 +8,7 @@ import com.gic.api.base.commons.ServiceResponse;
import com.gic.clerk.api.dto.ClerkDTO;
import com.gic.clerk.api.service.ClerkService;
import com.gic.commons.util.EntityUtil;
import com.gic.commons.util.GICMQClientUtil;
import com.gic.commons.util.PageHelperUtils;
import com.gic.commons.util.UniqueIdUtils;
import com.gic.haoban.manage.api.dto.contact.ContactFollowDTO;
......@@ -15,9 +16,11 @@ import com.gic.haoban.manage.api.dto.contact.ContactFollowGoodsDTO;
import com.gic.haoban.manage.api.enums.contact.ContactFollowTypeEnum;
import com.gic.haoban.manage.api.qdto.contact.ContactFollowQDTO;
import com.gic.haoban.manage.api.qdto.contact.ContactFollowSearchQDTO;
import com.gic.haoban.manage.api.qdto.contact.ContactLogQDTO;
import com.gic.haoban.manage.service.dao.mapper.contact.TabContactFollowMapper;
import com.gic.haoban.manage.service.entity.contact.TabContactFollow;
import com.gic.haoban.manage.service.service.contact.ContactFollowService;
import com.gic.mq.sdk.GicMQClient;
import com.gic.store.goods.service.StoreGoodsService;
import com.gic.store.goods.vo.StoreGoodsVO;
import com.github.pagehelper.PageHelper;
......@@ -85,6 +88,32 @@ public class ContactFollowServiceImpl implements ContactFollowService {
return contactFollow;
}).filter(Objects::nonNull).collect(Collectors.toList());
contactFollowMapper.insertBatch(followList);
// 部分跟进发送自动建联
autoContactSend(followList);
}
private static void autoContactSend(List<TabContactFollow> followList) {
// 自动建联
Integer followType = followList.get(0).getFollowType();
Integer contactAutoType = ContactFollowTypeEnum.fromCode(followType).getContactAutoType();
if (contactAutoType != null) {
List<String> message = followList.stream().map(x -> {
ContactLogQDTO contactLogQDTO = new ContactLogQDTO();
contactLogQDTO.setMemberId(x.getMemberId());
contactLogQDTO.setClerkId(x.getClerkId());
contactLogQDTO.setEnterpriseId(x.getEnterpriseId());
contactLogQDTO.setContactAutoType(contactAutoType);
return JSON.toJSONString(contactLogQDTO);
}).collect(Collectors.toList());
String routerName = "autoContactLogForMQ";
try {
GicMQClient clientInstance = GICMQClientUtil.getClientInstance();
clientInstance.sendBatchMessages(routerName, message);
} catch (Exception e) {
logger.error("发送错误!路由规则名称:" + routerName + ",message:" + message,e);
}
message.clear();
}
}
@Override
......
......@@ -42,7 +42,7 @@ public class QwSendApiServiceImpl implements QwSendApiService {
if (Objects.equals(refreshType,1)) {
qwSendMsgService.finishQwSend(dealQwSendDTO.getFinishQwSend(),dealQwSendDTO.getTryCount());
} else if (Objects.equals(refreshType, 2)) {
qwSendMsgService.refreshQwSendLog(dealQwSendDTO.getQwSendMsg());
qwSendMsgService.refreshQwSendLog(dealQwSendDTO);
}
return ServiceResponse.success();
}
......
......@@ -20,8 +20,8 @@ public interface QwSendMsgService {
/**
* 刷新企微群结果
* @param qwSendMsg
* @param dealQwSendDTO
*/
void refreshQwSendLog(DealQwSendDTO.QwSendMsgBO qwSendMsg);
void refreshQwSendLog(DealQwSendDTO dealQwSendDTO);
}
......@@ -5,31 +5,36 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.gic.api.base.commons.BusinessException;
import com.gic.api.base.commons.JSONResponse;
import com.gic.api.base.commons.ServiceResponse;
import com.gic.commons.util.UniqueIdUtils;
import com.gic.content.api.utils.MqUtils;
import com.gic.haoban.common.utils.EntityUtil;
import com.gic.haoban.manage.api.dto.anaylsis.ClerkShareGoodsLogDTO;
import com.gic.haoban.manage.api.dto.send.DealQwSendDTO;
import com.gic.haoban.manage.api.enums.contact.ContactFollowTypeEnum;
import com.gic.haoban.manage.api.qdto.contact.ContactFollowBatchQDTO;
import com.gic.haoban.manage.api.service.MemberUnionidRelatedApiService;
import com.gic.haoban.manage.api.service.MessageApiService;
import com.gic.haoban.manage.api.service.content.MaterialShareLogApiService;
import com.gic.haoban.manage.service.dao.mapper.TabHaobanExternalClerkRelatedMapper;
import com.gic.haoban.manage.service.dao.mapper.send.QwSendLogMapper;
import com.gic.haoban.manage.service.dao.mapper.send.QwSendMsgMapper;
import com.gic.haoban.manage.service.entity.TabHaobanExternalClerkRelated;
import com.gic.haoban.manage.service.entity.send.TabQwSendLog;
import com.gic.haoban.manage.service.entity.send.TabQwSendMsg;
import com.gic.haoban.manage.service.pojo.bo.send.FinishQwSendBO;
import com.gic.haoban.manage.service.pojo.bo.send.GroupSendResultBO;
import com.gic.haoban.manage.service.service.chat.GroupChatPlanService;
import com.gic.haoban.manage.service.service.content.impl.GroupMessageServiceImpl;
import com.gic.haoban.manage.service.service.send.QwSendMsgService;
import com.gic.member.api.constant.MemberExtKeyEnum;
import com.gic.member.api.dto.member.req.MemberExtraPropertyReq;
import com.gic.member.api.service.extra.MemberExtraPropertyApiService;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.stream.Collectors;
......@@ -55,6 +60,10 @@ public class QwSendMsgServiceImpl implements QwSendMsgService {
private MemberUnionidRelatedApiService memberUnionidRelatedApiService;
@Autowired
private MessageApiService messageApiService;
@Autowired
private MaterialShareLogApiService materialShareLogApiService;
@Autowired
private MemberExtraPropertyApiService memberExtraPropertyApiService;
@Override
public void finishQwSend(DealQwSendDTO.FinishQwSendBO finishQwSendBO,Integer tryCount) {
......@@ -83,7 +92,8 @@ public class QwSendMsgServiceImpl implements QwSendMsgService {
dealQwSendDTO.setRefreshType(2);
DealQwSendDTO.QwSendMsgBO qwSendMsgBO = EntityUtil.changeEntityByJSON(DealQwSendDTO.QwSendMsgBO.class, qwSendMsg);
dealQwSendDTO.setQwSendMsg(qwSendMsgBO);
MqUtils.sendMessageToMQ("qwSendRefreshByMQ", JSON.toJSONString(dealQwSendDTO), 60);
dealQwSendDTO.setFinishQwSend(finishQwSendBO);
MqUtils.sendMessageToMQ("qwSendRefreshByMQ", JSON.toJSONString(dealQwSendDTO), 30);
}else {
if (tryCount != null && tryCount >= 5) {
return;
......@@ -102,7 +112,8 @@ public class QwSendMsgServiceImpl implements QwSendMsgService {
}
@Override
public void refreshQwSendLog(DealQwSendDTO.QwSendMsgBO qwSendMsg) {
public void refreshQwSendLog(DealQwSendDTO dealQwSendDTO) {
DealQwSendDTO.QwSendMsgBO qwSendMsg = dealQwSendDTO.getQwSendMsg();
List<GroupSendResultBO> sendResultList = getSendResultList(qwSendMsg);
if (CollectionUtils.isEmpty(sendResultList)) {
return;
......@@ -147,9 +158,9 @@ public class QwSendMsgServiceImpl implements QwSendMsgService {
if (StringUtils.isBlank(log.getMemberId())) {
return;
}
memberList.add(new ContactFollowBatchQDTO.MemberFollow(log.getMemberId(), log.getSendTime()));
memberList.add(new ContactFollowBatchQDTO.MemberFollow(log.getMemberId(), log.getExternalUserId(), log.getSendTime()));
});
saveFollowMQ(qwSendMsg.getEnterpriseId(),qwSendMsg.getClerkId(), memberList);
saveFollowMQ(qwSendMsg.getEnterpriseId(),qwSendMsg.getClerkId(), memberList,dealQwSendDTO.getFinishQwSend());
}
entities.clear();
}
......@@ -229,16 +240,59 @@ public class QwSendMsgServiceImpl implements QwSendMsgService {
return EntityUtil.changeEntityListByJSON(GroupSendResultBO.class, list);
}
private void saveFollowMQ(String enterpriseId,String clerkId,List<ContactFollowBatchQDTO.MemberFollow> memberList) {
private void saveFollowMQ(String enterpriseId,String clerkId,List<ContactFollowBatchQDTO.MemberFollow> memberList,DealQwSendDTO.FinishQwSendBO finishQwSendBO) {
if (org.apache.commons.collections.CollectionUtils.isEmpty(memberList)) {
return;
}
if (finishQwSendBO == null) {
return;
}
Integer followType = null;
String followRemark = null;
Integer bizType = finishQwSendBO.getBizType();
List<ClerkShareGoodsLogDTO> shareGoodsList = finishQwSendBO.getShareGoodsList();
if (Objects.equals(bizType, 1)) {
followType = ContactFollowTypeEnum.MATERIAL.getCode();
followRemark = "向客户发送了营销素材";
} else if (Objects.equals(bizType, 2)) {
followType = ContactFollowTypeEnum.PRODUCT.getCode();
followRemark = "向客户发送了" + shareGoodsList.size() + "款商品";
} else {
return;
}
ContactFollowBatchQDTO batchQDTO = new ContactFollowBatchQDTO();
batchQDTO.setEnterpriseId(enterpriseId);
batchQDTO.setMemberList(memberList);
batchQDTO.setClerkId(clerkId);
batchQDTO.setFollowType(ContactFollowTypeEnum.WECHAT_GROUP_SEND.getCode());
batchQDTO.setFollowRemark("通过企微群发向客户发送了消息");
batchQDTO.setFollowType(followType);
batchQDTO.setFollowRemark(followRemark);
MqUtils.sendMessageToMQ("saveBatchFollowForMQ", JSON.toJSONString(batchQDTO));
if (Objects.equals(bizType, 2)) {
saveShareMaterialLog(enterpriseId, shareGoodsList, memberList);
}
}
private void saveShareMaterialLog(String enterpriseId,List<ClerkShareGoodsLogDTO> shareGoodsList,List<ContactFollowBatchQDTO.MemberFollow> memberList) {
List<ClerkShareGoodsLogDTO> list = Lists.newArrayList();
for (ContactFollowBatchQDTO.MemberFollow memberInfo : memberList) {
for (ClerkShareGoodsLogDTO goodsLogDTO : shareGoodsList) {
ClerkShareGoodsLogDTO temp = EntityUtil.changeEntityByJSON(ClerkShareGoodsLogDTO.class, goodsLogDTO);
temp.setExternalUserId(memberInfo.getExternalUserId());
temp.setMemberId(memberInfo.getMemberId());
list.add(temp);
}
//更新会员推荐时间更新
MemberExtraPropertyReq memberExtraPropertyReq = new MemberExtraPropertyReq();
memberExtraPropertyReq.setEnterpriseId(enterpriseId);
memberExtraPropertyReq.setMemberId(memberInfo.getMemberId());
memberExtraPropertyReq.setExtraKey(MemberExtKeyEnum.MEMBER_GOODS_SUGGEST_TIME.key());
memberExtraPropertyReq.setExtraValue(memberInfo.getFollowTime().getTime());
try {
memberExtraPropertyApiService.updateMemberExtraProperty(memberExtraPropertyReq);
} catch (Exception e) {
log.info("更新会员推荐时间更新异常,", e);
}
}
materialShareLogApiService.saveClerkShareRecommendLog(list);
}
}
......@@ -257,6 +257,7 @@
<dubbo:reference interface="com.gic.clerk.api.service.MenuApiService" id="menuApiService" timeout="10000" retries="0" check="false" />
<dubbo:reference interface="com.gic.member.ext.api.service.MemberGrowthWriteApiService" id="memberGrowthWriteApiService" timeout="10000" retries="0" check="false" />
<dubbo:reference interface="com.gic.member.api.service.integral.IntegralWriteApiService" id="integralWriteApiService" timeout="10000" retries="0" check="false"/>
<dubbo:reference id="memberExtraPropertyApiService" interface="com.gic.member.api.service.extra.MemberExtraPropertyApiService" timeout="100000" retries="0" check="false" />
<dubbo:reference id="memberTagEsApiService" interface="com.gic.member.tag.api.service.MemberTagEsApiService" timeout="100000" retries="0" check="false"/>
<dubbo:reference id="memberCrowdApiService" interface="com.gic.member.ext.api.service.MemberCrowdApiService" timeout="10000" retries="0" check="false"/>
......
......@@ -130,21 +130,12 @@ public class ClerkMaterialShareController {
log.info("saveClerkShareMaterialLog 保存导购分享推荐商品日志 clerkId:{}, recommendShareLogQO{}", recommendShareLogQO.getClerkId(), JSON.toJSONString(recommendShareLogQO));
List<ClerkShareGoodsLogDTO> list = Lists.newArrayList();
List<String> memberIdList = Lists.newArrayList();
List<String> goodsIdList = recommendShareLogQO.getGoodsIdList();
List<RecommendShareLogQO.MemberInfo> externalUserIdList = recommendShareLogQO.getMemberInfoList();
for (RecommendShareLogQO.MemberInfo memberInfo : externalUserIdList) {
for (String goodsId : goodsIdList) {
ClerkShareGoodsLogDTO temp = new ClerkShareGoodsLogDTO();
temp.setEnterpriseId(recommendShareLogQO.getEnterpriseId());
temp.setWxEnterpriseId(recommendShareLogQO.getWxEnterpriseId());
temp.setClerkId(recommendShareLogQO.getClerkId());
temp.setExternalUserId(memberInfo.getExternalUserId());
temp.setMemberId(memberInfo.getMemberId());
if(StringUtils.isNotEmpty(memberInfo.getMemberId())){
memberIdList.add(memberInfo.getMemberId());
}
temp.setBizId(goodsId);
temp.setBizType(ShareBizType.GOODS.getCode());
temp.setStoreId(recommendShareLogQO.getStoreId());
......@@ -153,24 +144,19 @@ public class ClerkMaterialShareController {
temp.setWxaLinkId(recommendShareLogQO.getWxaLinkId());
list.add(temp);
}
}
ServiceResponse<Long> serviceResponse = materialShareLogApiService.saveClerkShareRecommendLog(list);
// 改为查询企微是否真正发送成功
DealQwSendDTO.FinishQwSendBO finishQwSendBO = new DealQwSendDTO.FinishQwSendBO(
recommendShareLogQO.getClerkId(),
recommendShareLogQO.getStaffId(),
DateUtil.date(),
2,
recommendShareLogQO.getWxEnterpriseId(),
recommendShareLogQO.getEnterpriseId());
finishQwSendBO.setShareGoodsList(list);
dealQwSendMsg(finishQwSendBO);
if (!serviceResponse.isSuccess()) {
return RestResponse.failure("-701", "系统异常");
}
//更新会员推荐时间更新
if(CollectionUtils.isNotEmpty(memberIdList)){
for (String memberId : memberIdList) {
MemberExtraPropertyReq memberExtraPropertyReq = new MemberExtraPropertyReq();
memberExtraPropertyReq.setEnterpriseId(recommendShareLogQO.getEnterpriseId());
memberExtraPropertyReq.setMemberId(memberId);
memberExtraPropertyReq.setExtraKey(MemberExtKeyEnum.MEMBER_GOODS_SUGGEST_TIME.key());
memberExtraPropertyReq.setExtraValue(new Date().getTime());
memberExtraPropertyApiService.updateMemberExtraProperty(memberExtraPropertyReq);
}
}
if (StringUtils.isNotBlank(recommendShareLogQO.getWxaLinkId())) {
enterpriseWxaLinkService.updateTimeById(recommendShareLogQO.getWxaLinkId());
}
......@@ -179,7 +165,6 @@ public class ClerkMaterialShareController {
}
private void dealQwSendMsg(DealQwSendDTO.FinishQwSendBO finishQwSend) {
// 商品分享暂时不记,记录的是发送商品的类型而不是企微群发
DealQwSendDTO dealQwSendDTO = new DealQwSendDTO();
dealQwSendDTO.setEnterpriseId(finishQwSend.getEnterpriseId());
dealQwSendDTO.setRefreshType(1);
......
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