From c6232cfc36e373f83f45c95d400e09466cc2a7d3 Mon Sep 17 00:00:00 2001
From: yanghui <2536613402@qq.com>
Date: 星期五, 14 十月 2022 17:41:45 +0800
Subject: [PATCH] #feat 修改运营平台统计登录人数和新增人员

---
 springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/DateUtils.java                          |   45 +++++++-
 springcloud_k8s_panzhihuazhihuishequ/service_user/src/main/java/com/panzhihua/service_user/dao/UserDao.java                  |  108 ++++++++++++--------
 springcloud_k8s_panzhihuazhihuishequ/service_user/src/main/java/com/panzhihua/service_user/service/impl/UserServiceImpl.java |   68 ++++++++++---
 springcloud_k8s_panzhihuazhihuishequ/service_user/src/main/resources/mapper/UserDao.xml                                      |   39 +++++++
 4 files changed, 194 insertions(+), 66 deletions(-)

diff --git a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/DateUtils.java b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/DateUtils.java
index 204af82..901f014 100644
--- a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/DateUtils.java
+++ b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/DateUtils.java
@@ -4,11 +4,10 @@
 import java.text.SimpleDateFormat;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
 import lombok.extern.slf4j.Slf4j;
 
 @Slf4j
@@ -931,8 +930,7 @@
          Date after = getLastMonthEnd();
          System.out.println(date);
          System.out.println(after);
-
-
+         System.out.println(getMonthTwentyDay());
     }
 
     /**
@@ -1129,4 +1127,39 @@
 
         return firstDayOfMonth;
     }
+
+    /**
+     * 获取20天前那天时间
+     *
+     * @return
+     */
+    public static String getTwentyDay() {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(new Date());
+        cal.add(Calendar.DATE, -20);
+
+        return DateUtil.format(cal.getTime(),"yyyy-MM-dd");
+    }
+
+    /**
+     * 获取最近本月20天数据
+     *
+     * @return
+     */
+    public static String getMonthTwentyDay() {
+        Date date = new Date();
+        Long offset = DateUtil.between(new Date(), DateUtil.beginOfMonth(date), DateUnit.DAY);
+        if (offset >= 20) {
+            return getTwentyDay();
+        } else {
+            //距离月初不足20天
+            Calendar calendar = new GregorianCalendar();
+            calendar.setTime(date);
+            //获得本月第一天
+            calendar.add(Calendar.MONTH, 0);
+            calendar.set(Calendar.DAY_OF_MONTH, 1);
+            return DateUtil.format(calendar.getTime(),"yyyy-MM-dd");
+        }
+
+    }
 }
diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_user/src/main/java/com/panzhihua/service_user/dao/UserDao.java b/springcloud_k8s_panzhihuazhihuishequ/service_user/src/main/java/com/panzhihua/service_user/dao/UserDao.java
index 6e7df5a..6f96a31 100644
--- a/springcloud_k8s_panzhihuazhihuishequ/service_user/src/main/java/com/panzhihua/service_user/dao/UserDao.java
+++ b/springcloud_k8s_panzhihuazhihuishequ/service_user/src/main/java/com/panzhihua/service_user/dao/UserDao.java
@@ -1,18 +1,5 @@
 package com.panzhihua.service_user.dao;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-import com.panzhihua.common.model.vos.community.*;
-import com.panzhihua.common.model.vos.community.acid.ComActAcidCheckRecordVO;
-import com.panzhihua.common.model.vos.community.acid.ComActAcidMemberVO;
-import com.panzhihua.common.model.vos.community.acid.ComActAcidRecordVO;
-import com.panzhihua.common.model.vos.user.*;
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-import org.springframework.web.bind.annotation.RequestParam;
-
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -27,15 +14,23 @@
 import com.panzhihua.common.model.vos.IndexDataKanbanVO;
 import com.panzhihua.common.model.vos.IndexDataVO;
 import com.panzhihua.common.model.vos.LoginUserInfoVO;
