zoujiajian 3 лет назад
Родитель
Сommit
01e67ac6ba
22 измененных файлов с 652 добавлено и 19 удалено
  1. 18 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/CustomerServiceEveryMonthDetailMapper.java
  2. 19 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/RealGoodsOrderHandleMapper.java
  3. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/StatisticsCustomerServiceEveryMonthMapper.java
  4. 3 3
      netflix-dao/src/main/java/com/cyksj/mapper/manage/statistics/StatisticsUserDataMapper.java
  5. 24 0
      netflix-dao/src/main/java/com/cyksj/model/dto/SysCustomerServiceDto.java
  6. 36 0
      netflix-dao/src/main/java/com/cyksj/model/entity/CustomerServiceEveryMonthDetail.java
  7. 78 0
      netflix-dao/src/main/java/com/cyksj/model/entity/RealGoodsOrderHandle.java
  8. 26 0
      netflix-dao/src/main/java/com/cyksj/model/entity/StatisticsCustomerServiceEveryMonth.java
  9. 20 0
      netflix-dao/src/main/java/com/cyksj/model/entity/StatisticsUserData.java
  10. 6 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonView.java
  11. 28 0
      netflix-dao/src/main/java/com/cyksj/model/request/RealGoodsServiceReq.java
  12. 43 0
      netflix-dao/src/main/java/com/cyksj/model/views/CorpUserTagView.java
  13. 30 0
      netflix-dao/src/main/java/com/cyksj/model/views/CustomerServiceHandleOrderToMonthView.java
  14. 26 0
      netflix-dao/src/main/java/com/cyksj/model/views/StatisticsCustomerDataView.java
  15. 20 0
      netflix-dao/src/main/java/com/cyksj/model/views/StatisticsCustomerServiceEveryMonthView.java
  16. 21 2
      netflix-dao/src/main/java/com/cyksj/model/views/StatisticsUserDataView.java
  17. 10 0
      netflix-dao/src/main/resources/mapper/CustomerServiceEveryMonthDetailMapper.xml
  18. 34 0
      netflix-dao/src/main/resources/mapper/RealGoodsOrderHandleMapper.xml
  19. 81 0
      netflix-service/src/main/java/com/cyksj/task/OrderCustomerHandleScheduler.java
  20. 12 0
      netflix-service/src/main/java/com/cyksj/task/StatisticsDataScheduler.java
  21. 54 2
      netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java
  22. 50 12
      netflix-web/src/main/java/com/cyksj/web/controller/manage/statistics/StatisticsDataController.java

+ 18 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/CustomerServiceEveryMonthDetailMapper.java

@@ -0,0 +1,18 @@
+package com.cyksj.mapper.manage;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.CustomerServiceEveryMonthDetail;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: CustomerServiceHandleOrderEveryMonthMapper
+ *创建者: JavaZou
+ *创建时间:2022/11/29 17:08
+ */
+public interface CustomerServiceEveryMonthDetailMapper extends BaseMapper<CustomerServiceEveryMonthDetail> {
+
+	List<CustomerServiceEveryMonthDetail> getDetailData(@Param("type") Integer type, @Param("statisticsId") Long statisticsId);
+}

+ 19 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/RealGoodsOrderHandleMapper.java

