src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java
@@ -2,10 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.device.dto.DeviceDefectRecordDto; import com.ruoyi.device.dto.DeviceRepairDto; import com.ruoyi.device.pojo.DeviceDefectRecord; import com.ruoyi.device.pojo.DeviceLedger; import com.ruoyi.device.pojo.DeviceRepair; import com.ruoyi.device.service.DeviceDefectRecordService; import com.ruoyi.framework.web.domain.AjaxResult; import io.swagger.annotations.Api; src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java
@@ -2,7 +2,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.device.dto.DeviceLedgerDto; import com.ruoyi.device.mapper.DeviceLedgerMapper; @@ -10,15 +9,11 @@ import com.ruoyi.device.pojo.DeviceLedger; import com.ruoyi.device.pojo.DeviceMaintenance; import com.ruoyi.device.service.IDeviceLedgerService; import com.ruoyi.device.service.IDeviceMaintenanceService; import com.ruoyi.dto.DateQueryDto; import com.ruoyi.framework.aspectj.lang.annotation.Anonymous; import com.ruoyi.framework.web.domain.AjaxResult; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.ArrayUtils; import org.ehcache.spi.service.MaintainableService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -26,7 +21,6 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @Api(tags = "设å¤å°è´¦ç®¡ç") @@ -85,14 +79,7 @@ public void export(HttpServletResponse response, Long[] ids) { deviceLedgerService.export(response, ids); } /** * */ @GetMapping("/report/forms") @ApiOperation("æ¥è¯¢è®¾å¤å°è´¦å¾è¡¨æ°æ®") public AjaxResult report() { return AjaxResult.success(deviceLedgerService.report()); } @PostMapping("import") @ApiModelProperty("å¯¼å ¥è®¾å¤å°è´¦") public AjaxResult importData(MultipartFile file) throws IOException { src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java
@@ -3,13 +3,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.device.dto.DeviceMaintenanceDto; import com.ruoyi.device.dto.DeviceRepairDto; import com.ruoyi.device.pojo.DeviceLedger; import com.ruoyi.device.pojo.DeviceMaintenance; import com.ruoyi.device.pojo.DeviceRepair; import com.ruoyi.device.service.IDeviceLedgerService; import com.ruoyi.device.service.IDeviceMaintenanceService; import com.ruoyi.device.service.IDeviceRepairService; import com.ruoyi.framework.web.domain.AjaxResult; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; @@ -17,7 +14,6 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.Arrays; @Api(tags = "设å¤ä¿å »") @@ -65,7 +61,6 @@ @PostMapping ("maintenance") @ApiModelProperty("ä¿®æ¹è®¾å¤ä¿å »") public AjaxResult maintenance(@RequestBody DeviceMaintenance deviceMaintenance) { deviceMaintenance.setStatus(1); return deviceMaintenanceService.updateDeviceDeviceMaintenance(deviceMaintenance); } src/main/java/com/ruoyi/device/controller/DeviceRepairController.java
@@ -3,7 +3,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.device.dto.DeviceRepairDto; import com.ruoyi.device.pojo.DeviceLedger; import com.ruoyi.device.pojo.DeviceRepair; import com.ruoyi.device.service.IDeviceLedgerService; import com.ruoyi.device.service.IDeviceRepairService; @@ -14,7 +13,6 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.Arrays; @Api(tags = "è®¾å¤æ¥ä¿®ç®¡ç") @@ -56,7 +54,6 @@ @PostMapping ("repair") @ApiModelProperty("设å¤ç»´ä¿®") public AjaxResult repair( @RequestBody DeviceRepair deviceRepair) { deviceRepair.setStatus(1); return deviceRepairService.updateDeviceRepair(deviceRepair); } src/main/java/com/ruoyi/device/controller/MaintenanceTaskController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,60 @@ package com.ruoyi.device.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.device.pojo.MaintenanceTask; import com.ruoyi.device.service.MaintenanceTaskService; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; /** * @author :yys * @date : 2025/12/22 14:58 */ @Api(tags = "设å¤ä¿å »å®æ¶ä»»å¡ç®¡ç") @RestController @RequestMapping("/deviceMaintenanceTask") public class MaintenanceTaskController extends BaseController { @Autowired private MaintenanceTaskService maintenanceTaskService; @GetMapping("/listPage") @ApiOperation(value = "设å¤ä¿å »å®æ¶ä»»å¡å表") public AjaxResult listPage(Page page, MaintenanceTask maintenanceTask) { return maintenanceTaskService.listPage(page,maintenanceTask); } @PostMapping("/add") @ApiOperation(value = "æ·»å 设å¤ä¿å »å®æ¶ä»»å¡") @Log(title = "设å¤ä¿å »å®æ¶ä»»å¡", businessType = BusinessType.INSERT) public AjaxResult add(@RequestBody MaintenanceTask maintenanceTask) { return maintenanceTaskService.add(maintenanceTask); } @PostMapping("/update") @ApiOperation(value = "ä¿®æ¹è®¾å¤ä¿å »å®æ¶ä»»å¡") @Log(title = "设å¤ä¿å »å®æ¶ä»»å¡", businessType = BusinessType.UPDATE) public AjaxResult update(@RequestBody MaintenanceTask maintenanceTask) { return maintenanceTaskService.updateByMaintenanceTaskId(maintenanceTask); } @DeleteMapping("/delete") @ApiOperation(value = "å é¤è®¾å¤ä¿å »å®æ¶ä»»å¡") @Log(title = "设å¤ä¿å »å®æ¶ä»»å¡", businessType = BusinessType.DELETE) public AjaxResult delete(@RequestBody List<Long> ids) { return maintenanceTaskService.delete(ids); } } src/main/java/com/ruoyi/device/dto/DeviceAssetInfoDto.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/device/dto/DeviceLedgerDto.java
@@ -37,6 +37,19 @@ private String deviceModel; /** * 设å¤åç */ @ApiModelProperty("设å¤åç") private String deviceBrand; /** * åæ¾ä½ç½® */ @ApiModelProperty("åæ¾ä½ç½®") private String storageLocation; /** * ä¾åºååç§° */ private String supplierName; @@ -50,10 +63,6 @@ * æ°é */ private BigDecimal number; private String deviceBrand; private String storageLocation; /** * å«ç¨åä»· src/main/java/com/ruoyi/device/dto/DeviceMaintenanceDto.java
@@ -6,14 +6,12 @@ import lombok.Data; import java.time.LocalDateTime; import java.util.Date; @Data public class DeviceMaintenanceDto { @ApiModelProperty("设å¤ä¿å »id") private Long id; @ApiModelProperty("设å¤å°è´¦id") @@ -41,9 +39,9 @@ private String maintenanceActuallyTimeReq; @ApiModelProperty("ä¿å »ç»æ 0 ç»´ä¿® 1 å®å¥½") private Integer maintenanceResult; private String maintenanceResult; @ApiModelProperty("ç¶æ 0 å¾ ä¿å » 1 å®ç»") @ApiModelProperty("ç¶æ 0 å¾ ä¿å » 1 å®ç» 2 失败") private Integer status; @ApiModelProperty("å建æ¶é´") src/main/java/com/ruoyi/device/execl/DeviceLedgerExeclDto.java
@@ -1,13 +1,9 @@ package com.ruoyi.device.execl; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDateTime; @Data public class DeviceLedgerExeclDto { src/main/java/com/ruoyi/device/execl/DeviceMaintenanceExeclDto.java
@@ -37,7 +37,7 @@ @Excel(name = "ä¿å »ç»æ") private String maintenanceResult; @ApiModelProperty("ç¶æ 0 å¾ ä¿å » 1 å®ç»") @ApiModelProperty("ç¶æ 0 å¾ ä¿å » 1 å®ç» 2 失败") @Excel(name = "ç¶æ") private String status; src/main/java/com/ruoyi/device/execl/DeviceRepairExeclDto.java
@@ -1,8 +1,6 @@ package com.ruoyi.device.execl; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java
@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.device.dto.DeviceMaintenanceDto; import com.ruoyi.device.dto.DeviceRepairDto; import com.ruoyi.device.pojo.DeviceMaintenance; import org.apache.ibatis.annotations.Mapper; src/main/java/com/ruoyi/device/mapper/MaintenanceTaskMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,11 @@ package com.ruoyi.device.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.device.pojo.MaintenanceTask; /** * @author :yys * @date : 2025/12/22 14:56 */ public interface MaintenanceTaskMapper extends BaseMapper<MaintenanceTask> { } src/main/java/com/ruoyi/device/pojo/DeviceLedger.java
@@ -12,7 +12,6 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Date; /** * 设å¤å°è´¦å®ä½ç±» @@ -39,6 +38,18 @@ */ @ApiModelProperty("è§æ ¼åå·") private String deviceModel; /** * 设å¤åç */ @ApiModelProperty("设å¤åç") private String deviceBrand; /** * åæ¾ä½ç½® */ @ApiModelProperty("åæ¾ä½ç½®") private String storageLocation; /** * ä¾åºååç§° @@ -74,10 +85,6 @@ * ä¸å«ç¨æ»ä»· */ private BigDecimal unTaxIncludingPriceTotal; private String deviceBrand; private String storageLocation; /** * å½å ¥æ¶é´ src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
@@ -1,15 +1,15 @@ package com.ruoyi.device.pojo; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import com.baomidou.mybatisplus.annotation.*; import io.swagger.models.auth.In; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; import java.util.Date; @Data @TableName("device_maintenance") @@ -21,6 +21,21 @@ @ApiModelProperty("设å¤å°è´¦id") private Long deviceLedgerId; @ApiModelProperty("ä¿å »ä»»å¡id") private Long maintenanceTaskId; @ApiModelProperty(value = "颿¬¡") private String frequencyType; @ApiModelProperty(value = "颿¬¡è¯¦æ ") private String frequencyDetail; @ApiModelProperty(value = "䏿¬¡æ§è¡æ¶é´") private LocalDateTime nextExecutionTime; @ApiModelProperty(value = "æåæ§è¡æ¶é´") private LocalDateTime lastExecutionTime; private String deviceName; @@ -41,9 +56,9 @@ private LocalDateTime maintenanceActuallyTime; @ApiModelProperty("ä¿å »ç»æ 0 ç»´ä¿® 1 å®å¥½") private Integer maintenanceResult; private String maintenanceResult; @ApiModelProperty("ç¶æ 0 å¾ ä¿å » 1 å®ç»") @ApiModelProperty("ç¶æ 0 å¾ ä¿å » 1 å®ç» 2 失败") private Integer status; @ApiModelProperty("å建æ¶é´") src/main/java/com/ruoyi/device/pojo/DeviceRepair.java
@@ -4,14 +4,10 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import nonapi.io.github.classgraph.json.Id; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Date; @@ -49,7 +45,7 @@ @ApiModelProperty("ç»´ä¿®ç»æ") private String maintenanceResult; @ApiModelProperty("ç¶æ 0 å¾ ç»´ä¿® 1å®ç»") @ApiModelProperty("ç¶æ 0 å¾ ç»´ä¿® 1å®ç» 2 失败") private Integer status; @ApiModelProperty("å建æ¶é´") src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,109 @@ package com.ruoyi.device.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDate; import java.time.LocalDateTime; /** * @author :yys * @date : 2025/9/19 10:27 */ @Data @ApiModel @TableName("maintenance_task") public class MaintenanceTask { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "è§æ ¼åå·") private String deviceModel; /** * 主é®ID */ @TableId(type = IdType.AUTO) private Long id; @ApiModelProperty(value = "设å¤åç§°") @Excel(name = "ä¿å »ä»»å¡åç§°") private String taskName; @ApiModelProperty(value = "设å¤id") private Long taskId; @ApiModelProperty(value = "颿¬¡") @Excel(name = "颿¬¡") private String frequencyType; @ApiModelProperty(value = "颿¬¡è¯¦æ ") @Excel(name = "å¼å§æ¥æä¸æ¶é´") private String frequencyDetail; @ApiModelProperty(value = "䏿¬¡æ§è¡æ¶é´") private LocalDateTime nextExecutionTime; @ApiModelProperty(value = "æåæ§è¡æ¶é´") private LocalDateTime lastExecutionTime; @ApiModelProperty(value = "æ¯å¦æ¿æ´»") private boolean isActive; @ApiModelProperty(value = "夿³¨") @Excel(name = "夿³¨") private String remarks; @ApiModelProperty(value = "å½å ¥äººid") private Long registrantId; @ApiModelProperty(value = "å½å ¥äºº") @Excel(name = "å½å ¥äºº") private String registrant; @ApiModelProperty(value = "å½å ¥æ¥æ") @Excel(name = "å½å ¥æ¥æ", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate registrationDate; @ApiModelProperty(value = "ç¶æ") private String status; @ApiModelProperty(value = "软å 餿 å¿ï¼0=æªå é¤ï¼1=å·²å é¤") private Integer deleted; @TableField(exist = false) private String dateStr; @ApiModelProperty(value = "å建该记å½çç¨æ·") @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) private Integer createUser; @ApiModelProperty(value = "è®°å½å建æ¶é´") @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) // @JsonFormat(pattern = "yyyy-MM-dd") // @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDateTime createTime; @ApiModelProperty(value = "æåä¿®æ¹è¯¥è®°å½çç¨æ·") @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE) private Integer updateUser; @ApiModelProperty(value = "è®°å½æåæ´æ°æ¶é´") @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @ApiModelProperty(value = "ç§æ·ID") @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) private Long tenantId; } src/main/java/com/ruoyi/device/service/IDeviceLedgerService.java
@@ -3,17 +3,13 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.device.dto.DeviceAssetInfoDto; import com.ruoyi.device.dto.DeviceLedgerDto; import com.ruoyi.device.pojo.DeviceLedger; import com.ruoyi.dto.DateQueryDto; import com.ruoyi.framework.web.domain.AjaxResult; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.Objects; public interface IDeviceLedgerService extends IService<DeviceLedger> { IPage<DeviceLedgerDto> queryPage(Page page, DeviceLedgerDto deviceLedger); @@ -25,6 +21,4 @@ void export(HttpServletResponse response, Long[] ids); Boolean importData(MultipartFile file) throws IOException; DeviceAssetInfoDto report(); } src/main/java/com/ruoyi/device/service/MaintenanceTaskService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ package com.ruoyi.device.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.device.pojo.MaintenanceTask; import com.ruoyi.framework.web.domain.AjaxResult; import java.util.List; /** * @author :yys * @date : 2025/12/22 14:56 */ public interface MaintenanceTaskService extends IService<MaintenanceTask> { AjaxResult listPage(Page page, MaintenanceTask maintenanceTask); AjaxResult add(MaintenanceTask maintenanceTask); AjaxResult updateByMaintenanceTaskId(MaintenanceTask maintenanceTask); AjaxResult delete(List<Long> ids); } src/main/java/com/ruoyi/device/service/impl/DeviceDefectRecordServiceImpl.java
@@ -10,7 +10,6 @@ import com.ruoyi.device.pojo.DeviceDefectRecord; import com.ruoyi.device.pojo.DeviceRepair; import com.ruoyi.device.service.DeviceDefectRecordService; import com.ruoyi.device.service.IDeviceRepairService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java
@@ -2,19 +2,16 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.device.dto.DeviceAssetInfoDto; import com.ruoyi.device.dto.DeviceLedgerDto; import com.ruoyi.device.execl.DeviceLedgerExeclDto; import com.ruoyi.device.mapper.DeviceLedgerMapper; import com.ruoyi.device.pojo.DeviceLedger; import com.ruoyi.device.service.IDeviceLedgerService; import com.ruoyi.dto.DateQueryDto; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; @@ -26,12 +23,9 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.math.BigDecimal; import java.time.ZoneOffset; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; @Service @AllArgsConstructor @@ -52,9 +46,9 @@ @Override public AjaxResult saveDeviceLedger(DeviceLedger deviceLedger) { LambdaQueryWrapper<DeviceLedger> deviceLedgerLambdaQueryWrapper = new LambdaQueryWrapper<>(); deviceLedgerLambdaQueryWrapper.eq(DeviceLedger::getDeviceModel,deviceLedger.getDeviceModel()); deviceLedgerLambdaQueryWrapper.eq(DeviceLedger::getDeviceName,deviceLedger.getDeviceName()); if (this.count(deviceLedgerLambdaQueryWrapper) > 0) { return AjaxResult.error("设å¤åå·å·²åå¨"); return AjaxResult.error("设å¤åç§°å·²åå¨"); } boolean save = this.save(deviceLedger); if (save){ @@ -122,16 +116,5 @@ }); return true; } @Override public DeviceAssetInfoDto report() { List<DeviceLedger> list = deviceLedgerMapper.selectList(null); DeviceAssetInfoDto deviceAssetInfoDto = new DeviceAssetInfoDto(); deviceAssetInfoDto.setTotalEquipment(list.stream().map(DeviceLedger::getNumber).reduce(BigDecimal.ZERO, BigDecimal::add).intValue()); deviceAssetInfoDto.setTotalOriginalValue(list.stream().map(DeviceLedger::getTaxIncludingPriceTotal).reduce(BigDecimal.ZERO, BigDecimal::add)); deviceAssetInfoDto.setTotalNetValue(list.stream().map(DeviceLedger::getUnTaxIncludingPriceTotal).reduce(BigDecimal.ZERO, BigDecimal::add)); deviceAssetInfoDto.setTotalDepreciation(deviceAssetInfoDto.getTotalOriginalValue().subtract(deviceAssetInfoDto.getTotalNetValue())); return deviceAssetInfoDto; } } src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
@@ -17,7 +17,6 @@ import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -59,9 +58,8 @@ supplierManageList.forEach(deviceMaintenance -> { DeviceMaintenanceExeclDto deviceRepairExeclDto = new DeviceMaintenanceExeclDto(); BeanUtils.copyProperties(deviceMaintenance,deviceRepairExeclDto); deviceRepairExeclDto.setStatus(deviceMaintenance.getStatus() == 0 ? "å¾ ç»´ä¿®" : "å®ç»"); deviceRepairExeclDto.setMaintenanceResult(deviceMaintenance.getMaintenanceResult() != null && deviceMaintenance.getMaintenanceResult() == 0 ? "ç»´ä¿®" : "å®å¥½"); deviceRepairExeclDto.setStatus(deviceMaintenance.getStatus() == 0 ? "å¾ ç»´ä¿®" : deviceMaintenance.getStatus() == 1 ? "å®ç»" : "失败"); // deviceRepairExeclDto.setMaintenanceResult(deviceMaintenance.getMaintenanceResult() != null && deviceMaintenance.getMaintenanceResult() == 0 ? "ç»´ä¿®" : "å®å¥½"); deviceLedgerExeclDtos.add(deviceRepairExeclDto); }); ExcelUtil<DeviceMaintenanceExeclDto> util = new ExcelUtil<DeviceMaintenanceExeclDto>(DeviceMaintenanceExeclDto.class); src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
@@ -8,9 +8,7 @@ import com.ruoyi.device.dto.DeviceDefectRecordDto; import com.ruoyi.device.dto.DeviceRepairDto; import com.ruoyi.device.execl.DeviceRepairExeclDto; import com.ruoyi.device.mapper.DeviceDefectRecordMapper; import com.ruoyi.device.mapper.DeviceRepairMapper; import com.ruoyi.device.pojo.DeviceDefectRecord; import com.ruoyi.device.pojo.DeviceLedger; import com.ruoyi.device.pojo.DeviceRepair; import com.ruoyi.device.service.DeviceDefectRecordService; @@ -84,7 +82,7 @@ supplierManageList.stream().forEach(deviceRepair -> { DeviceRepairExeclDto deviceRepairExeclDto = new DeviceRepairExeclDto(); BeanUtils.copyProperties(deviceRepair,deviceRepairExeclDto); deviceRepairExeclDto.setStatusStr(deviceRepair.getStatus() == 0 ? "å¾ ç»´ä¿®" : "å®ç»"); deviceRepairExeclDto.setStatusStr(deviceRepair.getStatus() == 0 ? "å¾ ç»´ä¿®" : deviceRepair.getStatus() == 1 ? "å®ç»" : "失败"); deviceLedgerExeclDtos.add(deviceRepairExeclDto); }); @@ -100,7 +98,7 @@ supplierManageList.stream().forEach(deviceRepair -> { DeviceRepairExeclDto deviceRepairExeclDto = new DeviceRepairExeclDto(); BeanUtils.copyProperties(deviceRepair,deviceRepairExeclDto); deviceRepairExeclDto.setStatusStr(deviceRepair.getStatus() == 0 ? "å¾ ç»´ä¿®" : "å®ç»"); deviceRepairExeclDto.setStatusStr(deviceRepair.getStatus() == 0 ? "å¾ ç»´ä¿®" : deviceRepair.getStatus() == 1 ? "å®ç»" : "失败"); deviceLedgerExeclDtos.add(deviceRepairExeclDto); }); src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,243 @@ package com.ruoyi.device.service.impl; import com.ruoyi.device.pojo.DeviceMaintenance; import com.ruoyi.device.pojo.MaintenanceTask; import org.quartz.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; import java.io.Serializable; import java.time.DayOfWeek; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.YearMonth; import java.util.HashSet; import java.util.List; import java.util.Set; @Component @DisallowConcurrentExecution // ç¦æ¢å¹¶åæ§è¡åä¸ä¸ªJob public class MaintenanceTaskJob implements Job, Serializable { private static final long serialVersionUID = 1L; // å¿ é¡»å®ä¹åºååID @Autowired private DeviceMaintenanceServiceImpl deviceMaintenanceService; @Autowired private JdbcTemplate jdbcTemplate; @Override public void execute(JobExecutionContext context) throws JobExecutionException { JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); // ä¿®å¤ç±»å转æ¢éè¯¯ï¼æ£ç¡®è·åtaskId Long taskId = jobDataMap.getLong("maintenanceTaskId"); try { // 3. å°è¯æ¥è¯¢ä½ çä¸å¡æ°æ® // éè¿JDBCæ¨¡æ¿æ¥è¯¢å®æ¶ä»»å¡ä¿¡æ¯ï¼ä½¿ç¨åæ°åæ¥è¯¢é²æ¢SQLæ³¨å ¥ String yourSql = "SELECT * FROM maintenance_task where id = ?"; List<MaintenanceTask> tasks = jdbcTemplate.query( yourSql, new BeanPropertyRowMapper<>(MaintenanceTask.class), taskId ); MaintenanceTask timingTask = tasks.isEmpty() ? null : tasks.get(0); if (timingTask == null) { throw new JobExecutionException("MaintenanceTaskJobæ¾ä¸å°å®æ¶ä»»å¡: " + taskId); } // 2. å建并ä¿åå·¡æ£ä»»å¡è®°å½ - è¿å°±æ¯æ¨æä¾ç代ç åºè¯¥æ¾çä½ç½® DeviceMaintenance deviceMaintenance = createInspectionTask(timingTask); deviceMaintenanceService.save(deviceMaintenance); // 3. æ´æ°å®æ¶ä»»å¡çæ§è¡æ¶é´ if (!tasks.isEmpty()) { MaintenanceTask task = tasks.get(0); // æ´æ°æåæ§è¡æ¶é´ä¸ºå½åæ¶é´ LocalDateTime lastExecutionTime = LocalDateTime.now(); // 计ç®ä¸æ¬¡æ§è¡æ¶é´ LocalDateTime nextExecutionTime = calculateNextExecutionTime( task.getFrequencyType(), task.getFrequencyDetail(), lastExecutionTime ); // æ§è¡æ´æ°æä½ String updateSql = "UPDATE maintenance_task " + "SET last_execution_time = ?, next_execution_time = ? " + "WHERE id = ?"; jdbcTemplate.update( updateSql, lastExecutionTime, nextExecutionTime, taskId ); } } catch (Exception e) { throw new JobExecutionException(e); } } // è¿å°±æ¯æ¨æä¾ç代ç å°è£ æçæ¹æ³ private DeviceMaintenance createInspectionTask(MaintenanceTask timingTask) { DeviceMaintenance inspectionTask = new DeviceMaintenance(); // å¤å¶åºæ¬å±æ§ inspectionTask.setDeviceName(timingTask.getTaskName()); inspectionTask.setMaintenanceTaskId(timingTask.getId()); inspectionTask.setDeviceLedgerId(timingTask.getTaskId()); inspectionTask.setMaintenancePlanTime(LocalDateTime.now()); inspectionTask.setFrequencyType(timingTask.getFrequencyType()); inspectionTask.setFrequencyDetail(timingTask.getFrequencyDetail()); inspectionTask.setTenantId(timingTask.getTenantId()); inspectionTask.setStatus(0); inspectionTask.setDeviceModel(timingTask.getDeviceModel()); inspectionTask.setCreateUser(Integer.parseInt(timingTask.getRegistrantId().toString())); inspectionTask.setUpdateTime(LocalDateTime.now()); inspectionTask.setCreateTime(LocalDateTime.now()); inspectionTask.setUpdateUser(Integer.parseInt(timingTask.getRegistrantId().toString())); return inspectionTask; } /** * 计ç®ä¸æ¬¡æ§è¡æ¶é´ */ private LocalDateTime calculateNextExecutionTime(String frequencyType, String frequencyDetail, LocalDateTime currentTime) { try { switch (frequencyType) { case "DAILY": return calculateDailyNextTime(frequencyDetail, currentTime); case "WEEKLY": return calculateWeeklyNextTime(frequencyDetail, currentTime); case "MONTHLY": return calculateMonthlyNextTime(frequencyDetail, currentTime); case "QUARTERLY": return calculateQuarterlyNextTime(frequencyDetail, currentTime); default: throw new IllegalArgumentException("䏿¯æçé¢çç±»å: " + frequencyType); } } catch (Exception e) { throw new RuntimeException("计ç®ä¸æ¬¡æ§è¡æ¶é´å¤±è´¥: " + e.getMessage(), e); } } /** * è®¡ç®æ¯æ¥ä»»å¡ç䏿¬¡æ§è¡æ¶é´ */ private LocalDateTime calculateDailyNextTime(String timeStr, LocalDateTime current) { LocalTime executionTime = LocalTime.parse(timeStr); // è§£ææ ¼å¼ "HH:mm" LocalDateTime nextTime = LocalDateTime.of(current.toLocalDate(), executionTime); // 妿ä»å¤©çæ¶é´å·²è¿ï¼å宿æå¤© return current.isBefore(nextTime) ? nextTime : nextTime.plusDays(1); } /** * è®¡ç®æ¯å¨ä»»å¡ç䏿¬¡æ§è¡æ¶é´ */ private LocalDateTime calculateWeeklyNextTime(String detail, LocalDateTime current) { String[] parts = detail.split(","); String dayOfWeekStr = parts[0]; // å¦ "MON" æ "MON|WED|FRI" LocalTime time = LocalTime.parse(parts[1]); // æ¶é´é¨å // è§£æææå (æ¯æå¤ä¸ªææ) Set<DayOfWeek> targetDays = parseDayOfWeeks(dayOfWeekStr); // ä»å½åæ¶é´å¼å§æ¾ä¸ä¸ä¸ªç¬¦åæ¡ä»¶çææå LocalDateTime nextTime = current; while (true) { nextTime = nextTime.plusDays(1); if (targetDays.contains(nextTime.getDayOfWeek())) { return LocalDateTime.of(nextTime.toLocalDate(), time); } // 鲿¢æ é循ç¯(ç论ä¸ä¸ä¼åç) if (nextTime.isAfter(current.plusYears(1))) { throw new RuntimeException("æ æ³æ¾å°ä¸æ¬¡æ§è¡æ¶é´"); } } } /** * è®¡ç®æ¯æä»»å¡ç䏿¬¡æ§è¡æ¶é´ */ private LocalDateTime calculateMonthlyNextTime(String detail, LocalDateTime current) { String[] parts = detail.split(","); int dayOfMonth = Integer.parseInt(parts[0]); LocalTime time = LocalTime.parse(parts[1]); // ä»ä¸ä¸ªæå¼å§è®¡ç® LocalDateTime nextTime = current.plusMonths(1) .withDayOfMonth(Math.min(dayOfMonth, current.plusMonths(1).toLocalDate().lengthOfMonth())) .with(time); return nextTime; } /** * è®¡ç®æ¯å£åº¦ä»»å¡ç䏿¬¡æ§è¡æ¶é´ */ private LocalDateTime calculateQuarterlyNextTime(String detail, LocalDateTime current) { String[] parts = detail.split(","); int quarterMonth = Integer.parseInt(parts[0]); // 1=第1个æï¼2=第2个æï¼3=第3个æ int dayOfMonth = Integer.parseInt(parts[1]); LocalTime time = LocalTime.parse(parts[2]); // 计ç®å½åå£åº¦ int currentQuarter = (current.getMonthValue() - 1) / 3 + 1; int currentMonthInQuarter = (current.getMonthValue() - 1) % 3 + 1; YearMonth targetYearMonth; if (currentMonthInQuarter < quarterMonth) { // æ¬å£åº¦å è¿ææ§è¡æºä¼ targetYearMonth = YearMonth.from(current) .plusMonths(quarterMonth - currentMonthInQuarter); } else { // éè¦å°ä¸ä¸ªå£åº¦ targetYearMonth = YearMonth.from(current) .plusMonths(3 - currentMonthInQuarter + quarterMonth); } // å¤çææ«æ¥æ int adjustedDay = Math.min(dayOfMonth, targetYearMonth.lengthOfMonth()); return LocalDateTime.of( targetYearMonth.getYear(), targetYearMonth.getMonthValue(), adjustedDay, time.getHour(), time.getMinute() ); } /** * è§£æææå å符串 */ private Set<DayOfWeek> parseDayOfWeeks(String dayOfWeekStr) { Set<DayOfWeek> days = new HashSet<>(); String[] dayStrs = dayOfWeekStr.split("\\|"); for (String dayStr : dayStrs) { switch (dayStr) { case "MON": days.add(DayOfWeek.MONDAY); break; case "TUE": days.add(DayOfWeek.TUESDAY); break; case "WED": days.add(DayOfWeek.WEDNESDAY); break; case "THU": days.add(DayOfWeek.THURSDAY); break; case "FRI": days.add(DayOfWeek.FRIDAY); break; case "SAT": days.add(DayOfWeek.SATURDAY); break; case "SUN": days.add(DayOfWeek.SUNDAY); break; default: throw new IllegalArgumentException("æ æçææå : " + dayStr); } } return days; } } src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,278 @@ package com.ruoyi.device.service.impl; import com.ruoyi.device.pojo.MaintenanceTask; import lombok.extern.slf4j.Slf4j; import org.quartz.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalTime; import java.time.ZoneId; import java.time.format.DateTimeParseException; import java.util.Arrays; import java.util.Date; import java.util.stream.Collectors; /** * @author :yys * @date : 2025/12/22 15:16 */ @Service @Slf4j public class MaintenanceTaskScheduler { @Autowired private Scheduler scheduler; /** * æ·»å æ°ä»»å¡å°è°åº¦å¨ */ public void scheduleMaintenanceTask(MaintenanceTask task){ try { JobDetail jobDetail = buildJobDetail(task); Trigger trigger = buildJobTrigger(task, jobDetail); scheduler.scheduleJob(jobDetail, trigger); }catch (SchedulerException e){ log.error("SchedulerException scheduleMaintenanceTask ERROR",e); throw new RuntimeException(e); } } /** * æ´æ°å·²æä»»å¡ */ public void rescheduleMaintenanceTask(MaintenanceTask task){ try{ TriggerKey triggerKey = new TriggerKey("triggerMaintenanceTask_" + task.getId()); // è·åç°æè§¦åå¨å¹¶è½¬æ¢ä¸º CronTrigger Trigger oldTrigger = scheduler.getTrigger(triggerKey); if (!(oldTrigger instanceof CronTrigger)) { throw new SchedulerException("Existing trigger is not a CronTrigger"); } // 3. æå»ºCronTriggerï¼ç¡®ä¿æä¹ åé ç½® CronTrigger newTrigger = TriggerBuilder.newTrigger() .withIdentity(triggerKey) // å¯ä¸æ è¯ï¼ç¨äºæä¹ ååå¨ .withDescription(task.getTaskName() + "_TRIGGER") // 触åå¨æè¿° .forJob(oldTrigger.getJobKey()) // å ³è对åºçJob .withSchedule(CronScheduleBuilder .cronSchedule(convertToCronExpression(task)) // éè¿æ§è¡æ¶ççç¥ï¼æ ¹æ®ä¸å¡è°æ´ï¼ ) // 4. 设置å¼å§æ¶é´ï¼è¥ä¸ºnullåç«å³çæï¼ .startAt(task.getNextExecutionTime() != null ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant()) : new Date()) .build(); scheduler.rescheduleJob(triggerKey, newTrigger); }catch (SchedulerException e){ log.error("SchedulerException rescheduleMaintenanceTask ERROR",e); throw new RuntimeException(e); } } /** * æåä»»å¡ */ public void pauseMaintenanceTask(Long taskId) throws SchedulerException { JobKey jobKey = new JobKey("MaintenanceTask_" + taskId); scheduler.pauseJob(jobKey); } /** * æ¢å¤ä»»å¡ */ public void resumeMaintenanceTask(Long taskId) throws SchedulerException { JobKey jobKey = new JobKey("MaintenanceTask_" + taskId); scheduler.resumeJob(jobKey); } /** * å é¤ä»»å¡ */ public void unscheduleMaintenanceTask(Long taskId){ try { JobKey jobKey = new JobKey("MaintenanceTask_" + taskId); scheduler.deleteJob(jobKey); }catch (SchedulerException e){ log.error("SchedulerException unscheduleMaintenanceTask ERROR",e); throw new RuntimeException(e); } } private JobDetail buildJobDetail(MaintenanceTask task) { // 1. æå»ºå¯ä¸JobKeyï¼åºäºä»»å¡IDï¼ç¡®ä¿éå¯åè½è¯å«ï¼ JobKey jobKey = new JobKey("MaintenanceTask_" + task.getId()); // 2. å°è£ 任塿°æ®ï¼ä» 使ç¨åºæ¬ç±»åï¼ç¡®ä¿å¯åºååï¼ JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("maintenanceTaskId", task.getId()); // ä»»å¡IDï¼Longï¼å¯åºååï¼ jobDataMap.put("taskName", task.getTaskName()); // ä»»å¡åç§°ï¼Stringï¼å¯åºååï¼ jobDataMap.put("taskType", task.getFrequencyType()); // ä»»å¡ç±»åï¼Stringï¼ // æéæ·»å å ¶ä»å¿ è¦çåºæ¬ç±»ååæ° // 3. æå»ºJobDetailï¼è®¾ç½®æä¹ åç¸å ³å±æ§ return JobBuilder.newJob(MaintenanceTaskJob.class) .withIdentity(jobKey) // å¯ä¸æ è¯ï¼ç¨äºæä¹ ååå¨ .withDescription(task.getTaskName()) // ä»»å¡æè¿°ï¼åå ¥æ°æ®åº .usingJobData(jobDataMap) // ç»å®ä»»å¡æ°æ® .storeDurably(true) // å³ä½¿æ²¡æè§¦åå¨å ³èä¹æä¹ åä¿å .requestRecovery(true) // å½è°åº¦å¨å´©æºåæ¢å¤æ¶ï¼éæ°æ§è¡æªå®æçä»»å¡ .build(); } private Trigger buildJobTrigger(MaintenanceTask task, JobDetail jobDetail) { // 1. æå»ºå¯ä¸TriggerKeyï¼åºäºä»»å¡IDï¼ TriggerKey triggerKey = new TriggerKey("triggerMaintenanceTask_" + task.getId()); // 2. çæCron表达å¼ï¼åé»è¾ä¸åï¼ String cronExpression = convertToCronExpression(task); // 3. æå»ºCronTriggerï¼ç¡®ä¿æä¹ åé ç½® return TriggerBuilder.newTrigger() .withIdentity(triggerKey) // å¯ä¸æ è¯ï¼ç¨äºæä¹ ååå¨ .withDescription(task.getTaskName() + "_TRIGGER") // 触åå¨æè¿° .forJob(jobDetail) // å ³è对åºçJob .withSchedule(CronScheduleBuilder .cronSchedule(cronExpression) .withMisfireHandlingInstructionDoNothing() // éè¿æ§è¡æ¶ççç¥ï¼æ ¹æ®ä¸å¡è°æ´ï¼ ) // 4. 设置å¼å§æ¶é´ï¼è¥ä¸ºnullåç«å³çæï¼ .startAt(task.getNextExecutionTime() != null ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant()) : new Date()) .build(); } private String convertToCronExpression(MaintenanceTask task) { // åæ°æ ¡éª if (task == null || task.getFrequencyType() == null || task.getFrequencyDetail() == null) { throw new IllegalArgumentException("ä»»å¡åæ°ä¸è½ä¸ºç©º"); } // 使ç¨switchç¡®ä¿æ¡ä»¶äºæ¥ String frequencyType = task.getFrequencyType().toUpperCase(); // ç»ä¸è½¬ä¸ºå¤§åæ¯è¾ switch (frequencyType) { case "DAILY": return convertDailyToCron(task.getFrequencyDetail()); case "WEEKLY": return convertWeeklyToCron(task.getFrequencyDetail()); case "MONTHLY": return convertMonthlyToCron(task.getFrequencyDetail()); case "QUARTERLY": return convertQuarterlyToCron(task.getFrequencyDetail()); default: throw new IllegalArgumentException("䏿¯æçé¢çç±»å: " + task.getFrequencyType()); } } // æ¯æ¥ä»»å¡è½¬æ¢ private String convertDailyToCron(String frequencyDetail) { LocalTime time = parseTime(frequencyDetail); return String.format("0 %d %d * * ?", time.getMinute(), time.getHour()); } // æ¯å¨ä»»å¡è½¬æ¢ private String convertWeeklyToCron(String frequencyDetail) { String[] parts = validateAndSplit(frequencyDetail, ",", 2); String daysOfWeek = convertDayNamesToCron(parts[0]); LocalTime time = parseTime(parts[1]); return String.format("0 %d %d ? * %s", time.getMinute(), time.getHour(), daysOfWeek); } // æ¯æä»»å¡è½¬æ¢ private String convertMonthlyToCron(String frequencyDetail) { String[] parts = validateAndSplit(frequencyDetail, ",", 2); int day = validateDayOfMonth(parts[0]); LocalTime time = parseTime(parts[1]); return String.format("0 %d %d %d * ?", time.getMinute(), time.getHour(), day); } // æ¯å£åº¦ä»»å¡è½¬æ¢ private String convertQuarterlyToCron(String frequencyDetail) { String[] parts = validateAndSplit(frequencyDetail, ",", 3); int month = validateMonth(parts[0]); // éªè¯æä»½(1-12) int day = validateDayOfMonth(parts[1]); // éªè¯æ¥æ LocalTime time = parseTime(parts[2]); // è§£ææ¶é´ // 计ç®å£åº¦èµ·å§æä»½(1æ=1, 4æ=4, 7æ=7, 10æ=10) int quarterStartMonth = ((month - 1) / 3) * 3 + 1; return String.format("0 %d %d %d %d/3 ?", time.getMinute(), time.getHour(), day, quarterStartMonth); } // æ°å¢éªè¯æä»½çæ¹æ³(1-12) private int validateMonth(String monthStr) { try { int month = Integer.parseInt(monthStr); if (month < 1 || month > 12) { throw new IllegalArgumentException("æä»½å¿ é¡»å¨1-12ä¹é´"); } return month; } catch (NumberFormatException e) { throw new IllegalArgumentException("æ æçæä»½æ ¼å¼"); } } // è¾ å©æ¹æ³ï¼è§£ææ¶é´ private LocalTime parseTime(String timeStr) { try { return LocalTime.parse(timeStr); } catch (DateTimeParseException e) { throw new IllegalArgumentException("æ¶é´æ ¼å¼å¿ 须为HH:mm", e); } } // è¾ å©æ¹æ³ï¼éªè¯å¹¶åå²å符串 private String[] validateAndSplit(String input, String delimiter, int expectedParts) { String[] parts = input.split(delimiter); if (parts.length != expectedParts) { throw new IllegalArgumentException( String.format("æ ¼å¼é误ï¼åºä¸º%dé¨åç¨'%s'åé", expectedParts, delimiter)); } return parts; } // è¾ å©æ¹æ³ï¼éªè¯æä»½ä¸çæ¥ private int validateDayOfMonth(String dayStr) { int day = Integer.parseInt(dayStr); if (day < 1 || day > 31) { throw new IllegalArgumentException("æ¥æå¿ é¡»å¨1-31ä¹é´"); } return day; } // è¾ å©æ¹æ³ï¼éªè¯å£åº¦ä¸çæ private int validateMonthInQuarter(String monthStr) { int month = Integer.parseInt(monthStr); if (month < 1 || month > 3) { throw new IllegalArgumentException("å£åº¦æä»½å¿ é¡»æ¯1ã2æ3"); } return month; } // è½¬æ¢ææå åç§° private String convertDayNamesToCron(String dayNames) { return Arrays.stream(dayNames.split("\\|")) .map(this::convertSingleDayName) .collect(Collectors.joining(",")); } // 转æ¢å个ææå åç§° private String convertSingleDayName(String dayName) { switch (dayName.toUpperCase()) { case "MON": return "MON"; case "TUE": return "TUE"; case "WED": return "WED"; case "THU": return "THU"; case "FRI": return "FRI"; case "SAT": return "SAT"; case "SUN": return "SUN"; default: throw new IllegalArgumentException("æ æçææå : " + dayName); } } } src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,114 @@ package com.ruoyi.device.service.impl; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.device.mapper.MaintenanceTaskMapper; import com.ruoyi.device.pojo.MaintenanceTask; import com.ruoyi.device.service.MaintenanceTaskService; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.inspectiontask.pojo.TimingTask; import com.ruoyi.inspectiontask.service.impl.TimingTaskServiceImpl; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.*; /** * @author :yys * @date : 2025/12/22 14:57 */ @Service @Slf4j public class MaintenanceTaskServiceImpl extends ServiceImpl<MaintenanceTaskMapper, MaintenanceTask> implements MaintenanceTaskService { @Autowired private MaintenanceTaskMapper maintenanceTaskMapper; @Autowired private SysUserMapper sysUserMapper; @Autowired private TimingTaskServiceImpl timingTaskService; @Autowired private MaintenanceTaskScheduler maintenanceTaskScheduler; @Override public AjaxResult listPage(Page page, MaintenanceTask maintenanceTask) { Page<MaintenanceTask> taskPage = maintenanceTaskMapper.selectPage(page, null); // 2. å¦ææ²¡ææ°æ®ï¼ç´æ¥è¿å空å页 if (taskPage.getRecords().isEmpty()) { return AjaxResult.success(taskPage); } // 3. æ¶éææéè¦æ¥è¯¢çç¨æ·ID Set<Long> userIds = new HashSet<>(); // æ¶éç»è®°äººID taskPage.getRecords().forEach(task -> { if (task.getRegistrantId() != null) { userIds.add(task.getRegistrantId()); } }); // 4. æ¹éæ¥è¯¢ç¨æ·ä¿¡æ¯ Map<Long, String> userNickNameMap = new HashMap<>(); if (!userIds.isEmpty()) { List<SysUser> users = sysUserMapper.selectUserByIds((new ArrayList<>(userIds))); users.forEach(user -> userNickNameMap.put(user.getUserId(), user.getNickName())); } taskPage.getRecords().forEach(task -> { // 设置ç»è®°äººæµç§° if (task.getRegistrantId() != null) { task.setRegistrant(userNickNameMap.getOrDefault(task.getRegistrantId(), "æªç¥ç¨æ·")); } }); return AjaxResult.success(taskPage); } @Override public AjaxResult add(MaintenanceTask maintenanceTask) { maintenanceTask.setActive(true); // 计ç®é¦æ¬¡æ§è¡æ¶é´ TimingTask task = new TimingTask(); task.setFrequencyType(maintenanceTask.getFrequencyType()); task.setFrequencyDetail(maintenanceTask.getFrequencyDetail()); LocalDateTime firstExecutionTime = timingTaskService.calculateFirstExecutionTime(task); maintenanceTask.setNextExecutionTime(firstExecutionTime); int insert = maintenanceTaskMapper.insert(maintenanceTask); if (insert > 0) { maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask); } return AjaxResult.success("æ·»å æå"); } @Override public AjaxResult updateByMaintenanceTaskId(MaintenanceTask maintenanceTask) { MaintenanceTask maintenanceTask1 = maintenanceTaskMapper.selectById(maintenanceTask.getId()); if (maintenanceTask1 == null) { return AjaxResult.warn("æ²¡ææ¤æ°æ®"); } BeanUtils.copyProperties(maintenanceTask, maintenanceTask1); int update = maintenanceTaskMapper.updateById(maintenanceTask1); if (update > 0) { maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1); } return AjaxResult.success("æ´æ°æå"); } @Override public AjaxResult delete(List<Long> ids) { int delete = maintenanceTaskMapper.deleteBatchIds(ids); if (delete > 0) { ids.forEach(id -> { maintenanceTaskScheduler.unscheduleMaintenanceTask(id); }); } return AjaxResult.success("å 餿å"); } } src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java
@@ -6,12 +6,10 @@ import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.R; import com.ruoyi.inspectiontask.dto.InspectionTaskDto; import com.ruoyi.inspectiontask.dto.TimingTaskDto; import com.ruoyi.inspectiontask.pojo.InspectionTask; import com.ruoyi.inspectiontask.service.InspectionTaskService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; src/main/java/com/ruoyi/inspectiontask/controller/QrCodeController.java
@@ -9,7 +9,6 @@ import com.ruoyi.inspectiontask.service.QrCodeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; src/main/java/com/ruoyi/inspectiontask/controller/QrCodeScanRecordController.java
@@ -9,7 +9,6 @@ import com.ruoyi.inspectiontask.service.QrCodeScanRecordService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java
@@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.R; import com.ruoyi.inspectiontask.dto.TimingTaskDto; @@ -10,7 +12,6 @@ import com.ruoyi.inspectiontask.service.TimingTaskService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.quartz.SchedulerException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -58,6 +59,7 @@ */ @PostMapping("/addOrEditTimingTask") @ApiOperation(value = "æ°å¢ä¿®æ¹å®æ¶ä»»å¡") @Log(title = "宿¶ä»»å¡", businessType = BusinessType.INSERT) public R addOrEditTimingTask(@RequestBody TimingTaskDto timingTaskDto) throws SchedulerException { return R.ok(timingTaskService.addOrEditTimingTask(timingTaskDto)); } @@ -67,6 +69,7 @@ */ @DeleteMapping("/delTimingTask") @ApiOperation(value = "å é¤å®æ¶ä»»å¡") @Log(title = "宿¶ä»»å¡", businessType = BusinessType.DELETE) public R remove(@RequestBody Long[] ids) { return R.ok(timingTaskService.delByIds(ids)); } src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java
@@ -67,26 +67,28 @@ private Integer deleted; @ApiModelProperty(value = "å建该记å½çç¨æ·") @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) @TableField(fill = FieldFill.INSERT) private Integer createUser; @ApiModelProperty(value = "è®°å½å建æ¶é´") @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) @TableField(fill = FieldFill.INSERT) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @Excel(name = "ç»è®°æ¥æ", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; @ApiModelProperty(value = "æåä¿®æ¹è¯¥è®°å½çç¨æ·") @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE) @TableField(fill = FieldFill.INSERT_UPDATE) private Integer updateUser; @ApiModelProperty(value = "è®°å½æåæ´æ°æ¶é´") @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE) @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @ApiModelProperty(value = "ç§æ·") @TableField(fill = FieldFill.INSERT) private Long tenantId; @TableField(exist = false) private String dateStr; } src/main/java/com/ruoyi/inspectiontask/pojo/QrCodeScanRecord.java
@@ -53,21 +53,21 @@ private Integer deleted; @ApiModelProperty(value = "å建该记å½çç¨æ·") @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) @TableField(fill = FieldFill.INSERT) private Integer createUser; @ApiModelProperty(value = "è®°å½å建æ¶é´") @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) @TableField(fill = FieldFill.INSERT) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; @ApiModelProperty(value = "æåä¿®æ¹è¯¥è®°å½çç¨æ·") @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE) @TableField(fill = FieldFill.INSERT_UPDATE) private Integer updateUser; @ApiModelProperty(value = "è®°å½æåæ´æ°æ¶é´") @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE) @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; } src/main/java/com/ruoyi/inspectiontask/pojo/TimingTask.java
@@ -4,12 +4,10 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDate; import java.time.LocalDateTime; @@ -83,14 +81,17 @@ @ApiModelProperty(value = "软å 餿 å¿ï¼0=æªå é¤ï¼1=å·²å é¤") private Integer deleted; @TableField(exist = false) private String dateStr; @ApiModelProperty(value = "å建该记å½çç¨æ·") @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) private Integer createUser; @ApiModelProperty(value = "è®°å½å建æ¶é´") @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") // @JsonFormat(pattern = "yyyy-MM-dd") // @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDateTime createTime; @ApiModelProperty(value = "æåä¿®æ¹è¯¥è®°å½çç¨æ·") src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java
@@ -25,6 +25,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -151,6 +152,8 @@ dto.setInspector(inspectorNames); } dto.setDateStr(inspectionTask.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); // åå§åä¸ä¸ªéä»¶å表 dto.setBeforeProduction(new ArrayList<>()); dto.setAfterProduction(new ArrayList<>()); src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeScanRecordServiceImpl.java
@@ -11,7 +11,6 @@ import com.ruoyi.basic.pojo.StorageAttachment; import com.ruoyi.basic.pojo.StorageBlob; import com.ruoyi.basic.service.StorageAttachmentService; import com.ruoyi.common.constant.StorageAttachmentConstants; import com.ruoyi.common.utils.MinioUtils; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.inspectiontask.dto.QrCodeScanRecordDto; @@ -22,8 +21,6 @@ import com.ruoyi.inspectiontask.service.QrCodeScanRecordService; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; src/main/java/com/ruoyi/inspectiontask/service/impl/QuartzConfig.java
@@ -1,5 +1,6 @@ package com.ruoyi.inspectiontask.service.impl; import org.quartz.Scheduler; import org.quartz.spi.TriggerFiredBundle; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; @@ -10,10 +11,16 @@ import org.springframework.scheduling.quartz.SchedulerFactoryBean; import org.springframework.scheduling.quartz.SpringBeanJobFactory; import javax.sql.DataSource; @Configuration public class QuartzConfig { @Autowired private ApplicationContext applicationContext; // å设已é ç½®å为dataSourceçæ°æ®æºBean @Autowired private DataSource dataSource; @Bean public SchedulerFactoryBean schedulerFactoryBean() { @@ -24,10 +31,17 @@ jobFactory.setApplicationContext(applicationContext); schedulerFactory.setJobFactory(jobFactory); // å¨schedulerFactoryBean()æ¹æ³ä¸æ·»å schedulerFactory.setDataSource(dataSource); // å ¶ä»é ç½®... return schedulerFactory; } @Bean public Scheduler scheduler() { return schedulerFactoryBean().getScheduler(); } // èªå®ä¹JobFactoryï¼æ¯æèªå¨æ³¨å ¥ public static class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware { src/main/java/com/ruoyi/inspectiontask/service/impl/SpringContextHolder.java
@@ -1,6 +1,5 @@ package com.ruoyi.inspectiontask.service.impl; import org.quartz.JobExecutionContext; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java
@@ -11,8 +11,7 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.sql.DataSource; import java.io.Serializable; import java.time.DayOfWeek; import java.time.LocalDateTime; import java.time.LocalTime; @@ -23,7 +22,8 @@ @Component @DisallowConcurrentExecution // ç¦æ¢å¹¶åæ§è¡åä¸ä¸ªJob public class TimingTaskJob implements Job { public class TimingTaskJob implements Job, Serializable { private static final long serialVersionUID = 1L; // å¿ é¡»å®ä¹åºååID @Autowired private TimingTaskMapper timingTaskMapper; src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
@@ -39,14 +39,28 @@ throw new SchedulerException("Existing trigger is not a CronTrigger"); } // æå»ºæ°è§¦åå¨ Trigger newTrigger = TriggerBuilder.newTrigger() .withIdentity(triggerKey) .withDescription(task.getTaskName()) .withSchedule(CronScheduleBuilder.cronSchedule(convertToCronExpression(task))) .startAt(Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())) .forJob(oldTrigger.getJobKey()) // 3. æå»ºCronTriggerï¼ç¡®ä¿æä¹ åé ç½® CronTrigger newTrigger = TriggerBuilder.newTrigger() .withIdentity(triggerKey) // å¯ä¸æ è¯ï¼ç¨äºæä¹ ååå¨ .withDescription(task.getTaskName() + "_TRIGGER") // 触åå¨æè¿° .forJob(oldTrigger.getJobKey()) // å ³è对åºçJob .withSchedule(CronScheduleBuilder .cronSchedule(convertToCronExpression(task)) // éè¿æ§è¡æ¶ççç¥ï¼æ ¹æ®ä¸å¡è°æ´ï¼ ) // 4. 设置å¼å§æ¶é´ï¼è¥ä¸ºnullåç«å³çæï¼ .startAt(task.getNextExecutionTime() != null ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant()) : new Date()) .build(); // æå»ºæ°è§¦åå¨ // Trigger newTrigger = TriggerBuilder.newTrigger() // .withIdentity(triggerKey) // .withDescription(task.getTaskName()) // .withSchedule(CronScheduleBuilder.cronSchedule(convertToCronExpression(task))) // .startAt(Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())) // .forJob(oldTrigger.getJobKey()) // .build(); scheduler.rescheduleJob(triggerKey, newTrigger); } @@ -70,40 +84,57 @@ /** * å é¤ä»»å¡ */ public void unscheduleTimingTask(Long taskId) throws SchedulerException { public void unscheduleTimingTask(Long taskId){ try { JobKey jobKey = new JobKey("timingTask_" + taskId); scheduler.deleteJob(jobKey); }catch (SchedulerException e){ throw new RuntimeException(e); } } private JobDetail buildJobDetail(TimingTask task) { JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("taskId", task.getId()); // 1. æå»ºå¯ä¸JobKeyï¼åºäºä»»å¡IDï¼ç¡®ä¿éå¯åè½è¯å«ï¼ JobKey jobKey = new JobKey("timingTask_" + task.getId()); // 2. å°è£ 任塿°æ®ï¼ä» 使ç¨åºæ¬ç±»åï¼ç¡®ä¿å¯åºååï¼ JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("taskId", task.getId()); // ä»»å¡IDï¼Longï¼å¯åºååï¼ jobDataMap.put("taskName", task.getTaskName()); // ä»»å¡åç§°ï¼Stringï¼å¯åºååï¼ jobDataMap.put("taskType", task.getFrequencyType()); // ä»»å¡ç±»åï¼Stringï¼ // æéæ·»å å ¶ä»å¿ è¦çåºæ¬ç±»ååæ° // 3. æå»ºJobDetailï¼è®¾ç½®æä¹ åç¸å ³å±æ§ return JobBuilder.newJob(TimingTaskJob.class) .withIdentity("timingTask_" + task.getId()) .withDescription(task.getTaskName()) .usingJobData(jobDataMap) .storeDurably() .withIdentity(jobKey) // å¯ä¸æ è¯ï¼ç¨äºæä¹ ååå¨ .withDescription(task.getTaskName()) // ä»»å¡æè¿°ï¼åå ¥æ°æ®åº .usingJobData(jobDataMap) // ç»å®ä»»å¡æ°æ® .storeDurably(true) // å³ä½¿æ²¡æè§¦åå¨å ³èä¹æä¹ åä¿å .requestRecovery(true) // å½è°åº¦å¨å´©æºåæ¢å¤æ¶ï¼éæ°æ§è¡æªå®æçä»»å¡ .build(); } private Trigger buildJobTrigger(TimingTask task, JobDetail jobDetail) { // 1. æå»ºå¯ä¸TriggerKeyï¼åºäºä»»å¡IDï¼ TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId()); // 2. çæCron表达å¼ï¼åé»è¾ä¸åï¼ String cronExpression = convertToCronExpression(task); TriggerBuilder<CronTrigger> triggerBuilder = TriggerBuilder.newTrigger() .withIdentity("trigger_" + task.getId()) .withDescription(task.getTaskName()) .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)); if (jobDetail != null) { triggerBuilder.forJob(jobDetail); } if (task.getNextExecutionTime() != null) { triggerBuilder.startAt(Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())); } return triggerBuilder.build(); // 3. æå»ºCronTriggerï¼ç¡®ä¿æä¹ åé ç½® return TriggerBuilder.newTrigger() .withIdentity(triggerKey) // å¯ä¸æ è¯ï¼ç¨äºæä¹ ååå¨ .withDescription(task.getTaskName() + "_TRIGGER") // 触åå¨æè¿° .forJob(jobDetail) // å ³è对åºçJob .withSchedule(CronScheduleBuilder .cronSchedule(cronExpression) .withMisfireHandlingInstructionDoNothing() // éè¿æ§è¡æ¶ççç¥ï¼æ ¹æ®ä¸å¡è°æ´ï¼ ) // 4. 设置å¼å§æ¶é´ï¼è¥ä¸ºnullåç«å³çæï¼ .startAt(task.getNextExecutionTime() != null ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant()) : new Date()) .build(); } private String convertToCronExpression(TimingTask task) { // åæ°æ ¡éª src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
@@ -66,6 +66,7 @@ // æ¶éå·¡æ£äººIDï¼å¤ä¸ªID以éå·åéï¼ taskPage.getRecords().forEach(task -> { task.setDateStr(task.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); if (StringUtils.isNotBlank(task.getInspectorIds())) { Arrays.stream(task.getInspectorIds().split(",")) .filter(StringUtils::isNotBlank) @@ -118,7 +119,16 @@ public int addOrEditTimingTask(TimingTaskDto timingTaskDto) throws SchedulerException { TimingTask timingTask = new TimingTask(); BeanUtils.copyProperties(timingTaskDto, timingTask); // 1. è§£æå符串为 LocalDateï¼åªå å«å¹´ææ¥ï¼ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate localDate = LocalDate.parse(timingTaskDto.getDateStr(), formatter); // 2. è·åå½åç³»ç»ç LocalTimeï¼å 嫿¶åç§ï¼ LocalTime currentTime = LocalTime.now(); // 3. åå¹¶ LocalDate åå½å LocalTime 为 LocalDateTime LocalDateTime localDateTime = LocalDateTime.of(localDate, currentTime); timingTask.setCreateTime(localDateTime); // 设置å建人信æ¯åé»è®¤å¼ if (Objects.isNull(timingTaskDto.getId())) { timingTask.setRegistrationDate(LocalDate.now()); @@ -127,7 +137,6 @@ // 计ç®é¦æ¬¡æ§è¡æ¶é´ LocalDateTime firstExecutionTime = calculateFirstExecutionTime(timingTask); timingTask.setNextExecutionTime(firstExecutionTime); int result = timingTaskMapper.insert(timingTask); if (result > 0) { // æ°å¢æååæ·»å å°è°åº¦å¨ @@ -135,6 +144,8 @@ } return result; } else { int result = timingTaskMapper.updateById(timingTask); if (result > 0) { // æ´æ°æååéæ°è°åº¦ä»»å¡ @@ -144,7 +155,7 @@ } } private LocalDateTime calculateFirstExecutionTime(TimingTask task) { public LocalDateTime calculateFirstExecutionTime(TimingTask task) { // æ ¹æ®é¢çç±»åå详æ 计ç®é¦æ¬¡æ§è¡æ¶é´ String frequencyType = task.getFrequencyType(); if ("DAILY".equals(frequencyType)) { @@ -444,7 +455,13 @@ @Override public int delByIds(Long[] ids) { return timingTaskMapper.deleteBatchIds(Arrays.asList(ids)); int i = timingTaskMapper.deleteBatchIds(Arrays.asList(ids)); if(i > 0){ for (Long id : ids) { timingTaskScheduler.unscheduleTimingTask(id); } } return i; } } src/main/java/com/ruoyi/measuringinstrumentledger/pojo/SpareParts.java
@@ -6,6 +6,7 @@ import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDateTime; @Data @@ -22,6 +23,21 @@ */ private String sparePartsNo; /** * å¤ä»¶ä»·æ ¼ */ private BigDecimal price; /** * 设å¤idéåï¼å符串,éå¼ï¼ */ private String deviceIds; /** * 设å¤åç§°éåï¼å符串,éå¼ï¼ */ @TableField(exist = false) private String deviceNameStr; /** * å¤ä»¶ç¶id */ private Long parentId; src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsServiceImpl.java
@@ -1,9 +1,14 @@ package com.ruoyi.measuringinstrumentledger.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.device.mapper.DeviceLedgerMapper; import com.ruoyi.device.pojo.DeviceLedger; import com.ruoyi.measuringinstrumentledger.dto.SparePartsDto; import com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper; import com.ruoyi.measuringinstrumentledger.pojo.SpareParts; @@ -15,14 +20,29 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Service public class SparePartsServiceImpl extends ServiceImpl<SparePartsMapper, SpareParts> implements SparePartsService { @Autowired private SparePartsMapper sparePartsMapper; @Autowired private DeviceLedgerMapper deviceLedgerMapper; @Override public IPage<SparePartsDto> listPage(Page page, SpareParts spareParts) { return sparePartsMapper.listPage(page,spareParts); IPage<SparePartsDto> sparePartsDtoIPage = sparePartsMapper.listPage(page, spareParts); for (SparePartsDto record : sparePartsDtoIPage.getRecords()) { if(StringUtils.isNotEmpty(record.getDeviceIds())){ List<String> deviceIds = StringUtils.str2List(record.getDeviceIds(), ",", true, true); List<DeviceLedger> deviceLedgers = deviceLedgerMapper.selectBatchIds(deviceIds); if(CollectionUtils.isNotEmpty(deviceLedgers)){ record.setDeviceNameStr(deviceLedgers.stream().map(DeviceLedger::getDeviceName).collect(Collectors.joining( ","))); } } } return sparePartsDtoIPage; } @Override src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java
@@ -155,7 +155,7 @@ } } @Scheduled(cron = "0 0 3 * * ?") // æ¯å¤©åæ¨3ç¹æ§è¡ // @Scheduled(cron = "0 0 3 * * ?") // æ¯å¤©åæ¨3ç¹æ§è¡ public void cleanupExpiredTempFiles() { LambdaQueryWrapper<TempFile> wrapper = new LambdaQueryWrapper<>(); wrapper.lt(TempFile::getExpireTime, LocalDateTime.now()); // expireTime < å½åæ¶é´ src/main/java/com/ruoyi/project/monitor/service/impl/SysJobServiceImpl.java
@@ -37,12 +37,12 @@ @PostConstruct public void init() throws SchedulerException, TaskException { scheduler.clear(); List<SysJob> jobList = jobMapper.selectJobAll(); for (SysJob job : jobList) { ScheduleUtils.createScheduleJob(scheduler, job); } // scheduler.clear(); // List<SysJob> jobList = jobMapper.selectJobAll(); // for (SysJob job : jobList) // { // ScheduleUtils.createScheduleJob(scheduler, job); // } } /** src/main/resources/application-dev.yml
@@ -157,6 +157,31 @@ # #è¿æ¥æ± æå¤§é»å¡çå¾ æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ max-wait: -1ms # Quartz宿¶ä»»å¡é ç½®ï¼æ°å¢é¨åï¼ quartz: job-store-type: jdbc # ä½¿ç¨æ°æ®åºåå¨ jdbc: initialize-schema: never # 馿¬¡è¿è¡æ¶èªå¨åå»ºè¡¨ç»æï¼æååæ¹ä¸ºnever schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql # MySQLè¡¨ç»æèæ¬ properties: org: quartz: scheduler: instanceName: RuoYiScheduler instanceId: AUTO jobStore: class: org.quartz.impl.jdbcjobstore.JobStoreTX driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate # MySQLéé tablePrefix: qrtz_ # 表ååç¼ï¼ä¸èæ¬ä¸è´ isClustered: false # åèç¹æ¨¡å¼ï¼éç¾¤éæ¹ä¸ºtrueï¼ clusterCheckinInterval: 10000 txIsolationLevelSerializable: true threadPool: class: org.quartz.simpl.SimpleThreadPool threadCount: 10 # çº¿ç¨æ± å¤§å° threadPriority: 5 makeThreadsDaemons: true updateCheck: false # å ³éçæ¬æ£æ¥ # tokené ç½® token: # 令çèªå®ä¹æ è¯ src/main/resources/application-hxsj.yml
@@ -157,6 +157,31 @@ # #è¿æ¥æ± æå¤§é»å¡çå¾ æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ max-wait: -1ms # Quartz宿¶ä»»å¡é ç½®ï¼æ°å¢é¨åï¼ quartz: job-store-type: jdbc # ä½¿ç¨æ°æ®åºåå¨ jdbc: initialize-schema: never # 馿¬¡è¿è¡æ¶èªå¨åå»ºè¡¨ç»æï¼æååæ¹ä¸ºnever schema: classpath:org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql # MySQLè¡¨ç»æèæ¬ properties: org: quartz: scheduler: instanceName: RuoYiScheduler instanceId: AUTO jobStore: class: org.quartz.impl.jdbcjobstore.JobStoreTX driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate # MySQLéé tablePrefix: qrtz_ # 表ååç¼ï¼ä¸èæ¬ä¸è´ isClustered: false # åèç¹æ¨¡å¼ï¼éç¾¤éæ¹ä¸ºtrueï¼ clusterCheckinInterval: 10000 txIsolationLevelSerializable: true threadPool: class: org.quartz.simpl.SimpleThreadPool threadCount: 10 # çº¿ç¨æ± å¤§å° threadPriority: 5 makeThreadsDaemons: true updateCheck: false # å ³éçæ¬æ£æ¥ # tokené ç½® token: # 令çèªå®ä¹æ è¯ src/main/resources/application.yml
@@ -1,4 +1,4 @@ # Springé ç½® spring: profiles: active: demo active: dev src/main/resources/mapper/device/DeviceLedgerMapper.xml
@@ -7,8 +7,28 @@ <select id="queryPage" resultType="com.ruoyi.device.dto.DeviceLedgerDto"> SELECT dl.*, su.user_name AS createUser dl.id, dl.device_name, dl.device_model, dl.supplier_name, dl.device_brand, dl.storage_location, dl.unit, dl.number, dl.status, dl.plan_runtime_time, dl.start_runtime_time, dl.end_runtime_time, dl.runtime_duration, dl.tax_including_price_unit, dl.tax_including_price_total, dl.tax_rate, dl.un_tax_including_price_total, dl.create_time, dl.update_time , su.nick_name AS createUser, dl.update_user, dl.tenant_id FROM device_ledger dl left join sys_user su on dl.create_user = su.user_id <where> src/main/resources/mapper/device/DeviceMaintenanceMapper.xml
@@ -20,7 +20,7 @@ dm.maintenance_actually_name, dl.device_name, dl.device_model, su.user_name as create_user_name su.nick_name as create_user_name from device_maintenance dm left join device_ledger dl on dm.device_ledger_id = dl.id left join sys_user su on dm.create_user = su.user_id @@ -32,6 +32,9 @@ <if test="deviceMaintenanceDto.deviceModel != null"> and dl.device_model like concat('%',#{deviceMaintenanceDto.deviceModel},'%') </if> <if test="deviceMaintenanceDto.status != null"> and dm.status = #{deviceMaintenanceDto.status} </if> <if test="deviceMaintenanceDto.maintenanceActuallyName != null"> and dm.maintenance_actually_name like concat('%',#{deviceMaintenanceDto.maintenanceActuallyName},'%') </if> src/main/resources/mapper/device/DeviceRepairMapper.xml
@@ -32,6 +32,9 @@ <if test="deviceRepairDto.deviceModel != null"> and dl.device_model like concat('%',#{deviceRepairDto.deviceModel},'%') </if> <if test="deviceRepairDto.status != null"> and dr.status = #{deviceRepairDto.status} </if> <if test="deviceRepairDto.remark != null"> and dr.remark like concat('%',#{deviceRepairDto.remark},'%') </if> src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml
@@ -2,7 +2,8 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper"> <select id="listPage" resultType="com.ruoyi.measuringinstrumentledger.dto.SparePartsDto"> select sp.*,sp1.name as parentName from spare_parts sp select sp.*,sp1.name as parentName from spare_parts sp left join spare_parts sp1 on sp1.id = sp.parent_id <where> <if test="spareParts.name != null">