+import com.panzhihua.common.model.vos.community.*;
+import com.panzhihua.common.model.vos.community.acid.ComActAcidCheckRecordVO;
+import com.panzhihua.common.model.vos.community.acid.ComActAcidMemberVO;
+import com.panzhihua.common.model.vos.community.acid.ComActAcidRecordVO;
 import com.panzhihua.common.model.vos.community.screen.event.EventGridMemberVO;
 import com.panzhihua.common.model.vos.grid.GridMemberVO;
 import com.panzhihua.common.model.vos.partybuilding.ComPbServiceTeamWishVO;
-import com.panzhihua.common.model.vos.user.AdministratorsUserVO;
-import com.panzhihua.common.model.vos.user.SysUserNoticeVO;
-import com.panzhihua.common.model.vos.user.SysUserVO;
-import com.panzhihua.common.model.vos.user.UpdateUserArchivesVO;
+import com.panzhihua.common.model.vos.user.*;
 import com.panzhihua.service_user.model.dos.SysUserDO;
 import com.panzhihua.service_user.model.dtos.DataKanbanDTO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
 
 /**
  * @program: springcloud_k8s_panzhihuazhihuishequ
@@ -54,11 +49,11 @@
 
 
     IPage<AdministratorsUserVO> pageUserBackstage(Page page,
-        @Param("administratorsUserVO") AdministratorsUserVO administratorsUserVO);
+                                                  @Param("administratorsUserVO") AdministratorsUserVO administratorsUserVO);
 
 
     IPage<SysUserVO> pageUserAppletsBackstage(Page page,
-        @Param("pageUserAppletsBackstageDTO") PageUserAppletsBackstageDTO pageUserAppletsBackstageDTO);
+                                              @Param("pageUserAppletsBackstageDTO") PageUserAppletsBackstageDTO pageUserAppletsBackstageDTO);
 
 
     int deleteUserTest(Long userId);
@@ -77,7 +72,7 @@
 
     DataKanbanDTO selectCommunityActiveUserOrder(Date date1);
 
-    DataKanbanDTO selectCommunityAddUserOrder(@Param("areaCode")String areaCode,@Param("date1")Date date1);
+    DataKanbanDTO selectCommunityAddUserOrder(@Param("areaCode") String areaCode, @Param("date1") Date date1);
 
 
     IndexDataVO indexDataCommunityBackstage(Long communityId);
@@ -135,7 +130,7 @@
 
 
     IPage<GridMemberVO> getGridMemberList(Page page,
-        @Param("memberRelationDTO") PageEventGridMemberRelationDTO memberRelationDTO);
+                                          @Param("memberRelationDTO") PageEventGridMemberRelationDTO memberRelationDTO);
 
 
     void gridMemberEditStatus(@Param("gridMemberEditDTO") EventGridMemberEditStatusDTO gridMemberEditDTO);
@@ -145,7 +140,7 @@
 
 
     void addLcMember(@Param("lcMemberId") Long lcMemberId, @Param("userId") Long userId,
-        @Param("userName") String userName);
+                     @Param("userName") String userName);
 
 
     void delLcMember(@Param("gridMemberId") Long gridMemberId);
@@ -166,7 +161,7 @@
 
 
     List<ComPbServiceTeamWishVO> getServiceTeamList(@Param("param") String param,
-        @Param("communityId") Long communityId);
+                                                    @Param("communityId") Long communityId);
 
 
     List<SysUserVO> getUserListByCommunityId(@Param("communityId") Long communityId);
@@ -175,6 +170,7 @@
 
     /**
      * 禁用/启用便民服务商家账号
+     *
      * @param status
      * @param userIds
      * @return
@@ -183,38 +179,44 @@
 
     /**
      * 根据手机号维护社区团队表是否注册
+     *
      * @param phone 手机号
      */
     void judgeCommunityTeam(@Param("phone") String phone);
 
     /**
      * 根据手机号查询社区团队表中用户数量
+     *
      * @param phone 手机号
-     * @return  用户数量
+     * @return 用户数量
      */
     Integer getCommunityTeamCount(@Param("phone") String phone);
 
     /**
      * 查询西区所有街道列表以及统计人数
-     * @return  西区所有街道列表以及统计人数
+     *
+     * @return 西区所有街道列表以及统计人数
      */
     List<IndexUserStreetVo> getUserStreetList(@Param("areaCode") String areaCode);
 
     /**
      * 查询街道下社区列表以及统计人数
-     * @param streetId  街道id
-     * @return  社区列表以及统计人数
+     *
+     * @param streetId 街道id
+     * @return 社区列表以及统计人数
      */
     List<IndexUserCommunityVo> getUserCommunityList(@Param("streetId") Long streetId);
 
     /**
      * 查询街道下社区注册人数统计数据导出
-     * @return  社区注册人数统计数据导出
+     *
+     * @return 社区注册人数统计数据导出
      */
     List<IndexUserStreetExcelExportVo> getUserCommunityExcelExport(String areaCode);
 
     /**
      * 查看是否是社区物业人员
+     *
      * @param userId
      * @param userCommunityId
      * @return
@@ -223,6 +225,7 @@
 
     /**
      * 查看是否社工
+     *
      * @param phone
      * @param communityId
      * @return
@@ -231,6 +234,7 @@
 
     /**
      * 查看是否社会组织
+     *
      * @param userId
      * @return
      */
