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 |  191 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 185 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 a1ebac1..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,25 +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>
@@ -30,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) {
@@ -45,4 +66,162 @@
         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