liding
7 小时以前 444409ba734d4457f9109f0b71422b83fed60cd6
refactor(inspect): 重构设备列表查询和报告生成逻辑
已添加1个文件
已修改6个文件
193 ■■■■ 文件已修改
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderTemplateDeviceMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsOrderMapper.xml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsOrderTemplateDeviceMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/static/detection-report-template-v2.docx 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/static/inspection-report-template-v2.docx 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java
@@ -37,7 +37,8 @@
    IPage<SampleProductDto2> selectSampleAndProductByOrderId(@Param("page") IPage<SampleProductDto2> page, @Param("ew") QueryWrapper<SampleProductDto2> ew, @Param("id") Integer id);
    List<Map<String, String>> selectDeviceList(@Param("managementNumbers") Set<String> managementNumbers);
    List<Map<String, String>> selectDeviceListByIds(@Param("deviceIds") Set<Integer> deviceIds);
    List<SampleDefectsFatherVo> selectSampleDefects(Page page, @Param("inspectionItems") String inspectionItems, @Param("orderNumber") String orderNumber);
    String getStandardMethodCode(@Param("id") Integer id);
@@ -56,6 +57,7 @@
    /**
     * æŸ¥è¯¢æ£€éªŒç»“æžœ
     *
     * @param ids
     * @return
     */
@@ -63,6 +65,7 @@
    /**
     * èŽ·å–æ‰¹é‡æ£€éªŒçš„æ€»æ•°
     *
     * @param id
     * @return
     */
@@ -70,6 +73,7 @@
    /**
     * èŽ·å–çº¿èŠ¯é¢œè‰²
     *
     * @param id
     * @return
     */
@@ -84,6 +88,7 @@
    /**
     * åªæŸ¥è¯¢é»˜è®¤ç¬¬ä¸€ä¸ªçš„产品
     *
     * @param id
     * @return
     */
@@ -91,6 +96,7 @@
    /**
     * æŸ¥è¯¢æ—¥åކ图
     *
     * @param
     * @return
     */
@@ -112,6 +118,7 @@
    /**
     * æˆå“æ ‡ç­¾æ‰“印
     *
     * @param ids
     * @return
     */
@@ -119,6 +126,7 @@
    /**
     * å¤–购产品标签打印
     *
     * @param ids
     * @return
     */
@@ -126,12 +134,14 @@
    /**
     * æŸ¥è¯¢å¯¼å‡ºä¿¡æ¯
     *
     * @return
     */
    List<SampleOrderDto> rawAllInsOrderExport(@Param("ew") QueryWrapper<SampleOrderDto> ew, @Param("laboratory") String laboratory, @Param("isOrderAll") String isOrderAll);
    /**
     * æ ¹æ®è®¢å•查询试验室
     *
     * @param insOrderId
     * @return
     */
@@ -139,6 +149,7 @@
    /**
     * æŸ¥è¯¢è®¢å•信息
     *
     * @param insSampleId
     * @return
     */
@@ -146,6 +157,7 @@
    /**
     * æ ¹æ®è®¢å•id查询订单导出信息
     *
     * @param orderIds
     * @return
     */
