zoujiajian 2 лет назад
Родитель
Сommit
485da2e04b

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/mapper/corp/CorpInteractiveRadarUserRecordMapper.java

@@ -2,6 +2,9 @@ package com.cyksj.mapper.corp;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cyksj.model.entity.CorpInteractiveRadarUserRecord;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.Map;
 
 /*
  *项目名: netflix
@@ -10,4 +13,7 @@ import com.cyksj.model.entity.CorpInteractiveRadarUserRecord;
  *创建时间:2023/8/4 18:31
  */
 public interface CorpInteractiveRadarUserRecordMapper extends BaseMapper<CorpInteractiveRadarUserRecord> {
+
+	@Select("select count(*) clickNum,count(distinct user_id) clickUserNum from corp_interactive_radar_user_record where radar_id = #{radarId}")
+	Map<String, Long> selectClickRecord(Long radarId);
 }

+ 31 - 0
netflix-dao/src/main/java/com/cyksj/model/request/corp/message/NewsArticle.java

@@ -0,0 +1,31 @@
+package com.cyksj.model.request.corp.message;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: NewsArticle
+ * 创建者: JavaZou
+ * 创建时间:2023/10/27 12:23
+ */
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@Data
+public class NewsArticle {
+
+	private String title;
+
+	private String description;
+
+	private String url;
+
+	@JsonProperty("picurl")
+	private String picurl;
+
+	private String appid;
+
+	@JsonProperty("pagepath")
+	private String pagepath;
+}

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/model/request/corp/message/WxCorpAgentMessage.java

@@ -3,6 +3,8 @@ package com.cyksj.model.request.corp.message;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * @author chan
  * @date 2023/5/10 3:12 PM
@@ -25,4 +27,13 @@ public class WxCorpAgentMessage {
     private String safe;
 
     private TextCard textcard;
+
+    private News news;
+
+
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    @Data
+    public static class News{
+        private List<NewsArticle> articles;
+    }
 }

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/model/views/CorpInteractiveReaderView.java

