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
package com.ruoyi.process.listener;
 
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.inspect.event.NewJuOrderPlacedEvent;
import com.ruoyi.inspect.mapper.InsOrderStandardTemplateMapper;
import com.ruoyi.inspect.mapper.InsSampleMapper;
import com.ruoyi.inspect.pojo.InsOrder;
import com.ruoyi.inspect.pojo.InsOrderStandardTemplate;
import com.ruoyi.inspect.pojo.InsSample;
import com.ruoyi.inspect.service.InsOrderService;
import com.ruoyi.process.mapper.InspectionOrderDetailMapper;
import com.ruoyi.process.mapper.InspectionOrderMapper;
import com.ruoyi.process.pojo.InspectionOrder;
import com.ruoyi.process.pojo.InspectionOrderDetail;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
 
import java.time.LocalDate;
import java.util.List;
import java.util.stream.Collectors;
 
/**
 * 新聚成品下单成功后,自动生成一条检验委托单。
 */
@Component
@AllArgsConstructor
public class NewJuOrderInspectionListener {
 
    private final InsOrderService insOrderService;
    private final InspectionOrderMapper inspectionOrderMapper;
    private final InspectionOrderDetailMapper inspectionOrderDetailMapper;
    private final InsSampleMapper insSampleMapper;
    private final InsOrderStandardTemplateMapper insOrderStandardTemplateMapper;
 
    @EventListener
    public void onNewJuOrderPlaced(NewJuOrderPlacedEvent event) {
        InsOrder order = insOrderService.getById(event.getInsOrderId());
        if (order == null) {
            return;
        }
        // 幂等:同一成品订单已有检验委托单则跳过
        InspectionOrder existingOrder = inspectionOrderMapper.selectOne(Wrappers.<InspectionOrder>lambdaQuery()
                .eq(InspectionOrder::getInsOrderId, order.getId()).last("limit 1"));
        if (existingOrder != null) {
            existingOrder.setEntrustCode(order.getEntrustCode());
            existingOrder.setBatchNo(order.getBatchNo());
            existingOrder.setSampleName(StringUtils.isNotBlank(order.getSampleView()) ? order.getSampleView() : order.getSample());
            existingOrder.setProduction(order.getProduction());
            existingOrder.setQuantity(order.getTestQuantity());
            existingOrder.setCommissionUnit(order.getCompany());
            existingOrder.setCommissionUser(order.getPrepareUser());
            existingOrder.setCommissionPhone(order.getPhone());
            existingOrder.setIsLeave(Integer.valueOf(1).equals(order.getIsLeave()) ? 1 : 2);
            existingOrder.setProcessing(Integer.valueOf(1).equals(order.getSampleDisposal()) ? 0 : 1);
            existingOrder.setSend(Integer.valueOf(1).equals(order.getReportDelivery()) ? 1 : 0);
            inspectionOrderMapper.updateById(existingOrder);
            return;
        }
        InspectionOrder inspectionOrder = new InspectionOrder();
        inspectionOrder.setInsOrderId(order.getId());
        inspectionOrder.setEntrustCode(order.getEntrustCode());
        inspectionOrder.setBatchNo(order.getBatchNo());
        // 试样名称优先取报告展示字段
        inspectionOrder.setSampleName(StringUtils.isNotBlank(order.getSampleView())
                ? order.getSampleView() : order.getSample());
        inspectionOrder.setProduction(order.getProduction());
        inspectionOrder.setQuantity(order.getTestQuantity());
        inspectionOrder.setCommissionDate(LocalDate.now());
        inspectionOrder.setCommissionUnit(order.getCompany());
        inspectionOrder.setCommissionUser(order.getPrepareUser());
        inspectionOrder.setCommissionPhone(order.getPhone());
        inspectionOrder.setSampleStatus("完好");
        // 是否留样语义转换:ins 0否/1是 -> cnas 1是/2否
        inspectionOrder.setIsLeave(Integer.valueOf(1).equals(order.getIsLeave()) ? 1 : 2);
        // 样品处置:1委托方取回/2检测方处置 -> processing 0委托单位取回/1实验室处理;未选时沿用旧字段
        if (Integer.valueOf(1).equals(order.getSampleDisposal())) {
            inspectionOrder.setProcessing(0);
        } else if (Integer.valueOf(2).equals(order.getSampleDisposal())) {
            inspectionOrder.setProcessing(1);
        } else {
            inspectionOrder.setProcessing(order.getProcessing());
        }
        // 报告交付方式:1自取 -> send 1,其余 0;未选时沿用旧字段
        if (order.getReportDelivery() != null) {
            inspectionOrder.setSend(Integer.valueOf(1).equals(order.getReportDelivery()) ? 1 : 0);
        } else {
            inspectionOrder.setSend(order.getSend());
        }
        // 报告文件与约定时间生成时为空,后续在检验委托单页面编辑/上传
        inspectionOrderMapper.insert(inspectionOrder);
        createDetailRow(inspectionOrder, order);
    }
 
    /**
     * 下单即生成一行样品明细,批量下单后整批样品直接汇总在同一张委托书里。
     */
    private void createDetailRow(InspectionOrder inspectionOrder, InsOrder order) {
        InspectionOrderDetail detail = new InspectionOrderDetail();
        detail.setInspectionOrderId(inspectionOrder.getInspectionOrderId());
        detail.setSampleName(inspectionOrder.getSampleName());
        detail.setQuantity(order.getTestQuantity());
        detail.setSampleStatus(inspectionOrder.getSampleStatus());
        detail.setTestStandard(order.getSample());
 
        List<InsSample> samples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
                .eq(InsSample::getInsOrderId, order.getId())
                .orderByAsc(InsSample::getId));
        if (!samples.isEmpty()) {
            detail.setSampleNumber(samples.get(0).getSampleCode());
        }
        String testItem = insOrderStandardTemplateMapper.selectList(
                        Wrappers.<InsOrderStandardTemplate>lambdaQuery()
                                .eq(InsOrderStandardTemplate::getInsOrderId, order.getId())
                                .orderByAsc(InsOrderStandardTemplate::getSort, InsOrderStandardTemplate::getId))
                .stream()
                .map(InsOrderStandardTemplate::getName)
                .filter(StringUtils::isNotBlank)
                .collect(Collectors.joining("、"));
        detail.setTestItem(testItem);
        inspectionOrderDetailMapper.insert(detail);
    }
}