liding
8 小时以前 51786b723d0a91d11476776d9ce50af7994dc4bd
cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessTotaldealServiceImpl.java
@@ -15,15 +15,19 @@
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.mapper.InsOrderMapper;
import com.ruoyi.inspect.mapper.InsSampleMapper;
import com.ruoyi.inspect.mapper.InsSampleReceiptMapper;
import com.ruoyi.inspect.pojo.InsOrder;
import com.ruoyi.inspect.pojo.InsSample;
import com.ruoyi.inspect.pojo.InsSampleReceipt;
import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
import com.ruoyi.inspect.util.UserUtils;
import com.ruoyi.process.mapper.InspectionOrderMapper;
import org.apache.commons.lang3.StringUtils;
import com.ruoyi.process.dto.ProcessDealDto;
import com.ruoyi.process.mapper.ProcessDealMapper;
import com.ruoyi.process.mapper.ProcessSampleMapper;
import com.ruoyi.process.mapper.ProcessTotaldealMapper;
import com.ruoyi.process.pojo.InspectionOrder;
import com.ruoyi.process.pojo.ProcessDeal;
import com.ruoyi.process.pojo.ProcessSample;
import com.ruoyi.process.pojo.ProcessTotaldeal;
import com.ruoyi.process.service.ProcessDealService;
import com.ruoyi.process.service.ProcessTotaldealService;
@@ -43,12 +47,17 @@
import java.nio.file.Files;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
/**
 * <p>
@@ -66,13 +75,7 @@
    private ProcessTotaldealMapper processTotaldealMapper;
    @Resource
    private ProcessSampleMapper processSampleMapper;
    @Resource
    private ProcessDealService processDealService;
    @Resource
    private InspectionOrderMapper inspectionOrderMapper;
   @Resource
   private ProcessDealMapper processDealMapper;
@@ -83,6 +86,15 @@
    @Resource
    private UserMapper userMapper;
    @Resource
    private InsOrderMapper insOrderMapper;
    @Resource
    private InsSampleMapper insSampleMapper;
    @Resource
    private InsSampleReceiptMapper insSampleReceiptMapper;
    @Override
    public IPage<ProcessTotaldeal> pageProcessTotaldeal(Page page, ProcessTotaldeal processTotaldeal) {
@@ -138,54 +150,98 @@
    @Override
    public int addProcessTotaldeal(String month) {
        //新增总表
        ProcessTotaldeal processTotaldeal = new ProcessTotaldeal();
        //新增总表(同一月份复用已有总表)
        ProcessTotaldeal processTotaldeal;
        List<ProcessTotaldeal> processTotaldeals = processTotaldealMapper.selectList(Wrappers.<ProcessTotaldeal>lambdaQuery()
                .eq(ProcessTotaldeal::getMonth, month));
        if (processTotaldeals.size()<=0) {
        if (processTotaldeals.size() <= 0) {
            processTotaldeal = new ProcessTotaldeal();
            processTotaldeal.setMonth(month);//月份
            processTotaldeal.setSubmitState("待提交");
            processTotaldealMapper.insert(processTotaldeal);
        }else {
            processTotaldeal=processTotaldeals.get(0);
        } else {
            processTotaldeal = processTotaldeals.get(0);
        }
        //新增详情表
        //1.获取该月份的第一天和最后一天
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
        YearMonth yearMonth = YearMonth.parse(month, formatter);
        LocalDate firstDay = yearMonth.atDay(1);
        LocalDate lastDay = yearMonth.atEndOfMonth();
        //2.查询在这个时间范围内的所有样品登记的数据
        List<ProcessSample> processSamples = processSampleMapper.selectList(Wrappers.<ProcessSample>lambdaQuery()
                .between(ProcessSample::getLeaveDate, firstDay, lastDay));
        if (processSamples.size()>0){
            //获取处理方式
            InspectionOrder inspectionOrder = inspectionOrderMapper.selectById(processSamples.get(0).getInspectionOrderId());
            List<ProcessDeal> processDeals = new ArrayList<>();
            for (ProcessSample processSample : processSamples) {
                long count = processDealService.count(Wrappers.<ProcessDeal>lambdaQuery().eq(ProcessDeal::getProcessSampleId, processSample.getId()));
                if (count>0){
                    continue;
                }
                ProcessDeal processDeal = new ProcessDeal();
                processDeal.setSampleName(processSample.getSampleName());//样品名称
                processDeal.setSampleCode(processSample.getSampleCode());//样品编号
                processDeal.setSampleSupplier(processSample.getSampleSupplier());//供样单位
                processDeal.setNum(processSample.getNum());//样品数量
                processDeal.setDealMethod(inspectionOrder.getProcessing()==1?"实验室处理":"委托单位取回");//处理方式
                processDeal.setDealTime(LocalDate.now());//时间=当前时间
                processDeal.setTotaldealId(processTotaldeal.getId());//总表id
                processDeal.setProcessSampleId(processSample.getId());//样品接收id
                processDeals.add(processDeal);
        LocalDateTime startTime = yearMonth.atDay(1).atStartOfDay();
        LocalDateTime endTime = yearMonth.atEndOfMonth().atTime(LocalTime.MAX);
        //2.该月下单的委托单(排除原材料,typeSource 为空视为成品)
        List<InsOrder> orders = insOrderMapper.selectList(Wrappers.<InsOrder>lambdaQuery()
                .ge(InsOrder::getCreateTime, startTime)
                .le(InsOrder::getCreateTime, endTime));
        if (orders.isEmpty()) {
            return 0;
        }
        //3.只保留已生成样品接收记录的委托(已审核受理)
        List<Integer> orderIds = orders.stream().map(InsOrder::getId).collect(Collectors.toList());
        List<InsSampleReceipt> receipts = insSampleReceiptMapper.selectList(Wrappers.<InsSampleReceipt>lambdaQuery()
                .in(InsSampleReceipt::getInsOrderId, orderIds));
        Set<Integer> receiptOrderIds = receipts.stream().map(InsSampleReceipt::getInsOrderId).collect(Collectors.toSet());
        Map<Integer, InsOrder> orderMap = orders.stream()
                .filter(order -> !Integer.valueOf(1).equals(order.getTypeSource()))
                .filter(order -> receiptOrderIds.contains(order.getId()))
                .collect(Collectors.toMap(InsOrder::getId, order -> order, (a, b) -> a));
        if (orderMap.isEmpty()) {
            return 0;
        }
        //4.委托对应的样品
        List<InsSample> samples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
                .in(InsSample::getInsOrderId, orderMap.keySet()));
        if (samples.isEmpty()) {
            return 0;
        }
        //5.已进入任何处置批次的样品跳过(跨月也不会重复带入)
        List<Integer> sampleIds = samples.stream().map(InsSample::getId).collect(Collectors.toList());
        Set<Integer> dealtSampleIds = processDealService.list(Wrappers.<ProcessDeal>lambdaQuery()
                .select(ProcessDeal::getInsSampleId)
                .in(ProcessDeal::getInsSampleId, sampleIds))
                .stream().map(ProcessDeal::getInsSampleId).filter(Objects::nonNull).collect(Collectors.toSet());
        List<ProcessDeal> processDeals = new ArrayList<>();
        for (InsSample insSample : samples) {
            if (dealtSampleIds.contains(insSample.getId())) {
                continue;
            }
            InsOrder order = orderMap.get(insSample.getInsOrderId());
            ProcessDeal processDeal = new ProcessDeal();
            //样品名称优先取报告展示字段
            processDeal.setSampleName(order != null && StringUtils.isNotBlank(order.getSampleView())
                    ? order.getSampleView() : insSample.getSample());
            processDeal.setSampleCode(insSample.getSampleCode());//样品编号
            processDeal.setSampleSupplier(order == null ? null : order.getCompany());//供样单位=委托单位
            processDeal.setNum(insSample.getQuantity() == null ? 1 : insSample.getQuantity());//样品数量
            processDeal.setDealMethod(resolveDealMethod(order));//处理方式=下单时选择的样品处置
            processDeal.setDealTime(LocalDate.now());//时间=当前时间
            processDeal.setTotaldealId(processTotaldeal.getId());//总表id
            processDeal.setInsSampleId(insSample.getId());//检验样品id
            processDeals.add(processDeal);
        }
        if (!processDeals.isEmpty()) {
            processDealService.saveBatch(processDeals);
        }
        return 0;
        return processDeals.size();
    }
    /**
     * 处理方式:下单时的样品处置 1委托方取回 2检测方处置;历史单无该字段时回退旧的处理方式字段
     */
    private String resolveDealMethod(InsOrder order) {
        if (order == null) {
            return StringUtils.EMPTY;
        }
        if (Integer.valueOf(1).equals(order.getSampleDisposal())) {
            return "委托单位取回";
        }
        if (Integer.valueOf(2).equals(order.getSampleDisposal())) {
            return "实验室处理";
        }
        return Integer.valueOf(1).equals(order.getProcessing()) ? "实验室处理" : "委托单位取回";
    }
    @Override
    public void exportProcessTotaldeal(Integer id, HttpServletResponse response) {
        List<ProcessDeal> sampleDealDtos = processDealMapper.selectDeal(id);
        List<ProcessDealDto> sampleDealDtos = processDealMapper.selectDeal(id);
        ProcessTotaldeal processTotaldeal = processTotaldealMapper.selectById(id);
        // 获取路径
@@ -210,6 +266,7 @@
            template.write(os);
            os.flush();
            os.close();
            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");