@@ -34,6 +34,9 @@ public class CorpInteractiveReaderView {
 	@DbIgnore
 	private Integer clickNum;
 
+	@DbIgnore
+	private Integer clickUserNum;
+
 	@DbIgnore
 	private Integer payNum;
 

+ 5 - 2
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpEventActionServiceImpl.java

@@ -652,14 +652,16 @@ public class CorpEventActionServiceImpl implements CorpEventActionService {
 		corpUser.setType(corpUserInfo.getType());
 		String state = message.getState();
 		CorpFollowActiveCode corpFollowActiveCode = null;
-		if (StrUtil.isNotBlank(state) && corpUser.getId() == null && state.contains(Constant.AC_CODE_KEY)) {
+		if (StrUtil.isNotBlank(state) && state.contains(Constant.AC_CODE_KEY)) {
 			//查找对应的活动活码 记录
 			String acIdStr = StrUtil.subAfter(state, StrUtil.C_COLON, true);
 			if (Validator.isNumber(acIdStr)) {
 				Long acId = Long.parseLong(acIdStr);
 				corpFollowActiveCode = corpFollowActiveCodeMapper.selectById(acId);
 				if (corpFollowActiveCode != null) {
-					corpUser.setAcId(acId);
+					if (corpUser.getId() == null) {
+						corpUser.setAcId(acId);
+					}
 					String welcomeContent = corpFollowActiveCode.getText();
 					String attachmentsStr = corpFollowActiveCode.getAttachmentsStr();
 					//发送对应欢迎语
@@ -673,6 +675,7 @@ public class CorpEventActionServiceImpl implements CorpEventActionService {
 					List<String> followIds = Jsons.parseList(corpFollowActiveCode.getFollowStr(), String.class);
 					//对客户进行标记
 					markAddUserTag(corpFollowActiveCode.getMarkTag(), message.getToUserName(), corpUserInfo.getExternalUserId(), followIds, followedUsers);
+					state = corpFollowActiveCode.getMarkTag();
 				} catch (Exception e) {
 				}
 

+ 20 - 1
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpFollowActiveCodeFrontServiceImpl.java

@@ -21,7 +21,9 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.util.Comparator;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 项目名: yhlxj
@@ -101,6 +103,20 @@ public class CorpFollowActiveCodeFrontServiceImpl implements CorpFollowActiveCod
 			//若在当天之前
 			//若在当天之后 寻找下日值班客服
 			List<CorpFollowDutyRelate> todayCorpFollowDuty = corpFollowDutyRelateMapper.selectTodayDutyRelate(followIds, type);
+			if (CollUtil.isEmpty(todayCorpFollowDuty)) {
+				List<CorpFollowDutyRelate> dutyRelateList = corpFollowDutyRelateMapper.selectList(Wrappers.lambdaQuery(CorpFollowDutyRelate.class)
+						.ne(CorpFollowDutyRelate::getType, type));
+				Integer fType = type;
+				//优化获取下一个工作日 客服
+				List<CorpFollowDutyRelate> collect = dutyRelateList.stream().filter(data -> data.getType() > fType).collect(Collectors.toList());
+				if (CollUtil.isEmpty(collect)) {
+					collect = dutyRelateList;
+				}
+				collect.sort(Comparator.comparing(CorpFollowDutyRelate::getSt));
+				qrCode = getActiveQrCode(collect, activeCodeDtos);
+				redisService.set(activeCodeKey, qrCode, RedisService.key.CORP_FOLLOW_ACTIVE_CODE_KEY.getTimeout());
+				return qrCode;
+			}
 			CorpFollowDutyRelate relate = todayCorpFollowDuty.get(0);
 			Integer st = relate.getSt();
 			Integer et = relate.getEt();
@@ -180,6 +196,9 @@ public class CorpFollowActiveCodeFrontServiceImpl implements CorpFollowActiveCod
 				return activeCodeDto.getQrCode();
 			}
 		}
-		return null;
+		//兜底
+		randNum = RandomUtil.randomInt(activeCodeDtos.size());
+		CorpFollowActiveCodeDto activeCodeDto = activeCodeDtos.get(randNum);
+		return activeCodeDto.getQrCode();
 	}
 }

+ 21 - 11
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpInteractiveReaderFrontServiceImpl.java

@@ -1,15 +1,17 @@
 package com.cyksj.service.corp.impl;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.mapper.corp.*;
 import com.cyksj.model.entity.*;
-import com.cyksj.model.request.corp.message.TextCard;
+import com.cyksj.model.request.corp.message.NewsArticle;
 import com.cyksj.model.request.corp.message.WxCorpAgentMessage;
 import com.cyksj.service.corp.CorpInteractiveReaderFrontService;
 import com.cyksj.service.corp.WxCorpOps;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -44,7 +46,7 @@ public class CorpInteractiveReaderFrontServiceImpl implements CorpInteractiveRea
 		corpInteractiveRadarUserRecord.setUserId(userId);
 		corpInteractiveRadarUserRecord.setRadarId(radarId);
 		Integer type = radar.getType();
-		if (type == 1) {
+		if (type == 1 && userId != null) {
 			//给企业微信客服发送消息
 			WxCorpApp wxCorpApp = wxCorpAppMapper.selectById(radar.getWxCorpId());
 			CorpUser corpUser = corpUserMapper.selectOne(Wrappers.lambdaQuery(CorpUser.class).eq(CorpUser::getUserId, userId));
@@ -58,18 +60,26 @@ public class CorpInteractiveReaderFrontServiceImpl implements CorpInteractiveRea
 				String externalUserid = corpUserAuth.getExternalUserid();
 				List<CorpUserFollowRelation> corpUserFollowRelations = corpUserFollowRelationMapper.selectList(Wrappers.lambdaQuery(CorpUserFollowRelation.class).eq(CorpUserFollowRelation::getCorpUserId, externalUserid));
 
-				String msg = "【%s】打开了雷达链接【%s】<div class='highlight'>客户昵称:%s</div>";
-				//发送卡片消息
+				//发送图文消息
 				WxCorpAgentMessage agentMessage = new WxCorpAgentMessage();
 				agentMessage.setAgentid(Integer.valueOf(wxCorpApp.getAgentId()));
 				agentMessage.setTouser(corpUserFollowRelations.stream().map(CorpUserFollowRelation::getFollowId).collect(Collectors.joining("|")));
-				agentMessage.setMsgtype("textcard");
-				TextCard textCard = new TextCard();
-				textCard.setTitle("雷达链接");
-				textCard.setUrl(radar.getUrl());
-				textCard.setDescription(String.format(msg, corpUser.getName(), radar.getTitle(), corpUser.getName()));
-				textCard.setBtnTxt("点击查看链接");
-				agentMessage.setTextcard(textCard);
+				agentMessage.setMsgtype("news");
+
+				//图片信息
+				NewsArticle article = new NewsArticle();
+				article.setUrl(radar.getUrl());
+				String linkInfoStr = radar.getLinkInfoStr();
+				CorpInteractiveReaderLink linkInfo = Jsons.parseObject(linkInfoStr, CorpInteractiveReaderLink.class);
+				article.setDescription(linkInfo.getDesc());
+				article.setTitle(linkInfo.getTitle());
+				article.setPicurl(linkInfo.getImg());
+
+				List<NewsArticle> articles = new ArrayList<>();
+				articles.add(article);
+				WxCorpAgentMessage.News news = new WxCorpAgentMessage.News();
+				news.setArticles(articles);
+				agentMessage.setNews(news);
 				//发送卡片消息
 				wxCorpOps.sendAgentMessage(wxCorpApp.getCorpId(), agentMessage);
 			}

+ 25 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -41,6 +41,7 @@ import com.cyksj.enums.GatewayApiCode;
 import com.cyksj.mapper.*;
 import com.cyksj.mapper.channel.ChannelPopularizeMapper;
 import com.cyksj.mapper.channel.ShopConfigMapper;
+import com.cyksj.mapper.corp.CorpInteractiveUserOrderRelationMapper;
 import com.cyksj.mapper.manage.coupon.CouponDistributePopularizeMapper;
 import com.cyksj.mapper.manage.coupon.CouponMapper;
 import com.cyksj.mapper.manage.coupon.CouponSkuMapper;
@@ -216,6 +217,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final OrderDonPostService orderDonPostService;
 
+	private final CorpInteractiveUserOrderRelationMapper corpInteractiveUserOrderRelationMapper;
+
 	private final GoodsDiscountPlusPurchaseRelationMapper discountPlusPurchaseRelationMapper;
 
 	private final OrderDiscountPlusPurchaseSkuRelationMapper orderDiscountPlusPurchaseSkuRelationMapper;
@@ -558,6 +561,17 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			});
 			giftCardOrderUseRecordService.saveBatch(orderDon.getGcUseRecords());
 		}
