doc/20261016_É豸±£ÑøÏîÄ¿ÍêÕû½Å±¾.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,64 @@ DROP TABLE IF EXISTS device_maintenance_item; DROP TABLE IF EXISTS maintenance_task_item; DROP TABLE IF EXISTS maintenance_item; CREATE TABLE maintenance_item ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ä¿å »å 容ID', item_name TEXT NOT NULL COMMENT 'ä¿å »å 容', item_project VARCHAR(200) NOT NULL COMMENT 'ä¿å »é¡¹ç®', device_ledger_id BIGINT NULL COMMENT 'æå±è®¾å¤å°è´¦IDï¼ä¸ºç©ºè¡¨ç¤ºéç¨ä¿å »å 容', frequency_type VARCHAR(20) NOT NULL COMMENT 'ä¿å »é¢çï¼DAILY/WEEKLY/MONTHLY/QUARTERLY/ALLï¼éç¨é¢çï¼', sort_num INT NOT NULL DEFAULT 0 COMMENT 'æ¾ç¤ºé¡ºåº', is_active TINYINT NOT NULL DEFAULT 1 COMMENT 'ç¶æï¼1å¯ç¨ï¼0åç¨', remarks VARCHAR(500) NULL COMMENT '夿³¨', deleted TINYINT NOT NULL DEFAULT 0 COMMENT 'å 餿 å¿ï¼0æ£å¸¸ï¼1å é¤', create_user INT NULL COMMENT 'å建人', update_user INT NULL COMMENT 'æ´æ°äºº', create_time DATETIME NULL COMMENT 'å建æ¶é´', update_time DATETIME NULL COMMENT 'æ´æ°æ¶é´', tenant_id BIGINT NULL COMMENT 'ç§æ·ID', dept_id BIGINT NULL COMMENT 'é¨é¨ID', PRIMARY KEY (id), KEY idx_maintenance_item_scope (tenant_id, dept_id, device_ledger_id, frequency_type, is_active, deleted), KEY idx_maintenance_item_device_frequency (device_ledger_id, frequency_type, is_active, deleted) ) COMMENT='设å¤ä¿å »å 容åå ¸'; CREATE TABLE maintenance_task_item ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ä»»å¡é¡¹ç®å ³ç³»ID', maintenance_task_id BIGINT NOT NULL COMMENT 'ä¿å »ä»»å¡ID', maintenance_item_id BIGINT NULL COMMENT 'ä¿å »å 容IDï¼ä¸ºç©ºè¡¨ç¤ºæ¬ä»»å¡ä¸ç¨çèªå®ä¹å 容', item_project VARCHAR(200) NOT NULL COMMENT 'ä¿å »é¡¹ç®å¿«ç §', item_name TEXT NOT NULL COMMENT 'ä»»å¡é ç½®æ¶çä¿å »å å®¹å¿«ç §', sort_num INT NOT NULL DEFAULT 0 COMMENT 'ä»»å¡å æ¾ç¤ºé¡ºåº', create_time DATETIME NULL COMMENT 'å建æ¶é´', update_time DATETIME NULL COMMENT 'æ´æ°æ¶é´', tenant_id BIGINT NULL COMMENT 'ç§æ·ID', dept_id BIGINT NULL COMMENT 'é¨é¨ID', PRIMARY KEY (id), UNIQUE KEY uk_task_item (maintenance_task_id, maintenance_item_id), KEY idx_task_item_item (maintenance_item_id) ) COMMENT='设å¤ä¿å »ä»»å¡é¡¹ç®'; CREATE TABLE device_maintenance_item ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT 'ä¿å »è®°å½é¡¹ç®ID', device_maintenance_id BIGINT NOT NULL COMMENT 'ä¿å »è®°å½ID', maintenance_task_item_id BIGINT NULL COMMENT 'æ¥æºä»»å¡é¡¹ç®ID', maintenance_item_id BIGINT NULL COMMENT 'æ¥æºä¿å »å 容ID', item_project VARCHAR(200) NOT NULL COMMENT 'æ¬æ¬¡ä¿å »é¡¹ç®å¿«ç §', item_name TEXT NOT NULL COMMENT 'æ¬æ¬¡ä¿å »å å®¹å¿«ç §', item_status TINYINT NOT NULL DEFAULT 0 COMMENT '项ç®ç¶æï¼0å¾ å®æï¼1已宿ï¼2å¼å¸¸/æªå®æ', completed_by VARCHAR(100) NULL COMMENT '项ç®å®ææä½äºº', completed_time DATETIME NULL COMMENT '项ç®å®ææ¶é´', remarks VARCHAR(500) NULL COMMENT 'å项说æ', sort_num INT NOT NULL DEFAULT 0 COMMENT 'è®°å½å æ¾ç¤ºé¡ºåº', create_time DATETIME NULL COMMENT 'å建æ¶é´', update_time DATETIME NULL COMMENT 'æ´æ°æ¶é´', tenant_id BIGINT NULL COMMENT 'ç§æ·ID', dept_id BIGINT NULL COMMENT 'é¨é¨ID', PRIMARY KEY (id), KEY idx_device_maintenance_item_record (device_maintenance_id, sort_num), KEY idx_device_maintenance_item_task_item (maintenance_task_item_id) ) COMMENT='设å¤ä¿å »è®°å½é¡¹ç®æç»'; src/main/java/com/ruoyi/device/controller/MaintenanceItemController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,74 @@ package com.ruoyi.device.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.device.pojo.MaintenanceItem; import com.ruoyi.device.service.MaintenanceItemService; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.domain.AjaxResult; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.List; @Tag(name = "设å¤ä¿å »é¡¹ç®") @RestController @RequestMapping("/deviceMaintenanceItem") @RequiredArgsConstructor public class MaintenanceItemController { private final MaintenanceItemService maintenanceItemService; @GetMapping("/list") @Operation(summary = "设å¤ä¿å »é¡¹ç®å表") public AjaxResult list(MaintenanceItem query) { List<MaintenanceItem> items = maintenanceItemService.list(query); return AjaxResult.success(items); } @GetMapping("/page") @Operation(summary = "å页æ¥è¯¢è®¾å¤ä¿å »é¡¹ç®") public AjaxResult page( @RequestParam(defaultValue = "1") long pageNum, @RequestParam(defaultValue = "20") long pageSize, @RequestParam(defaultValue = "false") boolean includeCommon, MaintenanceItem query ) { Page<MaintenanceItem> result = maintenanceItemService.page(pageNum, pageSize, includeCommon, query); return AjaxResult.success(result); } @PostMapping @Log(title = "æ°å¢è®¾å¤ä¿å »é¡¹ç®", businessType = BusinessType.INSERT) @Operation(summary = "æ°å¢è®¾å¤ä¿å »é¡¹ç®") public AjaxResult add(@RequestBody MaintenanceItem item) { maintenanceItemService.createItem(item); return AjaxResult.success(); } @PutMapping @Log(title = "ä¿®æ¹è®¾å¤ä¿å »é¡¹ç®", businessType = BusinessType.UPDATE) @Operation(summary = "ä¿®æ¹è®¾å¤ä¿å »é¡¹ç®") public AjaxResult update(@RequestBody MaintenanceItem item) { maintenanceItemService.updateItem(item); return AjaxResult.success(); } @DeleteMapping("/{id}") @Log(title = "å é¤è®¾å¤ä¿å »é¡¹ç®", businessType = BusinessType.DELETE) @Operation(summary = "å é¤è®¾å¤ä¿å »é¡¹ç®") public AjaxResult delete(@PathVariable("id") Long id) { maintenanceItemService.deleteItem(id); return AjaxResult.success(); } } src/main/java/com/ruoyi/device/controller/MaintenanceTaskController.java
@@ -2,39 +2,38 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.device.pojo.MaintenanceTask; import com.ruoyi.device.service.MaintenanceItemService; 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.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; 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.List; /** * @author :yys * @date : 2025/12/22 14:58 */ @Tag(name = "设å¤ä¿å »å®æ¶ä»»å¡ç®¡ç") @RestController @RequestMapping("/deviceMaintenanceTask") @AllArgsConstructor @RequiredArgsConstructor public class MaintenanceTaskController extends BaseController { private MaintenanceTaskService maintenanceTaskService; private final MaintenanceTaskService maintenanceTaskService; private final MaintenanceItemService maintenanceItemService; @GetMapping("/listPage") @Operation(summary = "设å¤ä¿å »å®æ¶ä»»å¡å表") public AjaxResult listPage(Page page, MaintenanceTask maintenanceTask) { return maintenanceTaskService.listPage(page,maintenanceTask); return maintenanceTaskService.listPage(page, maintenanceTask); } @PostMapping("/add") @Operation(summary = "æ·»å 设å¤ä¿å »å®æ¶ä»»å¡") @@ -57,5 +56,9 @@ return maintenanceTaskService.delete(ids); } @GetMapping("/items") @Operation(summary = "å¯ç¨ç设å¤ä¿å »é¡¹ç®") public AjaxResult items() { return AjaxResult.success(maintenanceItemService.listActive()); } } src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceItemMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,9 @@ package com.ruoyi.device.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.device.pojo.DeviceMaintenanceItem; import org.apache.ibatis.annotations.Mapper; @Mapper public interface DeviceMaintenanceItemMapper extends BaseMapper<DeviceMaintenanceItem> { } src/main/java/com/ruoyi/device/mapper/MaintenanceItemMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,9 @@ package com.ruoyi.device.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.device.pojo.MaintenanceItem; import org.apache.ibatis.annotations.Mapper; @Mapper public interface MaintenanceItemMapper extends BaseMapper<MaintenanceItem> { } src/main/java/com/ruoyi/device/mapper/MaintenanceTaskItemMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.device.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.ruoyi.device.pojo.MaintenanceTaskItem; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import java.util.List; @Mapper public interface MaintenanceTaskItemMapper extends BaseMapper<MaintenanceTaskItem> { @Select("SELECT * FROM maintenance_task_item WHERE maintenance_task_id = #{taskId} ORDER BY sort_num, id") @InterceptorIgnore(tenantLine = "true") List<MaintenanceTaskItem> selectByTaskId(Long taskId); } src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
@@ -95,6 +95,12 @@ @TableField(exist = false) private List<SparePartUse> sparePartsUseList; @TableField(exist = false) private List<Long> maintenanceItemIds; @TableField(exist = false) private List<DeviceMaintenanceItem> maintenanceItems; @Data public static class SparePartUse { private Long id; src/main/java/com/ruoyi/device/pojo/DeviceMaintenanceItem.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,41 @@ package com.ruoyi.device.pojo; import com.baomidou.mybatisplus.annotation.FieldFill; 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 lombok.Data; import java.time.LocalDateTime; @Data @TableName("device_maintenance_item") public class DeviceMaintenanceItem { @TableId(type = IdType.AUTO) private Long id; private Long deviceMaintenanceId; private Long maintenanceTaskItemId; private Long maintenanceItemId; private String itemProject; private String itemName; private Integer itemStatus; private String completedBy; private LocalDateTime completedTime; private String remarks; private Integer sortNum; @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @TableField(fill = FieldFill.INSERT) private Long tenantId; @TableField(fill = FieldFill.INSERT) private Long deptId; } src/main/java/com/ruoyi/device/pojo/MaintenanceItem.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,46 @@ package com.ruoyi.device.pojo; import com.baomidou.mybatisplus.annotation.FieldFill; 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 lombok.Data; import java.time.LocalDateTime; @Data @TableName("maintenance_item") public class MaintenanceItem { @TableId(type = IdType.AUTO) private Long id; private String itemName; private String itemProject; private Long deviceLedgerId; private String frequencyType; private Integer sortNum; private Integer isActive; private String remarks; private Integer deleted; @TableField(fill = FieldFill.INSERT) private Integer createUser; @TableField(fill = FieldFill.INSERT_UPDATE) private Integer updateUser; @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @TableField(fill = FieldFill.INSERT) private Long tenantId; @TableField(fill = FieldFill.INSERT) private Long deptId; } src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
@@ -13,6 +13,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; /** * @author :yys @@ -91,6 +92,15 @@ @TableField(exist = false) private String dateStr; @TableField(exist = false) private List<Long> maintenanceItemIds; @TableField(exist = false) private List<MaintenanceTaskItem> customItems; @TableField(exist = false) private List<MaintenanceTaskItem> maintenanceItems; @Schema(description = "å建该记å½çç¨æ·") @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) private Integer createUser; src/main/java/com/ruoyi/device/pojo/MaintenanceTaskItem.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,36 @@ package com.ruoyi.device.pojo; import com.baomidou.mybatisplus.annotation.FieldFill; 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 lombok.Data; import java.time.LocalDateTime; @Data @TableName("maintenance_task_item") public class MaintenanceTaskItem { @TableId(type = IdType.AUTO) private Long id; private Long maintenanceTaskId; private Long maintenanceItemId; private String itemProject; private String itemName; private Integer sortNum; @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @TableField(fill = FieldFill.INSERT) private Long tenantId; @TableField(fill = FieldFill.INSERT) private Long deptId; } src/main/java/com/ruoyi/device/service/MaintenanceItemService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ package com.ruoyi.device.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.device.pojo.MaintenanceItem; import java.util.List; public interface MaintenanceItemService { List<MaintenanceItem> listActive(); List<MaintenanceItem> list(MaintenanceItem query); Page<MaintenanceItem> page(long pageNum, long pageSize, boolean includeCommon, MaintenanceItem query); void createItem(MaintenanceItem item); void updateItem(MaintenanceItem item); void deleteItem(Long id); } src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
@@ -11,7 +11,11 @@ import com.ruoyi.device.dto.DeviceMaintenanceDto; import com.ruoyi.device.execl.DeviceMaintenanceExeclDto; import com.ruoyi.device.mapper.DeviceMaintenanceMapper; import com.ruoyi.device.mapper.DeviceMaintenanceItemMapper; import com.ruoyi.device.mapper.MaintenanceItemMapper; import com.ruoyi.device.pojo.DeviceMaintenance; import com.ruoyi.device.pojo.DeviceMaintenanceItem; import com.ruoyi.device.pojo.MaintenanceItem; import com.ruoyi.device.service.IDeviceMaintenanceService; import com.ruoyi.device.vo.DeviceMaintenanceVo; import com.ruoyi.device.vo.DeviceRepairVo; @@ -20,15 +24,23 @@ import com.ruoyi.measuringinstrumentledger.pojo.SpareParts; import com.ruoyi.measuringinstrumentledger.pojo.SparePartsRequisitionRecord; import com.ruoyi.measuringinstrumentledger.service.SparePartsRequisitionRecordService; import com.github.xiaoymin.knife4j.core.util.CollectionUtils; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import java.time.LocalDateTime; @Service @@ -39,18 +51,29 @@ private final SparePartsMapper sparePartsMapper; private final SparePartsRequisitionRecordService sparePartsRequisitionRecordService; private final FileUtil fileUtil; private final DeviceMaintenanceItemMapper deviceMaintenanceItemMapper; private final MaintenanceItemMapper maintenanceItemMapper; @Override public IPage<DeviceMaintenanceDto> queryPage(Page page, DeviceMaintenanceDto deviceMaintenanceDto) { return deviceMaintenanceMapper.queryPage(page, deviceMaintenanceDto); IPage<DeviceMaintenanceDto> result = deviceMaintenanceMapper.queryPage(page, deviceMaintenanceDto); if (result.getRecords() != null && !result.getRecords().isEmpty()) { List<Long> ids = result.getRecords().stream().map(DeviceMaintenance::getId).toList(); List<DeviceMaintenanceItem> items = deviceMaintenanceItemMapper.selectList(new LambdaQueryWrapper<DeviceMaintenanceItem>().in(DeviceMaintenanceItem::getDeviceMaintenanceId, ids).orderByAsc(DeviceMaintenanceItem::getSortNum)); Map<Long, List<DeviceMaintenanceItem>> byRecord = items.stream().collect(Collectors.groupingBy(DeviceMaintenanceItem::getDeviceMaintenanceId)); result.getRecords().forEach(record -> record.setMaintenanceItems(byRecord.getOrDefault(record.getId(), new ArrayList<>()))); } return result; } @Override @Transactional(rollbackFor = Exception.class) public AjaxResult saveDeviceRepair(DeviceMaintenanceDto deviceMaintenance) { List<MaintenanceItem> selectedItems = getSelectedItems(deviceMaintenance.getMaintenanceItemIds(), null, deviceMaintenance.getDeviceLedgerId(), deviceMaintenance.getFrequencyType()); if (selectedItems == null) return AjaxResult.error("è¯·éæ©è³å°ä¸ä¸ªææçä¿å »é¡¹ç®"); boolean save = this.save(deviceMaintenance); if (save){ if (save) { saveRecordItems(deviceMaintenance, selectedItems); // å¤çå¾çä¸ä¼ fileUtil.saveStorageAttachmentByRecordTypeAndRecordId("file", RecordTypeEnum.DEVICE_MAINTENANCE, deviceMaintenance.getId(), deviceMaintenance.getStorageBlobDTOs()); return AjaxResult.success(); @@ -62,8 +85,13 @@ @Transactional(rollbackFor = Exception.class) public AjaxResult updateDeviceDeviceMaintenance(DeviceMaintenanceDto deviceMaintenance) { DeviceMaintenance oldDeviceMaintenance = this.getById(deviceMaintenance.getId()); if (oldDeviceMaintenance == null) return AjaxResult.error("ä¿å »è®°å½ä¸åå¨"); if (deviceMaintenance.getMaintenanceItems() != null) { AjaxResult validation = validateRecordItems(deviceMaintenance, oldDeviceMaintenance); if (validation != null) return validation; } // å¤çå¤ä»¶ä½¿ç¨æ åµ if (com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(deviceMaintenance.getSparePartsUseList())) { if (CollectionUtils.isNotEmpty(deviceMaintenance.getSparePartsUseList())) { List<Long> sparePartIds = new ArrayList<>(); for (DeviceMaintenance.SparePartUse sparePartUse : deviceMaintenance.getSparePartsUseList()) { // è·åå¤ä»¶ä¿¡æ¯ @@ -95,6 +123,16 @@ } } if (deviceMaintenance.getMaintenanceItems() != null) { AjaxResult itemResult = updateRecordItems(deviceMaintenance, oldDeviceMaintenance); if (itemResult != null) return itemResult; } else if (deviceMaintenance.getMaintenanceItemIds() != null) { List<MaintenanceItem> selectedItems = getSelectedItems(deviceMaintenance.getMaintenanceItemIds(), deviceMaintenance.getId(), oldDeviceMaintenance.getDeviceLedgerId(), oldDeviceMaintenance.getFrequencyType()); if (selectedItems == null) return AjaxResult.error("è¯·éæ©è³å°ä¸ä¸ªææçä¿å »é¡¹ç®"); deviceMaintenanceItemMapper.delete(new LambdaQueryWrapper<DeviceMaintenanceItem>().eq(DeviceMaintenanceItem::getDeviceMaintenanceId, deviceMaintenance.getId())); saveRecordItems(deviceMaintenance, selectedItems); } if (this.updateById(deviceMaintenance)) { // å¤çå¾çä¸ä¼ fileUtil.saveStorageAttachmentByRecordTypeAndRecordId("file", RecordTypeEnum.DEVICE_MAINTENANCE, deviceMaintenance.getId(), deviceMaintenance.getStorageBlobDTOs()); @@ -109,7 +147,9 @@ ArrayList<DeviceMaintenanceExeclDto> deviceLedgerExeclDtos = new ArrayList<>(); supplierManageList.forEach(deviceMaintenance -> { DeviceMaintenanceExeclDto deviceRepairExeclDto = new DeviceMaintenanceExeclDto(); BeanUtils.copyProperties(deviceMaintenance,deviceRepairExeclDto); BeanUtils.copyProperties(deviceMaintenance, deviceRepairExeclDto); List<DeviceMaintenanceItem> recordItems = deviceMaintenanceItemMapper.selectList(new LambdaQueryWrapper<DeviceMaintenanceItem>().eq(DeviceMaintenanceItem::getDeviceMaintenanceId, deviceMaintenance.getId()).orderByAsc(DeviceMaintenanceItem::getSortNum)); deviceRepairExeclDto.setMachineryCategory(recordItems.stream().map(DeviceMaintenanceItem::getItemName).collect(Collectors.joining("ã"))); deviceRepairExeclDto.setStatus(deviceMaintenance.getStatus() == 0 ? "å¾ ç»´ä¿®" : deviceMaintenance.getStatus() == 1 ? "å®ç»" : "失败"); // deviceRepairExeclDto.setMaintenanceResult(deviceMaintenance.getMaintenanceResult() != null && deviceMaintenance.getMaintenanceResult() == 0 ? "ç»´ä¿®" : "å®å¥½"); deviceLedgerExeclDtos.add(deviceRepairExeclDto); @@ -121,7 +161,71 @@ @Override public DeviceMaintenanceVo detailById(Long id) { DeviceMaintenanceVo vo = deviceMaintenanceMapper.detailById(id); if (vo != null) { vo.setMaintenanceItems(deviceMaintenanceItemMapper.selectList(new LambdaQueryWrapper<DeviceMaintenanceItem>().eq(DeviceMaintenanceItem::getDeviceMaintenanceId, id).orderByAsc(DeviceMaintenanceItem::getSortNum))); } vo.setStorageBlobVOs(fileUtil.getStorageBlobVOsByRecordTypeAndRecordId(RecordTypeEnum.DEVICE_MAINTENANCE, id)); return vo; } private List<MaintenanceItem> getSelectedItems(List<Long> ids, Long recordId, Long deviceId, String frequencyType) { if (deviceId == null || !List.of("DAILY", "WEEKLY", "MONTHLY", "QUARTERLY").contains(frequencyType) || ids == null || ids.isEmpty() || new HashSet<>(ids).size() != ids.size()) return null; List<MaintenanceItem> items = maintenanceItemMapper.selectList(new LambdaQueryWrapper<MaintenanceItem>().in(MaintenanceItem::getId, ids)); if (items.size() != ids.size()) return null; if (items.stream().anyMatch(item -> (item.getDeviceLedgerId() != null && !deviceId.equals(item.getDeviceLedgerId())) || !(frequencyType.equals(item.getFrequencyType()) || "ALL".equals(item.getFrequencyType())))) return null; Map<Long, MaintenanceItem> itemMap = items.stream().collect(Collectors.toMap(MaintenanceItem::getId, item -> item)); Set<Long> existingIds = recordId == null ? Collections.emptySet() : deviceMaintenanceItemMapper.selectList(new LambdaQueryWrapper<DeviceMaintenanceItem>().eq(DeviceMaintenanceItem::getDeviceMaintenanceId, recordId)).stream().map(DeviceMaintenanceItem::getMaintenanceItemId).collect(Collectors.toSet()); if (items.stream().anyMatch(item -> (item.getDeleted() != null && item.getDeleted() == 1 || item.getIsActive() == null || item.getIsActive() != 1) && !existingIds.contains(item.getId()))) return null; return ids.stream().map(itemMap::get).toList(); } private void saveRecordItems(DeviceMaintenance record, List<MaintenanceItem> selectedItems) { for (int i = 0; i < selectedItems.size(); i++) { MaintenanceItem source = selectedItems.get(i); DeviceMaintenanceItem item = new DeviceMaintenanceItem(); item.setDeviceMaintenanceId(record.getId()); item.setMaintenanceItemId(source.getId()); item.setItemProject(source.getItemProject()); item.setItemName(source.getItemName()); item.setItemStatus(0); item.setSortNum(i); item.setTenantId(record.getTenantId()); item.setDeptId(record.getDeptId()); deviceMaintenanceItemMapper.insert(item); } } private AjaxResult updateRecordItems(DeviceMaintenanceDto request, DeviceMaintenance record) { AjaxResult validation = validateRecordItems(request, record); if (validation != null) return validation; List<DeviceMaintenanceItem> current = deviceMaintenanceItemMapper.selectList(new LambdaQueryWrapper<DeviceMaintenanceItem>().eq(DeviceMaintenanceItem::getDeviceMaintenanceId, record.getId())); Map<Long, DeviceMaintenanceItem> currentById = current.stream().collect(Collectors.toMap(DeviceMaintenanceItem::getId, item -> item)); for (DeviceMaintenanceItem requested : request.getMaintenanceItems()) { DeviceMaintenanceItem item = currentById.get(requested.getId()); int status = requested.getItemStatus() == null ? 0 : requested.getItemStatus(); item.setItemStatus(status); if (requested.getRemarks() != null) item.setRemarks(requested.getRemarks()); item.setCompletedBy(status == 1 ? request.getMaintenanceActuallyName() : null); item.setCompletedTime(status == 1 ? LocalDateTime.now() : null); deviceMaintenanceItemMapper.updateById(item); } return null; } private AjaxResult validateRecordItems(DeviceMaintenanceDto request, DeviceMaintenance record) { List<DeviceMaintenanceItem> requestedItems = request.getMaintenanceItems(); if (requestedItems.stream().anyMatch(item -> item == null || item.getId() == null || (item.getItemStatus() != null && (item.getItemStatus() < 0 || item.getItemStatus() > 2)))) { return AjaxResult.error("ä¿å »é¡¹ç®ç¶ææ æ"); } List<DeviceMaintenanceItem> current = deviceMaintenanceItemMapper.selectList(new LambdaQueryWrapper<DeviceMaintenanceItem>().eq(DeviceMaintenanceItem::getDeviceMaintenanceId, record.getId())); Set<Long> currentIds = current.stream().map(DeviceMaintenanceItem::getId).collect(Collectors.toSet()); Set<Long> requestedIds = requestedItems.stream().map(DeviceMaintenanceItem::getId).collect(Collectors.toSet()); if (requestedIds.size() != current.size() || !requestedIds.equals(currentIds)) { return AjaxResult.error("ä¿å »é¡¹ç®æ¸ åå·²ååï¼è¯·å·æ°åéè¯"); } return null; } } src/main/java/com/ruoyi/device/service/impl/MaintenanceItemServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,205 @@ package com.ruoyi.device.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.device.mapper.MaintenanceItemMapper; import com.ruoyi.device.pojo.MaintenanceItem; import com.ruoyi.device.service.MaintenanceItemService; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service @RequiredArgsConstructor public class MaintenanceItemServiceImpl extends ServiceImpl<MaintenanceItemMapper, MaintenanceItem> implements MaintenanceItemService { private static final List<String> VALID_FREQUENCIES = List.of( "DAILY", "WEEKLY", "MONTHLY", "QUARTERLY", "ALL" ); private final MaintenanceItemMapper maintenanceItemMapper; @Override public List<MaintenanceItem> listActive() { return list(new LambdaQueryWrapper<MaintenanceItem>() .eq(MaintenanceItem::getDeleted, 0) .eq(MaintenanceItem::getIsActive, 1) .orderByAsc(MaintenanceItem::getSortNum) .orderByAsc(MaintenanceItem::getId)); } @Override public List<MaintenanceItem> list(MaintenanceItem query) { LambdaQueryWrapper<MaintenanceItem> wrapper = buildQueryWrapper(query, false) .orderByDesc(MaintenanceItem::getId); return maintenanceItemMapper.selectList(wrapper); } @Override public Page<MaintenanceItem> page( long pageNum, long pageSize, boolean includeCommon, MaintenanceItem query ) { long safePageNum = Math.max(pageNum, 1); long safePageSize = Math.min(Math.max(pageSize, 1), 100); LambdaQueryWrapper<MaintenanceItem> wrapper = buildQueryWrapper(query, includeCommon) .orderByAsc(MaintenanceItem::getSortNum) .orderByAsc(MaintenanceItem::getId); return maintenanceItemMapper.selectPage(new Page<>(safePageNum, safePageSize), wrapper); } @Override @Transactional(rollbackFor = Exception.class) public void createItem(MaintenanceItem item) { if (!isValid(item)) { throw new ServiceException("ä¿å »é¡¹ç®ãä¿å »å 容åé¢çä¸è½ä¸ºç©ºææ æ"); } normalize(item); item.setDeleted(0); if (existsName(item, null)) { throw new ServiceException("该设å¤åé¢çä¸å·²åå¨ååä¿å »å 容"); } if (maintenanceItemMapper.insert(item) <= 0) { throw new ServiceException("æ°å¢ä¿å »é¡¹ç®å¤±è´¥"); } } @Override @Transactional(rollbackFor = Exception.class) public void updateItem(MaintenanceItem item) { if (item == null || item.getId() == null || !isValid(item)) { throw new ServiceException("ä¿å »é¡¹ç®ãä¿å »å 容åé¢çä¸è½ä¸ºç©ºææ æ"); } MaintenanceItem existingItem = maintenanceItemMapper.selectById(item.getId()); if (existingItem == null || Integer.valueOf(1).equals(existingItem.getDeleted())) { throw new ServiceException("ä¿å »é¡¹ç®ä¸åå¨"); } normalize(item); if (existsName(item, item.getId())) { throw new ServiceException("该设å¤åé¢çä¸å·²åå¨ååä¿å »å 容"); } existingItem.setItemProject(item.getItemProject()); existingItem.setItemName(item.getItemName()); existingItem.setDeviceLedgerId(item.getDeviceLedgerId()); existingItem.setFrequencyType(item.getFrequencyType()); existingItem.setSortNum(item.getSortNum() == null ? 0 : item.getSortNum()); existingItem.setIsActive(item.getIsActive() == null ? existingItem.getIsActive() : item.getIsActive()); existingItem.setRemarks(item.getRemarks()); if (maintenanceItemMapper.updateById(existingItem) <= 0) { throw new ServiceException("ä¿®æ¹ä¿å »é¡¹ç®å¤±è´¥"); } } @Override @Transactional(rollbackFor = Exception.class) public void deleteItem(Long id) { if (id == null) { throw new ServiceException("ä¿å »é¡¹ç®ç¼å·ä¸è½ä¸ºç©º"); } MaintenanceItem item = maintenanceItemMapper.selectById(id); if (item == null || Integer.valueOf(1).equals(item.getDeleted())) { throw new ServiceException("ä¿å »é¡¹ç®ä¸åå¨"); } item.setDeleted(1); item.setIsActive(0); if (maintenanceItemMapper.updateById(item) <= 0) { throw new ServiceException("å é¤ä¿å »é¡¹ç®å¤±è´¥"); } } private LambdaQueryWrapper<MaintenanceItem> buildQueryWrapper( MaintenanceItem query, boolean includeCommon ) { MaintenanceItem filter = query == null ? new MaintenanceItem() : query; LambdaQueryWrapper<MaintenanceItem> wrapper = new LambdaQueryWrapper<MaintenanceItem>() .eq(MaintenanceItem::getDeleted, 0); if (StringUtils.isNotBlank(filter.getItemName())) { wrapper.like(MaintenanceItem::getItemName, filter.getItemName().trim()); } if (StringUtils.isNotBlank(filter.getItemProject())) { wrapper.like(MaintenanceItem::getItemProject, filter.getItemProject().trim()); } if (filter.getIsActive() != null) { wrapper.eq(MaintenanceItem::getIsActive, filter.getIsActive()); } if (filter.getDeviceLedgerId() != null) { if (includeCommon) { wrapper.and(condition -> condition .eq(MaintenanceItem::getDeviceLedgerId, filter.getDeviceLedgerId()) .or() .isNull(MaintenanceItem::getDeviceLedgerId)); } else { wrapper.eq(MaintenanceItem::getDeviceLedgerId, filter.getDeviceLedgerId()); } } if (StringUtils.isNotBlank(filter.getFrequencyType())) { if (includeCommon) { wrapper.and(condition -> condition .eq(MaintenanceItem::getFrequencyType, filter.getFrequencyType()) .or() .eq(MaintenanceItem::getFrequencyType, "ALL")); } else { wrapper.eq(MaintenanceItem::getFrequencyType, filter.getFrequencyType()); } } return wrapper; } private boolean isValid(MaintenanceItem item) { return item != null && StringUtils.isNotBlank(item.getItemProject()) && StringUtils.isNotBlank(item.getItemName()) && StringUtils.isNotBlank(item.getFrequencyType()) && VALID_FREQUENCIES.contains(item.getFrequencyType()); } private void normalize(MaintenanceItem item) { item.setItemProject(item.getItemProject().trim()); item.setItemName(item.getItemName().trim()); item.setSortNum(item.getSortNum() == null ? 0 : item.getSortNum()); item.setIsActive(item.getIsActive() == null ? 1 : item.getIsActive()); } private boolean existsName(MaintenanceItem item, Long excludedId) { LambdaQueryWrapper<MaintenanceItem> wrapper = new LambdaQueryWrapper<MaintenanceItem>() .eq(MaintenanceItem::getDeleted, 0) .eq(MaintenanceItem::getItemName, item.getItemName()) .eq(MaintenanceItem::getFrequencyType, item.getFrequencyType()); if (item.getDeviceLedgerId() == null) { wrapper.isNull(MaintenanceItem::getDeviceLedgerId); } else { wrapper.eq(MaintenanceItem::getDeviceLedgerId, item.getDeviceLedgerId()); } if (excludedId != null) { wrapper.ne(MaintenanceItem::getId, excludedId); } return maintenanceItemMapper.selectCount(wrapper) > 0; } } src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java
@@ -1,6 +1,11 @@ package com.ruoyi.device.service.impl; import com.ruoyi.device.pojo.DeviceMaintenance; import com.ruoyi.device.mapper.MaintenanceTaskItemMapper; import com.ruoyi.device.mapper.DeviceMaintenanceItemMapper; import com.ruoyi.device.pojo.MaintenanceTaskItem; import com.ruoyi.device.pojo.DeviceMaintenanceItem; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.device.pojo.MaintenanceTask; import lombok.RequiredArgsConstructor; import org.quartz.*; @@ -29,6 +34,12 @@ @Autowired private JdbcTemplate jdbcTemplate; @Autowired private MaintenanceTaskItemMapper maintenanceTaskItemMapper; @Autowired private DeviceMaintenanceItemMapper deviceMaintenanceItemMapper; @Override public void execute(JobExecutionContext context) throws JobExecutionException { JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); @@ -49,9 +60,26 @@ throw new JobExecutionException("MaintenanceTaskJobæ¾ä¸å°å®æ¶ä»»å¡: " + taskId); } // 2. å建并ä¿åå·¡æ£ä»»å¡è®°å½ - è¿å°±æ¯æ¨æä¾ç代ç åºè¯¥æ¾çä½ç½® List<MaintenanceTaskItem> taskItems = maintenanceTaskItemMapper.selectByTaskId(timingTask.getId()); if (taskItems.isEmpty()) { throw new JobExecutionException("ä¿å »ä»»å¡æªé ç½®ä¿å »é¡¹ç®: " + taskId); } // æä»»å¡é¡¹ç®å¿«ç §çææ¬æ¬¡ä¿å »è®°å½åé¡¹ç®æ¸ åã DeviceMaintenance deviceMaintenance = createInspectionTask(timingTask); deviceMaintenanceService.save(deviceMaintenance); for (MaintenanceTaskItem taskItem : taskItems) { DeviceMaintenanceItem recordItem = new DeviceMaintenanceItem(); recordItem.setDeviceMaintenanceId(deviceMaintenance.getId()); recordItem.setMaintenanceTaskItemId(taskItem.getId()); recordItem.setMaintenanceItemId(taskItem.getMaintenanceItemId()); recordItem.setItemProject(taskItem.getItemProject()); recordItem.setItemName(taskItem.getItemName()); recordItem.setItemStatus(0); recordItem.setSortNum(taskItem.getSortNum()); recordItem.setTenantId(deviceMaintenance.getTenantId()); recordItem.setDeptId(timingTask.getDeptId()); deviceMaintenanceItemMapper.insert(recordItem); } // 3. æ´æ°å®æ¶ä»»å¡çæ§è¡æ¶é´ if (!tasks.isEmpty()) { @@ -230,14 +258,29 @@ 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); 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); } } src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
@@ -5,7 +5,11 @@ 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.mapper.MaintenanceItemMapper; import com.ruoyi.device.mapper.MaintenanceTaskItemMapper; import com.ruoyi.device.pojo.MaintenanceItem; import com.ruoyi.device.pojo.MaintenanceTask; import com.ruoyi.device.pojo.MaintenanceTaskItem; import com.ruoyi.device.service.MaintenanceTaskService; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.inspectiontask.pojo.TimingTask; @@ -15,9 +19,18 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.*; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; /** * @author :yys @@ -29,13 +42,15 @@ public class MaintenanceTaskServiceImpl extends ServiceImpl<MaintenanceTaskMapper, MaintenanceTask> implements MaintenanceTaskService { private final MaintenanceTaskMapper maintenanceTaskMapper; private final MaintenanceItemMapper maintenanceItemMapper; private final MaintenanceTaskItemMapper maintenanceTaskItemMapper; private final SysUserMapper sysUserMapper; private final TimingTaskServiceImpl timingTaskService; private final MaintenanceTaskScheduler maintenanceTaskScheduler; @Override public AjaxResult listPage(Page page, MaintenanceTask maintenanceTask) { LambdaQueryWrapper<MaintenanceTask> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<MaintenanceTask> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.orderByDesc(MaintenanceTask::getId); Page<MaintenanceTask> taskPage = maintenanceTaskMapper.selectPage(page, queryWrapper); // 2. å¦ææ²¡ææ°æ®ï¼ç´æ¥è¿å空å页 @@ -65,11 +80,17 @@ task.setRegistrant(userNickNameMap.getOrDefault(task.getRegistrantId(), "æªç¥ç¨æ·")); } }); taskPage.getRecords().forEach(this::fillTaskItems); return AjaxResult.success(taskPage); } @Override @Transactional(rollbackFor = Exception.class) public AjaxResult add(MaintenanceTask maintenanceTask) { List<MaintenanceItem> selectedItems = getSelectedItems(maintenanceTask.getMaintenanceItemIds(), null, maintenanceTask.getTaskId(), maintenanceTask.getFrequencyType()); List<MaintenanceTaskItem> customItems = normalizeCustomItems(maintenanceTask.getCustomItems()); if (selectedItems == null || selectedItems.size() + customItems.size() == 0) return AjaxResult.error("è¯·éæ©è³å°ä¸ä¸ªææçä¿å »é¡¹ç®"); // 计ç®é¦æ¬¡æ§è¡æ¶é´ TimingTask task = new TimingTask(); task.setFrequencyType(maintenanceTask.getFrequencyType()); @@ -78,6 +99,7 @@ maintenanceTask.setNextExecutionTime(firstExecutionTime); int insert = maintenanceTaskMapper.insert(maintenanceTask); if (insert > 0) { saveTaskItems(maintenanceTask, selectedItems, customItems); // åªæå½ isActive 为 1 æ¶ææ·»å å°å®æ¶ä»»å¡è°åº¦å¨ if (maintenanceTask.getIsActive() != null && maintenanceTask.getIsActive() == 1) { maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask); @@ -87,11 +109,16 @@ } @Override @Transactional(rollbackFor = Exception.class) public AjaxResult updateByMaintenanceTaskId(MaintenanceTask maintenanceTask) { MaintenanceTask maintenanceTask1 = maintenanceTaskMapper.selectById(maintenanceTask.getId()); if (maintenanceTask1 == null) { return AjaxResult.warn("æ²¡ææ¤æ°æ®"); } List<MaintenanceItem> selectedItems = getSelectedItems(maintenanceTask.getMaintenanceItemIds(), maintenanceTask1.getId(), maintenanceTask.getTaskId(), maintenanceTask.getFrequencyType()); List<MaintenanceTaskItem> customItems = normalizeCustomItems(maintenanceTask.getCustomItems()); if (selectedItems == null || selectedItems.size() + customItems.size() == 0) return AjaxResult.error("è¯·éæ©è³å°ä¸ä¸ªææçä¿å »é¡¹ç®"); // ä¿åæ§ç isActive ç¶æ Integer oldIsActive = maintenanceTask1.getIsActive(); @@ -100,6 +127,9 @@ BeanUtils.copyProperties(maintenanceTask, maintenanceTask1); int update = maintenanceTaskMapper.updateById(maintenanceTask1); if (update > 0) { maintenanceTaskItemMapper.delete(new LambdaQueryWrapper<MaintenanceTaskItem>() .eq(MaintenanceTaskItem::getMaintenanceTaskId, maintenanceTask1.getId())); saveTaskItems(maintenanceTask1, selectedItems, customItems); // å¤ç isActive ç¶æåå if (newIsActive != null && newIsActive == 1) { // æ°ç¶æä¸ºå¯ç¨ï¼æ·»å å°å®æ¶ä»»å¡è°åº¦å¨ @@ -134,8 +164,88 @@ // å仿°æ®åºä¸å é¤è®°å½ int delete = maintenanceTaskMapper.deleteBatchIds(ids); if (delete > 0) { maintenanceTaskItemMapper.delete(new LambdaQueryWrapper<MaintenanceTaskItem>() .in(MaintenanceTaskItem::getMaintenanceTaskId, ids)); } if (delete > 0) { return AjaxResult.success("å 餿å"); } return AjaxResult.error("å é¤å¤±è´¥"); } private List<MaintenanceTaskItem> normalizeCustomItems(List<MaintenanceTaskItem> customItems) { if (customItems == null) return new ArrayList<>(); return customItems.stream().filter(Objects::nonNull) .filter(item -> item.getItemProject() != null && !item.getItemProject().trim().isEmpty() && item.getItemName() != null && !item.getItemName().trim().isEmpty()) .peek(item -> { item.setItemProject(item.getItemProject().trim()); item.setItemName(item.getItemName().trim()); }) .toList(); } private List<MaintenanceItem> getSelectedItems(List<Long> ids, Long taskId, Long deviceId, String frequencyType) { if (deviceId == null || !List.of("DAILY", "WEEKLY", "MONTHLY", "QUARTERLY").contains(frequencyType) || (ids != null && new HashSet<>(ids).size() != ids.size())) return null; if (ids == null || ids.isEmpty()) return new ArrayList<>(); List<MaintenanceItem> items = maintenanceItemMapper.selectList(new LambdaQueryWrapper<MaintenanceItem>() .in(MaintenanceItem::getId, ids)); if (items.size() != ids.size()) return null; if (items.stream().anyMatch(item -> (item.getDeviceLedgerId() != null && !deviceId.equals(item.getDeviceLedgerId())) || !(frequencyType.equals(item.getFrequencyType()) || "ALL".equals(item.getFrequencyType())))) return null; Map<Long, MaintenanceItem> itemMap = new HashMap<>(); items.forEach(item -> itemMap.put(item.getId(), item)); Set<Long> existingIds = taskId == null ? Collections.emptySet() : maintenanceTaskItemMapper.selectList( new LambdaQueryWrapper<MaintenanceTaskItem>() .eq(MaintenanceTaskItem::getMaintenanceTaskId, taskId)) .stream().map(MaintenanceTaskItem::getMaintenanceItemId).collect(Collectors.toSet()); if (items.stream().anyMatch(item -> (item.getDeleted() != null && item.getDeleted() == 1 || item.getIsActive() == null || item.getIsActive() != 1) && !existingIds.contains(item.getId()))) return null; List<MaintenanceItem> sorted = new ArrayList<>(); ids.forEach(id -> sorted.add(itemMap.get(id))); return sorted; } private void saveTaskItems(MaintenanceTask task, List<MaintenanceItem> selectedItems, List<MaintenanceTaskItem> customItems) { for (int i = 0; i < selectedItems.size(); i++) { MaintenanceItem source = selectedItems.get(i); MaintenanceTaskItem link = new MaintenanceTaskItem(); link.setMaintenanceTaskId(task.getId()); link.setMaintenanceItemId(source.getId()); link.setItemProject(source.getItemProject()); link.setItemName(source.getItemName()); link.setSortNum(i); link.setTenantId(task.getTenantId()); link.setDeptId(task.getDeptId()); maintenanceTaskItemMapper.insert(link); } for (int i = 0; i < customItems.size(); i++) { MaintenanceTaskItem link = new MaintenanceTaskItem(); link.setMaintenanceTaskId(task.getId()); link.setMaintenanceItemId(null); link.setItemProject(customItems.get(i).getItemProject()); link.setItemName(customItems.get(i).getItemName()); link.setSortNum(selectedItems.size() + i); link.setTenantId(task.getTenantId()); link.setDeptId(task.getDeptId()); maintenanceTaskItemMapper.insert(link); } task.setMaintenanceItems(maintenanceTaskItemMapper.selectList(new LambdaQueryWrapper<MaintenanceTaskItem>() .eq(MaintenanceTaskItem::getMaintenanceTaskId, task.getId()) .orderByAsc(MaintenanceTaskItem::getSortNum))); task.setMaintenanceItemIds(task.getMaintenanceItems().stream() .map(MaintenanceTaskItem::getMaintenanceItemId).filter(Objects::nonNull).collect(Collectors.toList())); } private void fillTaskItems(MaintenanceTask task) { List<MaintenanceTaskItem> items = maintenanceTaskItemMapper.selectList(new LambdaQueryWrapper<MaintenanceTaskItem>() .eq(MaintenanceTaskItem::getMaintenanceTaskId, task.getId()) .orderByAsc(MaintenanceTaskItem::getSortNum)); task.setMaintenanceItems(items); task.setMaintenanceItemIds(items.stream().map(MaintenanceTaskItem::getMaintenanceItemId).filter(Objects::nonNull) .collect(Collectors.toList())); } }