hsy
2026-08-31 1704e30de33833817a5fce4c4ab0b94ac8ce1cc6
fix: 修复多处表单验证与数据流转的缺陷,优化系统消息推送逻辑

- 修复宽带与通信管理、房屋租赁管理在编辑保存时重复新增数据的问题,补充表单响应式对象 `id` 属性
- 修复 `SysNoticeMapper.xml` 中手误引入的 `pathParms` 导致的 `ReflectionException` 反射异常
- 修复定时任务 `MaintenanceTaskJob` 中记录录入人 ID 时的潜在空指针异常(NPE)
- 修复设备保养计划在手工新增和定时任务生成时,未向执行人推送 App 系统消息的问题(补充调用 UnipushService)
- 优化设备保养提醒的消息文案,统一调整为:“你有一个新的设备保养计划 ,日期+设备名称”
- 优化项目管理表单,将“项目类型”调整为必填校验项
已修改3个文件
58 ■■■■■ 文件已修改
src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/SysNoticeMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
@@ -13,6 +13,12 @@
import com.ruoyi.device.mapper.DeviceMaintenanceMapper;
import com.ruoyi.device.pojo.DeviceMaintenance;
import com.ruoyi.device.service.IDeviceMaintenanceService;
import com.ruoyi.project.system.service.ISysNoticeService;
import com.ruoyi.project.system.service.impl.UnipushService;
import com.ruoyi.project.system.domain.SysNotice;
import java.util.Collections;
import com.ruoyi.common.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import com.ruoyi.device.vo.DeviceMaintenanceVo;
import com.ruoyi.device.vo.DeviceRepairVo;
import com.ruoyi.framework.web.domain.AjaxResult;
@@ -37,6 +43,7 @@
@Service
@RequiredArgsConstructor
@Slf4j
public class DeviceMaintenanceServiceImpl extends ServiceImpl<DeviceMaintenanceMapper, DeviceMaintenance> implements IDeviceMaintenanceService {
    private final DeviceMaintenanceMapper deviceMaintenanceMapper;
@@ -44,6 +51,8 @@
    private final SparePartsRequisitionRecordService sparePartsRequisitionRecordService;
    private final IDeviceRepairSparePartService deviceRepairSparePartService;
    private final FileUtil fileUtil;
    private final ISysNoticeService sysNoticeService;
    private final UnipushService unipushService;
    @Override
    public IPage<DeviceMaintenanceDto> queryPage(Page page, DeviceMaintenanceDto deviceMaintenanceDto) {
@@ -58,6 +67,34 @@
        if (save){
            // 处理图片上传
            fileUtil.saveStorageAttachmentByRecordTypeAndRecordId("file", RecordTypeEnum.DEVICE_MAINTENANCE, deviceMaintenance.getId(), deviceMaintenance.getStorageBlobDTOs());
            // 推送系统消息给执行人
            if (deviceMaintenance.getExecutorId() != null) {
                SysNotice notice = new SysNotice();
                notice.setNoticeTitle("新保养计划提醒");
                notice.setNoticeType("1"); // 1 通知
                String dateStr = deviceMaintenance.getMaintenancePlanTime() != null ?
                        deviceMaintenance.getMaintenancePlanTime().toLocalDate().toString() :
                        java.time.LocalDate.now().toString();
                notice.setNoticeContent("你有一个新的设备保养计划 ," + dateStr + " " + deviceMaintenance.getDeviceName());
                notice.setStatus("0"); // 正常
                notice.setConsigneeId(deviceMaintenance.getExecutorId());
                try {
                    Long currentUserId = SecurityUtils.getLoginUser().getUserId();
                    notice.setSenderId(currentUserId);
                } catch (Exception e) {
                    notice.setSenderId(0L); // 兜底
                }
                notice.setTenantId(deviceMaintenance.getTenantId());
                sysNoticeService.insertNotice(notice);
                try {
                    unipushService.sendClientMessage(Collections.singletonList(notice));
                } catch (Exception e) {
                    log.error("推送新保养计划系统消息失败", e);
                }
            }
            return AjaxResult.success();
        }
        return AjaxResult.error();
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java
@@ -11,6 +11,8 @@
import com.ruoyi.project.system.service.ISysNoticeService;
import com.ruoyi.project.system.domain.SysNotice;
import com.ruoyi.project.system.service.impl.UnipushService;
import java.util.Collections;
import java.io.Serializable;
import java.time.DayOfWeek;
import java.time.LocalDateTime;
@@ -33,6 +35,9 @@
    @Autowired
    private ISysNoticeService sysNoticeService;
    @Autowired
    private UnipushService unipushService;
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
@@ -61,14 +66,21 @@
            // 给执行人发送系统通知
            if (timingTask.getExecutorId() != null) {
                SysNotice notice = new SysNotice();
                notice.setNoticeTitle("新保养任务提醒");
                notice.setNoticeTitle("新保养计划提醒");
                notice.setNoticeType("1"); // 1 通知
                notice.setNoticeContent("您有一个新的设备保养任务需要执行,设备名称:" + timingTask.getTaskName());
                String dateStr = java.time.LocalDate.now().toString();
                notice.setNoticeContent("你有一个新的设备保养计划 ," + dateStr + " " + timingTask.getTaskName());
                notice.setStatus("0"); // 正常
                notice.setConsigneeId(timingTask.getExecutorId());
                notice.setSenderId(0L); // 0代表系统发送
                notice.setTenantId(timingTask.getTenantId());
                sysNoticeService.insertNotice(notice);
                try {
                    unipushService.sendClientMessage(Collections.singletonList(notice));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            // 3. 更新定时任务的执行时间
@@ -120,10 +132,12 @@
        inspectionTask.setStatus(0);
        inspectionTask.setDeviceModel(timingTask.getDeviceModel());
        inspectionTask.setMachineryCategory(timingTask.getMachineryCategory());
        if (timingTask.getRegistrantId() != null) {
        inspectionTask.setCreateUser(Integer.parseInt(timingTask.getRegistrantId().toString()));
            inspectionTask.setUpdateUser(Integer.parseInt(timingTask.getRegistrantId().toString()));
        }
        inspectionTask.setUpdateTime(LocalDateTime.now());
        inspectionTask.setCreateTime(LocalDateTime.now());
        inspectionTask.setUpdateUser(Integer.parseInt(timingTask.getRegistrantId().toString()));
        return inspectionTask;
    }
src/main/resources/mapper/system/SysNoticeMapper.xml
@@ -95,7 +95,6 @@
        <if test="consigneeId != null and consigneeId != ''">#{consigneeId},</if>
        <if test="jumpPath != null and jumpPath != ''">#{jumpPath},</if>
        <if test="appJumpPath != null and appJumpPath != ''">#{appJumpPath},</if>
        <if test="pathParms != null and pathParms != ''">#{queryParms},</if>
        <if test="createBy != null and createBy != ''">#{createBy},</if>
        <if test="tenantId != null and tenantId != ''">#{tenantId},</if>
             sysdate()