From 6f0df10fdd0e55e5ed3e31b1720efd25e2bf02fb Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期三, 16 九月 2026 18:51:12 +0800
Subject: [PATCH] fix: 添加条件过滤以确保查询结果中合格数量大于零

---
 src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingOperationServiceImpl.java |  238 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 230 insertions(+), 8 deletions(-)

diff --git a/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingOperationServiceImpl.java b/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingOperationServiceImpl.java
index f937f8d..a400bc1 100644
--- a/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingOperationServiceImpl.java
+++ b/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingOperationServiceImpl.java
@@ -1,20 +1,242 @@
 package com.ruoyi.technology.service.impl;
 
+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.common.exception.ServiceException;
+import com.ruoyi.technology.bean.dto.TechnologyRoutingOperationDto;
+import com.ruoyi.technology.bean.dto.TechnologyRoutingOperationParamSyncDto;
+import com.ruoyi.technology.bean.vo.TechnologyRoutingOperationVo;
+import com.ruoyi.technology.mapper.TechnologyOperationMapper;
+import com.ruoyi.technology.mapper.TechnologyRoutingMapper;
 import com.ruoyi.technology.mapper.TechnologyRoutingOperationMapper;
+import com.ruoyi.technology.mapper.TechnologyRoutingOperationParamMapper;
+import com.ruoyi.technology.pojo.TechnologyOperation;
+import com.ruoyi.technology.pojo.TechnologyRouting;
 import com.ruoyi.technology.pojo.TechnologyRoutingOperation;
+import com.ruoyi.technology.pojo.TechnologyRoutingOperationParam;
+import com.ruoyi.technology.service.TechnologyRoutingOperationParamService;
 import com.ruoyi.technology.service.TechnologyRoutingOperationService;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
