Selaa lähdekoodia

Merge branch 'statistics'

# Conflicts:
#	netflix-dao/src/main/java/com/cyksj/mapper/AccountMapper.java
#	netflix-dao/src/main/java/com/cyksj/mapper/manage/statistics/AppleOneDataMapper.java
#	netflix-dao/src/main/java/com/cyksj/mapper/manage/statistics/StreamingAccountDataMapper.java
#	netflix-dao/src/main/java/com/cyksj/model/entity/AbstractBackData.java
#	netflix-dao/src/main/java/com/cyksj/model/entity/Address.java
#	netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDon.java
#	netflix-dao/src/main/java/com/cyksj/model/entity/GroupsRelation.java
#	netflix-dao/src/main/java/com/cyksj/model/entity/GroupsTrips.java
#	netflix-dao/src/main/java/com/cyksj/model/entity/StreamingAccountData.java
#	netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSkuInsert.java
#	netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSpuInsert.java
#	netflix-dao/src/main/java/com/cyksj/model/manage/views/AccountView.java
#	netflix-dao/src/main/java/com/cyksj/model/manage/views/GoodsDonViewer.java
#	netflix-dao/src/main/java/com/cyksj/model/manage/views/GroupsRelationView.java
#	netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonView.java
#	netflix-dao/src/main/java/com/cyksj/model/views/BackgroundDataView.java
#	netflix-dao/src/main/resources/mapper/AccountMapper.xml
#	netflix-service/src/main/java/com/cyksj/service/mange/CmsAccountService.java
#	netflix-service/src/main/java/com/cyksj/service/mange/account/CmsAccountServiceImpl.java
#	netflix-service/src/main/java/com/cyksj/service/mange/statistics/StatisticsDataService.java
#	netflix-service/src/main/java/com/cyksj/service/mange/statistics/impl/StatisticsDataServiceImpl.java
#	netflix-service/src/main/java/com/cyksj/service/order/OrderDonService.java
#	netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
#	netflix-service/src/main/java/com/cyksj/task/StatisticsDataScheduler.java
#	netflix-web/src/main/java/com/cyksj/web/controller/manage/account/CmsAccountController.java
#	netflix-web/src/main/java/com/cyksj/web/controller/manage/group/CmsGroupController.java
#	netflix-web/src/main/java/com/cyksj/web/controller/manage/group/CmsGroupRelationController.java
#	netflix-web/src/main/java/com/cyksj/web/controller/manage/group/CmsHomeGroupController.java
#	netflix-web/src/main/java/com/cyksj/web/controller/manage/statistics/StatisticsDataController.java
#	netflix-web/src/main/java/com/cyksj/web/controller/user/AddressController.java
#	netflix-web/src/main/resources/application-prd.yml
zoujiajian 3 vuotta sitten
vanhempi
sitoutus
72bb041610
23 muutettua tiedostoa jossa 544 lisäystä ja 53 poistoa
  1. 7 0
      netflix-dao/src/main/java/com/cyksj/mapper/AccountMapper.java
  2. 5 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/statistics/AppleOneDataMapper.java
  3. 18 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/statistics/RealGoodsDataMapper.java
  4. 5 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/statistics/StreamingAccountDataMapper.java
  5. 0 5
      netflix-dao/src/main/java/com/cyksj/model/entity/AbstractBackData.java
  6. 0 1
      netflix-dao/src/main/java/com/cyksj/model/entity/Account.java
  7. 9 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GroupsRelation.java
  8. 51 0
      netflix-dao/src/main/java/com/cyksj/model/entity/RealGoodsData.java
  9. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/StreamingAccountData.java
  10. 6 0
      netflix-dao/src/main/java/com/cyksj/model/views/BackgroundDataView.java
  11. 96 0
      netflix-dao/src/main/java/com/cyksj/model/views/ExpiredAccountDataView.java
  12. 60 0
      netflix-dao/src/main/resources/mapper/AccountMapper.xml
  13. 45 0
      netflix-dao/src/main/resources/mapper/AppleOneDataMapper.xml
  14. 25 0
      netflix-dao/src/main/resources/mapper/RealGoodsDataMapper.xml
  15. 26 0
      netflix-dao/src/main/resources/mapper/StreamingAccountDataMapper.xml
  16. 6 0
      netflix-service/src/main/java/com/cyksj/service/mange/CmsAccountService.java
  17. 16 2
      netflix-service/src/main/java/com/cyksj/service/mange/account/CmsAccountServiceImpl.java
  18. 8 0
      netflix-service/src/main/java/com/cyksj/service/mange/statistics/StatisticsDataService.java
  19. 69 36
      netflix-service/src/main/java/com/cyksj/service/mange/statistics/impl/StatisticsDataServiceImpl.java
  20. 3 0
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  21. 46 6
      netflix-service/src/main/java/com/cyksj/task/StatisticsDataScheduler.java
  22. 1 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonSkuController.java
  23. 37 3
      netflix-web/src/main/java/com/cyksj/web/controller/manage/statistics/StatisticsDataController.java