+		if (payRequest.getRadarId() != null && user != null) {
+			CorpInteractiveUserOrderRelation corpInteractiveUserOrderRelation = new CorpInteractiveUserOrderRelation();
+			corpInteractiveUserOrderRelation.setUserId(user.getId());
+			corpInteractiveUserOrderRelation.setOrderId(orderDon.getId());
+			corpInteractiveUserOrderRelation.setRadarId(payRequest.getRadarId());
+			corpInteractiveUserOrderRelation.setIsNew(false);
+			if (user.getCreatedTime().getTime() >= DateUtil.beginOfDay(DateTime.now()).getTime()) {
+				corpInteractiveUserOrderRelation.setIsNew(true);
+			}
+			corpInteractiveUserOrderRelationMapper.insert(corpInteractiveUserOrderRelation);
+		}
 		return orderDon;
 	}
 
@@ -937,6 +951,17 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			});
 			giftCardOrderUseRecordService.saveBatch(orderDon.getGcUseRecords());
 		}
+		if (payRequest.getRadarId() != null && user != null) {
+			CorpInteractiveUserOrderRelation corpInteractiveUserOrderRelation = new CorpInteractiveUserOrderRelation();
+			corpInteractiveUserOrderRelation.setUserId(user.getId());
+			corpInteractiveUserOrderRelation.setOrderId(orderDon.getId());
+			corpInteractiveUserOrderRelation.setRadarId(payRequest.getRadarId());
+			corpInteractiveUserOrderRelation.setIsNew(false);
+			if (user.getCreatedTime().getTime() >= DateUtil.beginOfDay(DateTime.now()).getTime()) {
+				corpInteractiveUserOrderRelation.setIsNew(true);
+			}
+			corpInteractiveUserOrderRelationMapper.insert(corpInteractiveUserOrderRelation);
+		}
 		return orderDon;
 	}
 