@@ -239,6 +243,7 @@
 
     /**
      * 查看是否是微团队成员
+     *
      * @param phone
      * @param userCommunityId
      * @return
@@ -247,6 +252,7 @@
 
     /**
      * 查询街道信息
+     *
      * @param streetId
      * @return
      */
@@ -254,6 +260,7 @@
 
     /**
      * 查询是否是社会组织成员
+     *
      * @param userId
      * @return
      */
@@ -261,6 +268,7 @@
 
     /**
      * 查询是否社会组织联系人
+     *
      * @param phone
      * @return
      */
@@ -268,21 +276,25 @@
 
     /**
      * 查询是否人大代表
+     *
      * @param phone
      * @param userCommunityId
      * @return
      */
     int selectCountDpc(@Param("phone") String phone, @Param("userCommunityId") Long userCommunityId);
+
     /**
      * 查看是否网格员
+     *
      * @param phone
      * @param userCommunityId
      * @return
      */
-    int countEasyPhotoMember(@Param("phone") String phone,@Param("communityId") Long userCommunityId);
+    int countEasyPhotoMember(@Param("phone") String phone, @Param("communityId") Long userCommunityId);
 
     /**
      * 查询防疫工作人员信息
+     *
      * @param phone
      * @return
      */
@@ -290,6 +302,7 @@
 
     /**
      * 查询单位管理员
+     *
      * @param phone
      * @return
      */
@@ -297,6 +310,7 @@
 
     /**
      * 查询报道单位id
+     *
      * @param phone
      * @return
      */
@@ -304,6 +318,7 @@
 
     /**
      * 根据社区名称查询区县社区联动关系
+     *
      * @param relationName
      * @return
      */
@@ -311,6 +326,7 @@
 
     /**
      * 根据街道id查询区域名称
+     *
      * @param streetId
      * @return
      */