+ 7 - 0
netflix-dao/src/main/java/com/cyksj/mapper/AccountMapper.java

@@ -1,7 +1,10 @@
 package com.cyksj.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.model.entity.Account;
+import com.cyksj.model.views.ExpiredAccountDataView;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Date;
@@ -14,4 +17,8 @@ import java.util.List;
 public interface AccountMapper extends BaseMapper<Account> {
 
 	List<Integer> getNumOfUser(@Param("list") List<Long> accountIds, @Param("yesZeroDate") Date yesZeroDate, @Param("thisZeroDate") Date thisZeroDate);
+
+	IPage<ExpiredAccountDataView> getExpiredAccountView(@Param("goodsId") Integer goodsId, @Param("account") String account, @Param("renewStatus") Boolean renewStatus, @Param("handleStatus") Boolean handleStatus, @Param("cnAccount") String cnAccount, @Param("usAccount") String usAccount, @Param("userId") Integer userId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("now") String now, @Param("page") Page page);
+
+	List<Account> getNoAppleOneAccount(String appleOne);
 }

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/statistics/AppleOneDataMapper.java

@@ -2,6 +2,10 @@ package com.cyksj.mapper.manage.statistics;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cyksj.model.entity.AppleOneData;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
 
 /*
  *项目名: netflix
@@ -10,4 +14,5 @@ import com.cyksj.model.entity.AppleOneData;
  *创建时间:2022/10/18 14:54
  */
 public interface AppleOneDataMapper extends BaseMapper<AppleOneData> {
+	List<AppleOneData> statisticsAppleOneData(@Param("startDate") Date startDate, @Param("endDate") Date endDate);
 }

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

@@ -0,0 +1,18 @@
+package com.cyksj.mapper.manage.statistics;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.RealGoodsData;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: RealGoodsDataMapper
+ *创建者: JavaZou
+ *创建时间:2022/10/26 16:10
+ */
+public interface RealGoodsDataMapper extends BaseMapper<RealGoodsData> {
+	List<RealGoodsData> statisticsRealGoodsData(@Param("startDate") Date startDate, @Param("endDate") Date endDate);
+}

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/statistics/StreamingAccountDataMapper.java

@@ -2,6 +2,10 @@ package com.cyksj.mapper.manage.statistics;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cyksj.model.entity.StreamingAccountData;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
 
 /*
  *项目名: netflix
@@ -10,4 +14,5 @@ import com.cyksj.model.entity.StreamingAccountData;
  *创建时间:2022/10/18 14:53
  */
 public interface StreamingAccountDataMapper extends BaseMapper<StreamingAccountData> {
+	List<StreamingAccountData> statisticsStreamingData(@Param("startDate") Date startDate, @Param("endDate") Date endDate);
 }

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

