package com.zy.system.controller; 
 | 
  
 | 
import com.baomidou.mybatisplus.mapper.EntityWrapper; 
 | 
import com.core.annotations.ManagerAuth; 
 | 
import com.core.common.Arith; 
 | 
import com.core.common.R; 
 | 
import com.zy.system.service.OperateLogService; 
 | 
import com.zy.system.service.UserLoginService; 
 | 
import com.zy.system.service.UserService; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.web.bind.annotation.RequestMapping; 
 | 
import org.springframework.web.bind.annotation.RequestParam; 
 | 
import org.springframework.web.bind.annotation.RestController; 
 | 
  
 | 
import java.util.*; 
 | 
  
 | 
/** 
 | 
 * Created by vincent on 2019-12-06 
 | 
 */ 
 | 
@RestController 
 | 
@RequestMapping("/home") 
 | 
public class HomeController { 
 | 
  
 | 
    @Autowired 
 | 
    private OperateLogService operateLogService; 
 | 
    @Autowired 
 | 
    private UserService userService; 
 | 
    @Autowired 
 | 
    private UserLoginService userLoginService; 
 | 
  
 | 
    @RequestMapping("/top") 
 | 
    @ManagerAuth 
 | 
    public R top(){ 
 | 
        int logTotal = operateLogService.selectCount(new EntityWrapper<>()); 
 | 
        int logWeek = operateLogService.selectCountByCurrentWeek(); 
 | 
        int userTotal = userService.selectCount(new EntityWrapper<>()); 
 | 
        int loginWeek = userLoginService.selectCountByCurrentWeek(); 
 | 
  
 | 
        Map<String, Object> result = new HashMap<>(); 
 | 
        result.put("logTotal", logTotal); 
 | 
        result.put("logWeek", logWeek); 
 | 
        result.put("userTotal", userTotal); 
 | 
        result.put("live", Arith.multiplys(0, Arith.divides(2, loginWeek, userTotal), 100)+"%"); 
 | 
        return R.ok(result); 
 | 
    } 
 | 
  
 | 
  
 | 
    @RequestMapping("/report") 
 | 
    @ManagerAuth 
 | 
    public R top(@RequestParam(defaultValue = "1", value = "type", required = false)Integer type){ 
 | 
        Calendar calendar = Calendar.getInstance(); 
 | 
        calendar.setTime(new Date()); 
 | 
  
 | 
        List<Map<String, Object>> report; 
 | 
        StatsType statsType = StatsType.get(type); 
 | 
        if (type == 1) { 
 | 
            report = operateLogService.getReport(calendar.get(Calendar.YEAR), null); 
 | 
            report = fill(report, statsType.start, statsType.end); 
 | 
        } else { 
 | 
            report = operateLogService.getReport(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1); 
 | 
            report = fill(report, statsType.start, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); 
 | 
        } 
 | 
  
 | 
  
 | 
        Map<String, Object> result = new HashMap<>(); 
 | 
        result.put("visits", convert(report, statsType, 2)); 
 | 
        return R.ok(result); 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 自动补零 
 | 
     */ 
 | 
    private List<Map<String, Object>> fill(List<Map<String, Object>> list, int start, int end){ 
 | 
        for (int i = start ; i <= end; i++){ 
 | 
            boolean exist = false; 
 | 
            for (Map seq : list){ 
 | 
                if (Integer.parseInt(String.valueOf(seq.get("node"))) == i){ 
 | 
                    exist = true; 
 | 
                } 
 | 
            } 
 | 
            if (!exist){ 
 | 
                HashMap<String, Object> map = new HashMap<>(); 
 | 
                map.put("node", i); 
 | 
                map.put("val", 0); 
 | 
                list.add(map); 
 | 
            } 
 | 
        } 
 | 
        list.sort(Comparator.comparingInt(o -> (int) o.get("node"))); 
 | 
        return list; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * x轴单位转换 
 | 
     * @param dot y轴数值保留小数位 
 | 
     */ 
 | 
    private List<Map<String, Object>> convert(List<Map<String, Object>> list, StatsType statsType, int dot){ 
 | 
        for (Map<String, Object> map : list){ 
 | 
            Object val = map.get("val"); 
 | 
            map.put("val", Arith.multiplys(dot, 1, (Number) val)); 
 | 
            Object node = map.get("node"); 
 | 
            switch (statsType){ 
 | 
                case MONTH: 
 | 
                    map.put("node", node + "号"); 
 | 
                    break; 
 | 
                case YEAR: 
 | 
                    map.put("node", node + "月"); 
 | 
                    break; 
 | 
                default: 
 | 
                    break; 
 | 
            } 
 | 
        } 
 | 
        return list; 
 | 
    } 
 | 
  
 | 
    enum StatsType{ 
 | 
  
 | 
        YEAR(1,1, 12), 
 | 
        MONTH(2,1, 30), 
 | 
        ; 
 | 
  
 | 
        int id; 
 | 
        int start; 
 | 
        int end; 
 | 
        StatsType(int id, int start, int end) { 
 | 
            this.id = id; 
 | 
            this.start = start; 
 | 
            this.end = end; 
 | 
        } 
 | 
  
 | 
        static StatsType get(int id) { 
 | 
            StatsType[] values = StatsType.values(); 
 | 
            for (StatsType statsType : values){ 
 | 
                if (statsType.id == id){ 
 | 
                    return statsType; 
 | 
                } 
 | 
            } 
 | 
            throw new RuntimeException("找不到StatsType类型"); 
 | 
        } 
 | 
  
 | 
    } 
 | 
  
 | 
} 
 |