无关风月
2 天以前 60afc1c228318d136a273cd0b389217f87583277
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
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.AssetRepairRecordItem;
import com.ruoyi.system.model.AssetRepairRequest;
import com.ruoyi.system.query.AssetRepairRecordPageQuery;
import com.ruoyi.system.query.AssetRepairRequestListQuery;
import com.ruoyi.system.service.AssetRepairRecordItemService;
import com.ruoyi.system.service.AssetRepairRecordService;
import com.ruoyi.system.service.AssetRepairRequestService;
import com.ruoyi.system.service.AssetTypeService;
import com.ruoyi.system.vo.AssetRepairRequestVO;
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.Objects;
 
/**
 * <p>
 * 资产维修主表 服务实现类
 * </p>
 *
 * @author WuGuanFengYue
 * @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) {
        PageInfo<AssetRepairRequestVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<AssetRepairRequestVO> list = this.baseMapper.pageList(query,pageInfo);
        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;
    }
}