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.technology.bean.dto.TechnologyRoutingOperationDto; import com.ruoyi.technology.bean.dto.TechnologyRoutingOperationParamSyncDto; import com.ruoyi.technology.bean.vo.TechnologyRoutingOperationVo; import com.ruoyi.technology.mapper.TechnologyRoutingMapper; import com.ruoyi.technology.mapper.TechnologyRoutingOperationMapper; import com.ruoyi.technology.pojo.TechnologyRoutingOperation; 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; import java.util.List; @Service @Transactional(rollbackFor = Exception.class) @RequiredArgsConstructor public class TechnologyRoutingOperationServiceImpl extends ServiceImpl implements TechnologyRoutingOperationService { private final TechnologyRoutingOperationMapper technologyRoutingOperationMapper; private final TechnologyRoutingMapper technologyRoutingMapper; private final TechnologyRoutingOperationParamService technologyRoutingOperationParamService; @Override public IPage pageTechnologyRoutingOperation(Page page, TechnologyRoutingOperationDto technologyRoutingOperationDto) { return technologyRoutingOperationMapper.pageTechnologyRoutingOperation(page, technologyRoutingOperationDto); } @Override public List 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; } @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 technologyRouteOperations = technologyRoutingOperationMapper.selectList(Wrappers.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.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 operationList = technologyRoutingOperationMapper.selectList( Wrappers.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); } } } }