2026-04-22 20fc9ea9b6e4f885ced57a7ab7b98385834eb39a
feat(technology): 完善工艺路线工序管理功能

- 更新开发环境配置文件中的令牌密钥
- 为技术操作控制器添加明确的POST请求路径
- 为技术操作参数控制器设置根路径POST请求
- 为工艺路线操作控制器添加新增接口路径
- 在工艺路线操作DTO中增加路由ID兼容字段
- 扩展工艺路线操作映射器接口方法
- 实现工艺路线操作分页、列表和详情查询功能
- 在映射器XML中添加完整的SQL查询语句
- 优化工艺路线操作参数实体类注释
- 为工艺路线操作参数控制器添加新增路径
- 删除映射器XML中多余的字段映射
- 重构工艺路线操作参数服务实现逻辑
- 添加参数验证和数据填充机制
- 完善参数同步和校验功能
- 优化工艺路线操作服务的数据访问层
- 实现工艺路线操作的自动参数同步
- 扩展工艺路线操作返回对象属性
- 完善工艺路线服务的删除和同步逻辑
- 实现BOM结构到工艺路线的参数同步机制
已修改14个文件
337 ■■■■ 文件已修改
src/main/java/com/ruoyi/technology/bean/dto/TechnologyRoutingOperationDto.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/bean/vo/TechnologyRoutingOperationVo.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/controller/TechnologyOperationController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/controller/TechnologyOperationParamController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationParamController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/mapper/TechnologyRoutingOperationMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/pojo/TechnologyRoutingOperationParam.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingOperationParamServiceImpl.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingOperationServiceImpl.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/technology/TechnologyRoutingOperationMapper.xml 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/technology/TechnologyRoutingOperationParamMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/bean/dto/TechnologyRoutingOperationDto.java
@@ -2,6 +2,7 @@
import com.ruoyi.technology.pojo.TechnologyRoutingOperation;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -9,4 +10,7 @@
@Data
@ApiModel(value = "TechnologyRoutingOperationDto对象", description = "工艺路线工序查询参数")
public class TechnologyRoutingOperationDto extends TechnologyRoutingOperation {
    @ApiModelProperty("工艺路线id(兼容旧参数 routeId)")
    private Long routeId;
}
src/main/java/com/ruoyi/technology/bean/vo/TechnologyRoutingOperationVo.java
@@ -2,6 +2,7 @@
import com.ruoyi.technology.pojo.TechnologyRoutingOperation;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -9,4 +10,19 @@
@Data
@ApiModel(value = "TechnologyRoutingOperationVo对象", description = "工艺路线工序返回对象")
public class TechnologyRoutingOperationVo extends TechnologyRoutingOperation {
    @ApiModelProperty("工序名称")
    private String technologyOperationName;
    @ApiModelProperty("产品名称")
    private String productName;
    @ApiModelProperty("规格名称")
    private String model;
    @ApiModelProperty("规格名称")
    private String specificationName;
    @ApiModelProperty("单位")
    private String unit;
}
src/main/java/com/ruoyi/technology/controller/TechnologyOperationController.java
@@ -30,7 +30,7 @@
        return R.ok(technologyOperationService.listPage(page, technologyOperationDto));
    }
    @PostMapping
    @PostMapping("/add")
    @Log(title = "Add technology operation", businessType = BusinessType.INSERT)
    @ApiOperation("新增工序")
    public R add(@RequestBody TechnologyOperationDto technologyOperationDto) {
src/main/java/com/ruoyi/technology/controller/TechnologyOperationParamController.java
@@ -29,7 +29,7 @@
        return R.ok(technologyOperationParamService.listOperationParam(technologyOperationParamDto));
    }
    @PostMapping
    @PostMapping("/")
    @ApiOperation("新增或修改工序参数")
    public R addOrUpdate(@RequestBody TechnologyOperationParam technologyOperationParam) {
        return R.ok(technologyOperationParamService.saveTechnologyOperationParam(technologyOperationParam));
src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationController.java
@@ -40,7 +40,7 @@
        return R.ok(technologyRoutingOperationService.getTechnologyRoutingOperationInfo(id));
    }
    @PostMapping
    @PostMapping("/add")
    @ApiOperation("新增工艺路线工序")
    public R add(@RequestBody TechnologyRoutingOperation technologyRoutingOperation) {
        return R.ok(technologyRoutingOperationService.saveTechnologyRoutingOperation(technologyRoutingOperation));
src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationParamController.java
@@ -42,7 +42,7 @@
        return R.ok(technologyRoutingOperationParamService.getTechnologyRoutingOperationParamInfo(id));
    }
    @PostMapping
    @PostMapping("/add")
    @ApiOperation("新增生产订单工艺路线工序参数")
    public R<Boolean> add(@RequestBody TechnologyRoutingOperationParam technologyRoutingOperationParam) {
        return R.ok(technologyRoutingOperationParamService.saveTechnologyRoutingOperationParam(technologyRoutingOperationParam));
src/main/java/com/ruoyi/technology/mapper/TechnologyRoutingOperationMapper.java
@@ -1,8 +1,15 @@
package com.ruoyi.technology.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.technology.bean.dto.TechnologyRoutingOperationDto;
import com.ruoyi.technology.bean.vo.TechnologyRoutingOperationVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.technology.pojo.TechnologyRoutingOperation;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
@@ -14,5 +21,11 @@
 */
@Mapper
public interface TechnologyRoutingOperationMapper extends BaseMapper<TechnologyRoutingOperation> {
    IPage<TechnologyRoutingOperationVo> pageTechnologyRoutingOperation(Page<TechnologyRoutingOperationDto> page,
                                                                       @Param("c") TechnologyRoutingOperationDto dto);
    List<TechnologyRoutingOperationVo> listTechnologyRoutingOperation(@Param("c") TechnologyRoutingOperationDto dto);
    TechnologyRoutingOperationVo getTechnologyRoutingOperationInfo(@Param("id") Long id);
}
src/main/java/com/ruoyi/technology/pojo/TechnologyRoutingOperationParam.java
@@ -1,6 +1,10 @@
package com.ruoyi.technology.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -8,17 +12,9 @@
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
 * 生产订单工艺路线工序参数表
 * </p>
 *
 * @author 芯导软件(江苏)有限公司
 * @since 2026-04-20 10:22:16
 */
@Data
@TableName("technology_routing_operation_param")
@ApiModel(value = "TechnologyRoutingOperationParam对象", description = "生产订单工艺路线工序参数表")
@ApiModel(value = "TechnologyRoutingOperationParam对象", description = "工艺路线工序参数表")
public class TechnologyRoutingOperationParam implements Serializable {
    private static final long serialVersionUID = 1L;
@@ -26,9 +22,6 @@
    @ApiModelProperty("id")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty("工艺路线工序参数表id")
    private Long technologyRoutingOperationParamId;
    @ApiModelProperty("参数编码(唯一标识)")
    private String paramCode;
src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingOperationParamServiceImpl.java
@@ -38,7 +38,7 @@
    @Override
    public IPage<TechnologyRoutingOperationParamVo> pageTechnologyRoutingOperationParam(Page<TechnologyRoutingOperationParamDto> page,
                                                                                        TechnologyRoutingOperationParamDto dto) {
                                                                                         TechnologyRoutingOperationParamDto dto) {
        Page<TechnologyRoutingOperationParam> entityPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
        return this.page(entityPage, buildQueryWrapper(dto))
                .convert(item -> BeanUtil.copyProperties(item, TechnologyRoutingOperationParamVo.class));
@@ -62,7 +62,6 @@
    public boolean saveTechnologyRoutingOperationParam(TechnologyRoutingOperationParam item) {
        TechnologyRoutingOperation routingOperation = getRoutingOperation(item.getTechnologyRoutingOperationId());
        fillFromOperationParam(item, routingOperation);
        validateManualFields(item);
        checkDuplicate(item);
        return this.saveOrUpdate(item);
    }
@@ -75,7 +74,7 @@
    @Override
    public int syncTechnologyRoutingOperationParam(TechnologyRoutingOperationParamSyncDto syncDto) {
        if (syncDto == null || syncDto.getTechnologyRoutingOperationId() == null) {
            throw new ServiceException("technologyRoutingOperationId is required");
            throw new ServiceException("工艺路线工序ID不能为空");
        }
        TechnologyRoutingOperation routingOperation = getRoutingOperation(syncDto.getTechnologyRoutingOperationId());
        List<TechnologyOperationParam> operationParamList = technologyOperationParamMapper.selectList(
@@ -134,11 +133,11 @@
    private TechnologyRoutingOperation getRoutingOperation(Long technologyRoutingOperationId) {
        if (technologyRoutingOperationId == null) {
            throw new ServiceException("technologyRoutingOperationId is required");
            throw new ServiceException("工艺路线工序ID不能为空");
        }
        TechnologyRoutingOperation routingOperation = technologyRoutingOperationMapper.selectById(technologyRoutingOperationId);
        if (routingOperation == null) {
            throw new ServiceException("Technology routing operation not found");
            throw new ServiceException("工艺路线工序不存在");
        }
        return routingOperation;
    }
@@ -147,22 +146,54 @@
        if (item.getTechnologyOperationId() == null) {
            item.setTechnologyOperationId(routingOperation.getTechnologyOperationId());
        } else if (!item.getTechnologyOperationId().equals(routingOperation.getTechnologyOperationId())) {
            throw new ServiceException("technologyOperationId does not match routing operation");
            throw new ServiceException("工序ID与工艺路线工序不匹配");
        }
        if (item.getTechnologyOperationParamId() == null) {
        if (item.getTechnologyOperationParamId() != null) {
            TechnologyOperationParam operationParam = technologyOperationParamMapper.selectById(item.getTechnologyOperationParamId());
            if (operationParam == null) {
                throw new ServiceException("工序参数不存在");
            }
            if (!routingOperation.getTechnologyOperationId().equals(operationParam.getTechnologyOperationId())) {
                throw new ServiceException("工序参数不属于当前工艺路线工序");
            }
            TechnologyParam technologyParam = technologyParamMapper.selectById(operationParam.getTechnologyParamId());
            if (technologyParam == null) {
                throw new ServiceException("基础参数不存在");
            }
            fillFromTechnologyParam(item, technologyParam);
            if (item.getStandardValue() == null) {
                item.setStandardValue(operationParam.getStandardValue());
            }
            return;
        }
        TechnologyOperationParam operationParam = technologyOperationParamMapper.selectById(item.getTechnologyOperationParamId());
        if (operationParam == null) {
            throw new ServiceException("Technology operation param not found");
        if (item.getParamId() != null) {
            TechnologyParam technologyParam = technologyParamMapper.selectById(item.getParamId());
            if (technologyParam == null) {
                throw new ServiceException("基础参数不存在");
            }
            fillFromTechnologyParam(item, technologyParam);
            TechnologyOperationParam operationParam = technologyOperationParamMapper.selectOne(
                    Wrappers.<TechnologyOperationParam>lambdaQuery()
                            .eq(TechnologyOperationParam::getTechnologyOperationId, routingOperation.getTechnologyOperationId())
                            .eq(TechnologyOperationParam::getTechnologyParamId, item.getParamId())
                            .orderByAsc(TechnologyOperationParam::getId)
                            .last("limit 1")
            );
            if (operationParam != null) {
                item.setTechnologyOperationParamId(operationParam.getId());
                if (item.getStandardValue() == null) {
                    item.setStandardValue(operationParam.getStandardValue());
                }
            }
            return;
        }
        if (!routingOperation.getTechnologyOperationId().equals(operationParam.getTechnologyOperationId())) {
            throw new ServiceException("Operation param does not belong to routing operation");
        }
        TechnologyParam technologyParam = technologyParamMapper.selectById(operationParam.getTechnologyParamId());
        if (technologyParam == null) {
            throw new ServiceException("Technology param not found");
        }
        throw new ServiceException("paramId或technologyOperationParamId不能为空");
    }
    private void fillFromTechnologyParam(TechnologyRoutingOperationParam item, TechnologyParam technologyParam) {
        item.setParamId(technologyParam.getId());
        item.setParamCode(technologyParam.getParamCode());
        item.setParamName(technologyParam.getParamName());
@@ -173,18 +204,6 @@
        if (item.getRemark() == null || item.getRemark().trim().isEmpty()) {
            item.setRemark(technologyParam.getRemark());
        }
        if (item.getStandardValue() == null) {
            item.setStandardValue(operationParam.getStandardValue());
        }
    }
    private void validateManualFields(TechnologyRoutingOperationParam item) {
        if (item.getParamCode() == null || item.getParamCode().trim().isEmpty()) {
            throw new ServiceException("paramCode is required");
        }
        if (item.getParamName() == null || item.getParamName().trim().isEmpty()) {
            throw new ServiceException("paramName is required");
        }
    }
    private void checkDuplicate(TechnologyRoutingOperationParam item) {
@@ -193,12 +212,14 @@
                        .eq(TechnologyRoutingOperationParam::getTechnologyRoutingOperationId, item.getTechnologyRoutingOperationId())
                        .eq(item.getTechnologyOperationParamId() != null,
                                TechnologyRoutingOperationParam::getTechnologyOperationParamId, item.getTechnologyOperationParamId())
                        .eq(item.getTechnologyOperationParamId() == null && item.getParamCode() != null,
                        .eq(item.getTechnologyOperationParamId() == null && item.getParamId() != null,
                                TechnologyRoutingOperationParam::getParamId, item.getParamId())
                        .eq(item.getTechnologyOperationParamId() == null && item.getParamId() == null && item.getParamCode() != null,
                                TechnologyRoutingOperationParam::getParamCode, item.getParamCode())
                        .ne(item.getId() != null, TechnologyRoutingOperationParam::getId, item.getId())
        ) > 0;
        if (duplicate) {
            throw new ServiceException("Duplicate routing operation param");
            throw new ServiceException("工艺路线工序参数重复");
        }
    }
}
src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingOperationServiceImpl.java
@@ -1,16 +1,16 @@
package com.ruoyi.technology.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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;
@@ -26,27 +26,22 @@
    private final TechnologyRoutingOperationMapper technologyRoutingOperationMapper;
    private final TechnologyRoutingMapper technologyRoutingMapper;
    private final TechnologyRoutingOperationParamService technologyRoutingOperationParamService;
    @Override
    public IPage<TechnologyRoutingOperationVo> pageTechnologyRoutingOperation(Page<TechnologyRoutingOperationDto> page,
                                                                              TechnologyRoutingOperationDto technologyRoutingOperationDto) {
        Page<TechnologyRoutingOperation> entityPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
        return this.page(entityPage, buildQueryWrapper(technologyRoutingOperationDto))
                .convert(item -> BeanUtil.copyProperties(item, TechnologyRoutingOperationVo.class));
        return technologyRoutingOperationMapper.pageTechnologyRoutingOperation(page, technologyRoutingOperationDto);
    }
    @Override
    public List<TechnologyRoutingOperationVo> listTechnologyRoutingOperation(TechnologyRoutingOperationDto technologyRoutingOperationDto) {
        return BeanUtil.copyToList(this.list(buildQueryWrapper(technologyRoutingOperationDto)), TechnologyRoutingOperationVo.class);
        return technologyRoutingOperationMapper.listTechnologyRoutingOperation(technologyRoutingOperationDto);
    }
    @Override
    public TechnologyRoutingOperationVo getTechnologyRoutingOperationInfo(Long id) {
        TechnologyRoutingOperation technologyRoutingOperation = this.getById(id);
        if (technologyRoutingOperation == null) {
            return null;
        }
        return BeanUtil.copyProperties(technologyRoutingOperation, TechnologyRoutingOperationVo.class);
        return technologyRoutingOperationMapper.getTechnologyRoutingOperationInfo(id);
    }
    @Override
@@ -58,7 +53,14 @@
        if (technologyRoutingOperation.getDragSort() == null || technologyRoutingOperation.getDragSort() <= 0) {
            technologyRoutingOperation.setDragSort(nextDragSort(technologyRoutingOperation.getTechnologyRoutingId()));
        }
        return this.save(technologyRoutingOperation);
        boolean saved = this.save(technologyRoutingOperation);
        if (saved) {
            TechnologyRoutingOperationParamSyncDto syncDto = new TechnologyRoutingOperationParamSyncDto();
            syncDto.setTechnologyRoutingOperationId(technologyRoutingOperation.getId());
            syncDto.setReplaceExisting(true);
            technologyRoutingOperationParamService.syncTechnologyRoutingOperationParam(syncDto);
        }
        return saved;
    }
    @Override
@@ -72,22 +74,6 @@
            resetDragSort(technologyRoutingOperation.getTechnologyRoutingId());
        }
        return removed;
    }
    private LambdaQueryWrapper<TechnologyRoutingOperation> buildQueryWrapper(TechnologyRoutingOperationDto technologyRoutingOperation) {
        LambdaQueryWrapper<TechnologyRoutingOperation> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(technologyRoutingOperation.getId() != null, TechnologyRoutingOperation::getId, technologyRoutingOperation.getId())
                .eq(technologyRoutingOperation.getTechnologyRoutingId() != null,
                        TechnologyRoutingOperation::getTechnologyRoutingId, technologyRoutingOperation.getTechnologyRoutingId())
                .eq(technologyRoutingOperation.getProductModelId() != null,
                        TechnologyRoutingOperation::getProductModelId, technologyRoutingOperation.getProductModelId())
                .eq(technologyRoutingOperation.getTechnologyOperationId() != null,
                        TechnologyRoutingOperation::getTechnologyOperationId, technologyRoutingOperation.getTechnologyOperationId())
                .eq(technologyRoutingOperation.getIsQuality() != null,
                        TechnologyRoutingOperation::getIsQuality, technologyRoutingOperation.getIsQuality())
                .orderByAsc(TechnologyRoutingOperation::getDragSort)
                .orderByAsc(TechnologyRoutingOperation::getId);
        return queryWrapper;
    }
    private Integer nextDragSort(Long technologyRoutingId) {
src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java
@@ -12,12 +12,18 @@
import com.ruoyi.technology.bean.vo.TechnologyRoutingVo;
import com.ruoyi.technology.mapper.TechnologyBomStructureMapper;
import com.ruoyi.technology.mapper.TechnologyOperationMapper;
import com.ruoyi.technology.mapper.TechnologyOperationParamMapper;
import com.ruoyi.technology.mapper.TechnologyParamMapper;
import com.ruoyi.technology.mapper.TechnologyRoutingMapper;
import com.ruoyi.technology.mapper.TechnologyRoutingOperationMapper;
import com.ruoyi.technology.mapper.TechnologyRoutingOperationParamMapper;
import com.ruoyi.technology.pojo.TechnologyBomStructure;
import com.ruoyi.technology.pojo.TechnologyOperation;
import com.ruoyi.technology.pojo.TechnologyOperationParam;
import com.ruoyi.technology.pojo.TechnologyParam;
import com.ruoyi.technology.pojo.TechnologyRouting;
import com.ruoyi.technology.pojo.TechnologyRoutingOperation;
import com.ruoyi.technology.pojo.TechnologyRoutingOperationParam;
import com.ruoyi.technology.service.TechnologyRoutingService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@@ -28,6 +34,7 @@
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
@Transactional(rollbackFor = Exception.class)
@@ -41,6 +48,9 @@
    private final TechnologyBomStructureMapper technologyBomStructureMapper;
    private final TechnologyOperationMapper technologyOperationMapper;
    private final TechnologyOperationParamMapper technologyOperationParamMapper;
    private final TechnologyParamMapper technologyParamMapper;
    private final TechnologyRoutingOperationParamMapper technologyRoutingOperationParamMapper;
    @Override
    public IPage<TechnologyRoutingVo> pageTechnologyRouting(Page<TechnologyRoutingDto> page, TechnologyRoutingDto technologyRoutingDto) {
@@ -81,6 +91,14 @@
        if (ids == null || ids.isEmpty()) {
            return false;
        }
        List<TechnologyRoutingOperation> routingOperationList = technologyRoutingOperationMapper.selectList(
                Wrappers.<TechnologyRoutingOperation>lambdaQuery()
                        .in(TechnologyRoutingOperation::getTechnologyRoutingId, ids));
        if (!routingOperationList.isEmpty()) {
            List<Long> routingOperationIdList = routingOperationList.stream().map(TechnologyRoutingOperation::getId).collect(Collectors.toList());
            technologyRoutingOperationParamMapper.delete(Wrappers.<TechnologyRoutingOperationParam>lambdaQuery()
                    .in(TechnologyRoutingOperationParam::getTechnologyRoutingOperationId, routingOperationIdList));
        }
        technologyRoutingOperationMapper.delete(Wrappers.<TechnologyRoutingOperation>lambdaQuery()
                .in(TechnologyRoutingOperation::getTechnologyRoutingId, ids));
        return this.removeByIds(ids);
@@ -93,8 +111,16 @@
     * 3. 按 BOM 出现顺序去重后重新写入工艺路线工序表
     */
    private void syncRoutingOperationsByBom(TechnologyRouting technologyRouting) {
        technologyRoutingOperationMapper.delete(Wrappers.<TechnologyRoutingOperation>lambdaQuery()
                .eq(TechnologyRoutingOperation::getTechnologyRoutingId, technologyRouting.getId()));
        List<TechnologyRoutingOperation> oldRoutingOperationList = technologyRoutingOperationMapper.selectList(
                Wrappers.<TechnologyRoutingOperation>lambdaQuery()
                        .eq(TechnologyRoutingOperation::getTechnologyRoutingId, technologyRouting.getId()));
        if (!oldRoutingOperationList.isEmpty()) {
            List<Long> oldRoutingOperationIdList = oldRoutingOperationList.stream().map(TechnologyRoutingOperation::getId).collect(Collectors.toList());
            technologyRoutingOperationParamMapper.delete(Wrappers.<TechnologyRoutingOperationParam>lambdaQuery()
                    .in(TechnologyRoutingOperationParam::getTechnologyRoutingOperationId, oldRoutingOperationIdList));
            technologyRoutingOperationMapper.delete(Wrappers.<TechnologyRoutingOperation>lambdaQuery()
                    .eq(TechnologyRoutingOperation::getTechnologyRoutingId, technologyRouting.getId()));
        }
        if (technologyRouting.getBomId() == null) {
            return;
        }
@@ -123,6 +149,37 @@
            routingOperation.setDragSort(dragSort++);
            routingOperation.setIsQuality(getOperationQuality(bomStructure.getOperationId()));
            technologyRoutingOperationMapper.insert(routingOperation);
            syncRoutingOperationParams(routingOperation.getId(), bomStructure.getOperationId());
        }
    }
    private void syncRoutingOperationParams(Long technologyRoutingOperationId, Long technologyOperationId) {
        List<TechnologyOperationParam> operationParamList = technologyOperationParamMapper.selectList(
                Wrappers.<TechnologyOperationParam>lambdaQuery()
                        .eq(TechnologyOperationParam::getTechnologyOperationId, technologyOperationId)
                        .orderByAsc(TechnologyOperationParam::getId));
        if (operationParamList.isEmpty()) {
            return;
        }
        for (TechnologyOperationParam operationParam : operationParamList) {
            TechnologyParam technologyParam = technologyParamMapper.selectById(operationParam.getTechnologyParamId());
            if (technologyParam == null) {
                continue;
            }
            TechnologyRoutingOperationParam snapshot = new TechnologyRoutingOperationParam();
            snapshot.setTechnologyRoutingOperationId(technologyRoutingOperationId);
            snapshot.setTechnologyOperationParamId(operationParam.getId());
            snapshot.setTechnologyOperationId(operationParam.getTechnologyOperationId());
            snapshot.setParamId(technologyParam.getId());
            snapshot.setParamCode(technologyParam.getParamCode());
            snapshot.setParamName(technologyParam.getParamName());
            snapshot.setParamType(technologyParam.getParamType());
            snapshot.setParamFormat(technologyParam.getParamFormat());
            snapshot.setUnit(technologyParam.getUnit());
            snapshot.setIsRequired(technologyParam.getIsRequired());
            snapshot.setRemark(technologyParam.getRemark());
            snapshot.setStandardValue(operationParam.getStandardValue());
            technologyRoutingOperationParamMapper.insert(snapshot);
        }
    }
src/main/resources/application-dev.yml
@@ -199,7 +199,7 @@
  # 令牌自定义标识
  header: Authorization
  # 令牌密钥
  secret: abcdefghijklmnopqrstuvwxyz
  secret: xpAVjhCjQDaDB7mjPAzMDSbQWXNu2zYkTdDNUsPMS5Xx8QMmQVYN7n74eZrYJxDJ
  # 令牌有效期(默认30分钟)
  expireTime: 450
src/main/resources/mapper/technology/TechnologyRoutingOperationMapper.xml
@@ -16,4 +16,91 @@
        <result column="dept_id" property="deptId" />
    </resultMap>
    <select id="pageTechnologyRoutingOperation" resultType="com.ruoyi.technology.bean.vo.TechnologyRoutingOperationVo">
        select tro.*,
               top2.name as technologyOperationName,
               p.product_name as productName,
               pm.model,
               pm.model as specificationName,
               pm.unit
        from technology_routing_operation tro
                 left join technology_operation top2 on tro.technology_operation_id = top2.id
                 left join product_model pm on tro.product_model_id = pm.id
                 left join product p on pm.product_id = p.id
        <where>
            <if test="c != null">
                <if test="c.id != null">
                    and tro.id = #{c.id}
                </if>
                <if test="c.technologyRoutingId != null">
                    and tro.technology_routing_id = #{c.technologyRoutingId}
                </if>
                <if test="c.routeId != null">
                    and tro.technology_routing_id = #{c.routeId}
                </if>
                <if test="c.productModelId != null">
                    and tro.product_model_id = #{c.productModelId}
                </if>
                <if test="c.technologyOperationId != null">
                    and tro.technology_operation_id = #{c.technologyOperationId}
                </if>
                <if test="c.isQuality != null">
                    and tro.is_quality = #{c.isQuality}
                </if>
            </if>
        </where>
        order by tro.drag_sort asc, tro.id asc
    </select>
    <select id="listTechnologyRoutingOperation" resultType="com.ruoyi.technology.bean.vo.TechnologyRoutingOperationVo">
        select tro.*,
               top2.name as technologyOperationName,
               p.product_name as productName,
               pm.model,
               pm.model as specificationName,
               pm.unit
        from technology_routing_operation tro
                 left join technology_operation top2 on tro.technology_operation_id = top2.id
                 left join product_model pm on tro.product_model_id = pm.id
                 left join product p on pm.product_id = p.id
        <where>
            <if test="c != null">
                <if test="c.id != null">
                    and tro.id = #{c.id}
                </if>
                <if test="c.technologyRoutingId != null">
                    and tro.technology_routing_id = #{c.technologyRoutingId}
                </if>
                <if test="c.routeId != null">
                    and tro.technology_routing_id = #{c.routeId}
                </if>
                <if test="c.productModelId != null">
                    and tro.product_model_id = #{c.productModelId}
                </if>
                <if test="c.technologyOperationId != null">
                    and tro.technology_operation_id = #{c.technologyOperationId}
                </if>
                <if test="c.isQuality != null">
                    and tro.is_quality = #{c.isQuality}
                </if>
            </if>
        </where>
        order by tro.drag_sort asc, tro.id asc
    </select>
    <select id="getTechnologyRoutingOperationInfo" resultType="com.ruoyi.technology.bean.vo.TechnologyRoutingOperationVo">
        select tro.*,
               top2.name as technologyOperationName,
               p.product_name as productName,
               pm.model,
               pm.model as specificationName,
               pm.unit
        from technology_routing_operation tro
                 left join technology_operation top2 on tro.technology_operation_id = top2.id
                 left join product_model pm on tro.product_model_id = pm.id
                 left join product p on pm.product_id = p.id
        where tro.id = #{id}
        limit 1
    </select>
</mapper>
src/main/resources/mapper/technology/TechnologyRoutingOperationParamMapper.xml
@@ -2,10 +2,8 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.technology.mapper.TechnologyRoutingOperationParamMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.technology.pojo.TechnologyRoutingOperationParam">
        <id column="id" property="id" />
        <result column="technology_routing_operation_param_id" property="technologyRoutingOperationParamId" />
        <result column="param_code" property="paramCode" />
        <result column="param_name" property="paramName" />
        <result column="param_type" property="paramType" />