@@ -0,0 +1,19 @@
+package com.cyksj.mapper.manage;
+
+import cn.hutool.core.date.DateTime;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.RealGoodsOrderHandle;
+import com.cyksj.model.views.CustomerServiceHandleOrderToMonthView;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: RealGoodsOrderHandleMapper
+ *创建者: JavaZou
+ *创建时间:2022/11/29 16:53
+ */
+public interface RealGoodsOrderHandleMapper extends BaseMapper<RealGoodsOrderHandle> {
+	List<CustomerServiceHandleOrderToMonthView> selectCustomerToMonthData(@Param("now") DateTime now, @Param("begin") DateTime begin, @Param("list") List<String> noOrderStatus, @Param("type") Integer type);
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/StatisticsCustomerServiceEveryMonthMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.StatisticsCustomerServiceEveryMonth;
+
+/*
+ *项目名: netflix
+ *文件名: StatisticsCustomerServiceEveryMonthMapper
+ *创建者: JavaZou
+ *创建时间:2022/11/30 10:56
+ */
+public interface StatisticsCustomerServiceEveryMonthMapper extends BaseMapper<StatisticsCustomerServiceEveryMonth> {
+}

+ 3 - 3
netflix-dao/src/main/java/com/cyksj/mapper/manage/statistics/StatisticsUserDataMapper.java

@@ -20,9 +20,6 @@ public interface StatisticsUserDataMapper extends BaseMapper<StatisticsUserData>
 	@Select("select count(distinct unionid) from user where update_time between #{yesZeroDate} and #{thisZeroDate} and unionid != ''")
 	Integer getNumOfActiveUser(@Param("yesZeroDate") Date yesZeroDate, @Param("thisZeroDate") Date thisZeroDate);
 
-	@Select("select count(distinct unionid) from user where unionid != ''")
-	Integer getWxTotalOfUser();
-
 	@Select("select count(*) from user where login_phone != ''")
 	Integer getPcTotalOfUser();
 
@@ -31,4 +28,7 @@ public interface StatisticsUserDataMapper extends BaseMapper<StatisticsUserData>
 
 	@Select("select count(*) from user where update_time between #{yesZeroDate} and #{thisZeroDate} and login_phone != ''")
 	Integer getPcNumOfActiveUser(@Param("yesZeroDate") Date yesZeroDate, @Param("thisZeroDate") Date thisZeroDate);
+
+	@Select("select count(*) from user_distribute_shared where created_time between #{yesZeroDate} and #{thisZeroDate}")
+	Integer getNumOfDistributeUserToday(@Param("yesZeroDate") Date yesZeroDate, @Param("thisZeroDate") Date thisZeroDate);
 }

+ 24 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/SysCustomerServiceDto.java

@@ -0,0 +1,24 @@
+package com.cyksj.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: SysCustomerService
+ *创建者: JavaZou
+ *创建时间:2022/11/30 10:35
+ */
+@Getter
+@Setter
+public class SysCustomerServiceDto {
+	/**
+	 * 客服名称
+	 */
+	private String name;
+
+	/**
+	 * 客服二维码
+	 */
+	private String img;
+}

+ 36 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CustomerServiceEveryMonthDetail.java

@@ -0,0 +1,36 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: CustomerServiceHandleOrderEveryMonth
+ *创建者: JavaZou
+ *创建时间:2022/11/29 17:06
+ */
+@Getter
+@Setter
+public class CustomerServiceEveryMonthDetail extends BaseEntity{
+
+	private String customerServiceName;
+
+	private Long statisticsId;
+
+	/**
+	 * 1售前,2售后
+	 */
+	private Integer type;
+
+	/**
+	 * 订单数量
+	 */
+	private Integer numOfOrder;
+
+	/**
+	 * 金额
+	 */
+	private BigDecimal money;
+}

+ 78 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/RealGoodsOrderHandle.java

@@ -0,0 +1,78 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: RealGoodsOrderHandle
+ *创建者: JavaZou
+ *创建时间:2022/11/29 16:41
+ */
+@Getter
+@Setter
+@SearchBean(tables = "real_goods_order_handle rh left join order_don od on od.id = rh.order_id")
+public class RealGoodsOrderHandle{
+	@TableId(value = "id",type = IdType.AUTO)
+	@DbField("rh.id")
+	private Long id;
+
+	@DbField("rh.order_id")
+	private Long orderId;
+
+	/**
+	 * 售前客服名称
+	 */
+	@DbField("rh.before_service_name")
+	private String beforeServiceName;
+
+	/**
+	 * 售后客服名称
+	 */
+	@DbField("rh.after_service_name")
+	private String afterServiceName;
+
+	/**
+	 * 售前操作更换次数
+	 */
+	@DbField("rh.before_op_num")
+	private Integer beforeOpNum;
+
+	/**
+	 * 售后操作更换次数
+	 */
+	@DbField("rh.after_op_num")
+	private Integer afterOpNum;
+
+	@DbField("od.status")
+	@TableField(exist = false)
+	private OrderDon.Status status;
+
+	@DbField("od.money")
+	@TableField(exist = false)
+	private BigDecimal money;
+
+	/**
+	 * 创建时间
+	 */
+
+	@DbField("rh.created_time")
+	@TableField(fill = FieldFill.INSERT)
+	private Date createdTime;
+
+	/**
+	 * 修改时间
+	 */
+	@DbField("rh.update_time")
+	@TableField(fill = FieldFill.INSERT_UPDATE)
+	private Date updateTime;
+}

