From 60afc1c228318d136a273cd0b389217f87583277 Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期六, 11 十月 2025 11:29:33 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetRepairRecordServiceImpl.java | 201 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 195 insertions(+), 6 deletions(-) diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetRepairRecordServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetRepairRecordServiceImpl.java index c5acfe3..4593555 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetRepairRecordServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetRepairRecordServiceImpl.java @@ -1,21 +1,41 @@ package com.ruoyi.system.service.impl; +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.basic.PageInfo; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.system.constants.ApprovalApplicationCodePrefix; +import com.ruoyi.system.dto.AssetRepairRecordAddDTO; +import com.ruoyi.system.dto.asset.AssetRepairCompleteDTO; import com.ruoyi.system.mapper.AssetRepairRecordMapper; import com.ruoyi.system.model.AssetRepairRecord; -import com.ruoyi.system.model.AssetType; +import com.ruoyi.system.model.AssetRepairRecordItem; +import com.ruoyi.system.model.AssetRepairRequest; +import com.ruoyi.system.query.AssetRepairRecordPageQuery; import com.ruoyi.system.query.AssetRepairRequestListQuery; -import com.ruoyi.system.query.AssetStatisticsListQuery; +import com.ruoyi.system.service.AssetRepairRecordItemService; import com.ruoyi.system.service.AssetRepairRecordService; -import com.ruoyi.system.vo.AssetIdleListVO; +import com.ruoyi.system.service.AssetRepairRequestService; +import com.ruoyi.system.service.AssetTypeService; import com.ruoyi.system.vo.AssetRepairRequestVO; -import com.ruoyi.system.vo.AssetStatisticsVO; +import com.ruoyi.system.vo.asset.AssetRepairRecordAssetVO; +import com.ruoyi.system.vo.asset.AssetRepairRecordDetailVO; +import com.ruoyi.system.vo.asset.AssetRepairRecordPageVO; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; +import java.util.Objects; /** * <p> @@ -26,7 +46,12 @@ * @since 2025-09-15 */ @Service +@RequiredArgsConstructor(onConstructor_ = {@Lazy}) public class AssetRepairRecordServiceImpl extends ServiceImpl<AssetRepairRecordMapper, AssetRepairRecord> implements AssetRepairRecordService { + + private final AssetRepairRequestService assetRepairRequestService; + private final AssetRepairRecordItemService assetRepairRecordItemService; + private final AssetTypeService assetTypeService; @Override public PageInfo<AssetRepairRequestVO> pageList(AssetRepairRequestListQuery query) { @@ -35,4 +60,168 @@ pageInfo.setRecords(list); return pageInfo; } + + @Override + public IPage<AssetRepairRecordPageVO> getRepairRecordPageList(AssetRepairRecordPageQuery pageQuery) { + Page<AssetRepairRecordPageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); + return this.baseMapper.getRepairRecordPageList(page, pageQuery); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void addRepairRecord(AssetRepairRecordAddDTO addDTO) { + // 1. 生成维修单号 + String repairNo = generateRepairNo(); + + // 2. 校验报修单是否存在(如果提供了报修单号) + Integer repairRequestId = null; + if (StringUtils.hasText(addDTO.getRepairRequestNo())) { + repairRequestId = validateRepairRequest(addDTO.getRepairRequestNo()); + } + + // 3. 创建维修记录实体 + AssetRepairRecord repairRecord = new AssetRepairRecord(); + repairRecord.setRepairNo(repairNo); + repairRecord.setRepairRequestId(repairRequestId); + BeanUtil.copyProperties(addDTO, repairRecord); + repairRecord.setCreateBy(SecurityUtils.getUsername()); + + // 4. 保存维修记录主表 + boolean saved = this.save(repairRecord); + if (!saved) { + throw new RuntimeException("保存维修记录失败"); + } + + // 5. 保存维修资产关联关系 + saveRepairRecordItems(repairRecord.getId(), addDTO.getAssetMainIds()); + } + + /** + * 生成维修单号 + * 格式:WX + 日期 + 4位序号 + */ + private String generateRepairNo() { + String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); + + // 查询当天已生成的维修单号数量 + Long count = this.lambdaQuery() + .likeRight(AssetRepairRecord::getRepairNo, ApprovalApplicationCodePrefix.ASSET_REPAIR) + .ge(AssetRepairRecord::getCreateTime, LocalDate.now().atStartOfDay()) + .lt(AssetRepairRecord::getCreateTime, LocalDate.now().plusDays(1).atStartOfDay()) + .count(); + + // 生成4位序号,从0001开始 + int sequence = (count != null ? count.intValue() : 0) + 1; + String sequenceStr = String.format("%04d", sequence); + + return ApprovalApplicationCodePrefix.ASSET_REPAIR + dateStr + sequenceStr; + } + + /** + * 校验报修单是否存在 + * @param repairRequestNo 报修单号 + * @return 报修单ID + */ + private Integer validateRepairRequest(String repairRequestNo) { + AssetRepairRequest repairRequest = assetRepairRequestService.lambdaQuery() + .eq(AssetRepairRequest::getRepairNo, repairRequestNo) + .eq(AssetRepairRequest::getDisabled, false) + .one(); + + if (repairRequest == null) { + throw new RuntimeException("报修单不存在:" + repairRequestNo); + } + + return repairRequest.getId(); + } + + /** + * 保存维修记录资产关联关系 + * @param repairRecordId 维修记录ID + * @param assetMainIds 资产ID列表 + */ + private void saveRepairRecordItems(Integer repairRecordId, List<Integer> assetMainIds) { + if (assetMainIds == null || assetMainIds.isEmpty()) { + throw new RuntimeException("维修资产ID列表不能为空"); + } + + List<AssetRepairRecordItem> items = new ArrayList<>(); + for (Integer assetMainId : assetMainIds) { + AssetRepairRecordItem item = new AssetRepairRecordItem(); + item.setRepairRecordId(repairRecordId); + item.setAssetMainId(assetMainId); + items.add(item); + } + + boolean saved = assetRepairRecordItemService.saveBatch(items); + if (!saved) { + throw new RuntimeException("保存维修资产关联关系失败"); + } + } + + @Override + public AssetRepairRecordDetailVO getRepairRecordDetail(Integer id) { + // 1. 查询主表信息 + AssetRepairRecord repairRecord = this.getById(id); + if (repairRecord == null) { + throw new RuntimeException("维修记录不存在"); + } + + // 2. 转换主表信息到VO + AssetRepairRecordDetailVO detailVO = new AssetRepairRecordDetailVO(); + BeanUtil.copyProperties(repairRecord, detailVO); + + // 4. 查询关联的资产列表 + List<AssetRepairRecordAssetVO> assetList = this.baseMapper.getRepairAssetList(id); + detailVO.setAssetList(assetList); + + return detailVO; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void completeRepair(AssetRepairCompleteDTO dto) { + //查询维修记录资产关联表 + AssetRepairRecordItem item = assetRepairRecordItemService.lambdaQuery().eq(AssetRepairRecordItem::getRepairRecordId, dto.getRepairRecordId()) + .eq(AssetRepairRecordItem::getAssetMainId, dto.getAssetMainId()).one(); + if (Objects.isNull(item)) { + throw new ServiceException("维修记录不存在"); + } + item.setRepairFinishTime(Objects.nonNull(dto.getRepairFinishTime()) ? dto.getRepairFinishTime() : LocalDateTime.now()); + item.setRepairFee(dto.getRepairFee()); + item.setStatus(1); + assetRepairRecordItemService.updateById(item); + //统计未维修的资产数量 TODO 待验证 + Long count = assetRepairRecordItemService.lambdaQuery() + .eq(AssetRepairRecordItem::getRepairRecordId, dto.getRepairRecordId()).eq(AssetRepairRecordItem::getStatus, 0) + .count(); + if (count.equals(0L)) { + //更新主表状态 + AssetRepairRecord repairRecord = this.getById(dto.getRepairRecordId()); + repairRecord.setRepairStatus(2); + this.updateById(repairRecord); + //查询关联保修单 + if (Objects.nonNull(repairRecord.getRepairRequestId())) { + //更新关联报修单状态 + assetRepairRequestService.lambdaUpdate().set(AssetRepairRequest::getRepairStatus, 1) + .eq(AssetRepairRequest::getId, repairRecord.getRepairRequestId()) + .update(); + } + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteById(Integer id) { + this.removeById(id); + assetRepairRecordItemService.lambdaUpdate() + .eq(AssetRepairRecordItem::getRepairRecordId, id) + .remove(); + } + + @Override + public List<AssetRepairRequestVO> listAll(AssetRepairRequestListQuery query) { + List<AssetRepairRequestVO> list = this.baseMapper.listAll(query); + return list; + } } -- Gitblit v1.7.1