Procházet zdrojové kódy

客服添加客户 客服车票续费跟进;过滤买断制平台

zoujiajian před 2 roky
rodič
revize
7348200bb6
20 změnil soubory, kde provedl 428 přidání a 13 odebrání
  1. 4 0
      netflix-dao/src/main/java/com/cyksj/mapper/GroupsRelationExpiryRecordMapper.java
  2. 6 0
      netflix-dao/src/main/java/com/cyksj/mapper/UserMapper.java
  3. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/corp/CorpUserRelateMapper.java
  4. 3 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/coupon/CouponMapper.java
  5. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/CorpFollow.java
  6. 18 0
      netflix-dao/src/main/java/com/cyksj/model/entity/CorpUserRelate.java
  7. 1 1
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDon.java
  8. 2 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GroupsRelationExpiryRecord.java
  9. 5 0
      netflix-dao/src/main/java/com/cyksj/model/views/BackgroundDataView.java
  10. 24 0
      netflix-dao/src/main/java/com/cyksj/model/views/CorpRenewFollowHeadView.java
  11. 116 0
      netflix-dao/src/main/java/com/cyksj/model/views/CorpRenewFollowView.java
  12. 34 0
      netflix-dao/src/main/java/com/cyksj/model/views/RenewFollowStatisticsView.java
  13. 15 0
      netflix-dao/src/main/resources/mapper/CouponMapper.xml
  14. 4 2
      netflix-dao/src/main/resources/mapper/GroupRelationMapper.xml
  15. 15 0
      netflix-dao/src/main/resources/mapper/GroupsRelationExpiryRecordMapper.xml
  16. 86 4
      netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpEventActionServiceImpl.java
  17. 2 0
      netflix-service/src/main/java/com/cyksj/service/mange/coupon/impl/CouponCommonServiceImpl.java
  18. 30 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/WxCorpController.java
  19. 14 3
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonController.java
  20. 31 3
      netflix-web/src/main/java/com/cyksj/web/controller/manage/group/CmsGroupsRelationExpiryController.java

+ 4 - 0
netflix-dao/src/main/java/com/cyksj/mapper/GroupsRelationExpiryRecordMapper.java

@@ -2,6 +2,9 @@ package com.cyksj.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cyksj.model.entity.GroupsRelationExpiryRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Map;
 
 /*
  *项目名: netflix-job
@@ -11,4 +14,5 @@ import com.cyksj.model.entity.GroupsRelationExpiryRecord;
  */
 public interface GroupsRelationExpiryRecordMapper extends BaseMapper<GroupsRelationExpiryRecord> {
 
+	Map<String, Integer> selectRenewOrderData(@Param("followId") String followId, @Param("startTime") String startTime, @Param("endTime") String endTime);
 }

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

@@ -8,6 +8,7 @@ import org.apache.ibatis.annotations.Update;
 
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Set;
 
 /**
  * @author chan
@@ -62,4 +63,9 @@ public interface UserMapper extends BaseMapper<User> {
 
     @Update("update user set yhs_money = yhs_money - #{subMoney} where id = #{shopUserId} and yhs_money >= #{subMoney} and yhs_money > 0")
     Integer subYhsMoney(@Param("shopUserId") Long shopUserId, @Param("subMoney") BigDecimal subMoney);
+
+    @Select("(select id from user where login_phone = #{phone} limit 1)" +
+            " union all" +
+            " (select email_user_id from user_bind_detail where phone = #{phone} limit 1)")
+    Set<Long> getRelationUserIdsByPhone(String phone);
 }

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/corp/CorpUserRelateMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.corp;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.CorpUserRelate;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: CorpUserRelateMapper
+ * 创建者: JavaZou
+ * 创建时间:2023/11/23 11:06
+ */
+public interface CorpUserRelateMapper extends BaseMapper<CorpUserRelate> {
+}

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/coupon/CouponMapper.java