@@ -318,28 +334,32 @@
 
     /**
      * 看板用户统计:用户占比统计
-     * */
-    List<UserProportion> userAnalysis(@Param("type") Integer type,@Param("range") String range,@Param("streetId") Long streetId,@Param("areaCode")Long areaCode,@Param("appId")String appId);
+     */
+    List<UserProportion> userAnalysis(@Param("type") Integer type, @Param("range") String range, @Param("streetId") Long streetId, @Param("areaCode") Long areaCode, @Param("appId") String appId);
 
     /**
      * 统计区域实名用户数
-     * */
-    List<RealUser> realUserCount(@Param("type") Integer type,@Param("range") String range,@Param("streetId") Long streetId,@Param("areaCode")Long areaCode,@Param("appId")String appId);
+     */
+    List<RealUser> realUserCount(@Param("type") Integer type, @Param("range") String range, @Param("streetId") Long streetId, @Param("areaCode") Long areaCode, @Param("appId") String appId);
 
     /**
      * 统计该街道内的所有用户数
-     * */
-    Integer streetUserCount(@Param("id") Long id,@Param("areaCode")Long areaCode);
+     */
+    Integer streetUserCount(@Param("id") Long id, @Param("areaCode") Long areaCode);
 
     /**
      * 街道用户统计
-     * */
-    IndexDataKanbanVO dataKanBanStreet(@Param("streetId") Long streetId,@Param("areaCode") Long areaCode,@Param("range") String range);
+     */
+    IndexDataKanbanVO dataKanBanStreet(@Param("streetId") Long streetId, @Param("areaCode") Long areaCode, @Param("range") String range);
 
     /**
      * 获取当天的新增和日活
-     * */
-    Map<String,Long> getDailyAddAndActive(@Param("date") Date date, @Param("id") Long streetId, @Param("areaCode") Long areaCode, @Param("appId") String appId);
+     */
+    Map<String, Long> getDailyAddAndActive(@Param("date") Date date, @Param("id") Long streetId, @Param("areaCode") Long areaCode, @Param("appId") String appId);
+
+    Map<String, Long> getDailyAdd(@Param("createAt") String createAt, @Param("id") Long streetId, @Param("areaCode") Long areaCode, @Param("appId") String appId);
+
+    Map<String, Long> getActive(@Param("lastLoginTime") String lastLoginTime, @Param("id") Long streetId, @Param("areaCode") Long areaCode, @Param("appId") String appId);
 
 
     List<StreetVOS> selectStreetByAreaCode(Integer code);
@@ -354,17 +374,17 @@
 
     /**
      * 获取本月的
-     * */
-    Integer getMonthUsers(@Param("streetId") Long streetId,@Param("areaCode") Long areaCode,@Param("range") String range,@Param("appId")String appId);
+     */
+    Integer getMonthUsers(@Param("streetId") Long streetId, @Param("areaCode") Long areaCode, @Param("range") String range, @Param("appId") String appId);
 
     /**
      * 获取街道下属村/社区
-     * */
-    List<CommunityVO> selectCommunityByStreetId(@Param("id") Long streetId,@Param("type") Integer type);
+     */
+    List<CommunityVO> selectCommunityByStreetId(@Param("id") Long streetId, @Param("type") Integer type);
 
     /**
      * 获取账户id
-     * */
+     */
     List<Integer> selectIdsByAccount(@Param("array") String[] streetList);
 
     List<CommunityVO> selectCommunityByStreetName(String name);
diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_user/src/main/java/com/panzhihua/service_user/service/impl/UserServiceImpl.java b/springcloud_k8s_panzhihuazhihuishequ/service_user/src/main/java/com/panzhihua/service_user/service/impl/UserServiceImpl.java
index dabbc24..1897a3e 100644
--- a/springcloud_k8s_panzhihuazhihuishequ/service_user/src/main/java/com/panzhihua/service_user/service/impl/UserServiceImpl.java
+++ b/springcloud_k8s_panzhihuazhihuishequ/service_user/src/main/java/com/panzhihua/service_user/service/impl/UserServiceImpl.java
@@ -141,13 +141,17 @@
         // String encode = new BCryptPasswordEncoder().encode("lbsq123456");
         // System.out.println(encode);
 
-        List<String> dates = new ArrayList<>();
+//        List<String> dates = new ArrayList<>();
+//        Date date = new Date();
+//        for (int i = 19; i >= 0; i--) {
+//            Date date1 = DateUtils.addDays(date, -i);
+//            dates.add(DateFormatUtils.format(date1, "MM-dd"));
+//        }
+//        System.out.println(dates);
+
         Date date = new Date();
