Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

wujiefeng 1 год назад
Родитель
Сommit
38a5adcfaa
16 измененных файлов с 245 добавлено и 37 удалено
  1. 4 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/OrganizationUserSearch.java
  2. 3 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/userStatistics/PlatformUserStatisModel.java
  3. 1 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/user/UserStatisticsController.java
  4. 2 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/extend/DeviceInfoDaoExtend.java
  5. 26 12
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/impl/DeviceInfoDaoImpl.java
  6. 1 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/OrganizationUserDao.java
  7. 2 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/extend/OrganizationUserDaoExtend.java
  8. 1 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/extend/UserCountDaoExtend.java
  9. 28 12
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/impl/OrganizationUserDaoImpl.java
  10. 26 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/impl/UserCountDaoImpl.java
  11. 30 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DeviceUseRecords.java
  12. 9 7
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/DeviceUseRecordService.java
  13. 49 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/statistics/DeviceStatisticsService.java
  14. 34 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/statistics/OrgUserStatisticsService.java
  15. 27 2
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/statistics/UserStatisticsService.java
  16. 2 2
      FullCardServer/src/main/java/com/zhongshu/card/server/core/util/CommonUtil.java

+ 4 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/OrganizationUserSearch.java

@@ -3,6 +3,7 @@ package com.zhongshu.card.client.model.org;
 import com.github.microservice.auth.security.type.AuthType;
 import com.zhongshu.card.client.model.base.SuperSearch;
 import com.zhongshu.card.client.type.OrganizationUserType;
+import com.zhongshu.card.client.type.Sex;
 import com.zhongshu.card.client.type.UserState;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