@@ -9,6 +9,7 @@ import org.apache.ibatis.annotations.Select;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Set;
 
 /*
  *项目名: netflix
@@ -29,4 +30,6 @@ public interface CouponMapper extends BaseMapper<Coupon> {
 
 	@Select("select name from coupon where id = #{couponId}")
 	String getCouponNameById(Long couponId);
+
+	Coupon getRenewCouponBySkuId(@Param("skuId") Long skuId, @Param("couponIds") Set<Long> couponIds);
 }

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CorpFollow.java

@@ -20,6 +20,11 @@ public class CorpFollow extends BaseEntity implements Serializable {
      */
     private String userid;
 
+    /**
+     * 银河后台客服id
+     */
+    private Long cmsUserId;
+
     /**
      * 成员名称
      */

+ 18 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CorpUserRelate.java

@@ -0,0 +1,18 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: CorpUserRelate
+ * 创建者: JavaZou
+ * 创建时间:2023/11/23 11:06
+ */
+@Getter
+@Setter
+public class CorpUserRelate extends BaseEntity{
+	private Long corpUserId;
+
+	private String phone;
+}

+ 1 - 1
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDon.java

@@ -17,7 +17,7 @@ import java.util.List;
  */
 @Getter
 @Setter
-@SearchBean(tables = "goods_don",
+@SearchBean(tables = "goods_don g",
         where = ":condition:")
 public class GoodsDon extends BaseEntity {
 

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

@@ -80,6 +80,8 @@ public class GroupsRelationExpiryRecord extends BaseEntity {
 	 */
 	private String customerService;
 
+	private String followId;
+
 	/**
 	 * 是否跟进
 	 */

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/views/BackgroundDataView.java

@@ -218,4 +218,9 @@ public class BackgroundDataView {
 	 */
 	private BigDecimal yhShopTakeMoney;
 
+	/**
+	 * 私域当日金额
+	 */
+	private BigDecimal privatelyOrderMoney;
+
 }

+ 24 - 0
netflix-dao/src/main/java/com/cyksj/model/views/CorpRenewFollowHeadView.java

@@ -0,0 +1,24 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: CorpRenewFollowHeadView
+ * 创建者: JavaZou
+ * 创建时间:2023/11/16 15:31
+ */
+@Getter
+@Setter
+public class CorpRenewFollowHeadView {
+	/**
+	 * 续费单数
+	 */
+	private Integer renewOrders;
+
+	/**
+	 * 跟进续费单数
+	 */
+	private Integer renewFollowOrders;
+}

+ 116 - 0
netflix-dao/src/main/java/com/cyksj/model/views/CorpRenewFollowView.java

@@ -0,0 +1,116 @@
+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;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: CorpRenewFollowView
+ * 创建者: JavaZou
+ * 创建时间:2023/11/16 15:38
+ */
+@Getter
+@Setter
+@SearchBean(tables = "groups_relation_expiry_record gre inner join goods_don_sku sku on sku.id = gre.sku_id",
+		where = ":nk:")
+public class CorpRenewFollowView {
+
+	@DbField("gre.user_id")
+	private Long userId;
+
+	@DbField("gre.nickname")
+	private String nickname;
+
+	@DbField("gre.goods_id")
+	private Long goodsId;
+
+	@DbField("gre.goods_title")
+	private String goodsTitle;
+
+	@DbField("gre.relation_id")
+	private Long relationId;
+
+	@DbField("gre.start_time")
+	private Date startTime;
+
+	@DbField("gre.expiry_time")
+	private Date expiryTime;
+
+	@DbField("gre.sku_id")
+	private Long skuId;
+
+	@DbField("gre.spec_val")
+	private String specVal;
+
+	@DbField("gre.is_re_buy")
+	private Boolean isReBuy;
+
+	@DbField("gre.re_buy_order_id")
+	private Long reBuyOrderId;
+
+	@DbField("gre.re_buy_time")
+	private Date reBuyTime;
+
+	@DbField("gre.re_buy_goods_id")
+	private Long reBuyGoodsId;
+
+	@DbField("gre.re_buy_goods_title")
+	private String reBuyGoodsTitle;
+
+
+	@DbField("gre.re_buy_sku_id")
+	private Long reBuySkuId;
+
+	@DbField("gre.re_buy_spec_val")
+	private String reBuySpecVal;
+
+	/**
+	 * 分配时间
+	 */
+	@DbField("gre.assign_time")
+	private Date assignTime;
+
+	@DbField("gre.customer_service_id")
+	private Long customerServiceId;
+
+	/**
+	 * 分配客服
+	 */
+	@DbField("gre.customer_service")
+	private String customerService;
+
+	/**
+	 * 是否跟进
+	 */
+	@DbField("gre.is_follow")
+	private Boolean isFollow;
+
+	/**
+	 * 到期状态
+	 * 0已到期
+	 */
+	@DbField("gre.account_status")
+	private Integer accountStatus;
+
+	/**
+	 * 客服id
+	 */
+	@DbField("gre.follow_id")
+	private String followId;
+
+	/**
+	 * 注册环境
+	 */
+	@DbField("gre.register_env")
+	private String registerEnv;
+
+	@DbField("gre.contact")
+	private String contact;
+
+	@DbField("sku.months")
+	private Integer months;
+}

+ 34 - 0
netflix-dao/src/main/java/com/cyksj/model/views/RenewFollowStatisticsView.java

@@ -0,0 +1,34 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: RenewFollowStatisticsView
+ * 创建者: JavaZou
+ * 创建时间:2023/11/17 16:14
+ */
+@Getter
+@Setter
+@SearchBean(tables = "groups_relation_expiry_record",
+		where = ":time:",
+		groupBy = "customer_service_id")
+public class RenewFollowStatisticsView {
+	@DbField("any_value(customer_service)")
+	private String customerService;
+
+	@DbField("count(*)")
+	private Integer assignUsers;
+
+	@DbField("count(if(is_follow = 1,1,NULL))")
+	private Integer followUsers;
+
+	/**
+	 * 跟进且续费的人数
+	 */
+	@DbField("count(if(is_re_buy = 1 and is_follow = 1,1,NULL))")
+	private Integer reBuyUsers;
+}

+ 15 - 0
netflix-dao/src/main/resources/mapper/CouponMapper.xml

@@ -41,4 +41,19 @@
         where cp.deleted is true
           and (cp.ex_code = #{couponExCode} or cdp.ex_code = #{couponExCode}) limit 1
     </select>
+
+    <select id="getRenewCouponBySkuId" resultType="com.cyksj.model.entity.Coupon">
+        select c.id
+        from coupon c
+        inner join coupon_sku cs on cs.coupon_id = c.id and c.deleted is true and cs.deleted is true and
+        cs.sku_id = #{skuId} and c.use_scope = 'renew'
+        <if test="couponIds.size()>0">
+            and c.id not in
+            <foreach collection="couponIds" item="item" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        and c.classification_id = 8
+        order by discount desc limit 1
+    </select>
 </mapper>

+ 4 - 2
netflix-dao/src/main/resources/mapper/GroupRelationMapper.xml

@@ -89,8 +89,10 @@
     </select>
 
     <select id="getBindPhoneByUserId" resultType="java.lang.String">
-        select if(login_phone = '',ud.phone,login_phone) as phone from (select id,login_phone from user where id = #{userId} limit 1) u left join user_bind_detail ud
-        on ud.user_id = u.id
+        select if(login_phone != '', login_phone,
+                  (select phone from user_bind_detail where user_id = #{userId} or email_user_id = #{userId} limit 1))
+        from user
+        where id = #{userId} limit 1
     </select>
 
     <select id="selectViewPwdCount" resultType="java.lang.Integer">

+ 15 - 0
netflix-dao/src/main/resources/mapper/GroupsRelationExpiryRecordMapper.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.cyksj.mapper.GroupsRelationExpiryRecordMapper">
+
+
+    <select id="selectRenewOrderData" resultType="java.util.Map">
+        select COUNT(if(is_follow = 1, 1, NULL)) as renewFollowOrders, COUNT(*) as renewOrders
+        from groups_relation_expiry_record
+        where is_re_buy = 1
+        and re_buy_time between #{startTime} and #{endTime}
+        <if test="followId != null">
+            and follow_id = #{followId}
+        </if>
+    </select>
+</mapper>

+ 86 - 4
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpEventActionServiceImpl.java

@@ -14,22 +14,22 @@ import com.cyksj.common.util.IoKit;
 import com.cyksj.common.util.J11HttpC;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.config.corp.WeChatCorpFactory;
+import com.cyksj.mapper.GroupsRelationExpiryRecordMapper;
 import com.cyksj.mapper.OrderDonMapper;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.corp.*;
+import com.cyksj.mapper.manage.coupon.CouponMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.request.corp.Attachments;
 import com.cyksj.model.request.corp.CorpXmlMessage;
 import com.cyksj.model.request.corp.CorpXmlOutMessage;
 import com.cyksj.model.response.ExternalContact;
 import com.cyksj.model.response.FollowedUser;
-import com.cyksj.model.response.corp.CorpExternalContactInfo;
-import com.cyksj.model.response.corp.CorpUserExternalTagGroupInfo;
-import com.cyksj.model.response.corp.CorpUserExternalTagGroupList;
-import com.cyksj.service.corp.CorpService;
 import com.cyksj.model.response.corp.*;
 import com.cyksj.model.views.CorpUserSearchView;
+import com.cyksj.model.views.RenewalView;
 import com.cyksj.redis.RedisService;
+import com.cyksj.service.corp.CorpService;
 import com.cyksj.service.corp.WxCorpOps;
 import com.cyksj.service.corp.msg.CorpEventActionService;
 import com.cyksj.service.mange.coupon.CouponCommonService;
@@ -110,6 +110,12 @@ public class CorpEventActionServiceImpl implements CorpEventActionService {
 
 	private final BeanSearcher beanSearcher;
 
+	private final CouponMapper couponMapper;
+
+	private final GroupsRelationExpiryRecordMapper groupsRelationExpiryRecordMapper;
+
+	private final CorpUserRelateMapper corpUserRelateMapper;
+
 	private static final String DEFAULT_MSG = "您好,欢迎加入银河录像局";
 
 	/**
@@ -739,6 +745,27 @@ public class CorpEventActionServiceImpl implements CorpEventActionService {
 		} else {
 			corpUserMapper.updateById(corpUser);
 		}
+		followedUsers.forEach(followedUser -> {
+			//备注手机号  客服跟进用户年付续费
+			String description = followedUser.getDescription();
+			if (Validator.isMobile(description)) {
+				THREAD_POOL.execute(() ->{
+					CorpUserRelate corpUserRelate = corpUserRelateMapper.selectOne(Wrappers.lambdaQuery(CorpUserRelate.class)
+							.eq(CorpUserRelate::getCorpUserId, corpUser.getId()).last("limit 1"));
+					if (corpUserRelate != null) {
+						corpUserRelate.setPhone(description);
+						corpUserRelateMapper.updateById(corpUserRelate);
+					} else {
+						corpUserRelate = new CorpUserRelate();
+						corpUserRelate.setCorpUserId(corpUser.getId());
+						corpUserRelate.setPhone(description);
+						corpUserRelateMapper.insert(corpUserRelate);
+					}
+					//客服续费跟进
+					corpRenewFollowUser(description);
+				});
+			}
+		});
 		return corpUser;
 	}
 
@@ -850,4 +877,59 @@ public class CorpEventActionServiceImpl implements CorpEventActionService {
 
 		}
 	}
+
+	/**
+	 * 客服备注手机号 跟进用户年付车票续费
+	 */
+	public void corpRenewFollowUser(String phone) {
+		//是否是手机用户 或者 邮箱用户
+		Set<Long> relationUserIds = userMapper.getRelationUserIdsByPhone(phone);
+		if (CollUtil.isEmpty(relationUserIds)) {
+			return;
+		}
+		List<RenewalView> list = beanSearcher.searchAll(RenewalView.class, MapUtils.builder()
+				.field(RenewalView::getUserId, 0).op(Operator.NotEqual)
+				.field(RenewalView::getUserId, relationUserIds).op(Operator.InList)
+				.field(RenewalView::getYhsId, 0)
+				//年付
+				.field(RenewalView::getMonths, 12)
+				.field(RenewalView::getExpiryTime, DateTime.now()).op(Operator.GreaterThan)
+				.onlySelect(RenewalView::getUserId, RenewalView::getExpiryTime, RenewalView::getSkuId)
+				.build());
+		Set<Long> couponIds = new HashSet<>();
+
+		List<CouponUser> sendCouponUser = new ArrayList<>();
+
+		list.forEach(renew->{
+			Date expiryTime = renew.getExpiryTime();
+			Long skuId = renew.getSkuId();
+			Long userId = renew.getUserId();
+
+			//一个月车票将过期
+			if (expiryTime.before(DateUtil.offsetMonth(DateTime.now(), 1))) {
+				//续费分类下
+				//寻找对应续费的优惠券 发送
+				Coupon coupon = couponMapper.getRenewCouponBySkuId(skuId, couponIds);
+				if (coupon != null) {
+					CouponUser couponUser = new CouponUser();
+					couponUser.setUserId(userId);
+					couponUser.setCouponId(coupon.getId());
+					sendCouponUser.add(couponUser);
+
+					couponIds.add(coupon.getId());
+				}
+			}
+		});
+		//有几张过期的年付车票 发对应几张续费优惠券
+		if (CollUtil.isNotEmpty(sendCouponUser)) {
+			sendCouponUser.forEach(send -> {
+				couponCommonService.sendCouponToUser(send.getUserId(), send.getCouponId(), null, null, null, CouponUser.Channel.wxCorp);
+				//跟进用户续费
+				groupsRelationExpiryRecordMapper.update(null, Wrappers.lambdaUpdate(GroupsRelationExpiryRecord.class)
+						.set(GroupsRelationExpiryRecord::getIsFollow, true)
+						.eq(GroupsRelationExpiryRecord::getUserId, send.getUserId())
+						.eq(GroupsRelationExpiryRecord::getIsFollow, false));
+			});
+		}
+	}
 }

+ 2 - 0
netflix-service/src/main/java/com/cyksj/service/mange/coupon/impl/CouponCommonServiceImpl.java

@@ -6,6 +6,7 @@ import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.mapper.GoodsDonMapper;
 import com.cyksj.mapper.GoodsDonSkuMapper;
+import com.cyksj.mapper.GroupsRelationExpiryRecordMapper;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.manage.coupon.*;
 import com.cyksj.model.entity.*;
@@ -53,6 +54,7 @@ public class CouponCommonServiceImpl implements CouponCommonService {
 
 	private final CouponFontService couponFontService;
 
+	private final GroupsRelationExpiryRecordMapper groupsRelationExpiryRecordMapper;
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public void saveCoupon(Coupon coupon) throws Exception {

+ 30 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/WxCorpController.java

@@ -1,5 +1,7 @@
 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 cn.hutool.http.HttpUtil;
 import com.cyksj.common.snowflake.Sequence;
@@ -12,11 +14,14 @@ import com.cyksj.dto.CorpJsSdkTicket;
 import com.cyksj.dto.CorpOauth2UserInfo;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.GroupsRelationCustomerServiceFollowRecordMapper;
+import com.cyksj.mapper.GroupsRelationExpiryRecordMapper;
 import com.cyksj.model.dto.AuthRedirect;
 import com.cyksj.model.entity.CorpFollow;
 import com.cyksj.model.views.YHLXUserDetailView;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.corp.CorpService;
+import com.ejlchina.searcher.BeanSearcher;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -49,6 +54,12 @@ public class WxCorpController {
 
 	private final RedisService redisService;
 
+	private final BeanSearcher beanSearcher;
+
+	private final GroupsRelationExpiryRecordMapper groupsRelationExpiryRecordMapper;
+
+	private final GroupsRelationCustomerServiceFollowRecordMapper relationCustomerServiceFollowRecordMapper;
+
 	private final static String CORP_UUID = "corp-uuid";
 
 	/**
@@ -189,6 +200,10 @@ public class WxCorpController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult(jsSdkTicket);
 	}
 
+	public String getCorpUuid(){
+		return Optional.ofNullable(request.getHeader(CORP_UUID)).orElse(StringUtil.EMPTY);
+	}
+
 
 	/**
 	 * 初始化企业微信入库信息
@@ -207,4 +222,19 @@ public class WxCorpController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult(detailView);
 	}
 
+	/**
+	 * 企微 续费跟进头部数据
+	 */
+	@GetMapping("/get/corpRenewFollow/head/data")
+	public Result<Map<String, Integer>> getCorpRenewFollowHeadView(String startTime, String endTime) {
+		String followId = getCorpUuid();
+		if (startTime == null) {
+			startTime = DateUtil.beginOfDay(DateTime.now()).toString();
+		}
+		if (endTime == null) {
+			endTime = DateUtil.endOfDay(DateTime.now()).toString();
+		}
+		Map<String, Integer> map = groupsRelationExpiryRecordMapper.selectRenewOrderData(followId, startTime, endTime);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(map);
+	}
 }

+ 14 - 3
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonController.java

@@ -21,6 +21,8 @@ import com.cyksj.service.mange.CmsGoodsDonService;
 import com.cyksj.service.mange.GoodsDonCategoryService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapBuilder;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -193,10 +195,19 @@ public class CmsGoodsDonController {
      * 获取所有平台列表
      */
     @GetMapping("/get/all")
-    public Result<List<GoodsDon>> getAllGoodsList() {
-        List<GoodsDon> goodsDons = beanSearcher.searchAll(GoodsDon.class, MapUtils.flatBuilder(request.getParameterMap())
+    public Result<List<GoodsDon>> getAllGoodsList(Boolean isNoBuyout) {
+        MapBuilder mapBuilder = MapUtils.flatBuilder(request.getParameterMap());
+        //过滤买断制 平台
+        String conditionSql;
+        if (isNoBuyout != null && isNoBuyout) {
+            mapBuilder.field(GoodsDon::getSpecialType).op(Operator.IsNull);
+            conditionSql = "(select count(*) from goods_don_sku sku where sku.goods_id = g.id and sku.months = 300) = 0";
+        } else {
+            conditionSql = "(special_type is null or special_type != 'giftCard')";
+        }
+        List<GoodsDon> goodsDons = beanSearcher.searchAll(GoodsDon.class, mapBuilder
+                .put("condition", conditionSql)
                 .field(GoodsDon::getDeleted, true)
-                .put("condition", "(special_type is null or special_type != 'giftCard')")
                 .onlySelect(GoodsDon::getId, GoodsDon::getCategory, GoodsDon::getType, GoodsDon::getTitle, GoodsDon::getSecondType).build());
         return GatewayResponse.SUCCESS.newBuilder().toResult(goodsDons);
     }

+ 31 - 3
netflix-web/src/main/java/com/cyksj/web/controller/manage/group/CmsGroupsRelationExpiryController.java

@@ -13,6 +13,7 @@ import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.corp.CorpUserMapper;
 import com.cyksj.mapper.market.task.UserBindDetailMapper;
 import com.cyksj.model.entity.*;
+import com.cyksj.model.views.RenewFollowStatisticsView;
 import com.cyksj.service.user.UserBackService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
@@ -23,6 +24,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 import java.util.Optional;
 
 /*
@@ -68,12 +70,15 @@ public class CmsGroupsRelationExpiryController {
 			}
 		}
 		SearchResult<GroupsRelationExpiryRecord> search = beanSearcher.search(GroupsRelationExpiryRecord.class, builder
+				.field(GroupsRelationExpiryRecord::getIsFollow, false)
+				.orderBy(GroupsRelationExpiryRecord::getAssignTime).desc()
+				.orderBy(GroupsRelationExpiryRecord::getIsFollow).asc()
 				.build());
 		search.getDataList().forEach(data -> {
 			if (Constant.TRACK_RENEW_TYPE.contains(data.getRegister())) {
 				UserBindDetail userBindDetail = userBindDetailMapper.selectOne(Wrappers.lambdaQuery(UserBindDetail.class)
-						.eq(Constant.TRACK_RENEW_TYPE.get(0).equals(data.getRegister()),UserBindDetail::getEmailUserId, data.getUserId())
-						.eq(Constant.TRACK_RENEW_TYPE.get(1).equals(data.getRegister()),UserBindDetail::getUserId, data.getUserId())
+						.eq(Constant.TRACK_RENEW_TYPE.get(0).equals(data.getRegister()), UserBindDetail::getEmailUserId, data.getUserId())
+						.eq(Constant.TRACK_RENEW_TYPE.get(1).equals(data.getRegister()), UserBindDetail::getUserId, data.getUserId())
 						.ne(UserBindDetail::getPhone, StrUtil.EMPTY)
 						.last("limit 1"));
 				if (userBindDetail != null) {
@@ -82,7 +87,7 @@ public class CmsGroupsRelationExpiryController {
 				if (Constant.TRACK_RENEW_TYPE.get(1).equals(data.getRegister())) {
 					//实时获取企业微信昵称
 					Optional.ofNullable(corpUserMapper.selectOne(Wrappers.lambdaQuery(CorpUser.class)
-							.eq(CorpUser::getUserId, data.getUserId()).last("limit 1")))
+									.eq(CorpUser::getUserId, data.getUserId()).last("limit 1")))
 							.ifPresent(cu -> {
 								data.setCorpUserName(cu.getName());
 								data.setCorpHeadImgUrl(cu.getAvatar());
@@ -127,4 +132,27 @@ public class CmsGroupsRelationExpiryController {
 		groupsRelationExpiryRecordMapper.updateById(groupsRelationExpiryRecord);
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
+
+	/**
+	 * 跟进统计
+	 */
+	@GetMapping("/get/renewFollow/statistics")
+	public Result<List<RenewFollowStatisticsView>> getRenewFollowStatisticsData(String startTime, String endTime) {
+		MapBuilder builder = MapUtils.builder();
+		String timeSql = StrUtil.EMPTY;
+		if (StrUtil.isNotEmpty(startTime)) {
+			timeSql += String.format("assign_time >= '%s'", startTime);
+		}
+		if (StrUtil.isNotEmpty(endTime)) {
+			if (StrUtil.isNotEmpty(timeSql)) {
+				timeSql += " and ";
+			}
+			timeSql += String.format("assign_time < '%s'", endTime);
+		}
+		List<RenewFollowStatisticsView> renewFollowStatisticsViews = beanSearcher.searchAll(RenewFollowStatisticsView.class, builder
+				.put("time", timeSql)
+				.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(renewFollowStatisticsViews);
+	}
+
 }