新增工会数据定时统计任务

This commit is contained in:
liaozetao
2023-12-21 17:25:57 +08:00
parent cdaf9bff2d
commit 9a3d8789be
3 changed files with 142 additions and 24 deletions

View File

@@ -4,6 +4,8 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.accompany.admin.dto.stats.LaborStatsDto;
import com.accompany.admin.mapper.LaborStatsMapper;
import com.accompany.admin.mapper.stats.HallLaborStatsMapper;
import com.accompany.admin.model.stats.HallLaborStats;
import com.accompany.admin.service.base.BaseService;
import com.accompany.admin.vo.stats.LaborStatsVo;
import com.accompany.business.service.room.RoomService;
@@ -17,7 +19,9 @@ import com.accompany.core.model.Room;
import com.accompany.core.model.Users;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@@ -28,6 +32,9 @@ import java.util.stream.Collectors;
@Service
public class LaborStatsAdminService extends BaseService {
@Autowired
private HallLaborStatsMapper hallLaborStatsMapper;
@Autowired
LaborStatsMapper laborStatsMapper;
@Autowired
@@ -43,7 +50,7 @@ public class LaborStatsAdminService extends BaseService {
public List<LaborStatsVo> laborStats(Date startTime, Date endTime, String erbanNoStr) {
Date itTime = startTime;
List<LaborStatsVo> data = new ArrayList<>();
List<String> erbanNoList = Arrays.asList(erbanNoStr.split(","));
String[] erbanNoList = erbanNoStr.split(",");
while (DateTimeUtil.compareTime(endTime, itTime) >= 0) {
for (String erbanNo : erbanNoList) {
String dateStr = DateTimeUtil.convertDate(itTime, DateTimeUtil.DEFAULT_DATE_PATTERN);
@@ -64,7 +71,51 @@ public class LaborStatsAdminService extends BaseService {
return data;
}
//@Async
@Async
public void laborStats(Date startTime, Date endTime, String erBanNoStr, String cacheKey) {
logger.info("startTime : {}, startTime : {}, erBanNoStr : {}, cacheKey : {}", startTime, endTime, erBanNoStr, cacheKey);
Date dateTime = startTime;
List<LaborStatsVo> data = new ArrayList<>();
String[] erBanNoArray = erBanNoStr.split(StrUtil.COMMA);
Map<Long, Long> erBanNoMap = Arrays.stream(erBanNoArray).map(v -> usersService.getUserByErbanNo(Long.valueOf(v))).filter(Objects::nonNull).collect(Collectors.toMap(Users::getErbanNo, Users::getUid, (v1, v2) -> v1));
List<HallLaborStats> hallLaborStats = hallLaborStatsMapper.selectList(Wrappers.<HallLaborStats>lambdaQuery()
.eq(HallLaborStats::getErbanNo, erBanNoArray)
.le(HallLaborStats::getDate, startTime)
.ge(HallLaborStats::getDate, endTime));
while (DateTimeUtil.compareTime(endTime, dateTime) >= 0) {
for (String erBanNo : erBanNoArray) {
String dateStr = DateTimeUtil.convertDate(dateTime, DateTimeUtil.DEFAULT_DATE_PATTERN);
Long erBanNoToLong = Long.valueOf(erBanNoStr);
Long roomUid = erBanNoMap.get(erBanNoToLong);
if (roomUid == null) {
continue;
}
Room room = roomService.getRoomByUid(roomUid);
if (room == null) {
throw new ServiceException("厅不存在,厅号:" + erBanNo);
}
String roomTitle = room.getTitle();
LaborStatsVo stats = new LaborStatsVo();
stats.setDate(dateStr);
stats.setErbanNo(erBanNoToLong);
stats.setRoomTitle(roomTitle);
if (CollectionUtil.isNotEmpty(hallLaborStats)) {
hallLaborStats.stream()
.filter(v -> dateStr != null && dateStr.equals(v.getDate()) && erBanNoToLong.equals(v.getErbanNo()))
.findAny()
.ifPresent(laborStats -> BeanUtils.copyProperties(laborStats, stats));
}
data.add(stats);
}
dateTime = DateTimeUtil.addDays(dateTime, 1);
}
if (CollectionUtils.isEmpty(data)) {
data = null;
}
jedisService.setnx(cacheKey, JSON.toJSONString(data), OVERDUE_TIME);
logger.info("异步执行laborStatsV2 完成:" + cacheKey);
}
public List<LaborStatsVo> guildStatistics(Date startTime, Date endTime, String erBanNoStr, String cacheKey) {
logger.info("startTime : {}, startTime : {}, erBanNoStr : {}, cacheKey : {}", startTime, endTime, erBanNoStr, cacheKey);
Date dateTime = startTime;

View File

@@ -12,5 +12,16 @@ import java.util.Date;
*/
public interface HallLaborStatsService extends IService<HallLaborStats> {
/**
* 初始化公会数据统计
*
* @param startTime
* @param endTime
*/
void initialize(Date startTime, Date endTime);
/**
* 定时任务
*/
void execute();
}

View File

@@ -1,7 +1,7 @@
package com.accompany.admin.service.stats.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.accompany.admin.dto.stats.LaborStatsDto;
import cn.hutool.core.date.DatePattern;
import com.accompany.admin.mapper.stats.HallLaborStatsMapper;
import com.accompany.admin.model.stats.HallLaborStats;
import com.accompany.admin.service.statistic.LaborStatsAdminService;
@@ -10,23 +10,24 @@ import com.accompany.admin.vo.stats.LaborStatsVo;
import com.accompany.business.model.Hall;
import com.accompany.business.model.HallExample;
import com.accompany.business.mybatismapper.HallMapper;
import com.accompany.common.annotation.FieldComment;
import com.accompany.common.constant.Constant;
import com.accompany.common.utils.DateTimeUtil;
import com.accompany.core.exception.ServiceException;
import com.accompany.core.model.Room;
import com.accompany.core.model.Users;
import com.accompany.core.service.user.UsersBaseService;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* @author: liaozetao
@@ -54,29 +55,84 @@ public class HallLaborStatsServiceImpl extends ServiceImpl<HallLaborStatsMapper,
log.info("hall is empty.");
return;
}
String[] ignored = {"date", "erbanNo", "roomTitle"};
Class<LaborStatsVo> clazz = LaborStatsVo.class;
Date dateTime = startTime;
while (DateTimeUtil.compareTime(endTime, dateTime) >= 0) {
for (Hall hall : halls) {
Date currentEndTime = DateTimeUtil.addDays(dateTime, 1);
Long ownerUid = hall.getOwnerUid();
Users users = usersBaseService.getUsersByUid(ownerUid);
if (users == null) {
log.info("{} is not exists.", ownerUid);
continue;
}
Long erBanNo = users.getErbanNo();
List<LaborStatsVo> data = laborStatsAdminService.guildStatistics(dateTime, currentEndTime, String.valueOf(erBanNo), null);
if (CollectionUtil.isEmpty(data)) {
continue;
}
for (LaborStatsVo stats : data) {
HallLaborStats hallLaborStats = new HallLaborStats();
BeanUtils.copyProperties(stats, hallLaborStats);
save(hallLaborStats);
try {
Date currentEndTime = DateTimeUtil.addDays(dateTime, 1);
Long ownerUid = hall.getOwnerUid();
Users users = usersBaseService.getUsersByUid(ownerUid);
if (users == null) {
log.info("{} is not exists.", ownerUid);
continue;
}
Long erBanNo = users.getErbanNo();
List<LaborStatsVo> data = laborStatsAdminService.guildStatistics(dateTime, currentEndTime, String.valueOf(erBanNo), null);
if (CollectionUtil.isEmpty(data)) {
continue;
}
for (LaborStatsVo stats : data) {
boolean isSave = false;
for (Field declaredField : clazz.getDeclaredFields()) {
String fieldName = declaredField.getName();
if (Arrays.asList(ignored).contains(fieldName)) {
continue;
}
declaredField.setAccessible(true);
Object obj = declaredField.get(stats);
if (obj != null) {
if (Double.parseDouble(obj.toString()) > 0) {
isSave = true;
break;
}
}
}
if (isSave) {
log.info("save labor stats : {}", JSONObject.toJSONString(stats));
HallLaborStats hallLaborStats = new HallLaborStats();
BeanUtils.copyProperties(stats, hallLaborStats);
List<HallLaborStats> laborStats = list(Wrappers.<HallLaborStats>lambdaQuery()
.eq(HallLaborStats::getDate, stats.getDate())
.eq(HallLaborStats::getErbanNo, stats.getErbanNo()));
if (CollectionUtil.isEmpty(laborStats)) {
save(hallLaborStats);
} else {
update(Wrappers.<HallLaborStats>lambdaUpdate()
.set(HallLaborStats::getFirstInRoomRetained, stats.getFirstInRoomRetained())
.eq(HallLaborStats::getDate, stats.getDate())
.eq(HallLaborStats::getErbanNo, stats.getErbanNo()));
}
}
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
dateTime = DateTimeUtil.addDays(dateTime, 1);
}
}
/**
* 每天4点执行公会数据归档
*/
@Scheduled(cron = "0 0 4 * * ?")
@Override
public void execute() {
log.info("==== 执行公会数据生成 start ====");
try {
Date now = new Date();
Date dateTime = DateTimeUtil.addDays(new Date(), -2);
String startDate = DateTimeUtil.convertDate(dateTime, DatePattern.NORM_DATE_PATTERN);
String endDate = DateTimeUtil.convertDate(now, DatePattern.NORM_DATE_PATTERN);
Date startTime = DateTimeUtil.convertStrToDate(startDate, DateTimeUtil.DEFAULT_DATE_PATTERN);
Date endTime = DateTimeUtil.convertStrToDate(endDate, DateTimeUtil.DEFAULT_DATE_PATTERN);
log.info("startDate : {}, endTime : {}", startDate, endDate);
initialize(startTime, endTime);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
log.info("==== 执行公会数据生成 end ====");
}
}