@@ -34,6 +35,9 @@ public class OrganizationUserSearch extends SuperSearch {
     @Schema(description = "姓名")
     private String name;
 
+    @Schema(description = "性别")
+    private Sex sex;
+
     @Schema(description = "用户状态")
     private UserState state;
 

+ 3 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/userStatistics/PlatformUserStatisModel.java

@@ -36,4 +36,7 @@ public class PlatformUserStatisModel {
     @Schema(description = "未设置性别的")
     private Long unSetTotal = 0l;
 
+    @Schema(description = "较昨日")
+    private BigDecimal chainDay = BigDecimal.ZERO;
+
 }

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/user/UserStatisticsController.java

@@ -5,7 +5,7 @@ import com.github.microservice.auth.security.helper.AuthHelper;
 import com.github.microservice.auth.security.type.AuthType;
 import com.github.microservice.net.ResultContent;
 import com.zhongshu.card.client.model.userStatistics.PlatformUserStatisModel;
-import com.zhongshu.card.server.core.service.userStatistics.UserStatisticsService;
+import com.zhongshu.card.server.core.service.statistics.UserStatisticsService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;

+ 2 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/extend/DeviceInfoDaoExtend.java

@@ -16,4 +16,6 @@ public interface DeviceInfoDaoExtend {
 
     Page<DeviceInfo> page(Pageable pageable, DeviceInfoSearch param);
 
+    long count(DeviceInfoSearch param);
+
 }

+ 26 - 12
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/impl/DeviceInfoDaoImpl.java

@@ -4,8 +4,8 @@ import com.github.microservice.components.data.mongo.mongo.helper.DBHelper;
 import com.zhongshu.card.client.model.devices.DeviceInfoSearch;
 import com.zhongshu.card.server.core.dao.BaseImpl;
 import com.zhongshu.card.server.core.dao.devices.extend.DeviceInfoDaoExtend;
-import com.zhongshu.card.server.core.domain.school.Area;
 import com.zhongshu.card.server.core.domain.devices.DeviceInfo;
+import com.zhongshu.card.server.core.domain.school.Area;
 import com.zhongshu.card.server.core.util.CommonUtil;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -37,9 +37,30 @@ public class DeviceInfoDaoImpl extends BaseImpl implements DeviceInfoDaoExtend {
 
     @Override
     public Page<DeviceInfo> page(Pageable pageable, DeviceInfoSearch param) {
+        Criteria criteria = buildFilterCriteria(param);
+
+        Sort sort = buildSort(param);
+        Query query = Query.query(criteria);
+        query.with(sort);
+        return dbHelper.pages(query, pageable, DeviceInfo.class);
+    }
+
+    @Override
+    public long count(DeviceInfoSearch param) {
+        Criteria criteria = buildFilterCriteria(param);
+
+        Query query = Query.query(criteria);
+        return mongoTemplate.count(query, DeviceInfo.class);
+    }
+
+    public Criteria buildFilterCriteria(DeviceInfoSearch param) {
         param.setOid("");
         Criteria criteria = buildCriteria(param);
 
+        if (StringUtils.isNotEmpty(param.getProjectOid())) {
+            criteria.and("projectOid").is(param.getProjectOid());
+        }
+
         if (param.getDeviceType() != null) {
             criteria.and("deviceType").is(param.getDeviceType());
         }
@@ -57,9 +78,10 @@ public class DeviceInfoDaoImpl extends BaseImpl implements DeviceInfoDaoExtend {
         }
 
         if (!CommonUtil.longIsEmpty(param.getStartTime()) && !CommonUtil.longIsEmpty(param.getEndTime())) {
-            criteria.and("createTime").gte(param.getStartTime()).and("createTime").lte(param.getEndTime());
+            criteria.and("createTime").gte(param.getStartTime()).lte(param.getEndTime());
         }
 
+        // 设备绑定的机构
         if (ObjectUtils.isNotEmpty(param.getShopOids())) {
             criteria.and("beLongOid").in(param.getShopOids());
         }
@@ -97,17 +119,9 @@ public class DeviceInfoDaoImpl extends BaseImpl implements DeviceInfoDaoExtend {
 
         if (StringUtils.isNotEmpty(param.getKeyWord())) {
             Pattern pattern = Pattern.compile("^.*" + param.getKeyWord() + ".*$");
-            criteria.orOperator(
-                    Criteria.where("deviceId").regex(pattern),
-                    Criteria.where("deviceName").regex(pattern),
-                    Criteria.where("gateWayId").regex(pattern),
-                    Criteria.where("ip").regex(pattern)
-            );
+            criteria.orOperator(Criteria.where("deviceId").regex(pattern), Criteria.where("deviceName").regex(pattern), Criteria.where("gateWayId").regex(pattern), Criteria.where("ip").regex(pattern));
         }
-        Sort sort = buildSort(param);
-        Query query = Query.query(criteria);
-        query.with(sort);
-        return dbHelper.pages(query, pageable, DeviceInfo.class);
+        return criteria;
     }
 
 }

+ 1 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/OrganizationUserDao.java

@@ -60,4 +60,5 @@ public interface OrganizationUserDao extends MongoDao<OrganizationUser>, Organiz
     List<OrganizationUser> findByUserId(String userId);
 
     List<OrganizationUser> findByUserIdAndProjectOid(String userId, String projectOid);
+
 }

+ 2 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/extend/OrganizationUserDaoExtend.java

@@ -14,4 +14,6 @@ public interface OrganizationUserDaoExtend {
 
     Page<OrganizationUser> page(Pageable pageable, OrganizationUserSearch param);
 
+    long countUser(OrganizationUserSearch param);
+
 }

+ 1 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/extend/UserCountDaoExtend.java

@@ -14,5 +14,6 @@ public interface UserCountDaoExtend {
 
     Page<UserAccount> page(Pageable pageable, UserCountSearchParam param);
 
+    long countNumber(UserCountSearchParam param);
 
 }

+ 28 - 12
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/impl/OrganizationUserDaoImpl.java

@@ -9,7 +9,6 @@ import com.zhongshu.card.server.core.dao.org.extend.OrganizationUserDaoExtend;
 import com.zhongshu.card.server.core.domain.org.Department;
 import com.zhongshu.card.server.core.domain.org.OrganizationUser;
 import com.zhongshu.card.server.core.domain.org.Role;
-import com.zhongshu.card.server.core.util.CommonUtil;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -39,22 +38,38 @@ public class OrganizationUserDaoImpl extends BaseImpl implements OrganizationUse
     private DBHelper dbHelper;
 
     @Autowired
-    RoleDao roleDao;
+    private RoleDao roleDao;
 
     @Autowired
-    DepartmentDao departmentDao;
+    private DepartmentDao departmentDao;
 
     @Override
     public Page<OrganizationUser> page(Pageable pageable, OrganizationUserSearch param) {
+        Criteria criteria = buildFilterCriteria(param);
+
+        Sort sort = buildSort(param);
+        Query query = Query.query(criteria);
+        query.with(sort);
+        return dbHelper.pages(query, pageable, OrganizationUser.class);
+    }
+
+    @Override
+    public long countUser(OrganizationUserSearch param) {
+        Criteria criteria = buildFilterCriteria(param);
+        Query query = Query.query(criteria);
+        return mongoTemplate.count(query, OrganizationUser.class);
+    }
+
+    private Criteria buildFilterCriteria(OrganizationUserSearch param) {
         Criteria criteria = buildCriteriaNotOid(param);
 
         // 用户ID
-        if (ObjectUtils.isNotEmpty(param.getUserId())) {
+        if (StringUtils.isNotEmpty(param.getUserId())) {
             criteria.and("userId").is(param.getUserId());
         }
 
         // 机构ID
-        if (ObjectUtils.isNotEmpty(param.getOid())) {
+        if (StringUtils.isNotEmpty(param.getOid())) {
             criteria.and("oid").is(param.getOid());
         }
 
@@ -88,16 +103,21 @@ public class OrganizationUserDaoImpl extends BaseImpl implements OrganizationUse
             criteria.and("position.id").is(param.getPositionId());
         }
 
+        // 性别
+        if (param.getSex() != null) {
+            criteria.and("sex").is(param.getSex());
+        }
+
         // 角色
         List<String> roleIds = param.getRoleIds();
-        if (!CollectionUtils.isEmpty(roleIds)) {
+        if (ObjectUtils.isNotEmpty(roleIds)) {
             List<Role> roles = roleDao.findByIdIn(roleIds);
             criteria.and("roles").in(roles);
         }
 
         // 部门
         List<String> departmentIds = param.getDepartmentIds();
-        if (!CollectionUtils.isEmpty(departmentIds)) {
+        if (ObjectUtils.isNotEmpty(departmentIds)) {
             List<Department> roles = departmentDao.findByIdIn(departmentIds);
             criteria.and("departments").in(roles);
         }
@@ -137,11 +157,7 @@ public class OrganizationUserDaoImpl extends BaseImpl implements OrganizationUse
             Pattern pattern = Pattern.compile("^.*" + param.getKeyWord() + ".*$");
             criteria.orOperator(Criteria.where("name").regex(pattern), Criteria.where("phone").regex(pattern), Criteria.where("code").regex(pattern));
         }
-
-        Sort sort = buildSort(param);
-        Query query = Query.query(criteria);
-        query.with(sort);
-        return dbHelper.pages(query, pageable, OrganizationUser.class);
+        return criteria;
     }
 
 }

+ 26 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/impl/UserCountDaoImpl.java

@@ -13,12 +13,15 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.aggregation.Aggregation;
+import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.regex.Pattern;
 
 /**
@@ -41,9 +44,32 @@ public class UserCountDaoImpl extends BaseImpl implements UserCountDaoExtend {
         Sort sort = buildSort(param);
         Query query = Query.query(criteria);
         query.with(sort);
+
         return dbHelper.pages(query, pageable, UserAccount.class);
     }
 
+    @Override
+    public long countNumber(UserCountSearchParam param) {
+        Criteria criteria = buildCriteria(param);
+        Query query = Query.query(criteria);
+        long count = mongoTemplate.count(query, UserAccount.class);
+//        List<AggregationOperation> operations = new ArrayList<>(2);
+//        AggregationOperation match = Aggregation.match(criteria);
+//        operations.add(match);
+//
+//        AggregationOperation group = Aggregation.group("state").count().as("count");
+//        operations.add(group);
+//
+//        Aggregation groupAggregation = Aggregation.newAggregation(operations);
+//        List<Map> countObjs = mongoTemplate.aggregate(groupAggregation, BusinessInfo.class, Map.class).getMappedResults();
+//        if (countObjs.size() > 0) {
+//            Object obj = countObjs.get(0).get("count");
+//            int number = CommonUtil.getBigDecimalByObj(obj).intValue();
+//        }
+
+        return count;
+    }
+
     public Criteria buildCriteria(UserCountSearchParam param) {
         Criteria criteria = new Criteria();
 

+ 30 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DeviceUseRecords.java

@@ -7,6 +7,7 @@ import com.github.microservice.types.deviceUse.OperateType;
 import com.zhongshu.card.client.model.devices.DeviceInfoStoreModel;
 import com.zhongshu.card.client.model.org.UserCountSimpleModel;
 import com.zhongshu.card.client.model.school.CardInfoStoreModel;
+import com.zhongshu.card.client.utils.DateUtils;
 import com.zhongshu.card.server.core.domain.base.SuperMain;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
@@ -44,7 +45,7 @@ public class DeviceUseRecords extends SuperMain {
     @Schema(description = "操作模式,卡片、人脸、密码、指纹...")
     private OperateType operateType;
 
-    @Schema(description = "操作记录结果")
+    @Schema(description = "操作记录结果, 成功、失败、未知")
     private OperateState operateState;
 
     @Schema(description = "设备ID")
@@ -89,6 +90,34 @@ public class DeviceUseRecords extends SuperMain {
     @Schema(description = "时间")
     private Long timestamp;
 
+    @Schema(description = "年份,如:2024")
+    private Integer year;
+
+    @Schema(description = "月份,如:6")
+    private Integer month;
+
+    @Schema(description = "当前月的第几天")
+    private Integer dayOfMonth;
+
+    @Schema(description = "今年第几周,如:32")
+    private Integer week;
+
+    @Schema(description = "当前年的第几天")
+    private Integer dayOfYear;
+
+    @Schema(description = "当前的第几小时")
+    private Integer hourOfDay;
+
+    public void setTimes() {
+        this.year = DateUtils.getCurrentYear();
+        this.month = DateUtils.getCurrentMonthInYear();
+        this.dayOfMonth = DateUtils.getCurrentDayInMonth();
+        this.hourOfDay = DateUtils.getCurrentHourOfDay();
+
+        this.dayOfYear = DateUtils.getCurrentDayInYear();
+        this.week = DateUtils.getCurrentWeekInYear();
+    }
+
     //-----------------------验证是否通过
 
     @Schema(description = "创建时间,可阅读的")

+ 9 - 7
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/DeviceUseRecordService.java

@@ -1,14 +1,8 @@
 package com.zhongshu.card.server.core.service.devices;
 
-import cn.hutool.json.JSONUtil;
 import com.github.microservice.components.data.base.util.PageEntityUtil;
-import com.github.microservice.models.gateDoor.gateDoor.GateDoorIotParam;
-import com.github.microservice.models.gateDoor.use.GateDoorInfoParam;
 import com.github.microservice.models.gateDoor.use.GateDoorUseParam;
-import com.github.microservice.models.gateDoor.use.GateDoorUseResult;
 import com.github.microservice.net.ResultContent;
-import com.github.microservice.types.deviceUse.OperateState;
-import com.github.microservice.types.deviceUse.OperateType;
 import com.zhongshu.card.client.model.devices.DeviceUseRecordModel;
 import com.zhongshu.card.client.model.devices.DeviceUseRecordSearch;
 import com.zhongshu.card.client.utils.DateUtils;
@@ -95,6 +89,7 @@ public class DeviceUseRecordService extends SuperService {
                 String cardNo = param.getCardNo();
                 String userId = param.getUserId();
                 String projectOid = "";
+
                 DeviceInfo deviceInfo = null;
                 if (StringUtils.isNotEmpty(deviceId)) {
                     deviceInfo = deviceInfoDao.findTopByDeviceId(deviceId);
@@ -102,13 +97,14 @@ public class DeviceUseRecordService extends SuperService {
                         projectOid = deviceInfo.getProjectOid();
                     }
                 }
+                // 设备信息
                 deviceUseRecord.setDeviceId(deviceId);
                 if (ObjectUtils.isNotEmpty(deviceInfo)) {
                     // 设备信息
                     deviceUseRecord.setDeviceInfo(deviceInfoService.toStoreModel(deviceInfo));
                     deviceUseRecord.setDeviceType(deviceInfo.getDeviceType());
                     deviceUseRecord.setGateWayId(deviceInfo.getGateWayId());
-
+                    // 所属商户
                     deviceUseRecord.setBeLongOid(deviceInfo.getBeLongOid());
                     deviceUseRecord.setBeLongName(deviceInfo.getBeLongName());
                 }
@@ -127,6 +123,7 @@ public class DeviceUseRecordService extends SuperService {
                     deviceUseRecord.setCardInfo(cardInfoService.toStoreModel(cardInfo));
                 }
 
+                // 用户信息
                 UserAccount userAccount = null;
                 if (StringUtils.isNotEmpty(userId)) {
                     userAccount = userCountDao.findTopByUserId(userId);
@@ -136,9 +133,14 @@ public class DeviceUseRecordService extends SuperService {
                 }
                 deviceUseRecord.setUserId(userId);
                 deviceUseRecord.setUserAccount(userAccountService.toSimpleModel(userAccount));
+
+                // 使用时间
                 if (StringUtils.isNotEmpty(param.getTime())) {
                     deviceUseRecord.setTimestamp(DateUtils.timeToLong(param.getTime(), DateUtils.FORMAT_LONG));
                 }
+                deviceUseRecord.setTimes();
+
+                // 项目信息
                 deviceUseRecord.setProjectOid(projectOid);
                 Organization organization = organizationDao.findTopByOid(projectOid);
                 if (ObjectUtils.isNotEmpty(organization)) {

+ 49 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/statistics/DeviceStatisticsService.java

@@ -0,0 +1,49 @@
+package com.zhongshu.card.server.core.service.statistics;
+
+import com.zhongshu.card.client.model.devices.DeviceInfoSearch;
+import com.zhongshu.card.client.type.OnLineState;
+import com.zhongshu.card.server.core.dao.devices.DeviceInfoDao;
+import com.zhongshu.card.server.core.service.base.SuperService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 设备统计
+ *
+ * @author TRX
+ * @date 2024/12/12
+ */
+@Slf4j
+@Service
+public class DeviceStatisticsService extends SuperService {
+
+    @Autowired
+    private DeviceInfoDao deviceInfoDao;
+
+    /**
+     * 查询项目所有的设备数量
+     *
+     * @param projectOid
+     * @return
+     */
+    public long countProjectAllDevice(String projectOid) {
+        DeviceInfoSearch param = new DeviceInfoSearch();
+        param.setProjectOid(projectOid);
+        return deviceInfoDao.count(param);
+    }
+
+    /**
+     * 查询项目设备在线的数量
+     *
+     * @param projectOid
+     * @return
+     */
+    public long countProjectOnlineDevice(String projectOid) {
+        DeviceInfoSearch param = new DeviceInfoSearch();
+        param.setProjectOid(projectOid);
+        param.setOnLineState(OnLineState.OnLine);
+        return deviceInfoDao.count(param);
+    }
+
+}

+ 34 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/statistics/OrgUserStatisticsService.java

@@ -0,0 +1,34 @@
+package com.zhongshu.card.server.core.service.statistics;
+
+import com.zhongshu.card.client.model.org.OrganizationUserSearch;
+import com.zhongshu.card.server.core.dao.org.OrganizationUserDao;
+import com.zhongshu.card.server.core.service.base.SuperService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 项目、机构人员统计
+ */
+@Slf4j
+@Service
+public class OrgUserStatisticsService extends SuperService {
+
+    @Autowired
+    private OrganizationUserDao orgUserDao;
+
+    /**
+     * 统计项目用户数量
+     *
+     * @param projectOid
+     * @return
+     */
+    public long countProjectAllUsers(String projectOid) {
+        OrganizationUserSearch param = new OrganizationUserSearch();
+        param.setProjectOid(projectOid);
+        param.setIsSearchProject(Boolean.TRUE);
+        param.setIsOrg(Boolean.TRUE);
+        return orgUserDao.countUser(param);
+    }
+
+}

+ 27 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/userStatistics/UserStatisticsService.java → FullCardServer/src/main/java/com/zhongshu/card/server/core/service/statistics/UserStatisticsService.java

@@ -1,8 +1,10 @@
-package com.zhongshu.card.server.core.service.userStatistics;
+package com.zhongshu.card.server.core.service.statistics;
 
 import com.github.microservice.net.ResultContent;
+import com.zhongshu.card.client.model.org.UserCountSearchParam;
 import com.zhongshu.card.client.model.userStatistics.PlatformUserStatisModel;
 import com.zhongshu.card.client.type.Sex;
+import com.zhongshu.card.client.utils.DateUtils;
 import com.zhongshu.card.server.core.dao.org.UserCountDao;
 import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.util.CommonUtil;
@@ -10,6 +12,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Calendar;
+
 /**
  * 用户统计服务
  *
@@ -23,7 +27,11 @@ public class UserStatisticsService extends SuperService {
     @Autowired
     private UserCountDao userCountDao;
 
-
+    /**
+     * 统计平台用户返回
+     *
+     * @return
+     */
     public ResultContent<PlatformUserStatisModel> statisticsPlatformUserInfo() {
         return ResultContent.buildSuccess(statisticsPlatformUser());
     }
@@ -52,6 +60,23 @@ public class UserStatisticsService extends SuperService {
             model.setUnSetTotal(total - womanTotal - manTotal);
         }
 
+        // 昨天
+        UserCountSearchParam searchParam = new UserCountSearchParam();
+        Calendar c = Calendar.getInstance();
+        c.add(Calendar.DATE, -1);
+        Long yStart = DateUtils.getDayStartTime(c.getTimeInMillis());
+        Long yEnd = DateUtils.getDayEndTime(c.getTimeInMillis());
+        searchParam.setStartTime(yStart);
+        searchParam.setEndTime(yEnd);
+        long yNumber = userCountDao.countNumber(searchParam);
+        // 今天
+        Long start = DateUtils.getDayStartTime(System.currentTimeMillis());
+        Long end = DateUtils.getDayEndTime(System.currentTimeMillis());
+        searchParam.setStartTime(start);
+        searchParam.setEndTime(end);
+        long number = userCountDao.countNumber(searchParam);
+        // 较昨日
+        model.setChainDay(CommonUtil.chainScale(number, yNumber));
 
         return model;
     }

+ 2 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/util/CommonUtil.java

@@ -625,13 +625,13 @@ public class CommonUtil {
 
     /**
      * 计算环比,如:83.2 (最多保留2未小数)
-     * `
+     *
      *
      * @param currentNumber 当期的值
      * @param preNumber     上期的值
      * @return
      */
-    public BigDecimal chainScale(Long currentNumber, Long preNumber) {
+    public static BigDecimal chainScale(Long currentNumber, Long preNumber) {
         BigDecimal number = BigDecimal.ZERO;
         if (currentNumber != null) {
             if (preNumber == null || preNumber == 0) {