1
This commit is contained in:
@@ -45,6 +45,9 @@ public class AttendanceArrangementController extends BaseController {
|
|||||||
return attendanceArrangementService.queryPageList(bo, pageQuery);
|
return attendanceArrangementService.queryPageList(bo, pageQuery);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询某个月的日历排班信息的排班列表
|
* 查询某个月的日历排班信息的排班列表
|
||||||
*/
|
*/
|
||||||
|
@@ -6,6 +6,8 @@ import lombok.RequiredArgsConstructor;
|
|||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import jakarta.validation.constraints.*;
|
import jakarta.validation.constraints.*;
|
||||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
|
import org.dromara.property.domain.bo.AttendanceArrangementBo;
|
||||||
|
import org.dromara.property.domain.vo.AttendanceArrangementVo;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||||
@@ -103,4 +105,13 @@ public class AttendanceUserGroupController extends BaseController {
|
|||||||
@PathVariable("ids") Long[] ids) {
|
@PathVariable("ids") Long[] ids) {
|
||||||
return toAjax(attendanceUserGroupService.deleteWithValidByIds(List.of(ids), true));
|
return toAjax(attendanceUserGroupService.deleteWithValidByIds(List.of(ids), true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询排班的班表视图
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("Property:userGroup:queryScheduleView")
|
||||||
|
@GetMapping("/queryScheduleView")
|
||||||
|
public TableDataInfo<AttendanceUserGroupVo> queryScheduleView(AttendanceUserGroupBo bo, PageQuery pageQuery) {
|
||||||
|
return attendanceUserGroupService.queryScheduleView(bo, pageQuery);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -4,8 +4,10 @@ import org.dromara.common.tenant.core.TenantEntity;
|
|||||||
import com.baomidou.mybatisplus.annotation.*;
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 排班明细对象 attendance_user_group
|
* 排班明细对象 attendance_user_group
|
||||||
@@ -22,7 +24,7 @@ public class AttendanceUserGroup extends TenantEntity {
|
|||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@TableId(value = "id")
|
@TableId(value = "id")
|
||||||
private Long id;
|
private Long id;
|
||||||
@@ -52,5 +54,15 @@ public class AttendanceUserGroup extends TenantEntity {
|
|||||||
*/
|
*/
|
||||||
private String deptName;
|
private String deptName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开始日期
|
||||||
|
*/
|
||||||
|
private LocalDate startDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 结束日期(仅date_type=3时有效)
|
||||||
|
*/
|
||||||
|
private LocalDate endDate;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -8,6 +8,9 @@ import io.github.linpeilie.annotations.AutoMapper;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import jakarta.validation.constraints.*;
|
import jakarta.validation.constraints.*;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 排班明细业务对象 attendance_user_group
|
* 排班明细业务对象 attendance_user_group
|
||||||
@@ -21,7 +24,7 @@ import jakarta.validation.constraints.*;
|
|||||||
public class AttendanceUserGroupBo extends BaseEntity {
|
public class AttendanceUserGroupBo extends BaseEntity {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@NotNull(message = "不能为空", groups = { EditGroup.class })
|
@NotNull(message = "不能为空", groups = { EditGroup.class })
|
||||||
private Long id;
|
private Long id;
|
||||||
@@ -51,5 +54,21 @@ public class AttendanceUserGroupBo extends BaseEntity {
|
|||||||
*/
|
*/
|
||||||
private String deptName;
|
private String deptName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开始日期
|
||||||
|
*/
|
||||||
|
private LocalDate startDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 结束日期(仅date_type=3时有效)
|
||||||
|
*/
|
||||||
|
private LocalDate endDate;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 前端传某天的当前日期
|
||||||
|
*/
|
||||||
|
private LocalDate currentDate;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -1,15 +1,17 @@
|
|||||||
package org.dromara.property.domain.vo;
|
package org.dromara.property.domain.vo;
|
||||||
|
|
||||||
import org.dromara.property.domain.AttendanceUserGroup;
|
import org.dromara.property.domain.*;
|
||||||
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
|
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
|
||||||
import cn.idev.excel.annotation.ExcelProperty;
|
import cn.idev.excel.annotation.ExcelProperty;
|
||||||
import org.dromara.common.excel.annotation.ExcelDictFormat;
|
import org.dromara.common.excel.annotation.ExcelDictFormat;
|
||||||
import org.dromara.common.excel.convert.ExcelDictConvert;
|
import org.dromara.common.excel.convert.ExcelDictConvert;
|
||||||
import io.github.linpeilie.annotations.AutoMapper;
|
import io.github.linpeilie.annotations.AutoMapper;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDate;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
|
||||||
@@ -29,7 +31,7 @@ public class AttendanceUserGroupVo implements Serializable {
|
|||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@ExcelProperty(value = "")
|
@ExcelProperty(value = "")
|
||||||
private Long id;
|
private Long id;
|
||||||
@@ -64,5 +66,25 @@ public class AttendanceUserGroupVo implements Serializable {
|
|||||||
@ExcelProperty(value = "部门名称")
|
@ExcelProperty(value = "部门名称")
|
||||||
private String deptName;
|
private String deptName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开始日期
|
||||||
|
*/
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||||
|
private LocalDate startDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 结束日期(仅date_type=3时有效)
|
||||||
|
*/
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||||
|
private LocalDate endDate;
|
||||||
|
|
||||||
|
private AttendanceArrangement attendanceArrangement;
|
||||||
|
|
||||||
|
private AttendanceGroup attendanceGroup;
|
||||||
|
|
||||||
|
private AttendanceShift attendanceShift;
|
||||||
|
|
||||||
|
private AttendanceScheduleCycle scheduleCycle;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -67,4 +67,5 @@ public interface IAttendanceArrangementService {
|
|||||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||||
|
|
||||||
|
|
||||||
|
// TableDataInfo<AttendanceArrangementVo> queryScheduleView(AttendanceArrangementBo bo, PageQuery pageQuery);
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,5 @@
|
|||||||
package org.dromara.property.service;
|
package org.dromara.property.service;
|
||||||
|
|
||||||
import org.dromara.property.domain.AttendanceUserGroup;
|
|
||||||
import org.dromara.property.domain.vo.AttendanceUserGroupVo;
|
import org.dromara.property.domain.vo.AttendanceUserGroupVo;
|
||||||
import org.dromara.property.domain.bo.AttendanceUserGroupBo;
|
import org.dromara.property.domain.bo.AttendanceUserGroupBo;
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
@@ -66,4 +65,6 @@ public interface IAttendanceUserGroupService {
|
|||||||
* @return 是否删除成功
|
* @return 是否删除成功
|
||||||
*/
|
*/
|
||||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||||
|
|
||||||
|
TableDataInfo<AttendanceUserGroupVo> queryScheduleView(AttendanceUserGroupBo bo, PageQuery pageQuery);
|
||||||
}
|
}
|
||||||
|
@@ -255,6 +255,8 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
|
|||||||
return TableDataInfo.build(attendanceArrangementVoPage);
|
return TableDataInfo.build(attendanceArrangementVoPage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询某个月的日历排班信息的排班列表
|
* 查询某个月的日历排班信息的排班列表
|
||||||
*
|
*
|
||||||
@@ -570,4 +572,5 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -9,16 +9,21 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.dromara.property.domain.*;
|
||||||
|
import org.dromara.property.domain.bo.AttendanceArrangementBo;
|
||||||
|
import org.dromara.property.domain.constant.StatusConstant;
|
||||||
|
import org.dromara.property.domain.vo.AttendanceArrangementVo;
|
||||||
|
import org.dromara.property.mapper.*;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.dromara.property.domain.bo.AttendanceUserGroupBo;
|
import org.dromara.property.domain.bo.AttendanceUserGroupBo;
|
||||||
import org.dromara.property.domain.vo.AttendanceUserGroupVo;
|
import org.dromara.property.domain.vo.AttendanceUserGroupVo;
|
||||||
import org.dromara.property.domain.AttendanceUserGroup;
|
|
||||||
import org.dromara.property.mapper.AttendanceUserGroupMapper;
|
|
||||||
import org.dromara.property.service.IAttendanceUserGroupService;
|
import org.dromara.property.service.IAttendanceUserGroupService;
|
||||||
|
|
||||||
import java.util.List;
|
import java.time.LocalDate;
|
||||||
import java.util.Map;
|
import java.time.ZoneId;
|
||||||
import java.util.Collection;
|
import java.time.temporal.ChronoUnit;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 排班明细Service业务层处理
|
* 排班明细Service业务层处理
|
||||||
@@ -33,6 +38,16 @@ public class AttendanceUserGroupServiceImpl implements IAttendanceUserGroupServi
|
|||||||
|
|
||||||
private final AttendanceUserGroupMapper baseMapper;
|
private final AttendanceUserGroupMapper baseMapper;
|
||||||
|
|
||||||
|
private final AttendanceArrangementMapper arrangementMapper;
|
||||||
|
|
||||||
|
private final AttendanceGroupMapper groupMapper;
|
||||||
|
|
||||||
|
private final AttendanceWeekSetMapper weekSetMapper;
|
||||||
|
|
||||||
|
private final AttendanceShiftMapper shiftMapper;
|
||||||
|
|
||||||
|
private final AttendanceScheduleCycleMapper scheduleCycleMapper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询排班明细
|
* 查询排班明细
|
||||||
*
|
*
|
||||||
@@ -40,7 +55,7 @@ public class AttendanceUserGroupServiceImpl implements IAttendanceUserGroupServi
|
|||||||
* @return 排班明细
|
* @return 排班明细
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public AttendanceUserGroupVo queryById(Long id){
|
public AttendanceUserGroupVo queryById(Long id) {
|
||||||
return baseMapper.selectVoById(id);
|
return baseMapper.selectVoById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,7 +130,7 @@ public class AttendanceUserGroupServiceImpl implements IAttendanceUserGroupServi
|
|||||||
/**
|
/**
|
||||||
* 保存前的数据校验
|
* 保存前的数据校验
|
||||||
*/
|
*/
|
||||||
private void validEntityBeforeSave(AttendanceUserGroup entity){
|
private void validEntityBeforeSave(AttendanceUserGroup entity) {
|
||||||
//TODO 做一些数据校验,如唯一约束
|
//TODO 做一些数据校验,如唯一约束
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,9 +143,109 @@ public class AttendanceUserGroupServiceImpl implements IAttendanceUserGroupServi
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||||
if(isValid){
|
if (isValid) {
|
||||||
//TODO 做一些业务上的校验,判断是否需要校验
|
//TODO 做一些业务上的校验,判断是否需要校验
|
||||||
}
|
}
|
||||||
return baseMapper.deleteByIds(ids) > 0;
|
return baseMapper.deleteByIds(ids) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询排班的班表视图
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public TableDataInfo<AttendanceUserGroupVo> queryScheduleView(AttendanceUserGroupBo bo, PageQuery pageQuery) {
|
||||||
|
LambdaQueryWrapper<AttendanceUserGroup> lqw = buildQueryWrapper(bo);
|
||||||
|
//查询当前日期在哪些人员组中,当前日期大于等于人员组开始日期,小于等于人员组结束日期
|
||||||
|
LambdaQueryWrapper<AttendanceUserGroup> ge = lqw
|
||||||
|
.le(AttendanceUserGroup::getStartDate, bo.getCurrentDate())
|
||||||
|
.ge(AttendanceUserGroup::getEndDate, bo.getCurrentDate());
|
||||||
|
|
||||||
|
Page<AttendanceUserGroupVo> result = baseMapper.selectVoPage(pageQuery.build(), ge);
|
||||||
|
Page<AttendanceUserGroupVo> attendanceArrangementVoPage = result.setRecords(result.getRecords().stream().map(vo -> {
|
||||||
|
// 根据当前日期查询在开始时间和结束时间之间的人员组信息
|
||||||
|
if ((bo.getCurrentDate().isAfter(vo.getStartDate()) || bo.getCurrentDate().isEqual(vo.getStartDate())) &&
|
||||||
|
(bo.getCurrentDate().isBefore(vo.getEndDate()) || bo.getCurrentDate().isEqual(vo.getEndDate()))) {
|
||||||
|
|
||||||
|
// 根据查询出来的result取出scheduleId
|
||||||
|
Long scheduleId = vo.getScheduleId();
|
||||||
|
// 根据排班的id查询出排班的人员详细信息
|
||||||
|
// List<AttendanceUserGroup> userGroupList = baseMapper.selectList(Wrappers.<AttendanceUserGroup>lambdaQuery().eq(AttendanceUserGroup::getScheduleId, scheduleId));
|
||||||
|
|
||||||
|
//根据scheduleId查询出排班的详细信息
|
||||||
|
AttendanceArrangement attendanceArrangement = arrangementMapper.selectOne(Wrappers.<AttendanceArrangement>lambdaQuery().eq(AttendanceArrangement::getId, scheduleId));
|
||||||
|
// 假设每个vo只有一个scheduleId
|
||||||
|
Long userGroupListScheduleId = attendanceArrangement.getId();
|
||||||
|
AttendanceArrangement arrangement = arrangementMapper.selectOne(Wrappers.<AttendanceArrangement>lambdaQuery().eq(AttendanceArrangement::getId, userGroupListScheduleId));
|
||||||
|
vo.setAttendanceArrangement(arrangement);
|
||||||
|
|
||||||
|
// 根据scheduleId过滤出groupId
|
||||||
|
Long groupId = arrangement.getGroupId();
|
||||||
|
// 根据groupId查询出考勤组的详细信息
|
||||||
|
AttendanceGroup attendanceGroup = groupMapper.selectById(groupId);
|
||||||
|
vo.setAttendanceGroup(attendanceGroup);
|
||||||
|
|
||||||
|
// 判断当前考勤组的班制是固定班制还是排班制
|
||||||
|
if (Objects.equals(attendanceGroup.getAttendanceType(), StatusConstant.FIXEDSCHEDULE)) {
|
||||||
|
// 固定班制
|
||||||
|
// 根据考勤组id查询出班制信息的dayOfWeek
|
||||||
|
List<AttendanceWeekSet> weekSetList = weekSetMapper.selectList(Wrappers.<AttendanceWeekSet>lambdaQuery().eq(AttendanceWeekSet::getGroupId, groupId));
|
||||||
|
// 将当前日期转换为周几
|
||||||
|
int weekNumber = bo.getCurrentDate().getDayOfWeek().getValue();
|
||||||
|
// 匹配weekNumber和weekSetList中的dayOfWeek,匹配成功则将weekSet存到vo中
|
||||||
|
AttendanceWeekSet attendanceWeekSet = weekSetList.stream().filter(weekSet -> weekSet.getDayOfWeek() == weekNumber).findFirst().orElse(null);
|
||||||
|
if (attendanceWeekSet != null) {
|
||||||
|
// 根据过滤出来的attendanceWeekSet的weekSetId查询出shiftId
|
||||||
|
Long shiftId = attendanceWeekSet.getShiftId();
|
||||||
|
// 根据shiftId查询出班次的详细信息
|
||||||
|
AttendanceShift attendanceShift = shiftMapper.selectById(shiftId);
|
||||||
|
// 将attendanceShift存到vo中
|
||||||
|
vo.setAttendanceShift(attendanceShift);
|
||||||
|
}
|
||||||
|
} else if (Objects.equals(attendanceGroup.getAttendanceType(), StatusConstant.SHIFTSCHEDULE)) {
|
||||||
|
// 排班制
|
||||||
|
// 将startDate作为第一天,endDate作为最后一天,循环判断当前日期是第几天,取出当前天数的班次信息。
|
||||||
|
LocalDate startDate = vo.getStartDate();
|
||||||
|
LocalDate endDate = vo.getEndDate();
|
||||||
|
LocalDate currentDate = bo.getCurrentDate();
|
||||||
|
|
||||||
|
// 取出attendanceScheduleCycle表中的天数
|
||||||
|
List<Integer> cycleDaysList = scheduleCycleMapper.selectList(Wrappers.<AttendanceScheduleCycle>lambdaQuery().eq(AttendanceScheduleCycle::getGroupId, groupId)).stream()
|
||||||
|
.map(AttendanceScheduleCycle::getDayNumber)
|
||||||
|
.toList();
|
||||||
|
|
||||||
|
// 在startDate和endDate之间循环,判断当前日期是cycleDays中的第几天
|
||||||
|
for (LocalDate date = startDate; date.isBefore(endDate) || date.isEqual(endDate); date = date.plusDays(1)) {
|
||||||
|
if (date.isEqual(currentDate)) {
|
||||||
|
// 判断当前日期是cycleDays中的第几天
|
||||||
|
int dayNumber = (int) (ChronoUnit.DAYS.between(startDate, date) + 1);
|
||||||
|
int cycleDay = dayNumber % cycleDaysList.size();
|
||||||
|
if (cycleDay == 0) {
|
||||||
|
cycleDay = cycleDaysList.size();
|
||||||
|
}
|
||||||
|
// 根据cycleDay查询出当前日期的班次信息
|
||||||
|
AttendanceScheduleCycle cycle = scheduleCycleMapper.selectOne(Wrappers.<AttendanceScheduleCycle>lambdaQuery()
|
||||||
|
.eq(AttendanceScheduleCycle::getGroupId, groupId)
|
||||||
|
.eq(AttendanceScheduleCycle::getDayNumber, cycleDay));
|
||||||
|
if (cycle != null) {
|
||||||
|
// 将cycle存到vo中
|
||||||
|
vo.setScheduleCycle(cycle);
|
||||||
|
// 根据cycleId查询出shiftId
|
||||||
|
Long shiftId = cycle.getShiftId();
|
||||||
|
// 根据shiftId查询出班次的详细信息
|
||||||
|
AttendanceShift attendanceShift = shiftMapper.selectById(shiftId);
|
||||||
|
// 将shift存到vo中
|
||||||
|
vo.setAttendanceShift(attendanceShift);
|
||||||
|
}
|
||||||
|
break; // 找到当前日期后跳出循环
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return vo;
|
||||||
|
}).collect(Collectors.toList()));
|
||||||
|
|
||||||
|
return TableDataInfo.build(attendanceArrangementVoPage);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,189 @@
|
|||||||
|
package org.dromara.sis.controller;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.dromara.sis.domain.AlarmRecord;
|
||||||
|
import org.dromara.sis.domain.bo.SisAlarmEventsBo;
|
||||||
|
import org.dromara.sis.service.AlarmRecordService;
|
||||||
|
import org.dromara.sis.service.ISisAlarmEventsService;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 告警数据主动推送控制器
|
||||||
|
* 接收外部系统推送的告警数据并同步到数据库
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/alarm/push")
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class AlarmPushController {
|
||||||
|
|
||||||
|
private final AlarmRecordService alarmRecordService;
|
||||||
|
private final ISisAlarmEventsService sisAlarmEventsService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 接收单条告警数据推送
|
||||||
|
*/
|
||||||
|
@PostMapping("/single")
|
||||||
|
public ResponseEntity<Map<String, Object>> pushSingleAlarm(@RequestBody Map<String, Object> alarmData) {
|
||||||
|
try {
|
||||||
|
// 处理单条数据
|
||||||
|
processAlarmData(Collections.singletonList(alarmData));
|
||||||
|
|
||||||
|
Map<String, Object> result = new HashMap<>();
|
||||||
|
result.put("success", true);
|
||||||
|
result.put("message", "告警数据推送成功");
|
||||||
|
result.put("timestamp", new Date());
|
||||||
|
return ResponseEntity.ok(result);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("处理单条告警推送失败: {}", e.getMessage(), e);
|
||||||
|
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||||
|
.body(Collections.singletonMap("error", "处理告警数据失败: " + e.getMessage()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 接收批量告警数据推送
|
||||||
|
*/
|
||||||
|
@PostMapping("/batch")
|
||||||
|
public ResponseEntity<Map<String, Object>> pushBatchAlarms(@RequestBody List<Map<String, Object>> alarmDataList) {
|
||||||
|
if (alarmDataList == null || alarmDataList.isEmpty()) {
|
||||||
|
return ResponseEntity.badRequest().body(Collections.singletonMap("error", "推送数据不能为空"));
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
int processedCount = processAlarmData(alarmDataList);
|
||||||
|
|
||||||
|
Map<String, Object> result = new HashMap<>();
|
||||||
|
result.put("success", true);
|
||||||
|
result.put("message", "批量告警数据推送成功");
|
||||||
|
result.put("processedCount", processedCount);
|
||||||
|
result.put("totalReceived", alarmDataList.size());
|
||||||
|
result.put("timestamp", new Date());
|
||||||
|
return ResponseEntity.ok(result);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("处理批量告警推送失败: {}", e.getMessage(), e);
|
||||||
|
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||||
|
.body(Collections.singletonMap("error", "处理告警数据失败: " + e.getMessage()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理告警数据并保存到数据库
|
||||||
|
* @param alarmDataList 告警数据列表
|
||||||
|
* @return 处理成功的数量
|
||||||
|
*/
|
||||||
|
private int processAlarmData(List<Map<String, Object>> alarmDataList) {
|
||||||
|
log.info("开始处理推送的告警数据,共 {} 条", alarmDataList.size());
|
||||||
|
|
||||||
|
// 转换报警记录
|
||||||
|
List<AlarmRecord> records = alarmDataList.stream()
|
||||||
|
.map(alarmRecordService::convertFromMap)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
// 提取操作记录数据
|
||||||
|
Map<Long, List<Map<String, Object>>> operatorMap = new HashMap<>();
|
||||||
|
for (Map<String, Object> recordMap : alarmDataList) {
|
||||||
|
// 确保Id存在且为有效数字
|
||||||
|
Object idObj = recordMap.get("Id");
|
||||||
|
if (idObj == null) {
|
||||||
|
log.warn("跳过缺少Id的告警数据: {}", recordMap);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Long recordId;
|
||||||
|
try {
|
||||||
|
recordId = Long.valueOf(idObj.toString());
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
log.warn("告警数据Id格式错误: {}", idObj, e);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理操作记录
|
||||||
|
List<Map<String, Object>> operators = (List<Map<String, Object>>) recordMap.get("TaskOperators");
|
||||||
|
if (operators != null && !operators.isEmpty()) {
|
||||||
|
operatorMap.put(recordId, operators);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 同步到alarmEvents表
|
||||||
|
SisAlarmEventsBo sisAlarmEvents = convertToAlarmEvents(recordMap, recordId);
|
||||||
|
sisAlarmEventsService.insertByBo(sisAlarmEvents);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 保存数据(包含操作记录)
|
||||||
|
return alarmRecordService.saveOrUpdateRecords(records, operatorMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将原始告警数据转换为SisAlarmEventsBo对象
|
||||||
|
*/
|
||||||
|
private SisAlarmEventsBo convertToAlarmEvents(Map<String, Object> recordMap, Long recordId) {
|
||||||
|
SisAlarmEventsBo sisAlarmEvents = new SisAlarmEventsBo();
|
||||||
|
sisAlarmEvents.setId(recordId);
|
||||||
|
|
||||||
|
// 转换类型和级别
|
||||||
|
sisAlarmEvents.setType(convertToLong(recordMap.get("Type")));
|
||||||
|
sisAlarmEvents.setLevel(convertToLong(recordMap.get("Level")));
|
||||||
|
|
||||||
|
// 设备信息
|
||||||
|
sisAlarmEvents.setDeviceIp((String) recordMap.get("DeviceSipNum"));
|
||||||
|
sisAlarmEvents.setDeviceName(Objects.toString(recordMap.get("DeviceName"), ""));
|
||||||
|
sisAlarmEvents.setDeviceGroupId(convertToLong(recordMap.get("GroupId")));
|
||||||
|
sisAlarmEvents.setDeviceGroupName(Objects.toString(recordMap.get("GroupName"), ""));
|
||||||
|
|
||||||
|
// 时间和状态
|
||||||
|
sisAlarmEvents.setReportTime((Date) recordMap.get("StartTime"));
|
||||||
|
sisAlarmEvents.setState(convertToInteger(recordMap.get("State")));
|
||||||
|
|
||||||
|
// 工单ID(仅当状态为3时)
|
||||||
|
if (sisAlarmEvents.getState() == 3) {
|
||||||
|
sisAlarmEvents.setWorkOrderId(convertToLong(recordMap.get("WorkOrderId")));
|
||||||
|
}
|
||||||
|
|
||||||
|
return sisAlarmEvents;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 安全地将对象转换为Long类型
|
||||||
|
*/
|
||||||
|
private Long convertToLong(Object value) {
|
||||||
|
if (value == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (value instanceof Number) {
|
||||||
|
return ((Number) value).longValue();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return Long.valueOf(value.toString());
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
log.warn("转换为Long失败: {}", value, e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 安全地将对象转换为Integer类型
|
||||||
|
*/
|
||||||
|
private Integer convertToInteger(Object value) {
|
||||||
|
if (value == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (value instanceof Number) {
|
||||||
|
return ((Number) value).intValue();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return Integer.valueOf(value.toString());
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
log.warn("转换为Integer失败: {}", value, e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user