liding
昨天 5734b7e1c2fb6e64ddc5956b84c5a125a8c1ea0e
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsSampleReceiptServiceImpl.java
@@ -4,46 +4,44 @@
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.dto.TemplateInspectionItemDto;
import com.ruoyi.basic.utils.StandardTemplateInspectionItemParser;
import com.ruoyi.common.utils.GZipUtil;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.dto.SampleReceiptActionDto;
import com.ruoyi.inspect.dto.SampleReceiptPageDto;
import com.ruoyi.inspect.dto.SampleReceiptQueryDto;
import com.ruoyi.inspect.mapper.InsOrderMapper;
import com.ruoyi.inspect.mapper.InsOrderStandardTemplateMapper;
import com.ruoyi.inspect.mapper.InsProductMapper;
import com.ruoyi.inspect.mapper.InsSampleMapper;
import com.ruoyi.inspect.mapper.InsSampleReceiptMapper;
import com.ruoyi.inspect.mapper.InsSampleUserMapper;
import com.ruoyi.inspect.pojo.InsOrder;
import com.ruoyi.inspect.pojo.InsOrderStandardTemplate;
import com.ruoyi.inspect.pojo.InsProduct;
import com.ruoyi.inspect.pojo.InsSample;
import com.ruoyi.inspect.pojo.InsSampleReceipt;
import com.ruoyi.inspect.pojo.InsSampleUser;
import com.ruoyi.inspect.mapper.*;
import com.ruoyi.inspect.pojo.*;
import com.ruoyi.inspect.service.InsOrderService;
import com.ruoyi.inspect.service.InsOrderStateService;
import com.ruoyi.inspect.service.InsSampleReceiptService;
import com.ruoyi.system.mapper.UserMapper;
import jakarta.servlet.http.HttpServletResponse;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Service
@AllArgsConstructor
public class InsSampleReceiptServiceImpl extends ServiceImpl<InsSampleReceiptMapper, InsSampleReceipt>
        implements InsSampleReceiptService {
    private static final String DIRECT_TEMPLATE_LABORATORY = "新聚";
    private final InsSampleReceiptMapper receiptMapper;
    private final InsOrderMapper insOrderMapper;
    private final InsOrderStandardTemplateMapper insOrderStandardTemplateMapper;
@@ -55,13 +53,17 @@
    private final UserMapper userMapper;
    @Override
    public com.baomidou.mybatisplus.core.metadata.IPage<SampleReceiptPageDto> page(Page<?> page, SampleReceiptQueryDto query) {
        return receiptMapper.selectPage(page, query);
    public IPage<SampleReceiptPageDto> page(Page<?> page, SampleReceiptQueryDto query) {
        IPage<SampleReceiptPageDto> result = receiptMapper.selectPage(page, query);
        result.getRecords().forEach(this::fillInspectionItemsFromSnapshots);
        return result;
    }
    @Override
    public SampleReceiptPageDto detail(Integer id) {
        return receiptMapper.selectDetail(id);
        SampleReceiptPageDto detail = receiptMapper.selectDetail(id);
        fillInspectionItemsFromSnapshots(detail);
        return detail;
    }
    @Override
@@ -91,7 +93,26 @@
        Long productCount = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery()
                .eq(InsProduct::getInsSampleId, sample.getId()).eq(InsProduct::getState, 1));
        if (productCount == 0) {
            throw new ErrorException("该委托未绑定检验项目,不能提交检验");
            List<TemplateInspectionItemDto> items = getSnapshotInspectionItems(order.getId());
            if (items.isEmpty()) {
                throw new ErrorException("订单原始记录模板未配置检验项或导出值,不能提交检验");
            }
            int sort = 0;
            for (TemplateInspectionItemDto item : items) {
                InsProduct product = new InsProduct();
                product.setInsSampleId(sample.getId());
                product.setInspectionItem(item.getInspectionItem());
                product.setInspectionItemClass("");
                product.setInspectionItemSubclass("");
                product.setLaboratory(order.getLaboratory());
                product.setSample(order.getSample());
                product.setTemplateId(item.getTemplateId());
                product.setTemplateRowIndex(item.getTemplateRowIndex());
                product.setSonLaboratory(DIRECT_TEMPLATE_LABORATORY);
                product.setState(1);
                product.setSort(sort++);
                insProductMapper.insert(product);
            }
        }
        if (userMapper.selectById(dto.getMainInspectorId()) == null) {
            throw new ErrorException("主检验人不存在或已停用");
@@ -160,9 +181,43 @@
        }
    }
    private List<TemplateInspectionItemDto> getSnapshotInspectionItems(Integer orderId) {
        List<InsOrderStandardTemplate> snapshots = insOrderStandardTemplateMapper.selectList(
                Wrappers.<InsOrderStandardTemplate>lambdaQuery()
                        .eq(InsOrderStandardTemplate::getInsOrderId, orderId)
                        .orderByAsc(InsOrderStandardTemplate::getSort, InsOrderStandardTemplate::getId));
        List<TemplateInspectionItemDto> items = new ArrayList<>();
        for (InsOrderStandardTemplate snapshot : snapshots) {
            String thing = snapshot.getThing();
            try {
                thing = GZipUtil.uncompress(thing);
            } catch (RuntimeException ignored) {
                // 兼容未压缩的历史模板快照。
            }
            items.addAll(StandardTemplateInspectionItemParser.parse(
                    snapshot.getTemplateId(), snapshot.getSort(), thing));
        }
        return items;
    }
    private void fillInspectionItemsFromSnapshots(SampleReceiptPageDto row) {
        if (row == null || row.getOrderId() == null || StringUtils.isNotBlank(row.getInspectionItem())) {
            return;
        }
        try {
            String names = getSnapshotInspectionItems(row.getOrderId()).stream()
                    .map(TemplateInspectionItemDto::getInspectionItem)
                    .distinct().collect(Collectors.joining("\n"));
            row.setInspectionItem(names);
        } catch (RuntimeException ignored) {
            // 列表仍可查看;提交检验时会返回具体的模板解析错误。
        }
    }
    @Override
    public void export(SampleReceiptQueryDto query, HttpServletResponse response) {
        List<SampleReceiptPageDto> list = receiptMapper.selectExportList(query);
        list.forEach(this::fillInspectionItemsFromSnapshots);
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("UTF-8");
        try {