Эх сурвалжийг харах

群发任务每次发送统一记录;指定发送客服配置选择

zoujiajian 3 жил өмнө
parent
commit
f182960001

+ 2 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -125,4 +125,6 @@ public interface Constant {
 	 * 普通推广 关联优惠券id
 	 */
 	Long GENERAL_POPULARIZE_COUPON_ID = 111l;
+
+	String CORP_SERVICE_FOLLOWS_KEY = "corp_service_follows_key";
 }

+ 1 - 1
netflix-dao/src/main/java/com/cyksj/mapper/corp/CorpUserFollowRelationMapper.java

@@ -15,5 +15,5 @@ public interface CorpUserFollowRelationMapper extends BaseMapper<CorpUserFollowR
 
 	String selectCorpCustomers(@Param("unionid") String unionid, @Param("wxCorpId") Long wxCorpId);
 
-	List<CorpUserFollowRelationDto> selectCorpUserFollowRelationByTagIds(@Param("list") List<String> tagIds, @Param("wxCorpId") Long wxCorpId);
+	List<CorpUserFollowRelationDto> selectCorpUserFollowRelationByTagIds(@Param("list") List<String> tagIds, @Param("wxCorpId") Long wxCorpId, @Param("followIds") List<String> followIds);
 }

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CorpMsgBulkTaskRecord.java

@@ -54,6 +54,8 @@ public class CorpMsgBulkTaskRecord implements Serializable {
 
 	private Integer total;
 
+	private Long sendId;
+
 	/**
 	 * 成员是否发送,true已发送
 	 */

+ 59 - 0
netflix-dao/src/main/java/com/cyksj/model/views/CorpMsgBulkTaskCorpFollowSendRecordView.java

@@ -0,0 +1,59 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: CorpMsgBulkTaskSendRecordView
+ *创建者: JavaZou
+ *创建时间:2023/6/21 11:42
+ */
+@Getter
+@Setter
+@SearchBean(tables = "(select * from corp_msg_bulk_task_record where :send_id:) cmr left join corp_user_send_record cr on cr.corp_msg_record_id = cmr.id" +
+		" left join corp_follow cf on cf.userid = cmr.follow_id and cf.wx_corp_id = cmr.corp_id",
+		groupBy = "cmr.msgid")
+public class CorpMsgBulkTaskCorpFollowSendRecordView {
+
+	@DbField("cmr.msgid")
+	private String msgid;
+
+	/**
+	 * 总数
+	 */
+	@DbField("count(cr.id)")
+	private Integer total;
+
+	/**
+	 * 送达
+	 */
+	@DbField("count(if(cr.status = 1,cr.id,null))")
+	private Integer send;
+
+	/**
+	 * 未送达
+	 */
+	@DbField("count(if(cr.status != 1,cr.id,null))")
+	private Integer notSend;
+
+	/**
+	 * true已发送 一个未发
+	 */
+	@DbField("any_value(cmr.status)")
+	private Boolean status;
+
+	/**
+	 * 客服
+	 */
+	@DbField("any_value(cf.name)")
+	private String followName;
+
+	@DbField("any_value(cmr.created_time)")
+	private Date createTime;
+
+}

+ 3 - 9
netflix-dao/src/main/java/com/cyksj/model/views/CorpMsgBulkTaskSendRecordView.java

@@ -16,11 +16,11 @@ import java.util.Date;
 @Getter
 @Setter
 @SearchBean(tables = "(select * from corp_msg_bulk_task_record where :task_id:) cmr left join corp_user_send_record cr on cr.corp_msg_record_id = cmr.id",
-		groupBy = "cmr.msgid")
+		groupBy = "cmr.send_id")
 public class CorpMsgBulkTaskSendRecordView {
 
-	@DbField("cmr.msgid")
-	private String msgid;
+	@DbField("cmr.send_id")
+	private Long senId;
 
 	/**
 	 * 总数
@@ -40,12 +40,6 @@ public class CorpMsgBulkTaskSendRecordView {
 	@DbField("count(if(cr.status != 1,cr.id,null))")
 	private Integer notSend;
 
-	/**
-	 * true已发送 一个未发
-	 */
-	@DbField("any_value(cmr.status)")
-	private Boolean status;
-
 	@DbField("any_value(cmr.created_time)")
 	private Date createTime;
 

+ 6 - 0
netflix-dao/src/main/resources/mapper/CorpUserFollowRelationMapper.xml

@@ -26,6 +26,12 @@
         left join `corp_user_auth` ca on ca.external_userid = cufr.corp_user_id
         left join `corp_user` cu on cu.id = ca.corp_user_id
         where cufr.wx_corp_id = #{wxCorpId} and cu.user_id != 0
+        <if test="followIds != null and followIds.size() > 0">
+            and cufr.follow_id in
+            <foreach collection="followIds" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
         group by cufr.corp_user_id
     </select>
 </mapper>

+ 21 - 2
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpMsgBulkTaskServiceImpl.java

@@ -9,7 +9,9 @@ import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.snowflake.Sequence;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.StringUtil;
@@ -28,6 +30,7 @@ import com.cyksj.service.corp.CorpMsgBulkTaskService;
 import com.cyksj.service.corp.CorpService;
 import com.cyksj.service.corp.CorpUserSendRecordService;
 import com.cyksj.service.corp.WxCorpOps;
+import com.cyksj.service.sys.SysConfigService;
 import com.cyksj.xxljob.XxlJobInfo;
 import com.cyksj.xxljob.XxlJobUtil;
 import com.google.common.collect.Lists;
@@ -74,10 +77,14 @@ public class CorpMsgBulkTaskServiceImpl extends ServiceImpl<CorpMsgBulkTaskMappe
 
 	private final CorpMsgBulkTaskTagRelationMapper corpMsgBulkTaskTagRelationMapper;
 
+	private final SysConfigService sysConfigService;
+
 	private final RedisService redisService;
 
 	private final int LIMIT = 10000;
 
+	private static final Sequence SEQUENCE = new Sequence(0);
+
 	private static final GlobalThreadPoolTaskExecutor TASK_EXECUTOR = GlobalThreadPoolTaskExecutor.getInstance();
 
 	@Override
@@ -155,7 +162,17 @@ public class CorpMsgBulkTaskServiceImpl extends ServiceImpl<CorpMsgBulkTaskMappe
 		WxCorpApp wxCorpApp = wxCorpAppMapper.selectById(corpMsgBulkTask.getWxCorpId());
 		Assert.notNull(wxCorpApp, "企业微信未配置");
 		List<String> tagIds = Jsons.parseList(corpMsgBulkTask.getChooseTagStr(), String.class);
-		List<CorpUserFollowRelationDto> corpUserFollowRelations = corpUserFollowRelationMapper.selectCorpUserFollowRelationByTagIds(tagIds, wxCorpApp.getId());
+		//客服集合
+		List<String> service_follow_ids = null;
+		SysConfig serviceConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
+				.eq(SysConfig::getSysKey, Constant.CORP_SERVICE_FOLLOWS_KEY).last("limit 1"));
+		if (serviceConfig != null && StrUtil.isNotBlank(serviceConfig.getSysValue())) {
+			try {
+				service_follow_ids = Jsons.parseList(serviceConfig.getSysValue(), String.class);
+			} catch (Exception e) {
+			}
+		}
+		List<CorpUserFollowRelationDto> corpUserFollowRelations = corpUserFollowRelationMapper.selectCorpUserFollowRelationByTagIds(tagIds, wxCorpApp.getId(), service_follow_ids);
 		//将成员与客户相同关联聚合
 		Map<String, List<CorpUserFollowRelationDto>> userRelationMap = corpUserFollowRelations.stream().collect(Collectors.groupingBy(CorpUserFollowRelationDto::getFollowId));
 		//附件