+ 26 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/StatisticsCustomerServiceEveryMonth.java

@@ -0,0 +1,26 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: StatisticsCustomerServiceEveryMonth
+ *创建者: JavaZou
+ *创建时间:2022/11/30 10:55
+ */
+@Getter
+@Setter
+public class StatisticsCustomerServiceEveryMonth extends BaseEntity {
+	@DbField("statistics_data")
+	private String statisticsData;
+
+	@DbIgnore
+	@TableField(exist = false)
+	List<CustomerServiceEveryMonthDetail> details;
+}

+ 20 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/StatisticsUserData.java

@@ -44,5 +44,25 @@ public class StatisticsUserData extends BaseEntity{
 	 */
 	private Integer pcNumOfActiveUser;
 
+	/**
+	 * 通过分销新增的用户数
+	 */
+	private Integer numOfDistributeUser;
+
+	/**
+	 * 新加企业微信用户数
+	 */
+	private Integer numOfCorpUser;
+
+	/**
+	 * 企业微信设备标签人数
+	 */
+	private Integer numOfCorpEquipmentUser;
+
+	/**
+	 * 企业微信账号标签人数
+	 */
+	private Integer numOfCorpAccountUser;
+
 	private Date statisticsDate;
 }

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonView.java

@@ -81,4 +81,10 @@ public class OrderDonView {
 
     @DbIgnore
     private OrderDonTransport transport;
+
+    @DbIgnore
+    private String beforeServiceName;
+
+    @DbIgnore
+    private String afterServiceName;
 }

+ 28 - 0
netflix-dao/src/main/java/com/cyksj/model/request/RealGoodsServiceReq.java

@@ -0,0 +1,28 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/*
+ *项目名: netflix
+ *文件名: RealGoodsServiceReq
+ *创建者: JavaZou
+ *创建时间:2022/11/30 12:26
+ */
+@Getter
+@Setter
+public class RealGoodsServiceReq {
+	@NotNull
+	private Long orderId;
+	/**
+	 * 售前
+	 */
+	private String beforeServiceName;
+
+	/**
+	 * 售后
+	 */
+	private String afterServiceName;
+}

+ 43 - 0
netflix-dao/src/main/java/com/cyksj/model/views/CorpUserTagView.java

@@ -0,0 +1,43 @@
+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
+ *文件名: CorpUserTagView
+ *创建者: JavaZou
+ *创建时间:2022/11/29 16:02
+ */
+@Getter
+@Setter
+@SearchBean(tables = "corp_user cu left join corp_user_follow_relation cfr on cfr.corp_user_id = cu.external_userid" +
+		" left join corp_user_tag ct on ct.relation_id = cfr.id")
+public class CorpUserTagView {
+	/**
+	 * 用户id
+	 */
+	@DbField("cu.id")
+	private Long corpUserId;
+
+	@DbField("cu.external_userid")
+	private Long externalUserid;
+
+	@DbField("cu.unionid")
+	private String unionid;
+
+	/**
+	 * 外部联系人的类型,1表示该外部联系人是微信用户,2表示该外部联系人是企业微信用户
+	 */
+	private Integer type;
+
+	@DbField("ct.tag_name")
+	private String tagName;
+
+	@DbField("cu.created_time")
+	private Date createdTime;
+}

+ 30 - 0
netflix-dao/src/main/java/com/cyksj/model/views/CustomerServiceHandleOrderToMonthView.java

@@ -0,0 +1,30 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: CustomerServiceHandleOrderToMonthView
+ *创建者: JavaZou
+ *创建时间:2022/11/30 9:53
+ */
+@Getter
+@Setter
+public class CustomerServiceHandleOrderToMonthView {
+	private String beforeServiceName;
+
+	private String afterServiceName;
+
+	/**
+	 * 订单数量
+	 */
+	private Integer numOfOrder;
+
+	/**
+	 * 金额
+	 */
+	private BigDecimal money;
+}

+ 26 - 0
netflix-dao/src/main/java/com/cyksj/model/views/StatisticsCustomerDataView.java

