package com.ruoyi.inspect.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; 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 page(Page 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 listForExport(SealUsageExportRequest request) { if (request == null || StringUtils.isBlank(request.getMode())) { throw new ErrorException("请选择导出方式"); } List result; if ("selected".equals(request.getMode())) { if (request.getIds() == null || request.getIds().isEmpty()) { throw new ErrorException("请选择要导出的记录"); } List 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("报告批准信息不完整,无法生成用印台账"); } 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("开始日期不能晚于结束日期"); } } }