package com.ruoyi.process.listener; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.basic.mapper.StandardMethodMapper; import com.ruoyi.basic.mapper.StandardTreeMapper; import com.ruoyi.basic.pojo.StandardMethod; import com.ruoyi.basic.pojo.StandardTree; 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; private final StandardTreeMapper standardTreeMapper; private final StandardMethodMapper standardMethodMapper; @EventListener public void onNewJuOrderPlaced(NewJuOrderPlacedEvent event) { InsOrder order = insOrderService.getById(event.getInsOrderId()); if (order == null) { return; } // 幂等:同一成品订单已有检验委托单则跳过 InspectionOrder existingOrder = inspectionOrderMapper.selectOne(Wrappers.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(order.getSampleDate() != null ? order.getSampleDate() : LocalDate.now()); inspectionOrder.setCommissionUnit(order.getCompany()); inspectionOrder.setCommissionUser(order.getPrepareUser()); inspectionOrder.setCommissionPhone(order.getPhone()); inspectionOrder.setSampleStatus(order.getSampleStatus()); // 是否留样语义转换: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.setRemark(order.getRemark()); List samples = insSampleMapper.selectList(Wrappers.lambdaQuery() .eq(InsSample::getInsOrderId, order.getId()) .orderByAsc(InsSample::getId)); if (!samples.isEmpty()) { detail.setSampleNumber(samples.get(0).getSampleCode()); } List templates = insOrderStandardTemplateMapper.selectList( Wrappers.lambdaQuery() .eq(InsOrderStandardTemplate::getInsOrderId, order.getId()) .orderByAsc(InsOrderStandardTemplate::getSort, InsOrderStandardTemplate::getId)); detail.setTestStandard(resolveTestStandard(order, templates)); detail.setTestItem(templates.stream() .map(InsOrderStandardTemplate::getName) .filter(StringUtils::isNotBlank) .collect(Collectors.joining("、"))); inspectionOrderDetailMapper.insert(detail); } /** * 检测依据显示“标准号+标准名称”,优先取标准方法,取不到时回退到模板快照编号。 */ private String resolveTestStandard(InsOrder order, List templates) { if (order.getStandardTreeId() != null) { StandardTree tree = standardTreeMapper.selectById(order.getStandardTreeId()); if (tree != null && tree.getStandardMethodId() != null) { StandardMethod method = standardMethodMapper.selectById(tree.getStandardMethodId()); if (method != null) { String combined = (StringUtils.trimToEmpty(method.getCode()) + " " + StringUtils.trimToEmpty(method.getName())).trim(); if (StringUtils.isNotBlank(combined)) { return combined; } } } } return templates.stream() .map(InsOrderStandardTemplate::getNumber) .filter(StringUtils::isNotBlank) .distinct() .collect(Collectors.joining("、")); } }