|
|
@@ -2,14 +2,21 @@ package com.inspur.source.service.impl;
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.collection.CollectionUtil;
|
|
|
+import cn.hutool.core.date.DateField;
|
|
|
+import cn.hutool.core.date.DatePattern;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.inspur.device.domain.SmsbDevice;
|
|
|
+import com.inspur.device.domain.SmsbDeviceTask;
|
|
|
+import com.inspur.device.domain.constants.DeviceTaskConstants;
|
|
|
+import com.inspur.device.domain.constants.ResultCodeEnum;
|
|
|
import com.inspur.device.domain.vo.SmsbDeviceVo;
|
|
|
import com.inspur.device.mapper.SmsbDeviceMapper;
|
|
|
+import com.inspur.device.mapper.SmsbDeviceTaskMapper;
|
|
|
import com.inspur.device.service.ISmsbDeviceService;
|
|
|
import com.inspur.netty.message.push.PushMessageType;
|
|
|
import com.inspur.netty.util.PushMsgUtil;
|
|
|
@@ -21,6 +28,7 @@ import com.inspur.source.mapper.*;
|
|
|
import com.inspur.source.service.ISmsbItemPushService;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.dromara.common.core.constant.HttpStatus;
|
|
|
import org.dromara.common.core.domain.R;
|
|
|
import org.dromara.common.core.domain.event.ProcessEvent;
|
|
|
import org.dromara.common.core.domain.event.ProcessTaskEvent;
|
|
|
@@ -85,16 +93,19 @@ public class SmsbItemPushServiceImpl implements ISmsbItemPushService {
|
|
|
|
|
|
private final SmsbItemPushMapper baseMapper;
|
|
|
private final SmsbItemPushTimeMapper itemPushTimeMapper;
|
|
|
- private final SmsbItemPushDeviceMapper itemPushDeviceMapper;
|
|
|
private final SmsbItemPushRelMapper itemPushRelMapper;
|
|
|
private final SmsbItemFileRelMapper itemFileRelMapper;
|
|
|
private final SmsbItemSplitScreenMapper itemSplitScreenMapper;
|
|
|
private final SmsbItemMapper itemMapper;
|
|
|
+ private final SmsbItemPushPlaylistMapper smsbItemPushPlaylistMapper;
|
|
|
+ private final SmsbItemPushPlaylineMapper smsbItemPushPlaylineMapper;
|
|
|
@Autowired
|
|
|
private ISmsbDeviceService smsbDeviceService;
|
|
|
@Autowired
|
|
|
private SmsbDeviceMapper smsbDeviceMapper;
|
|
|
@Autowired
|
|
|
+ private SmsbDeviceTaskMapper smsbDeviceTaskMapper;
|
|
|
+ @Autowired
|
|
|
private IActTaskService actTaskService;
|
|
|
@Autowired
|
|
|
private FlowProcessEventHandler flowProcessEventHandler;
|
|
|
@@ -137,15 +148,15 @@ public class SmsbItemPushServiceImpl implements ISmsbItemPushService {
|
|
|
reviewVo.setResourceList(sourceList);
|
|
|
}
|
|
|
|
|
|
- List<SmsbItemPushTimeVo> pushTimeList = itemPushTimeMapper.selectVoList(new LambdaQueryWrapper<SmsbItemPushTime>()
|
|
|
- .eq(SmsbItemPushTime::getPushId, pushId));
|
|
|
- String dateStart = pushTimeList.get(0).getStartDate();
|
|
|
- String dateEnd = pushTimeList.get(0).getEndDate();
|
|
|
+ List<SmsbItemPushPlaylistVo> pushPlaylistVos = smsbItemPushPlaylistMapper.selectVoList(new LambdaQueryWrapper<SmsbItemPushPlaylist>()
|
|
|
+ .eq(SmsbItemPushPlaylist::getPushId, pushId));
|
|
|
+ String dateStart = pushPlaylistVos.get(0).getStartDate();
|
|
|
+ String dateEnd = pushPlaylistVos.get(0).getEndDate();
|
|
|
List<SmsbItemPushTimeRangeBo> timeRangeList = new ArrayList<>();
|
|
|
- for (SmsbItemPushTimeVo pushTime : pushTimeList) {
|
|
|
+ for (SmsbItemPushPlaylistVo pushTime : pushPlaylistVos) {
|
|
|
SmsbItemPushTimeRangeBo timeRange = new SmsbItemPushTimeRangeBo();
|
|
|
- timeRange.setStart(dateStart + " " + pushTime.getTimeStart());
|
|
|
- timeRange.setEnd(dateEnd + " " + pushTime.getTimeEnd());
|
|
|
+ timeRange.setStart(dateStart + " " + pushTime.getStartTime());
|
|
|
+ timeRange.setEnd(dateEnd + " " + pushTime.getEndTime());
|
|
|
timeRangeList.add(timeRange);
|
|
|
}
|
|
|
reviewVo.setTimeList(timeRangeList);
|
|
|
@@ -192,6 +203,36 @@ public class SmsbItemPushServiceImpl implements ISmsbItemPushService {
|
|
|
return lqw;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public R<ResponseBaseBean> validateTime(SmsbItemPushBo bo) {
|
|
|
+
|
|
|
+ ResponseBaseBean result = new ResponseBaseBean();
|
|
|
+ result.setCode(HttpStatus.SUCCESS);
|
|
|
+ List<ValidatePushTimeVo> validatePushTimeVos = new ArrayList<>();
|
|
|
+ result.setData(validatePushTimeVos);
|
|
|
+ // 遍历每个设备
|
|
|
+ List<String> deviceIds = bo.getDeviceIds();
|
|
|
+ for (String deviceId : deviceIds) {
|
|
|
+ // 1、判断日期是否与时序冲突
|
|
|
+ String startDateStr = bo.getDateRange().get(0) + " 00:00:00";
|
|
|
+ String endDateStr = bo.getDateRange().get(1) + " 23:59:59";
|
|
|
+ List<SmsbItemPushPlaylineVo> exitsTimeNodes = smsbItemPushPlaylineMapper.selectExistTimeNodes(startDateStr,endDateStr,Long.parseLong(deviceId));
|
|
|
+ // exitsTimeNodes 为空说明没冲突
|
|
|
+ if (CollectionUtil.isEmpty(exitsTimeNodes)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ ValidatePushTimeVo validateVo = new ValidatePushTimeVo();
|
|
|
+ validateVo.setDeviceName(smsbDeviceService.getDeviceCacheById(Long.parseLong(deviceId)).getName());
|
|
|
+ validatePushTimeVos.add(validateVo);
|
|
|
+ }
|
|
|
+ if (!CollectionUtil.isEmpty(validatePushTimeVos)) {
|
|
|
+ result.setCode(Integer.parseInt(ResultCodeEnum.PUSH_TIME_CLASH.getValue()));
|
|
|
+ result.setData(validatePushTimeVos);
|
|
|
+ }
|
|
|
+
|
|
|
+ return R.ok(result);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 新增内容发布
|
|
|
*
|
|
|
@@ -200,30 +241,53 @@ public class SmsbItemPushServiceImpl implements ISmsbItemPushService {
|
|
|
*/
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
- public Boolean insertByBo(SmsbItemPushBo bo) {
|
|
|
+ public R<Void> insertByBo(SmsbItemPushBo bo) {
|
|
|
SmsbItemPush add = MapstructUtils.convert(bo, SmsbItemPush.class);
|
|
|
add.setStatus(BusinessStatusEnum.DRAFT.getStatus());
|
|
|
add.setCreateUser(LoginHelper.getLoginUser().getUsername());
|
|
|
- validEntityBeforeSave(add);
|
|
|
- Date startDate = DateUtils.parseDate(bo.getDateRange().get(0));
|
|
|
- Date endDate = DateUtils.parseDate(bo.getDateRange().get(1));
|
|
|
+ Date startDate = DateUtils.parseDate(bo.getDateRange().get(0) + " 00:00:00");
|
|
|
+ Date endDate = DateUtils.parseDate(bo.getDateRange().get(1) + " 23:59:59");
|
|
|
add.setStartDate(startDate);
|
|
|
add.setEndDate(endDate);
|
|
|
boolean flag = baseMapper.insert(add) > 0;
|
|
|
if (!flag) {
|
|
|
- return flag;
|
|
|
+ R.fail(ResultCodeEnum.INTERNAL_SERVER_ERROR);
|
|
|
}
|
|
|
bo.setId(add.getId());
|
|
|
- // 保存内容时间排期
|
|
|
- addItemPushTime(bo);
|
|
|
- // 保存发布设备
|
|
|
- addItemPushDevice(bo);
|
|
|
- // 轮播组 分屏组
|
|
|
+ // 保存设备内容播放单
|
|
|
+ saveItemPushPlaylist(bo);
|
|
|
+ // 轮播组 分屏组关联保存
|
|
|
if (bo.getItemType() == 1 || bo.getItemType() == 2) {
|
|
|
addItemPushRel(bo.getId(), bo.getItemIds());
|
|
|
}
|
|
|
submitReview(add.getId());
|
|
|
- return flag;
|
|
|
+ return R.ok();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void saveItemPushPlaylist(SmsbItemPushBo bo) {
|
|
|
+ List<String> deviceIds = bo.getDeviceIds();
|
|
|
+ if (CollectionUtil.isEmpty(deviceIds)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ Integer sortNum = 0;
|
|
|
+ for (String deviceId : deviceIds) {
|
|
|
+ List<SmsbItemPushPlaylist> pushPlaylist = new ArrayList<>();
|
|
|
+ sortNum++;
|
|
|
+ for (SmsbItemPushTimeRangeBo smsbItemPushTimeRangeBo : bo.getTimeRange()) {
|
|
|
+ SmsbItemPushPlaylist onePlayList = new SmsbItemPushPlaylist();
|
|
|
+ onePlayList.setPushId(bo.getId());
|
|
|
+ onePlayList.setDeviceId(Long.parseLong(deviceId));
|
|
|
+ onePlayList.setSortNum(sortNum);
|
|
|
+ onePlayList.setPushState(1);
|
|
|
+ onePlayList.setStartTime(getHourTimeStrByUTC(smsbItemPushTimeRangeBo.getStart()));
|
|
|
+ onePlayList.setEndTime(getHourTimeStrByUTC(smsbItemPushTimeRangeBo.getEnd()));
|
|
|
+ onePlayList.setStartDate(bo.getDateRange().get(0));
|
|
|
+ onePlayList.setEndDate(bo.getDateRange().get(1));
|
|
|
+ onePlayList.setWeekDays(String.join(",", bo.getWeekDays()));
|
|
|
+ pushPlaylist.add(onePlayList);
|
|
|
+ }
|
|
|
+ smsbItemPushPlaylistMapper.insertBatch(pushPlaylist);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@@ -276,34 +340,244 @@ public class SmsbItemPushServiceImpl implements ISmsbItemPushService {
|
|
|
}
|
|
|
// 更新内容发布状态
|
|
|
baseMapper.updateById(smsbItemPush);
|
|
|
- // 如果是finnish 发布netty消息 推送长连接消息 记录每个设备的下发状态
|
|
|
+ // 如果是finnish
|
|
|
if (status.equals(BusinessStatusEnum.FINISH.getStatus())) {
|
|
|
- List<Long> deviceIds = itemPushDeviceMapper.selectList(new LambdaQueryWrapper<SmsbItemPushDevice>()
|
|
|
- .eq(SmsbItemPushDevice::getPushId, smsbItemPush.getId())).stream().map(SmsbItemPushDevice::getDeviceId).collect(Collectors.toList());
|
|
|
- List<String> deviceIdsAsString = deviceIds.stream().map(String::valueOf).collect(Collectors.toList());
|
|
|
- pushNettyMsg(deviceIdsAsString, smsbItemPush.getId());
|
|
|
+ // 新发布的播单内容
|
|
|
+ List<SmsbItemPushPlaylistVo> smsbItemPushPlaylists = smsbItemPushPlaylistMapper.selectDeviceListByPushId(smsbItemPush.getId());
|
|
|
+ if (CollectionUtil.isEmpty(smsbItemPushPlaylists)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 获取所有设备ID
|
|
|
+ List<Long> deviceIds = smsbItemPushPlaylists.stream().map(SmsbItemPushPlaylistVo::getDeviceId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
|
|
|
+ // 1-更新时序
|
|
|
+ updatePlayLine(smsbItemPush);
|
|
|
+ // 2-任务中心创建任务
|
|
|
+ createDeviceTask(deviceIds,smsbItemPush);
|
|
|
+ // 3-发送长连接
|
|
|
+ pushNettyMsg(deviceIds);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- @EventListener(condition = "#processTaskEvent.key.startsWith('review')")
|
|
|
- public void processTaskHandler(ProcessTaskEvent processTaskEvent) {
|
|
|
- log.info("processTaskHandler : 当前任务执行了{}", processTaskEvent.toString());
|
|
|
+ private void createDeviceTask(List<Long> deviceIds,SmsbItemPush smsbItemPush) {
|
|
|
+ if (CollectionUtil.isEmpty(deviceIds)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ List<SmsbDeviceTask> insertList = new ArrayList<>();
|
|
|
+ for (Long deviceId : deviceIds) {
|
|
|
+ SmsbDeviceVo smsbDeviceVo = smsbDeviceService.getDeviceCacheById(deviceId);
|
|
|
+ // 创建任务
|
|
|
+ SmsbDeviceTask deviceTask = new SmsbDeviceTask();
|
|
|
+ deviceTask.setIdentifier(smsbDeviceVo.getIdentifier());
|
|
|
+ deviceTask.setDeviceId(smsbDeviceVo.getId());
|
|
|
+ deviceTask.setTaskType(DeviceTaskConstants.DEVICE_TASK_PLAY_LINE_UPDATE);
|
|
|
+ deviceTask.setTaskParam(smsbItemPush.getId().toString());
|
|
|
+ deviceTask.setIsEnd(0);
|
|
|
+ insertList.add(deviceTask);
|
|
|
+ }
|
|
|
+ smsbDeviceTaskMapper.insertBatch(insertList);
|
|
|
}
|
|
|
|
|
|
- private void pushNettyMsg(List<String> deviceIds, Long pushId) {
|
|
|
- List<SmsbDevice> smsbDevices = smsbDeviceMapper.selectByIds(deviceIds);
|
|
|
- for (SmsbDevice smsbDevice : smsbDevices) {
|
|
|
- // 1 redis 缓存预加载
|
|
|
- cachePushInfo(smsbDevice.getIdentifier());
|
|
|
- // 2 发送长连接消息
|
|
|
- String nettyMessage = PushMessageType.CONTENT_UPDATE.getValue() + "/" + pushId;
|
|
|
- boolean pushResult = PushMsgUtil.sendV2(smsbDevice.getIdentifier(), nettyMessage);
|
|
|
- log.info("push content update identifier: {}, result:{}", smsbDevice.getIdentifier(), pushResult);
|
|
|
- // 3 下发成功 更新设备下发状态
|
|
|
- if (pushResult) {
|
|
|
- itemPushDeviceMapper.updateDevicePushStatus(pushId, smsbDevice.getId(), 2);
|
|
|
+ private void pushNettyMsg(List<Long> deviceIds) {
|
|
|
+ if (CollectionUtil.isEmpty(deviceIds)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ for (Long deviceId : deviceIds) {
|
|
|
+ // 发送长连接消息
|
|
|
+ String nettyMessage = PushMessageType.CONTENT_UPDATE.getValue();
|
|
|
+ SmsbDeviceVo smsbDeviceVo = smsbDeviceService.getDeviceCacheById(deviceId);
|
|
|
+ boolean pushResult = PushMsgUtil.sendV2(smsbDeviceVo.getIdentifier(), nettyMessage);
|
|
|
+ log.info("push content update identifier: {}, result:{}", smsbDeviceVo.getIdentifier(), pushResult);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void updatePlayLine(SmsbItemPush smsbItemPush) {
|
|
|
+ Long pushId = smsbItemPush.getId();
|
|
|
+ List<SmsbItemPushPlaylistVo> smsbItemPushPlaylists = smsbItemPushPlaylistMapper.selectDeviceListByPushId(pushId);
|
|
|
+ if (CollectionUtil.isEmpty(smsbItemPushPlaylists)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 获取所有设备ID
|
|
|
+ List<Long> deviceIds = smsbItemPushPlaylists.stream().map(SmsbItemPushPlaylistVo::getDeviceId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
|
|
|
+ // 根据一个设备 获取当前发布所有的日期节点
|
|
|
+ List<SmsbItemPushTimeRangeBo> timeRanges = getNewPushAllTimeRanges(smsbItemPushPlaylists,deviceIds.get(0));
|
|
|
+
|
|
|
+ // 获取第一个节点和最后一个节点
|
|
|
+ String firstNode = timeRanges.get(0).getStart();
|
|
|
+ String lastNode = timeRanges.get(timeRanges.size() - 1).getEnd();
|
|
|
+
|
|
|
+ for (Long deviceId : deviceIds) {
|
|
|
+ // 判断整个时间段内是否存在时间点
|
|
|
+ List<SmsbItemPushPlaylineVo> existTimeNodes = smsbItemPushPlaylineMapper.selectExistTimeNodes(firstNode, lastNode,deviceId);
|
|
|
+ // 没有则新增
|
|
|
+ if (CollectionUtil.isEmpty(existTimeNodes)) {
|
|
|
+ List<SmsbItemPushPlayline> allInsert = new ArrayList<>();
|
|
|
+ for (SmsbItemPushTimeRangeBo timeRange : timeRanges) {
|
|
|
+ SmsbItemPushPlayline oneInsert = new SmsbItemPushPlayline();
|
|
|
+ oneInsert.setStartTime(DateUtils.parseDate(timeRange.getStart()));
|
|
|
+ oneInsert.setEndTime(DateUtils.parseDate(timeRange.getEnd()));
|
|
|
+ oneInsert.setPushId(pushId);
|
|
|
+ oneInsert.setDeviceId(deviceId);
|
|
|
+ allInsert.add(oneInsert);
|
|
|
+ }
|
|
|
+ smsbItemPushPlaylineMapper.insertBatch(allInsert);
|
|
|
+ continue;
|
|
|
}
|
|
|
+ // 如果存在 则进行更新
|
|
|
+ // 对新增的每一天进行遍历
|
|
|
+ List<SmsbItemPushPlayline> needAdd = new ArrayList<>();
|
|
|
+ List<SmsbItemPushPlaylineVo> needRemove = new ArrayList<>();
|
|
|
+ for (SmsbItemPushTimeRangeBo timeRange : timeRanges) {
|
|
|
+ String oneStart = timeRange.getStart();
|
|
|
+ String oneEnd = timeRange.getEnd();
|
|
|
+ // 当前时间的日期
|
|
|
+ String newDate = DateUtils.parseDateToStr(DatePattern.NORM_DATE_PATTERN, DateUtils.parseDate(oneStart));
|
|
|
+ // 对存在的进行遍历 判断时间短是否冲突
|
|
|
+ for (SmsbItemPushPlaylineVo existTimeNode : existTimeNodes) {
|
|
|
+ String existDate = DateUtils.parseDateToStr(DatePattern.NORM_DATE_PATTERN, existTimeNode.getStartTime());
|
|
|
+ // 不是同一个日期,不进行判断
|
|
|
+ if (!newDate.equals(existDate)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ SmsbItemPushPlayline oneNeedAdd = new SmsbItemPushPlayline();
|
|
|
+ // 共计六种情况
|
|
|
+ // 1、无时间冲突 新发布完全早于老发布 或者完全晚于老发布
|
|
|
+ if (DateUtils.parseDate(oneStart).after(existTimeNode.getEndTime()) || DateUtils.parseDate(oneEnd).before(existTimeNode.getStartTime())) {
|
|
|
+ // 直接插入
|
|
|
+ oneNeedAdd.setPushId(pushId);
|
|
|
+ oneNeedAdd.setDeviceId(deviceId);
|
|
|
+ oneNeedAdd.setStartTime(DateUtils.parseDate(oneStart));
|
|
|
+ oneNeedAdd.setEndTime(DateUtils.parseDate(oneEnd));
|
|
|
+ needAdd.add(oneNeedAdd);
|
|
|
+ }
|
|
|
+ // 开始时间向前偏移100毫秒
|
|
|
+ Date existStartOffset = DateUtil.offset(existTimeNode.getStartTime(), DateField.MILLISECOND, 100);
|
|
|
+ // 结束时间向后偏移100毫秒
|
|
|
+ Date existEndOffset = DateUtil.offset(existTimeNode.getEndTime(), DateField.MILLISECOND, -100);
|
|
|
+ // 2、新发布结束与老发布开始冲突
|
|
|
+ if (DateUtils.parseDate(oneStart).before(existStartOffset)
|
|
|
+ && DateUtils.parseDate(oneEnd).after(existStartOffset)
|
|
|
+ && DateUtils.parseDate(oneEnd).before(existEndOffset)) {
|
|
|
+ // 删除原有时间
|
|
|
+ needRemove.add(existTimeNode);
|
|
|
+ // 拆分成两个
|
|
|
+ oneNeedAdd.setPushId(pushId);
|
|
|
+ oneNeedAdd.setDeviceId(deviceId);
|
|
|
+ oneNeedAdd.setStartTime(DateUtils.parseDate(oneStart));
|
|
|
+ oneNeedAdd.setEndTime(DateUtils.parseDate(oneEnd));
|
|
|
+ needAdd.add(oneNeedAdd);
|
|
|
+ SmsbItemPushPlayline oneNeedAdd2 = new SmsbItemPushPlayline();
|
|
|
+ oneNeedAdd2.setPushId(existTimeNode.getPushId());
|
|
|
+ oneNeedAdd2.setDeviceId(deviceId);
|
|
|
+ oneNeedAdd2.setStartTime(DateUtils.parseDate(oneEnd));
|
|
|
+ oneNeedAdd2.setEndTime(existTimeNode.getEndTime());
|
|
|
+ needAdd.add(oneNeedAdd2);
|
|
|
+ }
|
|
|
+ // 3、新发布与老发布冲突 老发布完全包含新发布
|
|
|
+ if (DateUtils.parseDate(oneStart).after(existStartOffset)
|
|
|
+ && DateUtils.parseDate(oneEnd).before(existEndOffset)) {
|
|
|
+ // 删除原有时间
|
|
|
+ needRemove.add(existTimeNode);
|
|
|
+ // 拆分成3个
|
|
|
+ oneNeedAdd.setPushId(existTimeNode.getPushId());
|
|
|
+ oneNeedAdd.setDeviceId(deviceId);
|
|
|
+ oneNeedAdd.setStartTime(existTimeNode.getStartTime());
|
|
|
+ oneNeedAdd.setEndTime(DateUtils.parseDate(oneStart));
|
|
|
+ needAdd.add(oneNeedAdd);
|
|
|
+ SmsbItemPushPlayline oneNeedAdd2 = new SmsbItemPushPlayline();
|
|
|
+ oneNeedAdd2.setPushId(pushId);
|
|
|
+ oneNeedAdd2.setDeviceId(deviceId);
|
|
|
+ oneNeedAdd2.setStartTime(DateUtils.parseDate(oneStart));
|
|
|
+ oneNeedAdd2.setEndTime(DateUtils.parseDate(oneEnd));
|
|
|
+ needAdd.add(oneNeedAdd2);
|
|
|
+ SmsbItemPushPlayline oneNeedAdd3 = new SmsbItemPushPlayline();
|
|
|
+ oneNeedAdd3.setPushId(existTimeNode.getPushId());
|
|
|
+ oneNeedAdd3.setDeviceId(deviceId);
|
|
|
+ oneNeedAdd3.setStartTime(DateUtils.parseDate(oneEnd));
|
|
|
+ oneNeedAdd3.setEndTime(existTimeNode.getEndTime());
|
|
|
+ needAdd.add(oneNeedAdd3);
|
|
|
+ }
|
|
|
+ // 4、新发布开始与老发布结束冲突
|
|
|
+ if (DateUtils.parseDate(oneStart).after(existStartOffset)
|
|
|
+ && DateUtils.parseDate(oneStart).before(existEndOffset)
|
|
|
+ && DateUtils.parseDate(oneEnd).after(existEndOffset)) {
|
|
|
+ // 删除原有时间
|
|
|
+ needRemove.add(existTimeNode);
|
|
|
+ // 拆分成2个
|
|
|
+ oneNeedAdd.setPushId(existTimeNode.getPushId());
|
|
|
+ oneNeedAdd.setDeviceId(deviceId);
|
|
|
+ oneNeedAdd.setStartTime(existTimeNode.getStartTime());
|
|
|
+ oneNeedAdd.setEndTime(DateUtils.parseDate(oneStart));
|
|
|
+ needAdd.add(oneNeedAdd);
|
|
|
+ SmsbItemPushPlayline oneNeedAdd2 = new SmsbItemPushPlayline();
|
|
|
+ oneNeedAdd2.setPushId(pushId);
|
|
|
+ oneNeedAdd2.setDeviceId(deviceId);
|
|
|
+ oneNeedAdd2.setStartTime(DateUtils.parseDate(oneStart));
|
|
|
+ oneNeedAdd2.setEndTime(DateUtils.parseDate(oneEnd));
|
|
|
+ needAdd.add(oneNeedAdd2);
|
|
|
+ }
|
|
|
+ // 5、 新发布完全覆盖老发布
|
|
|
+ if (DateUtils.parseDate(oneStart).before(existStartOffset) && DateUtils.parseDate(oneEnd).after(existEndOffset)) {
|
|
|
+ // 删除原有时间
|
|
|
+ needRemove.add(existTimeNode);
|
|
|
+ // 直接插入
|
|
|
+ oneNeedAdd.setPushId(pushId);
|
|
|
+ oneNeedAdd.setDeviceId(deviceId);
|
|
|
+ oneNeedAdd.setStartTime(DateUtils.parseDate(oneStart));
|
|
|
+ oneNeedAdd.setEndTime(DateUtils.parseDate(oneEnd));
|
|
|
+ needAdd.add(oneNeedAdd);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ // 需要删除的Ids
|
|
|
+ if (CollectionUtil.isNotEmpty(needRemove)) {
|
|
|
+ List<Long> needRemoveIds = needRemove.stream().map(SmsbItemPushPlaylineVo::getId).collect(Collectors.toList());
|
|
|
+ smsbItemPushPlaylineMapper.deleteByIds(needRemoveIds);
|
|
|
+ }
|
|
|
+ // 需要新增的
|
|
|
+ if (CollectionUtil.isNotEmpty(needAdd)) {
|
|
|
+ // 对需要新增的根据startTime进行去重
|
|
|
+ List<SmsbItemPushPlayline> needAddDistinct = needAdd.stream().collect(
|
|
|
+ Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(SmsbItemPushPlayline::getStartTime))),
|
|
|
+ ArrayList::new));
|
|
|
+ smsbItemPushPlaylineMapper.insertBatch(needAddDistinct);
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<SmsbItemPushTimeRangeBo> getNewPushAllTimeRanges(List<SmsbItemPushPlaylistVo> smsbItemPushPlaylists,Long deviceId) {
|
|
|
+ List<SmsbItemPushPlaylistVo> oneDevicePlayList = smsbItemPushPlaylists.stream()
|
|
|
+ .filter(item -> item.getDeviceId().equals(deviceId)).collect(Collectors.toList());
|
|
|
+ List<SmsbItemPushTimeRangeBo> dateNodes = new ArrayList<>();
|
|
|
+ LocalDate startDate = LocalDate.parse(smsbItemPushPlaylists.get(0).getStartDate());
|
|
|
+ LocalDate endDate = LocalDate.parse(smsbItemPushPlaylists.get(0).getEndDate());
|
|
|
+
|
|
|
+ // 定义日期格式
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
+ // 使用 Stream API // 将 LocalDate 转换为字符串
|
|
|
+ startDate.datesUntil(endDate.plusDays(1)).map(date -> date.format(formatter));
|
|
|
+ // 或者使用传统的 while 循环
|
|
|
+ LocalDate currentDate = startDate;
|
|
|
+ while (!currentDate.isAfter(endDate)) {
|
|
|
+ // 转换为字符串
|
|
|
+ String dateStr = currentDate.format(formatter);
|
|
|
+ for (SmsbItemPushPlaylistVo oneDeviceVo : oneDevicePlayList) {
|
|
|
+ SmsbItemPushTimeRangeBo oneRange = new SmsbItemPushTimeRangeBo();
|
|
|
+ oneRange.setStart(dateStr + " " + oneDeviceVo.getStartTime());
|
|
|
+ oneRange.setEnd(dateStr + " " + oneDeviceVo.getEndTime());
|
|
|
+ dateNodes.add(oneRange);
|
|
|
+ }
|
|
|
+ currentDate = currentDate.plusDays(1);
|
|
|
+ }
|
|
|
+ return dateNodes;
|
|
|
+ }
|
|
|
+
|
|
|
+ @EventListener(condition = "#processTaskEvent.key.startsWith('review')")
|
|
|
+ public void processTaskHandler(ProcessTaskEvent processTaskEvent) {
|
|
|
+ // log.info("processTaskHandler : 当前任务执行了{}", processTaskEvent.toString());
|
|
|
}
|
|
|
|
|
|
private void addItemPushRel(Long id, List<Long> itemIds) {
|
|
|
@@ -320,48 +594,6 @@ public class SmsbItemPushServiceImpl implements ISmsbItemPushService {
|
|
|
itemPushRelMapper.insertBatch(itemPushRelList);
|
|
|
}
|
|
|
|
|
|
- private void addItemPushDevice(SmsbItemPushBo bo) {
|
|
|
- List<String> deviceIds = bo.getDeviceIds();
|
|
|
- if (CollectionUtil.isEmpty(deviceIds)) {
|
|
|
- throw new ServiceException("发布设备不能为空");
|
|
|
- }
|
|
|
- List<SmsbItemPushDevice> itemPushDeviceList = new ArrayList<>();
|
|
|
- Integer sortNum = 0;
|
|
|
- for (String deviceId : deviceIds) {
|
|
|
- sortNum++;
|
|
|
- SmsbItemPushDevice itemPushDevice = new SmsbItemPushDevice();
|
|
|
- itemPushDevice.setPushId(bo.getId());
|
|
|
- itemPushDevice.setDeviceId(Long.parseLong(deviceId));
|
|
|
- itemPushDevice.setPushState(1);
|
|
|
- itemPushDevice.setSortNum(sortNum);
|
|
|
- itemPushDeviceList.add(itemPushDevice);
|
|
|
- }
|
|
|
- itemPushDeviceMapper.insertBatch(itemPushDeviceList);
|
|
|
- }
|
|
|
-
|
|
|
- private void addItemPushTime(SmsbItemPushBo bo) {
|
|
|
- List<SmsbItemPushTimeRangeBo> timeRange = bo.getTimeRange();
|
|
|
- if (CollectionUtil.isEmpty(timeRange)) {
|
|
|
- throw new ServiceException("内容时间排期不能为空");
|
|
|
- }
|
|
|
- List<String> weekDays = bo.getWeekDays();
|
|
|
- if (CollectionUtil.isEmpty(weekDays)) {
|
|
|
- throw new ServiceException("内容每周日期不能为空");
|
|
|
- }
|
|
|
- List<SmsbItemPushTime> itemPushTimeList = new ArrayList<>();
|
|
|
- for (SmsbItemPushTimeRangeBo smsbItemPushTimeRangeBo : timeRange) {
|
|
|
- SmsbItemPushTime itemPushTime = new SmsbItemPushTime();
|
|
|
- itemPushTime.setPushId(bo.getId());
|
|
|
- itemPushTime.setTimeStart(getHourTimeStrByUTC(smsbItemPushTimeRangeBo.getStart()));
|
|
|
- itemPushTime.setTimeEnd(getHourTimeStrByUTC(smsbItemPushTimeRangeBo.getEnd()));
|
|
|
- itemPushTime.setStartDate(bo.getDateRange().get(0));
|
|
|
- itemPushTime.setEndDate(bo.getDateRange().get(1));
|
|
|
- itemPushTime.setWeekDays(String.join(",", weekDays));
|
|
|
- itemPushTimeList.add(itemPushTime);
|
|
|
- }
|
|
|
- itemPushTimeMapper.insertBatch(itemPushTimeList);
|
|
|
- }
|
|
|
-
|
|
|
private String getHourTimeStrByUTC(String utcTime) {
|
|
|
OffsetDateTime offsetDateTime = OffsetDateTime.parse(utcTime);
|
|
|
OffsetDateTime beijingTime = offsetDateTime.withOffsetSameInstant(ZoneOffset.of("+08:00"));
|
|
|
@@ -380,17 +612,9 @@ public class SmsbItemPushServiceImpl implements ISmsbItemPushService {
|
|
|
@Override
|
|
|
public Boolean updateByBo(SmsbItemPushBo bo) {
|
|
|
SmsbItemPush update = MapstructUtils.convert(bo, SmsbItemPush.class);
|
|
|
- validEntityBeforeSave(update);
|
|
|
- pushNettyMsg(bo.getDeviceIds(), bo.getId());
|
|
|
return baseMapper.updateById(update) > 0;
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 保存前的数据校验
|
|
|
- */
|
|
|
- private void validEntityBeforeSave(SmsbItemPush entity) {
|
|
|
-
|
|
|
- }
|
|
|
|
|
|
/**
|
|
|
* 校验并批量删除内容发布信息
|
|
|
@@ -413,69 +637,47 @@ public class SmsbItemPushServiceImpl implements ISmsbItemPushService {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public R<FrontPushInfoVo> getItemPushInfo(String identifier) {
|
|
|
+ public R<List<FrontPushInfoVo>> getItemPushInfo(String identifier) {
|
|
|
if (StringUtils.isEmpty(identifier)) {
|
|
|
return R.fail(HttpApiResult.PARAM_IS_NULL.getCode(), HttpApiResult.PARAM_IS_NULL.getInfo());
|
|
|
}
|
|
|
- FrontPushInfoVo result = getItemPushInfoByCache(identifier);
|
|
|
+ List<FrontPushInfoVo> result = generatePushInfo(identifier);
|
|
|
return R.ok(result);
|
|
|
}
|
|
|
|
|
|
- // @Cacheable(cacheNames = "global:msr:device:push", key = "#identifier")
|
|
|
- public FrontPushInfoVo getItemPushInfoByCache(String identifier) {
|
|
|
- FrontPushInfoVo redisValue = RedisUtils.getCacheObject(PUSH_CONTENT_INFO_KEY + identifier);
|
|
|
- if (null != redisValue) {
|
|
|
- return redisValue;
|
|
|
- }
|
|
|
- return generatePushInfo(identifier);
|
|
|
- }
|
|
|
-
|
|
|
- // @CachePut(cacheNames = "global:msr:device:push", key = "#identifier")
|
|
|
- public FrontPushInfoVo cachePushInfo(String identifier) {
|
|
|
- FrontPushInfoVo redisValue = generatePushInfo(identifier);
|
|
|
- RedisUtils.setCacheObject(PUSH_CONTENT_INFO_KEY + identifier,redisValue, Duration.ofSeconds(60));
|
|
|
- return generatePushInfo(identifier);
|
|
|
- }
|
|
|
-
|
|
|
- public FrontPushInfoVo generatePushInfo(String identifier) {
|
|
|
- FrontPushInfoVo result = new FrontPushInfoVo();
|
|
|
+ public List<FrontPushInfoVo> generatePushInfo(String identifier) {
|
|
|
+ List<FrontPushInfoVo> result = new ArrayList<>();
|
|
|
SmsbDeviceVo deviceVo = smsbDeviceService.getDeviceByIdentifier(identifier);
|
|
|
- // 根据设备ID查询当前设备最新的内容下发
|
|
|
- Long deviceId = deviceVo.getId();
|
|
|
- result.setDeviceId(deviceId);
|
|
|
- result.setWidth(deviceVo.getWidth());
|
|
|
- result.setHeight(deviceVo.getHeight());
|
|
|
- // 根据等级倒序100垫片 200常规 300紧急 时间范围内的节目列表
|
|
|
- List<SmsbItemPushVo> smsbItemPushVoList = baseMapper.selectFrontOnePushByDeviceId(deviceId);
|
|
|
- if (CollectionUtil.isEmpty(smsbItemPushVoList)) {
|
|
|
- return result;
|
|
|
+ // 查询当前设备三天的时序
|
|
|
+ Date startDate = DateUtil.beginOfDay(new Date());
|
|
|
+ Date endDate = DateUtil.endOfDay(DateUtil.offsetDay(startDate, 2));
|
|
|
+ List<SmsbItemPushPlaylineVo> devicePlaylineList = smsbItemPushPlaylineMapper.selectExistTimeNodes(DateUtil.formatDateTime(startDate),
|
|
|
+ DateUtil.formatDateTime(endDate), deviceVo.getId());
|
|
|
+ for (SmsbItemPushPlaylineVo devicePlayline : devicePlaylineList) {
|
|
|
+ FrontPushInfoVo oneLineResult = new FrontPushInfoVo();
|
|
|
+ buildPushItemInfo(oneLineResult, devicePlayline);
|
|
|
+ oneLineResult.setDeviceId(deviceVo.getId());
|
|
|
+ oneLineResult.setWidth(deviceVo.getWidth());
|
|
|
+ oneLineResult.setHeight(deviceVo.getHeight());
|
|
|
+ result.add(oneLineResult);
|
|
|
}
|
|
|
- buildPushItemInfo(result, smsbItemPushVoList.get(0));
|
|
|
+
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- private void buildPushItemInfo(FrontPushInfoVo result, SmsbItemPushVo smsbItemPushVo) {
|
|
|
+ private void buildPushItemInfo(FrontPushInfoVo result, SmsbItemPushPlaylineVo devicePlayline) {
|
|
|
FrontItemInfoVO itemInfoVO = new FrontItemInfoVO();
|
|
|
// pushId - 内容下发基础信息
|
|
|
- Long pushId = smsbItemPushVo.getId();
|
|
|
+ Long pushId = devicePlayline.getPushId();
|
|
|
result.setPushId(pushId);
|
|
|
+ SmsbItemPushVo smsbItemPushVo = baseMapper.selectVoById(pushId);
|
|
|
result.setPushName(smsbItemPushVo.getName());
|
|
|
itemInfoVO.setLevel(smsbItemPushVo.getLevel());
|
|
|
- // 时间排期
|
|
|
- List<SmsbItemPushTimeVo> pushTimeList = itemPushTimeMapper.selectVoList(new LambdaQueryWrapper<SmsbItemPushTime>()
|
|
|
- .eq(SmsbItemPushTime::getPushId, pushId));
|
|
|
- String dateStart = pushTimeList.get(0).getStartDate();
|
|
|
- String dateEnd = pushTimeList.get(0).getEndDate();
|
|
|
- List<SmsbItemPushTimeRangeBo> timeRangeList = new ArrayList<>();
|
|
|
- for (SmsbItemPushTimeVo pushTime : pushTimeList) {
|
|
|
- SmsbItemPushTimeRangeBo timeRange = new SmsbItemPushTimeRangeBo();
|
|
|
- timeRange.setStart(dateStart + " " + pushTime.getTimeStart());
|
|
|
- timeRange.setEnd(dateEnd + " " + pushTime.getTimeEnd());
|
|
|
- timeRangeList.add(timeRange);
|
|
|
- }
|
|
|
- result.setTimeRange(timeRangeList);
|
|
|
+
|
|
|
+ result.setStartTime(DateUtil.formatDateTime(devicePlayline.getStartTime()));
|
|
|
+ result.setEndTime(DateUtil.formatDateTime(devicePlayline.getEndTime()));
|
|
|
// weekDays
|
|
|
- result.setWeekDays(pushTimeList.get(0).getWeekDays());
|
|
|
+ // result.setWeekDays(pushTimeList.get(0).getWeekDays());
|
|
|
// 根据pushId 查询出最新的一个节目
|
|
|
SmsbItemPushRel itemPushRel = itemPushRelMapper.selectOne(new LambdaQueryWrapper<SmsbItemPushRel>()
|
|
|
.eq(SmsbItemPushRel::getPushId, pushId).orderByDesc(SmsbItemPushRel::getCreateTime));
|
|
|
@@ -513,17 +715,10 @@ public class SmsbItemPushServiceImpl implements ISmsbItemPushService {
|
|
|
// 根据identifier 查询设备信息
|
|
|
SmsbDeviceVo smsbDeviceVo = smsbDeviceService.getDeviceByIdentifier(identifier);
|
|
|
Long deviceId = smsbDeviceVo.getId();
|
|
|
- updateDevicePushState(pushId, deviceId, 3);
|
|
|
+ // updateDevicePushState(pushId, deviceId, 3);
|
|
|
return R.ok();
|
|
|
}
|
|
|
|
|
|
- private void updateDevicePushState(Long pushId, Long deviceId, Integer state) {
|
|
|
- SmsbItemPushDevice updateBean = new SmsbItemPushDevice();
|
|
|
- updateBean.setPushState(state);
|
|
|
- itemPushDeviceMapper.update(updateBean, new LambdaQueryWrapper<SmsbItemPushDevice>()
|
|
|
- .eq(SmsbItemPushDevice::getPushId, pushId).eq(SmsbItemPushDevice::getDeviceId, deviceId));
|
|
|
- }
|
|
|
-
|
|
|
private List<FrontItemSourceVO> getItemSourceListByPushId(Long pushId) {
|
|
|
// 根据pushId 查询关联的轮播组
|
|
|
List<FrontItemSourceVO> fileRelList = itemFileRelMapper.selectVoListByPushId(pushId);
|