+ 17 - 8
netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/CorpInteractiveRadarController.java

@@ -2,12 +2,13 @@ package com.cyksj.web.controller.manage.corp;
 
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.corp.CorpInteractiveRadarUserRecordMapper;
 import com.cyksj.model.entity.CorpInteractiveRadar;
-import com.cyksj.model.entity.CorpInteractiveRadarUserRecord;
 import com.cyksj.model.entity.CorpInteractiveReaderLink;
 import com.cyksj.model.views.CorpInteractiveRadarOrderDataView;
 import com.cyksj.model.views.CorpInteractiveReaderOrderDetailView;
@@ -21,6 +22,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
 
 /*
  *项目名: netflix
@@ -38,6 +40,8 @@ public class CorpInteractiveRadarController {
 
 	private final HttpServletRequest request;
 
+	private final CorpInteractiveRadarUserRecordMapper corpInteractiveRadarUserRecordMapper;
+
 	/**
 	 * 新增互动雷达
 	 */
@@ -77,13 +81,18 @@ public class CorpInteractiveRadarController {
 		search.getDataList().forEach(data -> {
 			if (data.getType() == 1) {
 				String linkInfoStr = data.getLinkInfoStr();
-				try {
-					CorpInteractiveReaderLink linkInfo = Jsons.parseObject(linkInfoStr, CorpInteractiveReaderLink.class);
-					data.setLinkInfo(linkInfo);
-				} catch (Exception e) {
+				if (StrUtil.isNotBlank(linkInfoStr)) {
+					try {
+						CorpInteractiveReaderLink linkInfo = Jsons.parseObject(linkInfoStr, CorpInteractiveReaderLink.class);
+						data.setLinkInfo(linkInfo);
+					} catch (Exception e) {
+					}
 				}
-				data.setClickNum(beanSearcher.searchCount(CorpInteractiveRadarUserRecord.class, MapUtils.builder()
-						.field(CorpInteractiveRadarUserRecord::getRadarId, data.getId()).build()).intValue());
+				Map<String, Long> map = corpInteractiveRadarUserRecordMapper.selectClickRecord(data.getId());
+				Integer clickNum = map.get("clickNum").intValue();
+				data.setClickNum(clickNum);
+				Integer clickUserNum = map.get("clickUserNum").intValue();
+				data.setClickUserNum(clickUserNum);
 
 				CorpInteractiveReaderOrderDetailView detailView = beanSearcher.searchFirst(CorpInteractiveReaderOrderDetailView.class, MapUtils.builder().put("id", String.format("id = %s", data.getId())).build());
 				data.setPayNum(detailView.getTotal());
@@ -111,7 +120,7 @@ public class CorpInteractiveRadarController {
 	public Result<CorpInteractiveRadarOrderDataView> corpInteractiveRadarOrderDataViewResult(@PathVariable Long id) {
 		CorpInteractiveRadarOrderDataView view = new CorpInteractiveRadarOrderDataView();
 		DateTime beginOfDay = DateUtil.beginOfDay(DateTime.now());
-		String idEq = String.format(" cr.id = %s", id);
+		String idEq = String.format(" cr.radar_id = %s", id);
 		String conditionSql = String.format(" %s and cr.created_time >= '%s'", idEq, beginOfDay.toString());
 		CorpInteractiveRadarOrderDataView.CorpInteractiveRadarOrderData today = beanSearcher.searchFirst(CorpInteractiveRadarOrderDataView.CorpInteractiveRadarOrderData.class, MapUtils.builder().put("condition", conditionSql).build());
 

+ 4 - 1
netflix-web/src/main/resources/application.yml

@@ -1 +1,4 @@
-spring:
  profiles:
    active:
      - ${activeProfile}
+spring:
+  profiles:
+    active:
+      - ${activeProfile}