@@ -218,6 +235,7 @@ public class CorpMsgBulkTaskServiceImpl extends ServiceImpl<CorpMsgBulkTaskMappe
 			corpMsgTemplate.setText(text);
 		}
 		// 每一万条发一次
+		Long sendId = SEQUENCE.nextId();
 		collect.forEach((followId, val) -> {
 			try {
 				List<String> extendIds = new ArrayList<>(val.size());
@@ -227,7 +245,7 @@ public class CorpMsgBulkTaskServiceImpl extends ServiceImpl<CorpMsgBulkTaskMappe
 				}
 				for (CorpUserFollowRelationDto dto : val) {
 					extendIds.add(dto.getCorpUserId());
-					if (dto.getUserId() != null) {
+					if (userIds != null && dto.getUserId() != null) {
 						userIds.add(dto.getUserId());
 					}
 				}
@@ -245,6 +263,7 @@ public class CorpMsgBulkTaskServiceImpl extends ServiceImpl<CorpMsgBulkTaskMappe
 					corpMsgBulkTaskRecord.setTotal(corpUserIdList.size());
 					//该企业微信下的企业成员id
 					corpMsgBulkTaskRecord.setFollowId(followId);
+					corpMsgBulkTaskRecord.setSendId(sendId);
 					//该企业微信群发任务返回的msgid
 					corpMsgTemplate.setExternalUserid(null);
 					String content = Jsons.toJson(corpMsgTemplate);

+ 14 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/CorpMsgBulkTaskController.java

@@ -14,6 +14,7 @@ import com.cyksj.model.dto.CornMetaDto;
 import com.cyksj.model.entity.CorpMsgBulkTask;
 import com.cyksj.model.entity.CorpTag;
 import com.cyksj.model.request.corp.Attachments;
+import com.cyksj.model.views.CorpMsgBulkTaskCorpFollowSendRecordView;
 import com.cyksj.model.views.CorpMsgBulkTaskSendRecordView;
 import com.cyksj.service.corp.CorpMsgBulkTaskService;
 import com.cyksj.xxljob.XxlJobUtil;
@@ -160,6 +161,19 @@ public class CorpMsgBulkTaskController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 
+	/**
+	 * 群发记录 客服发送详情
+	 */
+	@GetMapping("/get/corpFollow/sendRecord/{id}")
+	public Result<SearchResult<CorpMsgBulkTaskCorpFollowSendRecordView>> getCorpFollowSendRecord(@PathVariable Long id) {
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		builder.put("send_id", String.format("send_id = %s", id));
+		SearchResult<CorpMsgBulkTaskCorpFollowSendRecordView> search = beanSearcher.search(CorpMsgBulkTaskCorpFollowSendRecordView.class, builder
+				.orderBy(CorpMsgBulkTaskCorpFollowSendRecordView::getCreateTime).desc()
+				.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
 	/**
 	 * 提醒群发
 	 */