-        for (int i = 19; i >= 0; i--) {
-            Date date1 = DateUtils.addDays(date, -i);
-            dates.add(DateFormatUtils.format(date1, "MM-dd"));
-        }
-        System.out.println(dates);
+        Long offset = DateUtil.between(new Date(), DateUtil.beginOfMonth(date), DateUnit.DAY);
+        System.out.println(offset);
 
         // BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
         // boolean matches = encoder.matches("admin1234567", encode);
@@ -3180,7 +3184,7 @@
         } else if ("wx98d62711dfbd8425".equals(uuLoginVO.getAppid())) {
             appId = "10001";
             secret = "d89f3a35931c386956c1a402a8e09941";
-        }else {
+        } else {
             return R.fail("appid未传");
         }
         uuLoginVO.setAppid(appId);
@@ -3193,7 +3197,7 @@
         }
         Map<String, String> headerMap = new HashMap<>();
         headerMap.put("appid", appId);
-        String resultJson = HttpClientUtil.get("https://api.uucsh.cn/member/wx/get-access?province=" + uuLoginVO.getProvince() + "&city=" + uuLoginVO.getCity() + "&area=" + uuLoginVO.getArea() + "&appid="+appId+"&timestamp=" + uuLoginVO.getTimestamp() + "&sign=" + uuLoginVO.getSign() + "&mobile=" + uuLoginVO.getMobile() + "&couponId=" + uuLoginVO.getCouponId(), headerMap, null);
+        String resultJson = HttpClientUtil.get("https://api.uucsh.cn/member/wx/get-access?province=" + uuLoginVO.getProvince() + "&city=" + uuLoginVO.getCity() + "&area=" + uuLoginVO.getArea() + "&appid=" + appId + "&timestamp=" + uuLoginVO.getTimestamp() + "&sign=" + uuLoginVO.getSign() + "&mobile=" + uuLoginVO.getMobile() + "&couponId=" + uuLoginVO.getCouponId(), headerMap, null);
         JSONObject result = JSON.parseObject(resultJson);
         if (result.get("status").equals(1)) {
             return R.ok(result.get("data"));
@@ -3420,25 +3424,56 @@
         return R.ok(realUserVO);
     }
 
+//    @Override
+//    public R userActivity(Integer type, Long streetId, Long areaCode, Integer range, String appId) {
+//        UserActivityAnalysisVO vo = new UserActivityAnalysisVO();
+//        List<Date> activeX = getTwentyDays();
+//        List<String> activeY = new ArrayList<>();
+//        List<String> adY = new ArrayList<>();
+//        if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(range)) {
+//            if (range.equals(1)) {
+//                //本月数据
+//                activeX = getMonthTwentyDays();
+//            }
+//        }
+//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+//        for (Date date : activeX) {
+//            Map<String, Long> map = userDao.getDailyAddAndActive(DateUtil.parse(sdf.format(date)), streetId, areaCode, appId);
+//            adY.add(map.get("addUser").toString());
+//            activeY.add(map.get("activeUser").toString());
+//        }
+//        vo.setUserX(getMAndD(activeX));
+//        vo.setAddUserY(adY);
+//        vo.setActiveUserY(activeY);
+//        return R.ok(vo);
+//    }
+
     @Override
     public R userActivity(Integer type, Long streetId, Long areaCode, Integer range, String appId) {
         UserActivityAnalysisVO vo = new UserActivityAnalysisVO();
-        List<Date> activeX = getTwentyDays();
+        String activeX = com.panzhihua.common.utlis.DateUtils.getTwentyDay();
+        List<Date> activeDate = getTwentyDays();
         List<String> activeY = new ArrayList<>();
         List<String> adY = new ArrayList<>();
         if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(range)) {
             if (range.equals(1)) {
                 //本月数据
-                activeX = getMonthTwentyDays();
+                activeX = com.panzhihua.common.utlis.DateUtils.getMonthTwentyDay();
+                activeDate = getMonthTwentyDays();
             }
         }
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-        for (Date date : activeX) {
-            Map<String, Long> map = userDao.getDailyAddAndActive(DateUtil.parse(sdf.format(date)), streetId, areaCode, appId);
-            adY.add(map.get("addUser").toString());
-            activeY.add(map.get("activeUser").toString());
+
+        //获取最近活跃人数
+        Map<String, Long> active = userDao.getActive(activeX, streetId, areaCode, appId);
+        //获取最近注册人数
+        Map<String, Long> dailyAdd = userDao.getDailyAdd(activeX, streetId, areaCode, appId);
+        for (Date date : activeDate) {
+            String dateStr = DateUtil.format(date, "yyyy-MM-dd");
+            activeY.add(active.containsKey(dateStr) ? active.get("activeUser").toString() : "0");
+            adY.add(dailyAdd.containsKey(dateStr) ? dailyAdd.get("addUser").toString() : "0");
+
         }
-        vo.setUserX(getMAndD(activeX));
+        vo.setUserX(getMAndD(activeDate));
         vo.setAddUserY(adY);
         vo.setActiveUserY(activeY);
         return R.ok(vo);
@@ -3683,6 +3718,7 @@
         return dates;
     }
 