@@ -22,11 +22,6 @@ public abstract class AbstractBackData {
 	@TableId(value = "id", type = IdType.AUTO)
 	private Long id;
 
-	/**
-	 * 展示数据时使用
-	 */
-	private Long showId;
-
 	/**
 	 * 用户数
 	 */

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

@@ -39,5 +39,4 @@ public class Account extends BaseEntity {
     private String usAccount;
 
     private String remark;
-
 }

+ 9 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GroupsRelation.java

@@ -36,6 +36,15 @@ public class GroupsRelation extends BaseEntity {
      * 账号
      */
     private String account;
+    /**
+     * 续费意愿处理状态
+     */
+    private Boolean renewStatus;
+
+    /**
+     * 处理状态
+     */
+    private Boolean isHandle;
 
 
     @AllArgsConstructor

+ 51 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/RealGoodsData.java

@@ -0,0 +1,51 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: RealGoodsData
+ *创建者: JavaZou
+ *创建时间:2022/10/26 15:57
+ */
+@Getter
+@Setter
+public class RealGoodsData extends BaseEntity{
+	/**
+	 * 平台id
+	 */
+	private Long goodsId;
+
+	/**
+	 * 商品名称
+	 */
+	private String goodsTitle;
+
+	/**
+	 * 规格id
+	 */
+	private Long skuId;
+
+	/**
+	 * 规格名称
+	 */
+	private String specVal;
+
+	/**
+	 * 用户数
+	 */
+	private Integer numOfUser;
+
+	/**
+	 * 订单数
+	 */
+	private Integer numOfOrder;
+
+	/**
+	 * 金额
+	 */
+	private BigDecimal money;
+}

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

@@ -16,4 +16,9 @@ public class StreamingAccountData extends AbstractBackData {
 	 * 账户名称
 	 */
 	private String accountName;
+
+	/**
+	 * 平台id
+	 */
+	private Long goodsId;
 }

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

@@ -1,6 +1,7 @@
 package com.cyksj.model.views;
 
 import com.cyksj.model.entity.AppleOneData;
+import com.cyksj.model.entity.RealGoodsData;
 import com.cyksj.model.entity.StreamingAccountData;
 import lombok.Getter;
 import lombok.Setter;
@@ -58,4 +59,9 @@ public class BackgroundDataView {
 	 */
 	private List<StreamingAccountData> streamAccountDataViews;
 
+	/**
+	 * 实物数据
+	 */
+	private List<RealGoodsData> realGoodsDataViews;
+
 }

+ 96 - 0
netflix-dao/src/main/java/com/cyksj/model/views/ExpiredAccountDataView.java

@@ -0,0 +1,96 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: ExpiredAccountStatisticsData
+ *创建者: JavaZou
+ *创建时间:2022/10/24 14:35
+ */
+@Getter
+@Setter
+public class ExpiredAccountDataView {
+	/**
+	 * 关联组id
+	 */
+	private Integer relationId;
+
+	/**
+	 * 所属平台
+	 */
+	private String platform;
+
+	/**
+	 * 主账号
+	 */
+	private String account;
+
+	/**
+	 * 类型
+	 */
+	private String type;
+
+	/**
+	 * 用户id
+	 */
+	private Integer userId;
+
+	/**
+	 * 用户账号
+	 */
+	private String userAccount;
+
+	/**
+	 * 用户头像
+	 */
+	private String img;
+
+	/**
+	 * 用户昵称
+	 */
+	private String nickName;
+
+	/**
+	 * 购买时间
+	 */
+	private Date payTime;
+
+	/**
+	 * 过期时间
+	 */
+	private Date expiryTime;
+
+	/**
+	 * 微信列表是否有
+	 */
+	private Boolean isWxFriend;
+
+	/**
+	 * 用户续费意愿
+	 */
+	private Boolean renewStatus;
+
+	/**
+	 * 是否处理过
+	 */
+	private Boolean isHandle;
+
+	/**
+	 * 国区id
+	 */
+	private String cnAccount;
+
+	/**
+	 * 美区id
+	 */
+	private String usAccount;
+
+	/**
+	 * 处理状态
+	 */
+	private Boolean status;
+}

+ 60 - 0
netflix-dao/src/main/resources/mapper/AccountMapper.xml

@@ -12,4 +12,64 @@
         and gt.status = 'validity'
         and u.created_time between #{yesZeroDate} and #{thisZeroDate}
     </select>
+
+    <select id="getExpiredAccountView" resultType="com.cyksj.model.views.ExpiredAccountDataView">
+        select gr.id as relationId,
+               a.title as platform,
+               a.account,
+               a.us_account,
+               a.cn_account,
+               concat(gdk.spec_val,'¥',cast(gdk.price/100 as decimal(10,2))) as 'type',
+               gr.user_id,
+               gr.account as userAccount,
+               u.headimgurl as img,
+               u.nickname,
+               gr.start_time as payTime,
+               gr.expiry_time,
+               gr.renew_status,
+               gr.is_handle
+        from `account` a left join `groups_trips` gt on gt.account_id = a.id
+        left join `groups_relation` gr on gr.groups_id = gt.id
+        left join `goods_don_sku` gdk on gdk.id = gt.sku_id
+        left join `user` u on gr.user_id = u.id
+        <where>
+            <if test="goodsId != null">
+                a.goods_id = #{goodsId}
+            </if>
+            <if test="account != null and account != ''">
+                and a.account like '%${account}%'
+            </if>
+            <if test="renewStatus != null">
+                and gr.renew_status is ${renewStatus}
+            </if>
+            <if test="handleStatus != null">
+                and gr.is_handle is ${handleStatus}
+            </if>
+            <if test="cnAccount != null and cnAccount != ''">
+                and a.cn_account = #{cnAccount}
+            </if>
+            <if test="usAccount != null and usAccount != ''">
+                and a.us_account = #{usAccount}
+            </if>
+            <if test="userId != null">
+                and gr.user_id = #{userId}
+            </if>
+            <if test="startTime != null">
+                and gr.expiry_time >= #{startTime}
+            </if>
+            <if test="endTime != null">
+                and gr.expiry_time &lt; #{endTime}
+            </if>
+                and gr.expiry_time &lt; #{now}
+                order by expiry_time
+        </where>
+    </select>
+
+    <select id="getNoAppleOneAccount" resultType="com.cyksj.model.entity.Account">
+        select a.id,
+               g.title,
+               g.id as goodsId
+        from `account` a inner join `goods_don` g on g.id = a.goods_id
+        where g.type = 1 and g.title != #{appleOne}
+    </select>
 </mapper>

+ 45 - 0
netflix-dao/src/main/resources/mapper/AppleOneDataMapper.xml

@@ -0,0 +1,45 @@
+<?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.statistics.AppleOneDataMapper">
+
+    <select id="statisticsStreamingData" resultType="com.cyksj.model.entity.StreamingAccountData">
+        select account_name,
+        sum(num_of_user) as num_of_user,
+        sum(num_of_order) as num_of_order,
+        cast(sum(money)/100 as decimal(20,2)) as money,
+        sum(num_of_month_order) as num_of_month_order,
+        sum(num_of_season_order) as num_of_season_order,
+        sum(num_of_year_order) as num_of_year_order
+        from `streaming_account_data`
+        <where>
+            <if test="startDate != null">
+                created_time >= #{startDate}
+            </if>
+            <if test="endDate != null">
+                created_time &lt;= #{endDate}
+            </if>
+        </where>
+        group by account_name
+    </select>
+
+    <select id="statisticsAppleOneData" resultType="com.cyksj.model.entity.AppleOneData">
+        select area_name,
+        sum(num_of_user) as num_of_user,
+        sum(num_of_order) as num_of_order,
+        cast(sum(money)/100 as decimal(20,2)) as money,
+        sum(num_of_month_order) as num_of_month_order,
+        sum(num_of_season_order) as num_of_season_order,
+        sum(num_of_year_order) as num_of_year_order
+        from `apple_one_data`
+        <where>
+            <if test="startDate != null">
+                created_time >= #{startDate}
+            </if>
+            <if test="endDate != null">
+                created_time &lt;= #{endDate}
+            </if>
+        </where>
+        group by area_name
+    </select>
+</mapper>

+ 25 - 0
netflix-dao/src/main/resources/mapper/RealGoodsDataMapper.xml

@@ -0,0 +1,25 @@
+<?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.statistics.RealGoodsDataMapper">
+
+    <select id="statisticsRealGoodsData" resultType="com.cyksj.model.entity.RealGoodsData">
+        select goods_id,
+               sku_id,
+               any_value(goods_title) as goods_title,
+               any_value(spec_val) as spec_val,
+               sum(num_of_user) as num_of_user,
+               sum(num_of_order) as num_of_order,
+               cast(sum(money)/100 as decimal(20,2)) as money
+        from real_goods_data
+        <where>
+            <if test="startDate != null">
+                created_time >= #{startDate}
+            </if>
+            <if test="endDate != null">
+                created_time &lt;= #{endDate}
+            </if>
+        </where>
+        group by goods_id,sku_id
+    </select>
+</mapper>

+ 26 - 0
netflix-dao/src/main/resources/mapper/StreamingAccountDataMapper.xml

@@ -0,0 +1,26 @@
+<?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.statistics.StreamingAccountDataMapper">
+
+    <select id="statisticsStreamingData" resultType="com.cyksj.model.entity.StreamingAccountData">
+        select goods_id,
+               any_value(account_name),
+               sum(num_of_user) as num_of_user,
+               sum(num_of_order) as num_of_order,
+               sum(money) as money,
+               sum(num_of_month_order) as num_of_month_order,
+               sum(num_of_season_order) as num_of_season_order,
+               sum(num_of_year_order) as num_of_year_order
+        from `streaming_account_data`
+        <where>
+            <if test="startDate != null">
+                created_time >= #{startDate}
+            </if>
+            <if test="endDate != null">
+                created_time &lt;= #{endDate}
+            </if>
+        </where>
+        group by goods_id
+    </select>
+</mapper>

+ 6 - 0
netflix-service/src/main/java/com/cyksj/service/mange/CmsAccountService.java

@@ -1,7 +1,9 @@
 package com.cyksj.service.mange;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.cyksj.model.entity.Account;
+import com.cyksj.model.views.ExpiredAccountDataView;
 
 import java.util.Date;
 import java.util.List;
@@ -13,4 +15,8 @@ import java.util.List;
 public interface CmsAccountService extends IService<Account> {
 
 	List<Integer> getNumOfUser(List<Long> accountIds, Date yesZeroDate, Date thisZeroDate);
+
+	IPage<ExpiredAccountDataView> getExpiredAccountView(Integer goodsId, String account, Boolean renewStatus, Boolean handleStatus, String cnAccount, String usAccount, Integer userId, String startTime, String endTime, String now, Long offset, Long limit);
+
+	List<Account> getNoAppleOneAccount(String appleOne);
 }

+ 16 - 2
netflix-service/src/main/java/com/cyksj/service/mange/account/CmsAccountServiceImpl.java

@@ -1,8 +1,11 @@
 package com.cyksj.service.mange.account;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cyksj.mapper.AccountMapper;
 import com.cyksj.model.entity.Account;
+import com.cyksj.model.views.ExpiredAccountDataView;
 import com.cyksj.service.mange.CmsAccountService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -22,7 +25,18 @@ public class CmsAccountServiceImpl extends ServiceImpl<AccountMapper, Account> i
 	private final AccountMapper accountMapper;
 
 	@Override
-	public List<Integer> getNumOfUser(List<Long> accountIds,Date yesZeroDate, Date thisZeroDate) {
-		return accountMapper.getNumOfUser(accountIds,yesZeroDate, thisZeroDate);
+	public List<Integer> getNumOfUser(List<Long> accountIds, Date yesZeroDate, Date thisZeroDate) {
+		return accountMapper.getNumOfUser(accountIds, yesZeroDate, thisZeroDate);
 	}
+
+	@Override
+	public IPage<ExpiredAccountDataView> getExpiredAccountView(Integer goodsId, String account, Boolean renewStatus, Boolean handleStatus, String cnAccount, String usAccount, Integer userId, String startTime, String endTime, String now, Long offset, Long limit) {
+		return accountMapper.getExpiredAccountView(goodsId, account, renewStatus, handleStatus, cnAccount, usAccount, userId, startTime, endTime, now, new Page<>(offset, limit));
+	}
+
+	@Override
+	public List<Account> getNoAppleOneAccount(String appleOne) {
+		return accountMapper.getNoAppleOneAccount(appleOne);
+	}
+
 }

+ 8 - 0
netflix-service/src/main/java/com/cyksj/service/mange/statistics/StatisticsDataService.java

@@ -1,7 +1,9 @@
 package com.cyksj.service.mange.statistics;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.cyksj.dto.Result;
 import com.cyksj.model.views.BackgroundDataView;
+import com.cyksj.model.views.ExpiredAccountDataView;
 
 /*
  *项目名: netflix
@@ -11,4 +13,10 @@ import com.cyksj.model.views.BackgroundDataView;
  */
 public interface StatisticsDataService {
 	Result<BackgroundDataView> getStatisticsByCondition(Long startTime, Long endTime);
+
+	IPage<ExpiredAccountDataView> getExpiredAccountView(Integer goodsId, String account, Boolean renewStatus, Boolean handleStatus, String cnAccount, String usAccount, Integer uid, Long startTime, Long endTime, Long start, Long limit);
+
+	Result<String> updateRenewStatus(Integer relationId);
+
+	Result<String> updateHandleStatus(Integer relationId);
 }

+ 69 - 36
netflix-service/src/main/java/com/cyksj/service/mange/statistics/impl/StatisticsDataServiceImpl.java

@@ -3,15 +3,19 @@ package com.cyksj.service.mange.statistics.impl;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.GoodsDonMapper;
+import com.cyksj.mapper.GoodsDonSkuMapper;
 import com.cyksj.mapper.GroupsRelationMapper;
 import com.cyksj.mapper.manage.statistics.AppleOneDataMapper;
+import com.cyksj.mapper.manage.statistics.RealGoodsDataMapper;
 import com.cyksj.mapper.manage.statistics.StreamingAccountDataMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.views.BackgroundDataView;
+import com.cyksj.model.views.ExpiredAccountDataView;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.mange.CmsAccountService;
 import com.cyksj.service.mange.statistics.StatisticsDataService;
@@ -50,6 +54,12 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 
 	private final StreamingAccountDataMapper streamingAccountDataMapper;
 
+	private final RealGoodsDataMapper realGoodsDataMapper;
+
+	private final GoodsDonMapper goodsDonMapper;
+
+	private final GoodsDonSkuMapper goodsDonSkuMapper;
+
 	@Override
 	public Result<BackgroundDataView> getStatisticsByCondition(Long startTime, Long endTime) {
 		BackgroundDataView backgroundDataView = new BackgroundDataView();
@@ -67,47 +77,70 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 		getAppleOneDataView(backgroundDataView, startDate, endDate);
 		//流媒体账号
 		getStreamingAccountDataView(backgroundDataView, startDate, endDate);
+		//实物数据
+		getRealGoodsData(backgroundDataView, startDate, endDate);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(backgroundDataView);
 	}
 
-	private void getAppleOneDataView(BackgroundDataView backgroundDataView, Date startDate, Date endDate) {
-		LambdaQueryWrapper<AppleOneData> wrapper = Wrappers.lambdaQuery(AppleOneData.class);
-		if (startDate != null) {
-			wrapper.ge(AppleOneData::getCreatedTime, startDate);
-		}
-		if (endDate != null) {
-			wrapper.le(AppleOneData::getCreatedTime, endDate);
+	@Override
+	public IPage<ExpiredAccountDataView> getExpiredAccountView(Integer goodsId, String account, Boolean renewStatus, Boolean handleStatus, String cnAccount, String usAccount, Integer userId, Long startTime, Long endTime, Long start, Long limit) {
+		String startDate = null;
+		String endDate = null;
+		if (startTime != null) {
+			startDate = DateTime.of(startTime).toString();
 		}
-		wrapper.orderByDesc(AppleOneData::getShowId);
-		wrapper.select(AppleOneData::getShowId);
-		wrapper.last("limit 1");
-		AppleOneData max = appleOneDataMapper.selectOne(wrapper);
-		if (max == null) {
-			backgroundDataView.setAppleOneDataViews(null);
-		} else {
-			List<AppleOneData> appleOneData = Optional.ofNullable(appleOneDataMapper.selectList(Wrappers.lambdaQuery(AppleOneData.class).eq(AppleOneData::getShowId, max.getShowId()))).orElse(new ArrayList<>());
-			backgroundDataView.setAppleOneDataViews(appleOneData);
+		if (endTime != null) {
+			endDate = DateTime.of(endTime).toString();
 		}
+		IPage<ExpiredAccountDataView> expiredAccountDataViews = accountService.getExpiredAccountView(goodsId, account, renewStatus, handleStatus, cnAccount, usAccount, userId, startDate, endDate, DateTime.now().toString(), start, limit);
+		return expiredAccountDataViews;
+	}
+
+	@Override
+	public Result<String> updateRenewStatus(Integer relationId) {
+		GroupsRelation groupsRelation = groupsRelationMapper.selectById(relationId);
+		groupsRelation.setRenewStatus(!groupsRelation.getRenewStatus());
+		groupsRelationMapper.updateById(groupsRelation);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("续约意愿状态变更成功");
+	}
+
+	@Override
+	public Result<String> updateHandleStatus(Integer relationId) {
+		GroupsRelation groupsRelation = groupsRelationMapper.selectById(relationId);
+		groupsRelation.setIsHandle(!groupsRelation.getIsHandle());
+		groupsRelationMapper.updateById(groupsRelation);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("处理状态变更成功");
+	}
+
+	private void getAppleOneDataView(BackgroundDataView backgroundDataView, Date startDate, Date endDate) {
+		List<AppleOneData> appleOneData = appleOneDataMapper.statisticsAppleOneData(startDate, endDate);
+		backgroundDataView.setAppleOneDataViews(appleOneData);
 	}
 
 	private void getStreamingAccountDataView(BackgroundDataView backgroundDataView, Date startDate, Date endDate) {
-		LambdaQueryWrapper<StreamingAccountData> wrapper = Wrappers.lambdaQuery(StreamingAccountData.class);
-		if (startDate != null) {
-			wrapper.ge(StreamingAccountData::getCreatedTime, startDate);
-		}
-		if (endDate != null) {
-			wrapper.le(StreamingAccountData::getCreatedTime, endDate);
-		}
-		wrapper.orderByDesc(StreamingAccountData::getShowId);
-		wrapper.select(StreamingAccountData::getShowId);
-		wrapper.last("limit 1");
-		StreamingAccountData max = streamingAccountDataMapper.selectOne(wrapper);
-		if (max == null) {
-			backgroundDataView.setStreamAccountDataViews(null);
-		} else {
-			List<StreamingAccountData> streamingAccountData = streamingAccountDataMapper.selectList(Wrappers.lambdaQuery(StreamingAccountData.class).eq(StreamingAccountData::getShowId, max.getShowId()));
-			backgroundDataView.setStreamAccountDataViews(streamingAccountData);
-		}
+		List<StreamingAccountData> streamingAccountData = streamingAccountDataMapper.statisticsStreamingData(startDate, endDate);
+		Optional.ofNullable(streamingAccountData).ifPresent(list->list.forEach(data->{
+			GoodsDon goodsDon = goodsDonMapper.selectOne(Wrappers.lambdaQuery(GoodsDon.class).eq(GoodsDon::getId, data.getGoodsId()).last("limit 1"));
+			if (goodsDon != null) {
+				data.setAccountName(goodsDon.getTitle());
+			}
+		}));
+		backgroundDataView.setStreamAccountDataViews(streamingAccountData);
+	}
+
+	private void getRealGoodsData(BackgroundDataView backgroundDataView, Date startDate, Date endDate) {
+		List<RealGoodsData> realGoodsData = realGoodsDataMapper.statisticsRealGoodsData(startDate, endDate);
+		Optional.ofNullable(realGoodsData).ifPresent(list -> list.forEach(data -> {
+			GoodsDon goodsDon = goodsDonMapper.selectOne(Wrappers.lambdaQuery(GoodsDon.class).eq(GoodsDon::getId, data.getGoodsId()).last("limit 1"));
+			if (goodsDon != null) {
+				data.setGoodsTitle(goodsDon.getTitle());
+			}
+			GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectOne(Wrappers.lambdaQuery(GoodsDonSku.class).eq(GoodsDonSku::getId, data.getSkuId()).last("limit 1"));
+			if (goodsDonSku != null) {
+				data.setSpecVal(goodsDonSku.getSpecVal());
+			}
+		}));
+		backgroundDataView.setRealGoodsDataViews(realGoodsData);
 	}
 
 	private void headerData(BackgroundDataView backgroundDataView, Date startDate, Date endDate) {
@@ -116,9 +149,9 @@ public class StatisticsDataServiceImpl implements StatisticsDataService {
 		//总订单数
 		List<OrderDon> orderDons = Optional.ofNullable(orderDonService.list(Wrappers.lambdaQuery(OrderDon.class).notIn(OrderDon::getStatus, StatisticsDataScheduler.noOrderStatus).ge(ObjectUtil.isNotNull(startDate), OrderDon::getCreatedTime, startDate).le(ObjectUtil.isNotNull(endDate), OrderDon::getCreatedTime, endDate))).orElse(new ArrayList<>());
 		backgroundDataView.setTotalNumOfOrder(orderDons.size());
-		BigDecimal totalMoney = orderDons.stream().map(OrderDon::getMoney).reduce(BigDecimal::add).get();
+		Optional<BigDecimal> totalMoney = orderDons.stream().map(OrderDon::getMoney).reduce(BigDecimal::add);
 		//总订单金额
-		backgroundDataView.setTotalOrderAmount(totalMoney);
+		backgroundDataView.setTotalOrderAmount(totalMoney.isPresent() ? totalMoney.get().divide(BigDecimal.valueOf(100)) : BigDecimal.ZERO);
 		//近5天将要到期的主账号总数
 		DateTime now = DateTime.now();
 		DateTime zero = DateUtil.beginOfDay(now);

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

@@ -265,6 +265,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
             GroupsTrips groupsTrips = groupsMapper.selectById(relation.getGroupsId());
             if (GroupsRelation.Status.locking.equals(relation.getStatus()) || GroupsRelation.Status.validity.equals(relation.getStatus())) {
                 relation.setStatus(GroupsRelation.Status.validity);
+                //续费后,下一次续费意愿状态为false
+                relation.setRenewStatus(false);
+                relation.setIsHandle(false);
                 if (GroupsTrips.Status.validity.equals(groupsTrips.getStatus())) {
                     //如果续费增加时间,如果首次则设置当前时间为初始时间
                     Date expiryTime = Optional.ofNullable(relation.getExpiryTime()).orElse(new Date());

+ 46 - 6
netflix-service/src/main/java/com/cyksj/task/StatisticsDataScheduler.java

@@ -5,7 +5,9 @@ import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
+import com.cyksj.mapper.GoodsDonMapper;
 import com.cyksj.mapper.manage.statistics.AppleOneDataMapper;
+import com.cyksj.mapper.manage.statistics.RealGoodsDataMapper;
 import com.cyksj.mapper.manage.statistics.StreamingAccountDataMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.service.mange.CmsAccountService;
@@ -53,6 +55,9 @@ public class StatisticsDataScheduler {
 
 	private static Long DAY_MILLS = 86400000l;
 
+	private final GoodsDonMapper goodsDonMapper;
+
+	private final RealGoodsDataMapper realGoodsDataMapper;
 
 	/**
 	 * 后台数据统计 定时器
@@ -65,6 +70,9 @@ public class StatisticsDataScheduler {
 		TASK_POOL.execute(() -> statisticsAppleOneData(yesZeroDate, thisZeroDate));
 		//统计流媒体账号数据
 		TASK_POOL.execute(() -> statisticsStreamingAccountData(yesZeroDate, thisZeroDate));
+		//统计实物数据
+		statisticsRealGoodsData(yesZeroDate, thisZeroDate);
+
 	}
 
 	/**
@@ -89,7 +97,6 @@ public class StatisticsDataScheduler {
 			appleOneDataStatistics(orderDons, appleOne, appleOneSave);
 		});
 		for (AbstractBackData appleOne : appleOneSave) {
-			appleOne.setShowId(yesZeroDate.getTime());
 			appleOneDataMapper.insert((AppleOneData) appleOne);
 		}
 	}
@@ -115,20 +122,53 @@ public class StatisticsDataScheduler {
 	 * 统计流媒体账号数据
 	 */
 	private void statisticsStreamingAccountData(Date yesZeroDate, Date thisZeroDate) {
-		List<Account> accounts = Optional.ofNullable(accountService.list(Wrappers.lambdaQuery(Account.class).ne(Account::getTitle, APPLE_ONE).select(Account::getId, Account::getTitle))).orElse(new ArrayList<>());
-		Map<String, List<Account>> accountMaps = accounts.stream().collect(Collectors.groupingBy(Account::getTitle));
+		List<Account> accounts = accountService.getNoAppleOneAccount(APPLE_ONE);
+		Map<Long, List<Account>> accountMaps = accounts.stream().collect(Collectors.groupingBy(Account::getGoodsId));
 		List<StreamingAccountData> StreamingAccountDataSave = new ArrayList<>(accounts.size());
-		accountMaps.forEach((accountName, accountList) -> {
+		accountMaps.forEach((goodsId, accountList) -> {
 			StreamingAccountData streamingAccount = new StreamingAccountData();
-			streamingAccount.setAccountName(accountName);
+			streamingAccount.setAccountName(accountList.get(0).getTitle());
+			streamingAccount.setGoodsId(goodsId);
 			streamingAccountDataStatistics(accountList, streamingAccount, StreamingAccountDataSave, yesZeroDate, thisZeroDate);
 		});
 		for (StreamingAccountData streamingAccountData : StreamingAccountDataSave) {
-			streamingAccountData.setShowId(yesZeroDate.getTime());
 			streamingAccountDataMapper.insert(streamingAccountData);
 		}
 	}
 
+	/**
+	 * 统计实物数据
+	 */
+	private void statisticsRealGoodsData(Date yesZeroDate, Date thisZeroDate) {
+		List<GoodsDon> goodsDons = goodsDonMapper.selectList(Wrappers.lambdaQuery(GoodsDon.class).eq(GoodsDon::getType, 2));
+		List<RealGoodsData> realGoodsDataList = new ArrayList<>();
+		if (!goodsDons.isEmpty()) {
+			goodsDons.forEach(goods -> {
+				List<GoodsDonSku> skuList = goodsDonSkuService.list(Wrappers.lambdaQuery(GoodsDonSku.class).eq(GoodsDonSku::getGoodsId, goods.getId()));
+				if (!skuList.isEmpty()) {
+					skuList.forEach(sku -> {
+						RealGoodsData realGoodsData = new RealGoodsData();
+						realGoodsData.setGoodsId(goods.getId());
+						realGoodsData.setGoodsTitle(goods.getTitle());
+						realGoodsData.setSkuId(sku.getId());
+						realGoodsData.setSpecVal(sku.getSpecVal());
+						//用户数
+						List<OrderDon> orderDon = Optional.ofNullable(orderDonService.list(Wrappers.lambdaQuery(OrderDon.class).eq(OrderDon::getSkuId, sku.getId()).between(OrderDon::getCreatedTime, yesZeroDate, thisZeroDate))).orElse(new ArrayList<>());
+						Set<Long> userList = Optional.ofNullable(orderDon.stream().map(OrderDon::getUserId).collect(Collectors.toSet())).orElse(new HashSet<>());
+						realGoodsData.setNumOfUser(userList.size());
+						realGoodsData.setNumOfOrder(orderDon.size());
+						Optional<BigDecimal> money = orderDon.stream().map(OrderDon::getMoney).reduce(BigDecimal::add);
+						realGoodsData.setMoney(money.isPresent() ? money.get() : BigDecimal.ZERO);
+						realGoodsDataList.add(realGoodsData);
+					});
+				}
+			});
+		}
+		if (!realGoodsDataList.isEmpty()) {
+			realGoodsDataList.forEach(data -> realGoodsDataMapper.insert(data));
+		}
+	}
+
 	/**
 	 * @param accounts             主账号
 	 * @param streamingAccountData

+ 1 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonSkuController.java

@@ -2,6 +2,7 @@ package com.cyksj.web.controller.manage.goods;
 
 import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.util.IoKit;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;

+ 37 - 3
netflix-web/src/main/java/com/cyksj/web/controller/manage/statistics/StatisticsDataController.java

@@ -1,12 +1,14 @@
 package com.cyksj.web.controller.manage.statistics;
 
+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.model.views.BackgroundDataView;
+import com.cyksj.model.views.ExpiredAccountDataView;
 import com.cyksj.service.mange.statistics.StatisticsDataService;
 import lombok.RequiredArgsConstructor;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 /*
  *项目名: netflix
@@ -21,11 +23,43 @@ import org.springframework.web.bind.annotation.RestController;
 public class StatisticsDataController {
 
 	private final StatisticsDataService statisticsDataService;
+
 	/**
 	 * 查询统计数据
 	 */
 	@GetMapping
 	public Result<BackgroundDataView> getStatisticsByCondition(Long startTime, Long endTime) {
+
 		return statisticsDataService.getStatisticsByCondition(startTime, endTime);
 	}
+
+	/**
+	 * 到期账号数列表
+	 */
+	@GetMapping("/expired/account")
+	public Result<IPage<ExpiredAccountDataView>> getExpiredAccountView(Integer goodsId, String account, Boolean renewStatus, Boolean handleStatus, String cnAccount, String usAccount, Integer userId, Long startTime, Long endTime, @RequestParam(required = false, defaultValue = "1") Long start, @RequestParam(required = false, defaultValue = "10") Long limit) {
+		return GatewayResponse.SUCCESS.newBuilder().toResult(statisticsDataService.getExpiredAccountView(goodsId, account, renewStatus, handleStatus, cnAccount, usAccount, userId, startTime, endTime, start, limit));
+	}
+
+	/**
+	 * 到期状态续费意愿修改
+	 */
+	@PutMapping("/put/renewStatus/{relationId}")
+	public Result<String> updateRenewStatus(@PathVariable Integer relationId) {
+		if (relationId == null || relationId < 1) {
+			throw BusinessRuntimeException.getInstance("用户关联组id不存在");
+		}
+		return statisticsDataService.updateRenewStatus(relationId);
+	}
+
+	/**
+	 * 处理状态修改
+	 */
+	@PutMapping("/put/handleStatus/{relationId}")
+	public Result<String> updateHandleStatus(@PathVariable Integer relationId) {
+		if (relationId == null || relationId < 1) {
+			throw BusinessRuntimeException.getInstance("用户关联组id不存在");
+		}
+		return statisticsDataService.updateHandleStatus(relationId);
+	}
 }