@@ -153,6 +165,7 @@
    /**
     * æŸ¥è¯¢å½“前时间是否有该检测项的抽样计划订单
     *
     * @param itmeId    æ ·å“Id
     * @param startTime å¼€å§‹æ—¶é—´
     * @param endTime   ç»“束时间
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderTemplateDeviceMapper.java
@@ -4,26 +4,13 @@
import com.ruoyi.inspect.pojo.InsOrderTemplateDevice;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface InsOrderTemplateDeviceMapper extends BaseMapper<InsOrderTemplateDevice> {
    @Select({"<script>",
            "select id from device where id in",
            "<foreach collection='deviceIds' item='deviceId' open='(' separator=',' close=')'>",
            "#{deviceId}",
            "</foreach>",
            "</script>"})
    List<Integer> selectExistingDeviceIds(@Param("deviceIds") List<Integer> deviceIds);
    @Select("select distinct d.management_number " +
            "from ins_order_template_device otd " +
            "join device d on d.id = otd.device_id " +
            "where otd.ins_order_id = #{orderId} " +
            "and d.management_number is not null and d.management_number <> '' " +
            "order by d.management_number")
    List<String> selectManagementNumbersByOrderId(@Param("orderId") Integer orderId);
    List<Integer> selectDeviceIdsByOrderId(@Param("orderId") Integer orderId);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
@@ -75,6 +75,7 @@
import java.nio.file.Paths;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
@@ -3212,7 +3213,6 @@
        boolean showResult = Objects.equals(reportType, INSPECTION_REPORT);
        List<Map<String, Object>> tables = new ArrayList<>();
        Set<String> standardMethod = new LinkedHashSet<>();
        Set<String> deviceSet = new HashSet<>();
        Set<String> models = new HashSet<>();
        // æŸ¥è¯¢æ£€éªŒé¡¹æ•°é‡
        AtomicInteger productSize = new AtomicInteger();
@@ -3230,17 +3230,6 @@
                    standardMethodCode = standardMethodCode + "+" + a.getSpecialStandardMethod();
                }
                standardMethod.add(standardMethodCode);
            }
            for (InsProduct b : a.getInsProduct()) {
                if (b.getInsProductResult() != null) {
                    List<JSONObject> jsonObjects = JSON.parseArray(b.getInsProductResult().getEquipValue(), JSONObject.class);
                    for (JSONObject jsonObject : jsonObjects) {
                        if (!"".equals(jsonObject.get("v") + "")) {
                            List<String> v = StrUtil.split(jsonObject.get("v") + "", ",");
                            deviceSet.addAll(v);
                        }
                    }
                }
            }
            // ç›´ç»‘模板的检测报告、检验报告都使用新版固定结果行,不再进入旧版检验项表格逻辑。
            // ç›´ç»‘模板中的承载记录没有旧检验项字段,进入旧逻辑会在格式化时产生空指针。
@@ -3271,28 +3260,6 @@
                }
                max = a.getQuantity();
                // å­£åº¦æ£€éªŒéœ€è¦è¿›åŽ‚æ£€éªŒçš„è®¾å¤‡
                // æŸ¥è¯¢æ˜¯å¦æœ‰è¿›åŽ‚æ£€éªŒ
                InsOrder order = insOrderMapper.selectOne(Wrappers.<InsOrder>lambdaQuery()
                        .eq(InsOrder::getIfsInventoryId, insOrder.getIfsInventoryId())
                        .ne(InsOrder::getState, -1)
                        .eq(InsOrder::getOrderType, InsOrderTypeConstants.ENTER_THE_FACTORY)
                        .ne(InsOrder::getId, insOrder.getId())
                        .last("limit 1"));
                if (order != null) {
                    List<SampleProductDto> sampleProductDtos = insSampleMapper.selectSampleProductListByOrderId(order.getId());
                    for (InsProduct b : sampleProductDtos.get(0).getInsProduct()) {
                        if (b.getInsProductResult() != null) {
                            List<JSONObject> jsonObjects = JSON.parseArray(b.getInsProductResult().getEquipValue(), JSONObject.class);
                            for (JSONObject jsonObject : jsonObjects) {
                                if (!"".equals(jsonObject.get("v") + "")) {
                                    List<String> v = StrUtil.split(jsonObject.get("v") + "", ",");
                                    deviceSet.addAll(v);
                                }
                            }
                        }
                    }
                }
                if (StringUtils.isBlank(insOrder.getSampleView())) {
                    insOrder.setSampleView(insOrder.getSample());
                }
@@ -3448,20 +3415,13 @@
        tables.forEach(table -> {
            table.put("tableSize", tables.size() + 1);
        });
        // æ–°è®¢å•按模板选择设备;旧订单没有模板设备关系时回退到订单级设备记录。
        Set<String> reportDeviceNumbers = insOrderTemplateDeviceMapper
                .selectManagementNumbersByOrderId(orderId).stream()
                .filter(StringUtils::isNotBlank)
        // æŠ¥å‘Šåªå±•示检验单各模板选择的设备,并按设备ID去重。
        Set<Integer> reportDeviceIds = insOrderTemplateDeviceMapper
                .selectDeviceIdsByOrderId(orderId).stream()
                .filter(Objects::nonNull)
                .collect(Collectors.toCollection(LinkedHashSet::new));
        if (reportDeviceNumbers.isEmpty()) {
            reportDeviceNumbers.addAll(insOrderDeviceRecordMapper.selectDeviceNumber(orderId).stream()
                    .map(InsOrderDeviceRecordDto::getManagementNumber)
                    .filter(StringUtils::isNotBlank)
                    .collect(Collectors.toList()));
        }
        reportDeviceNumbers.addAll(deviceSet);
        List<Map<String, String>> deviceList = reportDeviceNumbers.isEmpty()
                ? new ArrayList<>() : insOrderMapper.selectDeviceList(reportDeviceNumbers);
        List<Map<String, String>> deviceList = reportDeviceIds.isEmpty()
                ? new ArrayList<>() : insOrderMapper.selectDeviceListByIds(reportDeviceIds);
        if (CollectionUtils.isNotEmpty(deviceList)) {
            int count = 1;
            for (Map<String, String> stringMap : deviceList) {
@@ -3562,28 +3522,18 @@
            sendTime = reportInventory.getDeclareDate();
        }
        // æ£€æµ‹æ—¥æœŸï¼šé¦–次保存模板值时间-首次提交时间
        // æ£€æµ‹æ—¥æœŸï¼šæ±‡æ€»æ£€éªŒå•各模板填写的检测时间,日期相同显示一个,否则显示最早至最晚。
        LocalDateTime now = LocalDateTime.now();
        // æäº¤æ—¶é—´
        LocalDateTime submitTime = LocalDateTime.now();
        // åˆ¤æ–­æ˜¯å¦æœ‰æäº¤æ—¶é—´
        if (insOrder.getFirstSubmitDate() != null) {
            submitTime = insOrder.getFirstSubmitDate();
        }
        LocalDateTime firstInspectDate = insOrder.getFirstInspectDate();
        // å­—段上线前的历史订单沿用原来的下发时间,避免改变既有报告口径。
        if (firstInspectDate == null) {
            firstInspectDate = insOrder.getSendTime();
        }
        if (firstInspectDate == null) {
            firstInspectDate = submitTime;
        }
        String insTime = formatReportTestDate(firstInspectDate, submitTime);
        String insTimeEn = monthNames[firstInspectDate.getMonthValue() - 1] + " " + firstInspectDate.format(DateTimeFormatter.ofPattern("dd, yyyy")) + "-"
                + monthNames[submitTime.getMonthValue() - 1] + " " + submitTime.format(DateTimeFormatter.ofPattern("dd, yyyy"));
        List<InsOrderStandardTemplate> templateSnapshots = insOrderStandardTemplateService.list(
                Wrappers.<InsOrderStandardTemplate>lambdaQuery()
                        .eq(InsOrderStandardTemplate::getInsOrderId, orderId)
                        .orderByAsc(InsOrderStandardTemplate::getSort, InsOrderStandardTemplate::getId));
        List<LocalDate> detectionDates = templateSnapshots.stream()
                .map(InsOrderStandardTemplate::getDetectionTime)
                .filter(Objects::nonNull)
                .collect(Collectors.toList());
        String insTime = formatReportTestDate(detectionDates);
        String insTimeEn = formatReportTestDateEn(detectionDates, monthNames);
        // æ£€éªŒçŽ¯å¢ƒï¼šä¼˜å…ˆæ±‡æ€»å„æ¨¡æ¿å¡«å†™çš„æ¸©æ¹¿åº¦ï¼ŒæŠ¥å‘Šå±•ç¤ºå…¨éƒ¨æ¨¡æ¿çš„æœ€å°å€¼åˆ°æœ€å¤§å€¼ã€‚
        String environment = buildReportEnvironment(orderId, insOrder);
@@ -3621,10 +3571,6 @@
            batchNo = defaultReportText(reportInventory.getUpdateBatchNo(), reportInventory.getLotBatchNo());
        }
        // æ–°èšç›´ç»‘模板订单:报告信息取委托信息和订单模板快照,不再取能力范围标准方法。
        List<InsOrderStandardTemplate> templateSnapshots = insOrderStandardTemplateService.list(
                Wrappers.<InsOrderStandardTemplate>lambdaQuery()
                        .eq(InsOrderStandardTemplate::getInsOrderId, orderId)
                        .orderByAsc(InsOrderStandardTemplate::getSort, InsOrderStandardTemplate::getId));
        boolean newJuTemplateOrder = !templateSnapshots.isEmpty() && directTemplateOrder;
        if (newJuTemplateOrder) {
            productName = defaultReportText(insOrder.getSampleView(), insOrder.getSample());
@@ -3945,11 +3891,16 @@
        for (Map<String, String> device : deviceList) {
            String name = getMapText(device, "deviceName", "device_name");
            String managementNumber = getMapText(device, "managementNumber", "management_number");
            String item = defaultReportText(name, "/");
            if (StringUtils.isNotBlank(managementNumber)) {
                item += ":" + managementNumber;
            if (StringUtils.isBlank(name) || "/".equals(name.trim())) {
                continue;
            }
            String number = StringUtils.isBlank(managementNumber) || "/".equals(managementNumber.trim())
                    ? "出厂编号" : managementNumber.trim();
            String item = name.trim() + ":" + number;
            equipmentItems.add(item);
        }
        if (equipmentItems.isEmpty()) {
            return "/";
        }
        List<String> items = new ArrayList<>(equipmentItems);
        List<String> lines = new ArrayList<>();
@@ -4049,12 +4000,31 @@
        return StringUtils.isNotBlank(fallback) ? fallback : "/";
    }
    private static String formatReportTestDate(LocalDateTime startTime, LocalDateTime endTime) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyå¹´MM月dd日");
        if (startTime.toLocalDate().equals(endTime.toLocalDate())) {
            return startTime.format(formatter);
    private static String formatReportTestDate(List<LocalDate> detectionDates) {
        if (CollectionUtils.isEmpty(detectionDates)) {
            return "/";
        }
        return startTime.format(formatter) + "至" + endTime.format(formatter);
        LocalDate startDate = Collections.min(detectionDates);
        LocalDate endDate = Collections.max(detectionDates);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyå¹´MM月dd日");
        if (startDate.equals(endDate)) {
            return startDate.format(formatter);
        }
        return startDate.format(formatter) + "至" + endDate.format(formatter);
    }
    private static String formatReportTestDateEn(List<LocalDate> detectionDates, String[] monthNames) {
        if (CollectionUtils.isEmpty(detectionDates)) {
            return "/";
        }
        LocalDate startDate = Collections.min(detectionDates);
        LocalDate endDate = Collections.max(detectionDates);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd, yyyy");
        String startText = monthNames[startDate.getMonthValue() - 1] + " " + startDate.format(formatter);
        if (startDate.equals(endDate)) {
            return startText;
        }
        return startText + "-" + monthNames[endDate.getMonthValue() - 1] + " " + endDate.format(formatter);
    }
    /**
inspect-server/src/main/resources/mapper/InsOrderMapper.xml
@@ -241,7 +241,7 @@
        </if>
    </select>
    <select id="selectDeviceList" resultType="java.util.Map">
    <select id="selectDeviceListByIds" resultType="java.util.Map">
        select device_name,
               en_device_name,
               specification_model,
@@ -249,10 +249,14 @@
               date_format(activation_date,'%Y-%m-%d')
        latest_traceability
        from device
        where device.management_number in
        <foreach collection="managementNumbers" index="index" open="(" separator="," close=")" item="val">
        where device.id in
        <foreach collection="deviceIds" index="index" open="(" separator="," close=")" item="val">
            #{val}
        </foreach>
        order by field(device.id,
        <foreach collection="deviceIds" index="index" separator="," item="val">
            #{val}
        </foreach>)
    </select>
    <update id="updateStatus">
inspect-server/src/main/resources/mapper/InsOrderTemplateDeviceMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.inspect.mapper.InsOrderTemplateDeviceMapper">
    <select id="selectExistingDeviceIds" resultType="java.lang.Integer">
        select id
        from device
        where id in
        <foreach collection="deviceIds" item="deviceId" open="(" separator="," close=")">
            #{deviceId}
        </foreach>
    </select>
    <select id="selectDeviceIdsByOrderId" resultType="java.lang.Integer">
        select otd.device_id
        from ins_order_template_device otd
        where otd.ins_order_id = #{orderId}
          and otd.device_id is not null
        group by otd.device_id
        order by min(otd.sort), otd.device_id
    </select>
</mapper>
inspect-server/src/main/resources/static/detection-report-template-v2.docx
Binary files differ
inspect-server/src/main/resources/static/inspection-report-template-v2.docx
Binary files differ