+
     /**
      * 获取最近本月20天数据
      *
diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_user/src/main/resources/mapper/UserDao.xml b/springcloud_k8s_panzhihuazhihuishequ/service_user/src/main/resources/mapper/UserDao.xml
index d28d4ed..bc8d554 100644
--- a/springcloud_k8s_panzhihuazhihuishequ/service_user/src/main/resources/mapper/UserDao.xml
+++ b/springcloud_k8s_panzhihuazhihuishequ/service_user/src/main/resources/mapper/UserDao.xml
@@ -709,6 +709,45 @@
         </if>
     </select>
 
+    <select id="getDailyAdd" resultType="java.util.Map">
+        SELECT DATE_FORMAT( su.create_at, '%Y-%m-%d' ) as createAt ,count(su.user_id) as addUser	  FROM
+        sys_user AS su
+        LEFT JOIN com_act AS ac ON su.community_id = ac.community_id
+        LEFT JOIN com_street AS cs ON ac.street_id = cs.street_id
+        where su.community_id&lt;>''
+        and cs.area_code&lt;>''
+        and su.type = 1
+        <if test="appId != null and appId != &quot;&quot;">
+            and su.app_id = #{appId}
+        </if>
+        <if test="id != null">
+            and cs.street_id=#{id}
+        </if>
+        <if test="areaCode != null">
+            and cs.area_code=#{areaCode}
+        </if>
+        AND su.create_at > #{createAt} GROUP BY createAt
+    </select>
+    <select id="getActive" resultType="java.util.Map">
+        SELECT DATE_FORMAT( su.last_login_time, '%Y-%m-%d' ) as createAt ,count(su.user_id) as activeUser	  FROM
+        sys_user AS su
+        LEFT JOIN com_act AS ac ON su.community_id = ac.community_id
+        LEFT JOIN com_street AS cs ON ac.street_id = cs.street_id
+        where su.community_id&lt;>''
+        and cs.area_code&lt;>''
+        and su.type = 1
+        <if test="appId != null and appId != &quot;&quot;">
+            and su.app_id = #{appId}
+        </if>
+        <if test="id != null">
+            and cs.street_id=#{id}
+        </if>
+        <if test="areaCode != null">
+            and cs.area_code=#{areaCode}
+        </if>
+        AND su.last_login_time > #{lastLoginTime} GROUP BY createAt
+    </select>
+
     <select id="selectStreetByAreaCode" resultType="com.panzhihua.common.model.vos.user.StreetVOS">
         select street_id as id,name as name from com_street where area_code=#{code} and app_id ='wx118de8a734d269f0'
     </select>

--
Gitblit v1.7.1