@@ -0,0 +1,26 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.StatisticsCustomerServiceEveryMonth;
+import com.ejlchina.searcher.SearchResult;
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: StatisticsCustomerDataView
+ *创建者: JavaZou
+ *创建时间:2022/11/29 17:24
+ */
+@Getter
+@Setter
+public class StatisticsCustomerDataView {
+	/**
+	 * 这个月实时数据
+	 */
+	private StatisticsCustomerServiceEveryMonthView toMonth;
+
+	/**
+	 * 往月数据
+	 */
+	private SearchResult<StatisticsCustomerServiceEveryMonth> monthData;
+}

+ 20 - 0
netflix-dao/src/main/java/com/cyksj/model/views/StatisticsCustomerServiceEveryMonthView.java

@@ -0,0 +1,20 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: StatisticsCustomerServiceEveryMonthView
+ *创建者: JavaZou
+ *创建时间:2022/11/30 11:30
+ */
+@Getter
+@Setter
+public class StatisticsCustomerServiceEveryMonthView {
+	private String statisticsData;
+
+	List<CustomerServiceHandleOrderToMonthView> details;
+}

+ 21 - 2
netflix-dao/src/main/java/com/cyksj/model/views/StatisticsUserDataView.java

@@ -14,8 +14,6 @@ import lombok.Setter;
 @Getter
 @Setter
 public class StatisticsUserDataView {
-	private Integer totalOfUser;
-
 	/**
 	 * 公众号用户数
 	 */
@@ -46,5 +44,26 @@ public class StatisticsUserDataView {
 	 */
 	private Integer pcNumOfActiveUser;
 
+
+	/**
+	 * 通过分销新增的用户数
+	 */
+	private Integer numOfDistributeUser;
+
+	/**
+	 * 企业微信今日新增人数
+	 */
+	private Integer numOfCorpUser;
+
+	/**
+	 * 企业微信设备标签今日新增人数
+	 */
+	private Integer numOfCorpEquipmentUser;
+
+	/**
+	 * 企业微信账号标签今日新增人数
+	 */
+	private Integer numOfCorpAccountUser;
+
 	SearchResult<StatisticsUserData> userData;
 }

+ 10 - 0
netflix-dao/src/main/resources/mapper/CustomerServiceEveryMonthDetailMapper.xml

@@ -0,0 +1,10 @@
+<?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.manage.CustomerServiceEveryMonthDetailMapper">
+
+    <select id="getDetailData" resultType="com.cyksj.model.entity.CustomerServiceEveryMonthDetail">
+        select cd.* from `customer_service_every_month_detail` cd
+        where cd.statistics_id = #{statisticsId}
+        and type = #{type}
+    </select>
+</mapper>

+ 34 - 0
netflix-dao/src/main/resources/mapper/RealGoodsOrderHandleMapper.xml

@@ -0,0 +1,34 @@
+<?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.manage.RealGoodsOrderHandleMapper">
+
+    <select id="selectCustomerToMonthData"
+            resultType="com.cyksj.model.views.CustomerServiceHandleOrderToMonthView">
+        select
+        <if test="type == 1">
+            before_service_name,
+        </if>
+        <if test="type == 2">
+            after_service_name,
+        </if>
+        count(*) as numOfOrder,
+        sum(od.money) as money
+        from real_goods_order_handle ch left join order_don od on od.id = ch.order_id
+        where od.status not in
+        <foreach collection="list" item="item" open="(" close=")" separator=",">
+            #{item}
+        </foreach>
+        and ch.created_time between #{begin} and #{now}
+        <if test="type == 1">
+            and before_service_name != ''
+            group by before_service_name
+            order by before_service_name
+        </if>
+        <if test="type == 2">
+            and after_service_name != ''
+            group by after_service_name
+            order by after_service_name
+        </if>
+    </select>
+</mapper>

+ 81 - 0
netflix-service/src/main/java/com/cyksj/task/OrderCustomerHandleScheduler.java

@@ -0,0 +1,81 @@
+package com.cyksj.task;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.cyksj.mapper.manage.CustomerServiceEveryMonthDetailMapper;
+import com.cyksj.mapper.manage.StatisticsCustomerServiceEveryMonthMapper;
+import com.cyksj.model.entity.CustomerServiceEveryMonthDetail;
+import com.cyksj.model.entity.RealGoodsOrderHandle;
+import com.cyksj.model.entity.StatisticsCustomerServiceEveryMonth;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/*
+ *项目名: netflix
+ *文件名: OrderCustomerHandleScheduler
+ *创建者: JavaZou
+ *创建时间:2022/11/29 16:44
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class OrderCustomerHandleScheduler {
+	private final CustomerServiceEveryMonthDetailMapper detailMapper;
+
+	private final StatisticsCustomerServiceEveryMonthMapper statisticsEveryMonthMapper;
+
+	private final BeanSearcher beanSearcher;
+
+	public static List<String> noOrderStatus = List.of("noPayment", "close", "refund");
+
+	/**
+	 * 客服业绩数据统计
+	 */
+	@Scheduled(cron = "59 59 23 L * ?")
+	public void orderCustomerHandle() {
+		DateTime now = DateTime.now();
+		DateTime begin = DateUtil.beginOfMonth(now);
+		String statisticsDate = DateUtil.format(now, "yyyy-MM");
+		List<RealGoodsOrderHandle> realGoodsOrderHandles = beanSearcher.searchAll(RealGoodsOrderHandle.class, MapUtils.builder()
+				.field(RealGoodsOrderHandle::getStatus, noOrderStatus).op(Operator.NotIn)
+				.field(RealGoodsOrderHandle::getCreatedTime, begin, now).op(Operator.Between)
+				.build());
+		Map<String, List<RealGoodsOrderHandle>> before = realGoodsOrderHandles.stream().collect(Collectors.groupingBy(RealGoodsOrderHandle::getBeforeServiceName));
+		Map<String, List<RealGoodsOrderHandle>> after = realGoodsOrderHandles.stream().collect(Collectors.groupingBy(RealGoodsOrderHandle::getAfterServiceName));
+		StatisticsCustomerServiceEveryMonth statistics = new StatisticsCustomerServiceEveryMonth();
+		statistics.setStatisticsData(statisticsDate);
+		statisticsEveryMonthMapper.insert(statistics);
+		before.forEach((k, v) -> {
+			customerServiceRecord(k, v, 1, statistics.getId());
+		});
+		after.forEach((k, v) -> {
+			customerServiceRecord(k, v, 2, statistics.getId());
+		});
+	}
+
+
+	public void customerServiceRecord(String serviceName, List<RealGoodsOrderHandle> handlers, Integer type, Long statisticsId) {
+		if (StrUtil.isNotBlank(serviceName)) {
+			CustomerServiceEveryMonthDetail record = new CustomerServiceEveryMonthDetail();
+			record.setType(type);
+			record.setCustomerServiceName(serviceName);
+			record.setStatisticsId(statisticsId);
+			record.setNumOfOrder(handlers.size());
+			Optional<BigDecimal> money = handlers.stream().map(RealGoodsOrderHandle::getMoney).reduce(BigDecimal::add);
+			record.setMoney(money.isPresent() ? money.get() : BigDecimal.ZERO);
+			detailMapper.insert(record);
+		}
+	}
+}