-/**
- * <p>
- * 宸ヨ壓璺嚎宸ュ簭琛� 鏈嶅姟瀹炵幇绫�
- * </p>
- *
- * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
- * @since 2026-04-20 10:06:47
- */
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 @Service
+@Transactional(rollbackFor = Exception.class)
+@RequiredArgsConstructor
 public class TechnologyRoutingOperationServiceImpl extends ServiceImpl<TechnologyRoutingOperationMapper, TechnologyRoutingOperation> implements TechnologyRoutingOperationService {
 
+    private final TechnologyRoutingOperationMapper technologyRoutingOperationMapper;
+
+    private final TechnologyRoutingMapper technologyRoutingMapper;
+    private final TechnologyOperationMapper technologyOperationMapper;
+    private final TechnologyRoutingOperationParamMapper technologyRoutingOperationParamMapper;
+    private final TechnologyRoutingOperationParamService technologyRoutingOperationParamService;
+
+    @Override
+    public IPage<TechnologyRoutingOperationVo> pageTechnologyRoutingOperation(Page<TechnologyRoutingOperationDto> page,
+                                                                              TechnologyRoutingOperationDto technologyRoutingOperationDto) {
+        return technologyRoutingOperationMapper.pageTechnologyRoutingOperation(page, technologyRoutingOperationDto);
+    }
+
+    @Override
+    public List<TechnologyRoutingOperationVo> listTechnologyRoutingOperation(TechnologyRoutingOperationDto technologyRoutingOperationDto) {
+        return technologyRoutingOperationMapper.listTechnologyRoutingOperation(technologyRoutingOperationDto);
+    }
+
+    @Override
+    public TechnologyRoutingOperationVo getTechnologyRoutingOperationInfo(Long id) {
+        return technologyRoutingOperationMapper.getTechnologyRoutingOperationInfo(id);
+    }
+
+    @Override
+    public boolean saveTechnologyRoutingOperation(TechnologyRoutingOperation technologyRoutingOperation) {
+        if (technologyRoutingOperation.getTechnologyRoutingId() == null
+                || technologyRoutingMapper.selectById(technologyRoutingOperation.getTechnologyRoutingId()) == null) {
+            throw new RuntimeException("宸ヨ壓璺嚎涓嶅瓨鍦紝鏃犳硶淇濆瓨宸ュ簭");
+        }
+        if (technologyRoutingOperation.getDragSort() == null || technologyRoutingOperation.getDragSort() <= 0) {
+            technologyRoutingOperation.setDragSort(nextDragSort(technologyRoutingOperation.getTechnologyRoutingId()));
+        }
+        boolean saved = this.save(technologyRoutingOperation);
+        if (saved) {
+            TechnologyRoutingOperationParamSyncDto syncDto = new TechnologyRoutingOperationParamSyncDto();
+            syncDto.setTechnologyRoutingOperationId(technologyRoutingOperation.getId());
+            syncDto.setReplaceExisting(true);
+            technologyRoutingOperationParamService.syncTechnologyRoutingOperationParam(syncDto);
+        }
+        return saved;
+    }
+
+    /**
+     * 鍏ㄩ噺淇濆瓨宸ヨ壓璺嚎宸ュ簭锛�
+     * 1) 鎸夋彁浜ら『搴忎綔涓哄伐搴忛『搴忥紙dragSort 浠� 1 寮�濮嬶級锛�
+     * 2) 姣忛亾宸ュ簭鍙厑璁稿嚭鐜颁竴娆★紝涓庘�滄寜BOM宸ュ簭鍘婚噸鐢熸垚鈥濅繚鎸佷竴鑷达紱
+     * 3) 宸ュ簭浜у嚭瑙勬牸鍥哄畾涓哄伐鑹鸿矾绾跨殑鎴愬搧瑙勬牸锛�
+     * 4) 鏈洖浼犵殑宸ュ簭杩炲悓鍙傛暟蹇収涓�骞跺垹闄ゃ��
+     */
+    @Override
+    public boolean saveRouteOperations(TechnologyRoutingOperationDto dto) {
+        if (dto == null) {
+            throw new ServiceException("鍙傛暟涓嶈兘涓虹┖");
+        }
+        Long technologyRoutingId = dto.getTechnologyRoutingId() != null ? dto.getTechnologyRoutingId() : dto.getRouteId();
+        if (technologyRoutingId == null) {
+            throw new ServiceException("宸ヨ壓璺嚎ID涓嶈兘涓虹┖");
+        }
+        TechnologyRouting technologyRouting = technologyRoutingMapper.selectById(technologyRoutingId);
+        if (technologyRouting == null) {
+            throw new ServiceException("宸ヨ壓璺嚎涓嶅瓨鍦�");
+        }
+        List<TechnologyRoutingOperationDto> operationList = dto.getOperationList() == null
+                ? Collections.emptyList()
+                : dto.getOperationList();
+
+        List<TechnologyRoutingOperation> dbList = this.list(Wrappers.<TechnologyRoutingOperation>lambdaQuery()
+                .eq(TechnologyRoutingOperation::getTechnologyRoutingId, technologyRoutingId));
+        Set<Long> dbIds = dbList.stream().map(TechnologyRoutingOperation::getId).collect(Collectors.toSet());
+
+        Set<Long> submittedIds = new HashSet<>();
+        Set<Long> submittedOperationIds = new HashSet<>();
+        List<TechnologyRoutingOperation> insertList = new ArrayList<>();
+        List<TechnologyRoutingOperation> updateList = new ArrayList<>();
+
+        int dragSort = 1;
+        for (TechnologyRoutingOperationDto item : operationList) {
+            Long technologyOperationId = item.getTechnologyOperationId();
+            if (technologyOperationId == null) {
+                throw new ServiceException("璇蜂负鎵�鏈夊伐搴忛�夋嫨宸ヨ壓宸ュ簭");
+            }
+            TechnologyOperation technologyOperation = technologyOperationMapper.selectById(technologyOperationId);
+            if (technologyOperation == null) {
+                throw new ServiceException("宸ヨ壓宸ュ簭涓嶅瓨鍦�");
+            }
+            if (!submittedOperationIds.add(technologyOperationId)) {
+                throw new ServiceException("鍚屼竴閬撳伐搴忎笉鑳介噸澶嶅嚭鐜板湪宸ヨ壓璺嚎涓細" + technologyOperation.getName());
+            }
+
+            TechnologyRoutingOperation entity = new TechnologyRoutingOperation();
+            entity.setTechnologyRoutingId(technologyRoutingId);
+            entity.setProductModelId(technologyRouting.getProductModelId());
+            entity.setTechnologyOperationId(technologyOperationId);
+            entity.setDragSort(dragSort++);
+            entity.setIsQuality(technologyOperation.getIsQuality());
+            entity.setIsProduction(technologyOperation.getIsProduction());
+            entity.setType(technologyOperation.getType());
+
+            if (item.getId() == null) {
+                insertList.add(entity);
+            } else {
+                if (!dbIds.contains(item.getId())) {
+                    throw new ServiceException("宸ヨ壓璺嚎宸ュ簭涓嶅瓨鍦ㄦ垨涓嶅睘浜庡綋鍓嶅伐鑹鸿矾绾�");
+                }
+                entity.setId(item.getId());
+                submittedIds.add(item.getId());
+                updateList.add(entity);
+            }
+        }
+
+        Set<Long> deleteIds = new HashSet<>(dbIds);
+        deleteIds.removeAll(submittedIds);
+        if (!deleteIds.isEmpty()) {
+            // 鍒犻櫎宸ュ簭鏃跺悓鏃舵竻鐞嗗叾鍙傛暟蹇収锛岄伩鍏嶇暀涓嬪绔嬫暟鎹�
+            technologyRoutingOperationParamMapper.delete(Wrappers.<TechnologyRoutingOperationParam>lambdaQuery()
+                    .in(TechnologyRoutingOperationParam::getTechnologyRoutingOperationId, deleteIds));
+            for (Long deleteId : deleteIds) {
+                removeTechnologyRoutingOperation(deleteId);
+            }
+        }
+        if (!updateList.isEmpty()) {
+            this.updateBatchById(updateList);
+        }
+        for (TechnologyRoutingOperation insert : insertList) {
+            saveTechnologyRoutingOperation(insert);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean removeTechnologyRoutingOperation(Long id) {
+        TechnologyRoutingOperation technologyRoutingOperation = this.getById(id);
+        if (technologyRoutingOperation == null) {
+            return false;
+        }
+        boolean removed = this.removeById(id);
+        if (removed) {
+            resetDragSort(technologyRoutingOperation.getTechnologyRoutingId());
+        }
+        return removed;
+    }
+
+    @Override
+    public int sort(TechnologyRoutingOperation technologyRoutingOperation) {
+        //鏌ヨ琚敼鍔ㄧ殑杩欐潯鏁版嵁
+        TechnologyRoutingOperation oldtechnologyRoutingOperation = technologyRoutingOperationMapper.selectById(technologyRoutingOperation.getId());
+        //鏌ヨ璇ュ伐鑹鸿矾绾跨殑鎵�鏈夊伐搴忓苟鎸夌収椤哄簭鎺掑簭
+        List<TechnologyRoutingOperation> technologyRouteOperations = technologyRoutingOperationMapper.selectList(Wrappers.<TechnologyRoutingOperation>lambdaQuery()
+                .eq(TechnologyRoutingOperation::getTechnologyRoutingId, oldtechnologyRoutingOperation.getTechnologyRoutingId())
+                .orderByAsc(TechnologyRoutingOperation::getDragSort));
+        // 鑾峰彇鐩爣浣嶇疆锛堢Щ鍔ㄥ埌绗嚑涓箣鍚庯級
+        Integer targetPosition = technologyRoutingOperation.getDragSort();
+        if (targetPosition != null && targetPosition >= 0) {
+            // 绉诲姩鍏冪礌鍒版柊鐨勪綅缃�
+            technologyRouteOperations.remove(oldtechnologyRoutingOperation);
+            technologyRouteOperations.add(targetPosition-1, oldtechnologyRoutingOperation);
+            // 鏇存柊鎵�鏈夊彈褰卞搷鐨勬帓搴忓瓧娈�
+            for (int i = 0; i < technologyRouteOperations.size(); i++) {
+                TechnologyRoutingOperation item = technologyRouteOperations.get(i);
+                if (!item.getId().equals(oldtechnologyRoutingOperation.getId())) {
+                    // 妫�鏌ユ槸鍚﹂渶瑕佹洿鏂版帓搴忓��
+                    if (item.getDragSort() != i+1) {
+                        item.setDragSort(i+1);
+                        technologyRoutingOperationMapper.updateById(item);
+                    }
+                } else {
+                    // 鏇存柊鍘熻褰曠殑鏂版帓搴忎綅缃�
+                    oldtechnologyRoutingOperation.setDragSort(targetPosition);
+                    technologyRoutingOperationMapper.updateById(oldtechnologyRoutingOperation);
+                }
+            }
+            return 1;
+        }
+        return 0;
+    }
+
+    private Integer nextDragSort(Long technologyRoutingId) {
+        TechnologyRoutingOperation lastOperation = technologyRoutingOperationMapper.selectOne(
+                Wrappers.<TechnologyRoutingOperation>lambdaQuery()
+                        .eq(TechnologyRoutingOperation::getTechnologyRoutingId, technologyRoutingId)
+                        .orderByDesc(TechnologyRoutingOperation::getDragSort)
+                        .last("limit 1")
+        );
+        if (lastOperation == null || lastOperation.getDragSort() == null) {
+            return 1;
+        }
+        return lastOperation.getDragSort() + 1;
+    }
+
+    private void resetDragSort(Long technologyRoutingId) {
+        List<TechnologyRoutingOperation> operationList = technologyRoutingOperationMapper.selectList(
+                Wrappers.<TechnologyRoutingOperation>lambdaQuery()
+                        .eq(TechnologyRoutingOperation::getTechnologyRoutingId, technologyRoutingId)
+                        .orderByAsc(TechnologyRoutingOperation::getDragSort)
+                        .orderByAsc(TechnologyRoutingOperation::getId)
+        );
+        for (int i = 0; i < operationList.size(); i++) {
+            TechnologyRoutingOperation item = operationList.get(i);
+            int dragSort = i + 1;
+            if (item.getDragSort() == null || item.getDragSort() != dragSort) {
+                item.setDragSort(dragSort);
+                technologyRoutingOperationMapper.updateById(item);
+            }
+        }
+    }
 }

--
Gitblit v1.9.3