diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/AttendanceArrangementController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/AttendanceArrangementController.java index 3b4e675a..eaeb2018 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/AttendanceArrangementController.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/AttendanceArrangementController.java @@ -45,6 +45,9 @@ public class AttendanceArrangementController extends BaseController { return attendanceArrangementService.queryPageList(bo, pageQuery); } + + + /** * 查询某个月的日历排班信息的排班列表 */ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/AttendanceUserGroupController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/AttendanceUserGroupController.java index 0079ab1e..58ffb3b0 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/AttendanceUserGroupController.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/AttendanceUserGroupController.java @@ -6,6 +6,8 @@ import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.*; 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.validation.annotation.Validated; import org.dromara.common.idempotent.annotation.RepeatSubmit; @@ -103,4 +105,13 @@ public class AttendanceUserGroupController extends BaseController { @PathVariable("ids") Long[] ids) { return toAjax(attendanceUserGroupService.deleteWithValidByIds(List.of(ids), true)); } + + /** + * 查询排班的班表视图 + */ + @SaCheckPermission("Property:userGroup:queryScheduleView") + @GetMapping("/queryScheduleView") + public TableDataInfo queryScheduleView(AttendanceUserGroupBo bo, PageQuery pageQuery) { + return attendanceUserGroupService.queryScheduleView(bo, pageQuery); + } } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/AttendanceUserGroup.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/AttendanceUserGroup.java index af8673e7..c8b6ab0e 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/AttendanceUserGroup.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/AttendanceUserGroup.java @@ -4,8 +4,10 @@ import org.dromara.common.tenant.core.TenantEntity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; import java.io.Serial; +import java.time.LocalDate; /** * 排班明细对象 attendance_user_group @@ -22,7 +24,7 @@ public class AttendanceUserGroup extends TenantEntity { private static final long serialVersionUID = 1L; /** - * + * */ @TableId(value = "id") private Long id; @@ -52,5 +54,15 @@ public class AttendanceUserGroup extends TenantEntity { */ private String deptName; + /** + * 开始日期 + */ + private LocalDate startDate; + + /** + * 结束日期(仅date_type=3时有效) + */ + private LocalDate endDate; + } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/AttendanceUserGroupBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/AttendanceUserGroupBo.java index d5b860c0..44f51f94 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/AttendanceUserGroupBo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/AttendanceUserGroupBo.java @@ -8,6 +8,9 @@ import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; /** * 排班明细业务对象 attendance_user_group @@ -21,7 +24,7 @@ import jakarta.validation.constraints.*; public class AttendanceUserGroupBo extends BaseEntity { /** - * + * */ @NotNull(message = "不能为空", groups = { EditGroup.class }) private Long id; @@ -51,5 +54,21 @@ public class AttendanceUserGroupBo extends BaseEntity { */ private String deptName; + /** + * 开始日期 + */ + private LocalDate startDate; + + /** + * 结束日期(仅date_type=3时有效) + */ + private LocalDate endDate; + + + /** + * 前端传某天的当前日期 + */ + private LocalDate currentDate; + } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/AttendanceUserGroupVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/AttendanceUserGroupVo.java index 37456201..df4cfc0b 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/AttendanceUserGroupVo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/AttendanceUserGroupVo.java @@ -1,15 +1,17 @@ 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.ExcelProperty; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; import java.io.Serial; import java.io.Serializable; +import java.time.LocalDate; import java.util.Date; @@ -29,7 +31,7 @@ public class AttendanceUserGroupVo implements Serializable { private static final long serialVersionUID = 1L; /** - * + * */ @ExcelProperty(value = "") private Long id; @@ -64,5 +66,25 @@ public class AttendanceUserGroupVo implements Serializable { @ExcelProperty(value = "部门名称") 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; + } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IAttendanceArrangementService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IAttendanceArrangementService.java index 856014de..c452f573 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IAttendanceArrangementService.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IAttendanceArrangementService.java @@ -67,4 +67,5 @@ public interface IAttendanceArrangementService { Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +// TableDataInfo queryScheduleView(AttendanceArrangementBo bo, PageQuery pageQuery); } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IAttendanceUserGroupService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IAttendanceUserGroupService.java index eb51e331..0c800425 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IAttendanceUserGroupService.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IAttendanceUserGroupService.java @@ -1,6 +1,5 @@ package org.dromara.property.service; -import org.dromara.property.domain.AttendanceUserGroup; import org.dromara.property.domain.vo.AttendanceUserGroupVo; import org.dromara.property.domain.bo.AttendanceUserGroupBo; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -66,4 +65,6 @@ public interface IAttendanceUserGroupService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + TableDataInfo queryScheduleView(AttendanceUserGroupBo bo, PageQuery pageQuery); } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java index e14f152b..9f8b6157 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java @@ -255,6 +255,8 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS return TableDataInfo.build(attendanceArrangementVoPage); } + + /** * 查询某个月的日历排班信息的排班列表 * @@ -570,4 +572,5 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS } + } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceUserGroupServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceUserGroupServiceImpl.java index fb38fc40..44ecf723 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceUserGroupServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceUserGroupServiceImpl.java @@ -9,16 +9,21 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; 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.dromara.property.domain.bo.AttendanceUserGroupBo; 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 java.util.List; -import java.util.Map; -import java.util.Collection; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.stream.Collectors; /** * 排班明细Service业务层处理 @@ -33,6 +38,16 @@ public class AttendanceUserGroupServiceImpl implements IAttendanceUserGroupServi 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 排班明细 */ @Override - public AttendanceUserGroupVo queryById(Long id){ + public AttendanceUserGroupVo queryById(Long 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 做一些数据校验,如唯一约束 } @@ -128,9 +143,109 @@ public class AttendanceUserGroupServiceImpl implements IAttendanceUserGroupServi */ @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ + if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteByIds(ids) > 0; } + + + /** + * 查询排班的班表视图 + */ + @Override + public TableDataInfo queryScheduleView(AttendanceUserGroupBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + //查询当前日期在哪些人员组中,当前日期大于等于人员组开始日期,小于等于人员组结束日期 + LambdaQueryWrapper ge = lqw + .le(AttendanceUserGroup::getStartDate, bo.getCurrentDate()) + .ge(AttendanceUserGroup::getEndDate, bo.getCurrentDate()); + + Page result = baseMapper.selectVoPage(pageQuery.build(), ge); + Page 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 userGroupList = baseMapper.selectList(Wrappers.lambdaQuery().eq(AttendanceUserGroup::getScheduleId, scheduleId)); + + //根据scheduleId查询出排班的详细信息 + AttendanceArrangement attendanceArrangement = arrangementMapper.selectOne(Wrappers.lambdaQuery().eq(AttendanceArrangement::getId, scheduleId)); + // 假设每个vo只有一个scheduleId + Long userGroupListScheduleId = attendanceArrangement.getId(); + AttendanceArrangement arrangement = arrangementMapper.selectOne(Wrappers.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 weekSetList = weekSetMapper.selectList(Wrappers.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 cycleDaysList = scheduleCycleMapper.selectList(Wrappers.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.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); + + } } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/AlarmPushController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/AlarmPushController.java new file mode 100644 index 00000000..929d50c0 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/AlarmPushController.java @@ -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> pushSingleAlarm(@RequestBody Map alarmData) { + try { + // 处理单条数据 + processAlarmData(Collections.singletonList(alarmData)); + + Map 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> pushBatchAlarms(@RequestBody List> alarmDataList) { + if (alarmDataList == null || alarmDataList.isEmpty()) { + return ResponseEntity.badRequest().body(Collections.singletonMap("error", "推送数据不能为空")); + } + + try { + int processedCount = processAlarmData(alarmDataList); + + Map 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> alarmDataList) { + log.info("开始处理推送的告警数据,共 {} 条", alarmDataList.size()); + + // 转换报警记录 + List records = alarmDataList.stream() + .map(alarmRecordService::convertFromMap) + .collect(Collectors.toList()); + + // 提取操作记录数据 + Map>> operatorMap = new HashMap<>(); + for (Map 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> operators = (List>) 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 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; + } + } +}