+ 12 - 0
netflix-service/src/main/java/com/cyksj/task/StatisticsDataScheduler.java

@@ -13,9 +13,13 @@ import com.cyksj.mapper.manage.statistics.RealGoodsDataMapper;
 import com.cyksj.mapper.manage.statistics.StatisticsUserDataMapper;
 import com.cyksj.mapper.manage.statistics.StreamingAccountDataMapper;
 import com.cyksj.model.entity.*;
+import com.cyksj.model.views.CorpUserTagView;
 import com.cyksj.service.mange.CmsAccountService;
 import com.cyksj.service.mange.CmsGoodsDonSkuService;
 import com.cyksj.service.order.OrderDonService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -68,6 +72,8 @@ public class StatisticsDataScheduler {
 
 	private final StatisticsUserDataMapper statisticsUserDataMapper;
 
+	private final BeanSearcher beanSearcher;
+
 	/**
 	 * 后台数据统计 定时器
 	 */
@@ -100,6 +106,12 @@ public class StatisticsDataScheduler {
 		statisticsUserData.setNumOfActiveUser(statisticsUserDataMapper.getNumOfActiveUser(yesZeroDate, thisZeroDate));
 		statisticsUserData.setNumOfUser(yesNumOfUser + statisticsUserData.getNumOfNewUser());
 
+		statisticsUserData.setNumOfDistributeUser(statisticsUserDataMapper.getNumOfDistributeUserToday(yesZeroDate, thisZeroDate));
+		List<CorpUserTagView> corpUserLists = Optional.ofNullable(beanSearcher.searchAll(CorpUserTagView.class, MapUtils.builder().field(CorpUserTagView::getCreatedTime, yesZeroDate, thisZeroDate).op(Operator.Between).build())).orElse(new ArrayList<>());
+		statisticsUserData.setNumOfCorpUser(corpUserLists.size());
+		statisticsUserData.setNumOfCorpEquipmentUser(corpUserLists.stream().filter(data -> "设备".equals(data.getTagName())).collect(Collectors.toList()).size());
+		statisticsUserData.setNumOfCorpAccountUser(corpUserLists.stream().filter(data -> "账号".equals(data.getTagName())).collect(Collectors.toList()).size());
+
 		statisticsUserData.setPcNumOfNewUser(statisticsUserDataMapper.getPcNumOfNewUser(yesZeroDate, thisZeroDate));
 		statisticsUserData.setPcNumOfActiveUser(statisticsUserDataMapper.getPcNumOfActiveUser(yesZeroDate, thisZeroDate));
 		statisticsUserData.setPcNumOfUser(yesPcNumOfUser + statisticsUserData.getPcNumOfNewUser());

+ 54 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java

@@ -2,18 +2,23 @@ package com.cyksj.web.controller.manage;
 
 import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.annotation.NoSubmit;
+import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.RealGoodsInterestUserMapper;
+import com.cyksj.mapper.manage.RealGoodsOrderHandleMapper;
 import com.cyksj.model.entity.OrderDon;
 import com.cyksj.model.entity.OrderDonWaybill;
 import com.cyksj.model.entity.RealGoodsInterestUser;
+import com.cyksj.model.entity.RealGoodsOrderHandle;
 import com.cyksj.model.excel.ExcelRealGoodsUserInterestData;
 import com.cyksj.model.manage.request.ReqSetLogisticsPost;
 import com.cyksj.model.manage.views.OrderDonView;
+import com.cyksj.model.request.RealGoodsServiceReq;
 import com.cyksj.model.request.UserRealGoodsInterestReq;
-import com.cyksj.model.views.RealGoodsInterestUserView;
 import com.cyksj.model.views.OrderDonTransportView;
+import com.cyksj.model.views.RealGoodsInterestUserView;
 import com.cyksj.service.mange.CmsOrderDonService;
 import com.cyksj.service.user.UserService;
 import com.cyksj.web.util.EasyExcelUtils;
@@ -23,12 +28,14 @@ import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapBuilder;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * @author chan
@@ -51,10 +58,21 @@ public class CmsOrderController {
 
     private final RealGoodsInterestUserMapper realGoodsInterestUserMapper;
 
+    private final RealGoodsOrderHandleMapper realGoodsOrderHandleMapper;
+
 
     @GetMapping("/get")
-    public Result<SearchResult<OrderDonView>> get(){
+    public Result<SearchResult<OrderDonView>> get() {
         SearchResult<OrderDonView> search = beanSearcher.search(OrderDonView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+        search.getDataList().forEach(data -> {
+            if (data.getGoodsDonType() == 2) {
+                RealGoodsOrderHandle realGoodsOrderHandle = realGoodsOrderHandleMapper.selectOne(Wrappers.lambdaQuery(RealGoodsOrderHandle.class).eq(RealGoodsOrderHandle::getOrderId, data.getId()).last("limit 1"));
+                if (realGoodsOrderHandle != null) {
+                    data.setBeforeServiceName(realGoodsOrderHandle.getBeforeServiceName());
+                    data.setAfterServiceName(realGoodsOrderHandle.getAfterServiceName());
+                }
+            }
+        });
         return GatewayResponse.SUCCESS.newBuilder().toResult(search);
     }
 
@@ -144,4 +162,38 @@ public class CmsOrderController {
         EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, ExcelRealGoodsUserInterestData.class, excelRealGoodsUserInterestData, "用户意愿列表", "用户意愿列表", ExcelTypeEnum.XLSX, null);
     }
 
+    /**
+     * 实物订单配置售前售后客户
+     */
+    @PostMapping("/put/realGoods/service")
+    @NoSubmit
+    public Result<String> putRealGoodsService(@RequestBody @Validated RealGoodsServiceReq request) {
+        OrderDon orderDon = cmsOrderDonService.getById(request.getOrderId());
+        if (orderDon == null || orderDon.getRelationId() != 0) {
+            throw BusinessRuntimeException.getInstance("该订单不是实物订单");
+        }
+        RealGoodsOrderHandle realGoodsOrderHandle = Optional.ofNullable(realGoodsOrderHandleMapper.selectOne(Wrappers.lambdaQuery(RealGoodsOrderHandle.class).eq(RealGoodsOrderHandle::getOrderId, request.getOrderId()).last("limit 1"))).orElse(new RealGoodsOrderHandle());
+        if (StringUtils.isNotBlank(request.getBeforeServiceName())) {
+            realGoodsOrderHandle.setBeforeServiceName(request.getBeforeServiceName());
+        }
+        if (StringUtils.isNotBlank(request.getAfterServiceName())) {
+            realGoodsOrderHandle.setAfterServiceName(request.getAfterServiceName());
+        }
+        if (realGoodsOrderHandle.getId() == null) {
+            realGoodsOrderHandle.setOrderId(request.getOrderId());
+            realGoodsOrderHandleMapper.insert(realGoodsOrderHandle);
+        }else {
+            if (realGoodsOrderHandle.getBeforeOpNum() > 2) {
+                throw BusinessRuntimeException.getInstance("售前客服已两次修改");
+            }
+            if (realGoodsOrderHandle.getAfterOpNum() > 2) {
+                throw BusinessRuntimeException.getInstance("售后客服已两次修改");
+            }
+            realGoodsOrderHandle.setBeforeOpNum(realGoodsOrderHandle.getBeforeOpNum() + 1);
+            realGoodsOrderHandle.setAfterOpNum(realGoodsOrderHandle.getAfterOpNum() + 1);
+            realGoodsOrderHandleMapper.updateById(realGoodsOrderHandle);
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult("操作成功");
+    }
+
 }

+ 50 - 12
netflix-web/src/main/java/com/cyksj/web/controller/manage/statistics/StatisticsDataController.java

@@ -2,27 +2,27 @@ package com.cyksj.web.controller.manage.statistics;
 
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
-import com.cyksj.mapper.UserMapper;
-import com.cyksj.mapper.manage.statistics.StatisticsUserDataMapper;
-import com.cyksj.model.entity.StatisticsUserData;
 import com.cyksj.mapper.GroupsRelationMapper;
+import com.cyksj.mapper.UserMapper;
+import com.cyksj.mapper.manage.CustomerServiceEveryMonthDetailMapper;
+import com.cyksj.mapper.manage.RealGoodsOrderHandleMapper;
 import com.cyksj.mapper.manage.statistics.IncrExpiryTimeRecordMapper;
+import com.cyksj.mapper.manage.statistics.StatisticsUserDataMapper;
 import com.cyksj.model.entity.GroupsRelation;
 import com.cyksj.model.entity.IncrExpiryTimeRecord;
+import com.cyksj.model.entity.StatisticsCustomerServiceEveryMonth;
+import com.cyksj.model.entity.StatisticsUserData;
 import com.cyksj.model.request.RenewTimeUpReq;
-import com.cyksj.model.views.BackgroundDataView;
-import com.cyksj.model.views.ExpiredAccountDataView;
-import com.cyksj.model.views.StatisticsUserDataView;
+import com.cyksj.model.views.*;
 import com.cyksj.service.mange.statistics.StatisticsDataService;
+import com.cyksj.task.OrderCustomerHandleScheduler;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
-import com.ejlchina.searcher.util.MapUtils;
-import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import org.springframework.transaction.annotation.Transactional;
@@ -30,6 +30,10 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
 
 /*
  *项目名: netflix
@@ -55,6 +59,10 @@ public class StatisticsDataController {
 
 	private final StatisticsUserDataMapper statisticsUserDataMapper;
 
+	private final CustomerServiceEveryMonthDetailMapper detailMapper;
+
+	private final RealGoodsOrderHandleMapper realGoodsOrderHandleMapper;
+
 	/**
 	 * 查询统计数据
 	 */
@@ -141,16 +149,46 @@ public class StatisticsDataController {
 		DateTime now = DateTime.now();
 		DateTime thisZero = DateUtil.beginOfDay(now);
 		DateTime thisEnd = DateUtil.endOfDay(now);
-		Integer wxUserNum = statisticsUserDataMapper.getWxTotalOfUser();
+		Integer total = userMapper.selectCount(null);
 		Integer pcUserNum = statisticsUserDataMapper.getPcTotalOfUser();
-		statisticsUserDataView.setTotalOfUser(wxUserNum + pcUserNum);
-		statisticsUserDataView.setNumOfUser(wxUserNum);
+		statisticsUserDataView.setNumOfUser(total - pcUserNum);
 		statisticsUserDataView.setPcNumOfUser(pcUserNum);
 		statisticsUserDataView.setNumOfNewUser(statisticsUserDataMapper.getNumOfNewUser(thisZero, thisEnd));
 		statisticsUserDataView.setPcNumOfNewUser(statisticsUserDataMapper.getPcNumOfNewUser(thisZero, thisEnd));
 		statisticsUserDataView.setNumOfActiveUser(statisticsUserDataMapper.getNumOfActiveUser(thisZero, thisEnd));
 		statisticsUserDataView.setPcNumOfActiveUser(statisticsUserDataMapper.getPcNumOfActiveUser(thisZero, thisEnd));
+
+		statisticsUserDataView.setNumOfDistributeUser(statisticsUserDataMapper.getNumOfDistributeUserToday(thisZero, thisEnd));
+		List<CorpUserTagView> corpUserLists = Optional.ofNullable(beanSearcher.searchAll(CorpUserTagView.class, MapUtils.builder().field(CorpUserTagView::getCreatedTime, thisZero, thisEnd).op(Operator.Between).build())).orElse(new ArrayList<>());
+		statisticsUserDataView.setNumOfCorpUser(corpUserLists.size());
+		statisticsUserDataView.setNumOfCorpEquipmentUser(corpUserLists.stream().filter(data -> "设备".equals(data.getTagName())).collect(Collectors.toList()).size());
+		statisticsUserDataView.setNumOfCorpAccountUser(corpUserLists.stream().filter(data -> "账号".equals(data.getTagName())).collect(Collectors.toList()).size());
+
 		statisticsUserDataView.setUserData(beanSearcher.search(StatisticsUserData.class, MapUtils.flatBuilder(request.getParameterMap()).build()));
 		return GatewayResponse.SUCCESS.newBuilder().toResult(statisticsUserDataView);
 	}
+
+	/**
+	 * 客服分销数据统计
+	 */
+	@GetMapping("/get/customer/service/data")
+	public Result<StatisticsCustomerDataView> getCustomerData(Integer type, HttpServletRequest request) throws Exception {
+		DateTime now = DateTime.now();
+		DateTime begin = DateUtil.beginOfMonth(now);
+		String statisticsDate = DateUtil.format(now, "yyyy-MM");
+		List<CustomerServiceHandleOrderToMonthView> toMonthDetail = realGoodsOrderHandleMapper.selectCustomerToMonthData(now, begin, OrderCustomerHandleScheduler.noOrderStatus, type);
+		StatisticsCustomerDataView customerDataView = new StatisticsCustomerDataView();
+		if (!toMonthDetail.isEmpty()) {
+			StatisticsCustomerServiceEveryMonthView toMonth = new StatisticsCustomerServiceEveryMonthView();
+			toMonth.setStatisticsData(statisticsDate);
+			toMonth.setDetails(toMonthDetail);
+			customerDataView.setToMonth(toMonth);
+		}
+		SearchResult<StatisticsCustomerServiceEveryMonth> search = beanSearcher.search(StatisticsCustomerServiceEveryMonth.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		search.getDataList().forEach(data -> {
+			data.setDetails(detailMapper.getDetailData(type, data.getId()));
+		});
+		customerDataView.setMonthData(search);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(customerDataView);
+	}
 }