Commit f8dd35c0 authored by nie'hong's avatar nie'hong

完善项目工时统计

parent ed34748f
......@@ -26,6 +26,8 @@ public interface WorkProjectMapper extends BaseMapper<WorkProject> {
*/
List<WorkProject> getProjectsByCriteria(Map<String, Object> map);
/**
* 获取项目
* @param ids 项目id
......@@ -47,4 +49,6 @@ public interface WorkProjectMapper extends BaseMapper<WorkProject> {
int updateIsConclusionById(Integer id);
int updateProject(ModifyProjectVo modifyProjectVo);
List<WorkProject> getListByDeptAndIsConclusion(@Param("deptId") Integer deptId,@Param("isConclusion") Integer isConclusion);
}
......@@ -93,14 +93,18 @@ public interface WorkTimeOrderMapper extends BaseMapper<WorkTimeOrder> {
/**
* 获取人员项目工时
*/
List<UserWorkTimeStatisticsByProject> getUserProjectWorkTimeStatistics(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("isConclusion") Integer isConclusion, @Param("projectIds") List<Integer> projectIds, @Param("userIds") List<Integer> userIds);
List<UserWorkTimeStatisticsByProject> getUserProjectWorkTimeStatistics(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("isConclusion") Integer isConclusion, @Param("projectIds") List<Integer> projectIds, @Param("isAll") Boolean isAll);
/**
* 根据工单状态获取填报条数
*
* @param userId
* @param firstDayOfMonth
* @param status
* @return
*/
List<MonthlyWorkingHoursStatistics> selectCountByTypeAndStatus(@Param("userId") Integer userId, @Param("firstDayOfMonth") Date firstDayOfMonth,@Param("status") Integer[] status);
List<MonthlyWorkingHoursStatistics> selectCountByTypeAndStatus(@Param("userId") Integer userId, @Param("firstDayOfMonth") Date firstDayOfMonth, @Param("status") Integer[] status);
List<UserWorkTimeStatisticsByProject> selectListByType(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("isConclusion") Integer isConclusion, @Param("queryType") List<Integer> queryType, @Param("userIds") List<Integer> userIds, @Param("isAll") Boolean isAll);
}
......@@ -161,4 +161,11 @@ ORDER BY p.is_conclusion DESC
</select>
<select id="getListByDeptAndIsConclusion" resultType="cn.wisenergy.model.app.WorkProject">
select <include refid="Base_Column_List"/>
from <include refid="table"/>
where dept=#{deptId} AND isConclusion=#{isConclusion}
</select>
</mapper>
......@@ -28,6 +28,7 @@
<result property="projectId" column="project_id"/>
<result property="projectType" column="project_type"/>
<result property="projectName" column="project_name"/>
<result property="projectTypeName" column="type_name"/>
<result property="isOvertime" column="is_overtime"/>
<result property="workTime" column="work_time"/>
</collection>
......@@ -297,7 +298,7 @@
<select id="getUserProjectWorkTimeStatistics" resultMap="userWorkTimeStatisticsByProject">
SELECT u.id AS user_id, u.`name` AS user_name, t.project_id AS project_id, t.type AS project_type, p.project_name AS project_name, case t.is_overtime when 1 then '加班' ELSE '正常' end AS is_overtime,SUM(t.work_time) AS work_time
SELECT <if test="isAll == true"> u.id AS user_id, u.`name` AS user_name,</if> <if test="isAll == false">'合计' AS user_name ,</if> t.project_id AS project_id, t.type AS project_type, p.project_name AS project_name, case t.is_overtime when 1 then '加班' ELSE '正常' end AS is_overtime,SUM(t.work_time) AS work_time
from work_time_order t left join work_project p on t.project_id = p.id join work_user u on t.user_id = u.id
where
t.status in (2,5) AND
......@@ -308,25 +309,11 @@
<if test="startDate != null">
AND t.work_day > #{startDate}
</if>
<if test="projectIds != null">
AND project_id in
<foreach collection="projectIds" item="projectId" open="(" close=")" separator=",">
#{projectId}
</foreach>
</if>
GROUP BY u.id,u.`name`,t.project_id,t.type,p.project_name, t.is_overtime
<if test="userIds != null">
UNION
SELECT u.id AS user_id ,u.`name` AS user_name, t.project_id AS project_id,t.type AS project_type
,p.project_name AS project_name, case t.is_overtime when 1 then '加班' ELSE '正常' end AS is_overtime,SUM(t.work_time) AS work_time
from work_time_order t left join work_project p on t.project_id = p.id join work_user u on t.user_id = u.id
where
t.status in (2,5) AND t.type in(5,6,7) AND t.user_id in
<foreach collection="userIds" item="userId" separator="," open="(" close=")" >
#{userId}
</foreach>
GROUP BY u.id,u.`name`,t.project_id,t.type,p.project_name, t.is_overtime
</if>
AND project_id in
<foreach collection="projectIds" item="projectId" open="(" close=")" separator=",">
#{projectId}
</foreach>
GROUP BY <if test="isAll == true"> u.id,u.`name`,</if>t.project_id,t.type,p.project_name, t.is_overtime
</select>
<select id="selectCountByTypeAndStatus" resultType="cn.wisenergy.model.dto.MonthlyWorkingHoursStatistics">
......@@ -338,4 +325,27 @@
</foreach>
GROUP BY type
</select>
<select id="selectListByType" resultMap="userWorkTimeStatisticsByProject">
SELECT <if test="isAll == true"> u.id AS user_id, u.`name` AS user_name,</if> <if test="isAll == false"> '合计' AS user_name,</if> ty.id AS project_type, ty.name AS project_name, case t.is_overtime when 1 then '加班' ELSE '正常' end AS is_overtime,IFNULL(SUM(t.work_time),0) AS work_time
from work_type ty left join work_time_order t on t.type = ty.id left join work_user u on t.user_id = u.id
where
(t.work_day &lt;= #{endDate} or t.work_day is null) AND (t.status IN (2, 5) or t.status is null)
<if test="isConclusion != null">
AND (p.is_conclusion = #{isConclusion} or p.is_conclusion is null)
</if>
<if test="startDate != null">
AND (t.work_day > #{startDate} or t.work_day is null)
</if>
AND ty.id in
<foreach collection="queryType" item="type" open="(" close=")" separator=",">
#{type}
</foreach>
AND (t.user_id in
<foreach collection="userIds" item="userId" open="(" close=")" separator=",">
#{userId}
</foreach>
or t.user_id is null)
GROUP BY <if test="isAll == true">u.id,u.`name`,</if> ty.id,ty.name, t.is_overtime
</select>
</mapper>
......@@ -49,10 +49,10 @@ public interface StatisticsService {
*
* @param startDate
* @param endDate
* @param status
* @param isConclusion
* @return
*/
List<UserWorkTimeStatisticsByProject> getUserWorkTimeStatisticsReport(Integer userId, String startDate, String endDate, Integer status);
List<UserWorkTimeStatisticsByProject> getUserWorkTimeStatisticsReport(Integer userId, Integer deptId, String startDate, String endDate, Integer isConclusion);
/**
* 获取项目统计
......
......@@ -70,4 +70,6 @@ public interface WorkProjectService {
Boolean modifyProject(ModifyProjectVo modifyProjectVo);
Boolean addProject(CreateProjectVo createProjectVo);
}
......@@ -67,6 +67,9 @@ public class StatisticsServiceImpl implements StatisticsService {
@Autowired
private WorkProjectTimeCostMapper workProjectTimeCostMapper;
@Autowired
private WorkProjectMapper workProjectMapper;
@Autowired
private WorkUserProjectMapper workUserProjectMapper;
......@@ -136,14 +139,14 @@ public class StatisticsServiceImpl implements StatisticsService {
}
@Override
public Map<String,Object> getMonthlyStatistics(Integer userId) {
public Map<String, Object> getMonthlyStatistics(Integer userId) {
log.info("WorkTimeOrderServiceImpl[]getMonthlyStatistics[]input.param" + userId);
WorkUser user = workUserService.getById(userId);
List<Integer> role = userRoleLevelUtils.getRole(user.getId());
//本月第一天
Date firstDayOfMonth = DateUtil.getCurrentFirstDayOfMonth();
//返回数据对象
Map<String,Object> objects = new HashMap<>();
Map<String, Object> objects = new HashMap<>();
//存放查询条件
Map<String, Object> map = new HashMap<>();
//用户是项目或部门级别,查询审批统计
......@@ -186,7 +189,7 @@ public class StatisticsServiceImpl implements StatisticsService {
approvalStatistics.setApprovalCount(completedCount);
approvalStatistics.setRejectNotSubmit(rejectAndNotResubmit);
approvalStatistics.setNotApprovalCount(notCompletedCount);
objects.put("manager",approvalStatistics);
objects.put("manager", approvalStatistics);
}
// 填报情况
......@@ -242,7 +245,7 @@ public class StatisticsServiceImpl implements StatisticsService {
}
objects.put("notFilledCount", notFilledCount);
objects.put("countByCondition", countByCondition);
objects.put("user" ,monthlyWorkingHoursStatistics);
objects.put("user", monthlyWorkingHoursStatistics);
return objects;
}
......@@ -315,7 +318,7 @@ public class StatisticsServiceImpl implements StatisticsService {
collect.addAll(workTimeAndCostCollect);
for (WorkTimeAndCostCollect timeAndCostCollect : collect) {
WorkType workType = workTypes.get(timeAndCostCollect.getType()-1);
WorkType workType = workTypes.get(timeAndCostCollect.getType() - 1);
timeAndCostCollect.setTypeName(workType.getName());
}
// 获取查询结果中的类型
......@@ -468,12 +471,17 @@ public class StatisticsServiceImpl implements StatisticsService {
}
@Override
public List<UserWorkTimeStatisticsByProject> getUserWorkTimeStatisticsReport(Integer userId, String startDate, String endDate, Integer status) {
log.info("StatisticsServiceImpl[]getUserWorkTimeStatisticsReport[]");
public List<UserWorkTimeStatisticsByProject> getUserWorkTimeStatisticsReport(Integer userId, Integer deptId, String startDate, String endDate, Integer isConclusion) {
log.info("StatisticsServiceImpl[]getUserWorkTimeStatisticsReport[]" + userId + deptId + startDate + endDate + isConclusion);
List<Integer> role = userRoleLevelUtils.getRole(userId);
if (role.contains(ManagerEnum.NOT_MANAGER.getCode())) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.THE_USER_NOT_MANAGER_PLASE_MANAGER_LOGIN);
}
// 不是中心级不能选择部门
if (!role.contains(ManagerEnum.IS_CENTRE_DIRECTOR) && deptId != null) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.NO_AUTHORITY);
}
// 默认统计截至时间为前一天
if (StringUtil.isEmpty(endDate)) {
Date date = new Date();
......@@ -482,6 +490,9 @@ public class StatisticsServiceImpl implements StatisticsService {
}
// 获取用户负责项目主键集合
List<WorkProject> userManageProjects = workProjectService.getUserManageProjects(userId);
if (deptId != null) {
userManageProjects = workProjectMapper.getListByDeptAndIsConclusion(deptId, isConclusion);
}
// 管理项目为空则提前结束
if (CollectionUtil.isEmpty(userManageProjects)) {
return null;
......@@ -489,35 +500,43 @@ public class StatisticsServiceImpl implements StatisticsService {
// 提取项目主键
List<Integer> projectIds = userManageProjects.stream().map(WorkProject::getId).collect(Collectors.toList());
List<UserWorkTimeStatisticsByProject> userWorkTimeStatisticsByProjects = new ArrayList<>();
// 返回结果集合第一个元素是用户管理项目的集合
UserWorkTimeStatisticsByProject userWorkTimeStatisticsByProject = new UserWorkTimeStatisticsByProject();
List<ProjectWorkTimeAndType> projectWorkTimeAndTypes = new ArrayList<>();
for (WorkProject userManageProject : userManageProjects) {
// 项目加班工时对象
ProjectWorkTimeAndType projectWorkTimeAndType = createProjectWorkTimeAndType(userManageProject);
projectWorkTimeAndType.setIsOvertime("正常");
projectWorkTimeAndTypes.add(projectWorkTimeAndType);
// 项目正常工时对象
projectWorkTimeAndType = createProjectWorkTimeAndType(userManageProject);
projectWorkTimeAndType.setIsOvertime("加班");
projectWorkTimeAndTypes.add(projectWorkTimeAndType);
}
// 添加表头:外部商务/技术交流、内部培训/技术准备/管理、其他非项目/商机工作
List<ProjectWorkTimeAndType> projectWorkTimeAndTypeListByType = this.createProjectWorkTimeAndTypeListByType();
projectWorkTimeAndTypes.addAll(projectWorkTimeAndTypeListByType);
// 管理项目组成人员主键,如果用户仅为项目级别管理人员,则为空
List<Integer> userIds = null;
// 查询各个项目正常工时和加班工时统计
List<UserWorkTimeStatisticsByProject> userProjectWorkTimeStatistics = workTimeOrderMapper.getUserProjectWorkTimeStatistics(startDate, endDate, isConclusion, projectIds, false);
// 查询除开项目于、商机、请假、调休这几种类型的工单
List<WorkType> types = workTypeMapper.getAll();
List<Integer> queryType = new ArrayList<>();
for (WorkType type : types) {
if (type.getId() > 4) {
queryType.add(type.getId());
}
}
// 部门级别以上的用户可以查询所管理项目的成员所填的其他类型的工单
List<Integer> userIds = workUserProjectMapper.selectUserIdByProjectIds(projectIds);
if (role.contains(ManagerEnum.IS_DEPARTMENT_DIRECTOR.getCode()) || role.contains(ManagerEnum.IS_CENTRE_DIRECTOR.getCode())) {
userIds = workUserProjectMapper.selectUserIdByProjectIds(projectIds);
List<UserWorkTimeStatisticsByProject> userWorkTimeStatisticsByProjectList = workTimeOrderMapper.selectListByType(startDate, endDate, isConclusion, queryType, userIds,false);
if (CollectionUtil.isNotEmpty(userWorkTimeStatisticsByProjectList)) {
userProjectWorkTimeStatistics.get(0).getProjectWorkTimeAndType().addAll(userWorkTimeStatisticsByProjectList.get(0).getProjectWorkTimeAndType());
}
}
// 查询各个项目下所有人的加班工时和平常工时
List<UserWorkTimeStatisticsByProject> userProjectWorkTimeStatistics1 = workTimeOrderMapper.getUserProjectWorkTimeStatistics(startDate, endDate, isConclusion, projectIds, true);
// 查询各个项目下所有人的其他除了项目、商机、请假、调休类型的加班工时和平常工时
List<UserWorkTimeStatisticsByProject> userWorkTimeStatisticsByProjects = workTimeOrderMapper.selectListByType(startDate, endDate, isConclusion, queryType, userIds, true);
for (UserWorkTimeStatisticsByProject userWorkTimeStatisticsByProject : userWorkTimeStatisticsByProjects) {
for (UserWorkTimeStatisticsByProject workTimeStatisticsByProject : userProjectWorkTimeStatistics1) {
if (userWorkTimeStatisticsByProject.getUserId() != null && userWorkTimeStatisticsByProject.getUserId().equals(workTimeStatisticsByProject.getUserId())) {
workTimeStatisticsByProject.getProjectWorkTimeAndType().addAll(userWorkTimeStatisticsByProject.getProjectWorkTimeAndType());
}
}
}
userProjectWorkTimeStatistics.addAll(userProjectWorkTimeStatistics1);
/*
*
*
*
* */
// 查询人员项目工时统计
List<UserWorkTimeStatisticsByProject> userProjectWorkTimeStatistics = workTimeOrderMapper.getUserProjectWorkTimeStatistics(startDate, endDate, status, projectIds, userIds);
// 工单类型
List<WorkType> types = workTypeMapper.getAll();
// 取出单人的项目工时统计
for (UserWorkTimeStatisticsByProject userProjectWorkTimeStatistic : userProjectWorkTimeStatistics) {
......@@ -525,33 +544,13 @@ public class StatisticsServiceImpl implements StatisticsService {
List<ProjectWorkTimeAndType> projectWorkTimeAndType1 = userProjectWorkTimeStatistic.getProjectWorkTimeAndType();
// 遍历一个人所有项目统计,计算所有项目所有工时总和
for (ProjectWorkTimeAndType projectWorkTimeAndType : projectWorkTimeAndType1) {
projectWorkTimeAndType.setProjectTypeName(types.get(projectWorkTimeAndType.getProjectType()).getName());
projectWorkTimeAndType.setProjectTypeName(types.get(projectWorkTimeAndType.getProjectType()-1).getName());
totalTime += projectWorkTimeAndType.getWorkTime();
// 计算项目的所有人员工时总和
for (ProjectWorkTimeAndType workTimeAndType : projectWorkTimeAndTypes) {
// 项目统计数据
if (workTimeAndType.getProjectName() != null && workTimeAndType.getProjectName().equals(projectWorkTimeAndType.getProjectName()) && workTimeAndType.getIsOvertime().equals(projectWorkTimeAndType.getIsOvertime())) {
workTimeAndType.setWorkTime(workTimeAndType.getWorkTime() + projectWorkTimeAndType.getWorkTime());
} else if (workTimeAndType.getProjectTypeName() != null && workTimeAndType.getProjectTypeName().equals(projectWorkTimeAndType.getProjectTypeName()) && workTimeAndType.getIsOvertime().equals(projectWorkTimeAndType.getIsOvertime())) {
workTimeAndType.setWorkTime(workTimeAndType.getWorkTime() + projectWorkTimeAndType.getWorkTime());
}
}
}
userProjectWorkTimeStatistic.setTotalTime(totalTime);
}
// 返回结果第一条数据是所有项目的名称和工时总计
userWorkTimeStatisticsByProject.setProjectWorkTimeAndType(projectWorkTimeAndTypes);
userWorkTimeStatisticsByProjects.add(userWorkTimeStatisticsByProject);
// 将项目名称集合与人员工时统计封装在一起
userWorkTimeStatisticsByProjects.addAll(userProjectWorkTimeStatistics);
// 合计所有项目合计中的总工时
UserWorkTimeStatisticsByProject userWorkTimeStatisticsByProject1 = userWorkTimeStatisticsByProjects.get(0);
Integer workTime = 0;
for (ProjectWorkTimeAndType projectWorkTimeAndType : userWorkTimeStatisticsByProject1.getProjectWorkTimeAndType()) {
workTime += projectWorkTimeAndType.getWorkTime();
}
userWorkTimeStatisticsByProject1.setTotalTime(workTime);
return userWorkTimeStatisticsByProjects;
return userProjectWorkTimeStatistics;
}
@Override
......@@ -684,55 +683,6 @@ public class StatisticsServiceImpl implements StatisticsService {
return cellStyle;
}
// 返回一个项目工时类型信息对象
public ProjectWorkTimeAndType createProjectWorkTimeAndType(WorkProject project) {
ProjectWorkTimeAndType projectWorkTimeAndType = new ProjectWorkTimeAndType();
projectWorkTimeAndType.setProjectId(project.getId());
projectWorkTimeAndType.setProjectName(project.getProjectName());
projectWorkTimeAndType.setWorkTime(0);
return projectWorkTimeAndType;
}
// 生成三种类型的表头
public List<ProjectWorkTimeAndType> createProjectWorkTimeAndTypeListByType() {
List<ProjectWorkTimeAndType> list = new ArrayList<>(6);
ProjectWorkTimeAndType timeAndType;
List<WorkType> workTypes = workTypeMapper.getAll();
// 外部商务、技术交流
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(4).getName(), "正常");
list.add(timeAndType);
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(4).getName(), "加班");
list.add(timeAndType);
// 内部培训、技术准备、管理
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(5).getName(), "正常");
list.add(timeAndType);
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(5).getName(), "加班");
list.add(timeAndType);
// 其他非项目/商机工作
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(6).getName(), "正常");
list.add(timeAndType);
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(6).getName(), "加班");
list.add(timeAndType);
return list;
}
// 根据类型生成ProjectWorkTimeAndType对象
public ProjectWorkTimeAndType createProjectWorkTimeAndTypeByType(String type, String isOvertime) {
ProjectWorkTimeAndType projectWorkTimeAndType = new ProjectWorkTimeAndType();
projectWorkTimeAndType.setProjectTypeName(type);
projectWorkTimeAndType.setIsOvertime(isOvertime);
projectWorkTimeAndType.setWorkTime(0);
return projectWorkTimeAndType;
}
// 根据日期生成ProjectStatisticsByMonth对象
public ProjectStatisticsByMonth.StatisticsDateAndWorkTime createStatisticsDateAndWorkTime(String date) {
ProjectStatisticsByMonth.StatisticsDateAndWorkTime statisticsDateAndWorkTime = new ProjectStatisticsByMonth.StatisticsDateAndWorkTime();
statisticsDateAndWorkTime.setDate(date);
statisticsDateAndWorkTime.setTotalTime(new BigDecimal("0.00"));
statisticsDateAndWorkTime.setCost(new BigDecimal("0.00"));
return statisticsDateAndWorkTime;
}
// 部门主键不为空时,日期格式只有某月。为空时,日期格式为某年统计的第一个月为某年某月,其余为某月
public void conversionDateFormat(List<ProjectStatisticsByMonth> projectStatisticsByMonths, Integer deptId) {
......
......@@ -75,12 +75,12 @@ public class StatisticsController extends BaseController {
@ApiOperation(value = "获取本月工时统计和审核统计", notes = "获取本月", httpMethod = "GET")
@ApiImplicitParam(name = "userId", value = "用户主键", dataType = "int", required = true)
@GetMapping("/getMonthlyWorkingHours")
public Result<Map<String,Object>> getMonthlyWorkingHours(Integer userId) {
public Result<Map<String, Object>> getMonthlyWorkingHours(Integer userId) {
log.info("WorkOrderController[]getMonthlyWorkingHours[]input.param" + userId);
if (userId == null) {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.INPUT_PARAM_IS_NULL);
}
Map<String,Object> monthlyStatistics = statisticsService.getMonthlyStatistics(userId);
Map<String, Object> monthlyStatistics = statisticsService.getMonthlyStatistics(userId);
return getResult(monthlyStatistics);
}
......@@ -115,15 +115,15 @@ public class StatisticsController extends BaseController {
@ApiOperation(value = "获取人员工时统计报表", notes = "获取人员工时统计报表")
@GetMapping("/getUserWorkTimeStatisticsReport")
public Result<List<UserWorkTimeStatisticsByProject>> getUserWorkTimeStatisticsReport(Integer userId, String startDate, String endDate, Integer status) {
log.info("StatisticsController[]getUserWorkTimeStatisticsReport[]input.param{}" + userId, startDate, endDate, status);
List<UserWorkTimeStatisticsByProject> userWorkTimeStatisticsByProjects = statisticsService.getUserWorkTimeStatisticsReport(userId, startDate, endDate, status);
public Result<List<UserWorkTimeStatisticsByProject>> getUserWorkTimeStatisticsReport(Integer userId, Integer deptId, String startDate, String endDate, Integer isConclusion) {
log.info("StatisticsController[]getUserWorkTimeStatisticsReport[]input.param{}" + userId, deptId, startDate, endDate, isConclusion);
List<UserWorkTimeStatisticsByProject> userWorkTimeStatisticsByProjects = statisticsService.getUserWorkTimeStatisticsReport(userId,deptId, startDate, endDate, isConclusion);
return getResult(userWorkTimeStatisticsByProjects);
}
@ApiOperation(value = "获取项目统计报表", notes = "获取项目统计报表")
@GetMapping("/getProjectStatistics")
public Result<List<ProjectStatisticsByMonth>> getProjectStatistics(Integer userId, Integer deptId,Integer year, Integer projectId) {
public Result<List<ProjectStatisticsByMonth>> getProjectStatistics(Integer userId, Integer deptId, Integer year, Integer projectId) {
log.info("StatisticsController[]getProjectStatistics[]input.param" + userId + deptId + year, projectId);
List<ProjectStatisticsByMonth> projectStatisticsByMonths = statisticsService.getProjectStatistics(userId, deptId, year, projectId);
return getResult(projectStatisticsByMonths);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment