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
package com.ruoyi.inspect.service.impl;
 
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.dto.SealUsageCopiesUpdate;
import com.ruoyi.inspect.dto.SealUsageExportRequest;
import com.ruoyi.inspect.dto.SealUsageLedgerQuery;
import com.ruoyi.inspect.mapper.SealUsageLedgerMapper;
import com.ruoyi.inspect.pojo.InsReport;
import com.ruoyi.inspect.pojo.SealUsageLedger;
import com.ruoyi.inspect.service.SealUsageLedgerService;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.system.mapper.UserMapper;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
 
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Objects;
 
@Service
public class SealUsageLedgerServiceImpl implements SealUsageLedgerService {
 
    @Resource
    private SealUsageLedgerMapper ledgerMapper;
 
    @Resource
    private UserMapper userMapper;
 
    @Override
    public IPage<SealUsageLedger> page(Page<SealUsageLedger> page, SealUsageLedgerQuery query) {
        validateDateRange(query);
        return ledgerMapper.selectLedgerPage(page, query);
    }
 
    @Override
    public void updateCopies(SealUsageCopiesUpdate update) {
        if (update == null || update.getId() == null || update.getVersion() == null) {
            throw new ErrorException("缺少台账记录或版本信息");
        }
        if (update.getCopies() == null || update.getCopies() < 1) {
            throw new ErrorException("份数必须为正整数");
        }
        int affected = ledgerMapper.updateCopies(update.getId(), update.getCopies(), update.getVersion(),
                SecurityUtils.getUserId().intValue());
        if (affected != 1) {
            if (ledgerMapper.selectById(update.getId()) == null) {
                throw new ErrorException("用印台账记录不存在");
            }
            throw new ErrorException("记录已被修改,请刷新后重试");
        }
    }
 
    @Override
    public List<SealUsageLedger> listForExport(SealUsageExportRequest request) {
        if (request == null || StringUtils.isBlank(request.getMode())) {
            throw new ErrorException("请选择导出方式");
        }
        List<SealUsageLedger> result;
        if ("selected".equals(request.getMode())) {
            if (request.getIds() == null || request.getIds().isEmpty()) {
                throw new ErrorException("请选择要导出的记录");
            }
            List<Long> ids = new ArrayList<>(new LinkedHashSet<>(request.getIds()));
            if (ids.stream().anyMatch(Objects::isNull)) {
                throw new ErrorException("导出记录参数不正确");
            }
            result = ledgerMapper.selectForExport(null, ids);
            if (result.size() != ids.size()) {
                throw new ErrorException("部分用印台账记录不存在或无权访问");
            }
        } else if ("filtered".equals(request.getMode())) {
            SealUsageLedgerQuery query = request.getQuery() == null ? new SealUsageLedgerQuery() : request.getQuery();
            validateDateRange(query);
            result = ledgerMapper.selectForExport(query, null);
        } else {
            throw new ErrorException("不支持的导出方式");
        }
        if (result.isEmpty()) {
            throw new ErrorException("暂无可导出的记录");
        }
        return result;
    }
 
    @Override
    public void recordApprovedReport(InsReport report) {
        if (report == null || report.getId() == null || report.getRatifyTime() == null
                || report.getRatifyUserId() == null || StringUtils.isBlank(report.getCode())
                || StringUtils.isBlank(report.getSealNames())) {
            throw new ErrorException("报告批准信息不完整,无法生成用印台账");
        }
        // 报告退回后重新批准仍属于同一份报告;保留首次批准生成的独立用印记录,
        // 避免唯一键冲突导致重新批准事务整体回滚。
        if (ledgerMapper.selectCount(Wrappers.<SealUsageLedger>lambdaQuery()
                .eq(SealUsageLedger::getReportId, report.getId())) > 0) {
            return;
        }
        User ratifyUser = userMapper.selectById(report.getRatifyUserId());
        if (ratifyUser == null || StringUtils.isBlank(ratifyUser.getName())) {
            throw new ErrorException("找不到报告批准人,无法生成用印台账");
        }
        String projectName = StringUtils.defaultString(ledgerMapper.selectProjectName(report.getInsOrderId()));
 
        SealUsageLedger ledger = new SealUsageLedger();
        ledger.setReportId(report.getId());
        ledger.setReportCode(report.getCode());
        ledger.setInsOrderId(report.getInsOrderId());
        ledger.setUseTime(report.getRatifyTime());
        ledger.setSealIds(report.getSealIds());
        ledger.setSealNames(report.getSealNames());
        ledger.setProjectName(projectName);
        ledger.setUseUserId(report.getRatifyUserId());
        ledger.setUseUserName(ratifyUser.getName());
        ledger.setCopies(1);
        ledger.setVersion(0);
        ledgerMapper.insert(ledger);
    }
 
    private void validateDateRange(SealUsageLedgerQuery query) {
        if (query != null && query.getStartDate() != null && query.getEndDate() != null
                && query.getStartDate().isAfter(query.getEndDate())) {
            throw new ErrorException("开始日期不能晚于结束日期");
        }
    }
}