2026-04-20 1dc68ebfceb2a12b3d72a7584a04f11cdf8bcd62
feat(technology): 添加工艺路线和工艺路线工序的CRUD功能

- 添加工艺路线分页查询、详情、新增、修改、删除接口
- 添加工艺路线工序分页查询、列表、详情、新增、修改、删除接口
- 实现工艺路线工序拖拽排序功能
- 实现工艺路线编号自动生成逻辑
- 添加数据库连接配置端口修改
- 集成Swagger API文档注解
已修改7个文件
322 ■■■■ 文件已修改
src/main/java/com/ruoyi/CodeGenerator.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationController.java 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/service/TechnologyRoutingOperationService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/service/TechnologyRoutingService.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingOperationServiceImpl.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/CodeGenerator.java
@@ -20,7 +20,7 @@
// 演示例子,执行 main 方法控制台输入模块表名回车自动生成对应项目目录中
public class CodeGenerator {
    public static String database_url = "jdbc:mysql://localhost:3307/product-inventory-management-new-pro";
    public static String database_url = "jdbc:mysql://localhost:3306/product-inventory-management-new-pro";
    public static String database_username = "root";
    public static String database_password= "123456";
    public static String author = "芯导软件(江苏)有限公司";
src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java
@@ -1,18 +1,51 @@
package com.ruoyi.technology.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.technology.pojo.TechnologyRouting;
import com.ruoyi.technology.service.TechnologyRoutingService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * <p>
 * 工艺路线表 前端控制器
 * </p>
 *
 * @author 芯导软件(江苏)有限公司
 * @since 2026-04-20 10:06:33
 */
import java.util.Arrays;
@RestController
@RequestMapping("/technologyRouting")
@Api(tags = "工艺路线")
public class TechnologyRoutingController {
    @Autowired
    private TechnologyRoutingService technologyRoutingService;
    @GetMapping("/page")
    @ApiOperation("工艺路线分页查询")
    public R page(Page<TechnologyRouting> page, TechnologyRouting technologyRouting) {
        return R.ok(technologyRoutingService.pageTechnologyRouting(page, technologyRouting));
    }
    @GetMapping("/{id}")
    @ApiOperation("工艺路线详情")
    public R getInfo(@PathVariable("id") Long id) {
        return R.ok(technologyRoutingService.getById(id));
    }
    @PostMapping
    @ApiOperation("新增工艺路线")
    public R add(@RequestBody TechnologyRouting technologyRouting) {
        return R.ok(technologyRoutingService.saveTechnologyRouting(technologyRouting));
    }
    @PutMapping
    @ApiOperation("修改工艺路线")
    public R edit(@RequestBody TechnologyRouting technologyRouting) {
        return R.ok(technologyRoutingService.updateById(technologyRouting));
    }
    @DeleteMapping("/{ids}")
    @ApiOperation("删除工艺路线")
    public R remove(@PathVariable("ids") Long[] ids) {
        return R.ok(technologyRoutingService.removeTechnologyRouting(Arrays.asList(ids)));
    }
}
src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationController.java
@@ -1,18 +1,55 @@
package com.ruoyi.technology.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.technology.pojo.TechnologyRoutingOperation;
import com.ruoyi.technology.service.TechnologyRoutingOperationService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * <p>
 * 工艺路线工序表 前端控制器
 * </p>
 *
 * @author 芯导软件(江苏)有限公司
 * @since 2026-04-20 10:06:47
 */
@RestController
@RequestMapping("/technologyRoutingOperation")
@Api(tags = "工艺路线工序")
public class TechnologyRoutingOperationController {
    @Autowired
    private TechnologyRoutingOperationService technologyRoutingOperationService;
    @GetMapping("/page")
    @ApiOperation("工艺路线工序分页查询")
    public R page(Page<TechnologyRoutingOperation> page, TechnologyRoutingOperation technologyRoutingOperation) {
        return R.ok(technologyRoutingOperationService.pageTechnologyRoutingOperation(page, technologyRoutingOperation));
    }
    @GetMapping("/list")
    @ApiOperation("工艺路线工序列表")
    public R list(TechnologyRoutingOperation technologyRoutingOperation) {
        return R.ok(technologyRoutingOperationService.listTechnologyRoutingOperation(technologyRoutingOperation));
    }
    @GetMapping("/{id}")
    @ApiOperation("工艺路线工序详情")
    public R getInfo(@PathVariable("id") Long id) {
        return R.ok(technologyRoutingOperationService.getById(id));
    }
    @PostMapping
    @ApiOperation("新增工艺路线工序")
    public R add(@RequestBody TechnologyRoutingOperation technologyRoutingOperation) {
        return R.ok(technologyRoutingOperationService.saveTechnologyRoutingOperation(technologyRoutingOperation));
    }
    @PutMapping
    @ApiOperation("修改工艺路线工序")
    public R edit(@RequestBody TechnologyRoutingOperation technologyRoutingOperation) {
        return R.ok(technologyRoutingOperationService.updateById(technologyRoutingOperation));
    }
    @DeleteMapping("/{id}")
    @ApiOperation("删除工艺路线工序")
    public R remove(@PathVariable("id") Long id) {
        return R.ok(technologyRoutingOperationService.removeTechnologyRoutingOperation(id));
    }
}
src/main/java/com/ruoyi/technology/service/TechnologyRoutingOperationService.java
@@ -1,16 +1,20 @@
package com.ruoyi.technology.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.technology.pojo.TechnologyRoutingOperation;
/**
 * <p>
 * 工艺路线工序表 服务类
 * </p>
 *
 * @author 芯导软件(江苏)有限公司
 * @since 2026-04-20 10:06:47
 */
import java.util.List;
public interface TechnologyRoutingOperationService extends IService<TechnologyRoutingOperation> {
    IPage<TechnologyRoutingOperation> pageTechnologyRoutingOperation(Page<TechnologyRoutingOperation> page,
                                                                     TechnologyRoutingOperation technologyRoutingOperation);
    List<TechnologyRoutingOperation> listTechnologyRoutingOperation(TechnologyRoutingOperation technologyRoutingOperation);
    boolean saveTechnologyRoutingOperation(TechnologyRoutingOperation technologyRoutingOperation);
    boolean removeTechnologyRoutingOperation(Long id);
}
src/main/java/com/ruoyi/technology/service/TechnologyRoutingService.java
@@ -1,16 +1,17 @@
package com.ruoyi.technology.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.technology.pojo.TechnologyRouting;
/**
 * <p>
 * 工艺路线表 服务类
 * </p>
 *
 * @author 芯导软件(江苏)有限公司
 * @since 2026-04-20 10:06:33
 */
import java.util.List;
public interface TechnologyRoutingService extends IService<TechnologyRouting> {
    IPage<TechnologyRouting> pageTechnologyRouting(Page<TechnologyRouting> page, TechnologyRouting technologyRouting);
    Long saveTechnologyRouting(TechnologyRouting technologyRouting);
    boolean removeTechnologyRouting(List<Long> ids);
}
src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingOperationServiceImpl.java
@@ -1,20 +1,109 @@
package com.ruoyi.technology.service.impl;
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.mapper.TechnologyRoutingMapper;
import com.ruoyi.technology.mapper.TechnologyRoutingOperationMapper;
import com.ruoyi.technology.pojo.TechnologyRoutingOperation;
import com.ruoyi.technology.service.TechnologyRoutingOperationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
 * <p>
 * 工艺路线工序表 服务实现类
 * </p>
 *
 * @author 芯导软件(江苏)有限公司
 * @since 2026-04-20 10:06:47
 */
import java.util.List;
@Service
@Transactional(rollbackFor = Exception.class)
public class TechnologyRoutingOperationServiceImpl extends ServiceImpl<TechnologyRoutingOperationMapper, TechnologyRoutingOperation> implements TechnologyRoutingOperationService {
    @Autowired
    private TechnologyRoutingOperationMapper technologyRoutingOperationMapper;
    @Autowired
    private TechnologyRoutingMapper technologyRoutingMapper;
    @Override
    public IPage<TechnologyRoutingOperation> pageTechnologyRoutingOperation(Page<TechnologyRoutingOperation> page,
                                                                            TechnologyRoutingOperation technologyRoutingOperation) {
        return this.page(page, buildQueryWrapper(technologyRoutingOperation));
    }
    @Override
    public List<TechnologyRoutingOperation> listTechnologyRoutingOperation(TechnologyRoutingOperation technologyRoutingOperation) {
        return this.list(buildQueryWrapper(technologyRoutingOperation));
    }
    @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()));
        }
        return this.save(technologyRoutingOperation);
    }
    @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;
    }
    private LambdaQueryWrapper<TechnologyRoutingOperation> buildQueryWrapper(TechnologyRoutingOperation 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) {
        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);
            }
        }
    }
}
src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java
@@ -1,20 +1,72 @@
package com.ruoyi.technology.service.impl;
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.mapper.TechnologyRoutingMapper;
import com.ruoyi.technology.mapper.TechnologyRoutingOperationMapper;
import com.ruoyi.technology.pojo.TechnologyRouting;
import com.ruoyi.technology.pojo.TechnologyRoutingOperation;
import com.ruoyi.technology.service.TechnologyRoutingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
 * <p>
 * 工艺路线表 服务实现类
 * </p>
 *
 * @author 芯导软件(江苏)有限公司
 * @since 2026-04-20 10:06:33
 */
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
@Service
@Transactional(rollbackFor = Exception.class)
public class TechnologyRoutingServiceImpl extends ServiceImpl<TechnologyRoutingMapper, TechnologyRouting> implements TechnologyRoutingService {
    @Autowired
    private TechnologyRoutingMapper technologyRoutingMapper;
    @Autowired
    private TechnologyRoutingOperationMapper technologyRoutingOperationMapper;
    @Override
    public IPage<TechnologyRouting> pageTechnologyRouting(Page<TechnologyRouting> page, TechnologyRouting technologyRouting) {
        LambdaQueryWrapper<TechnologyRouting> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(technologyRouting.getId() != null, TechnologyRouting::getId, technologyRouting.getId())
                .eq(technologyRouting.getProductModelId() != null, TechnologyRouting::getProductModelId, technologyRouting.getProductModelId())
                .eq(technologyRouting.getBomId() != null, TechnologyRouting::getBomId, technologyRouting.getBomId())
                .like(isNotBlank(technologyRouting.getProcessRouteCode()), TechnologyRouting::getProcessRouteCode, technologyRouting.getProcessRouteCode())
                .like(isNotBlank(technologyRouting.getDescription()), TechnologyRouting::getDescription, technologyRouting.getDescription())
                .orderByDesc(TechnologyRouting::getId);
        return this.page(page, queryWrapper);
    }
    @Override
    public Long saveTechnologyRouting(TechnologyRouting technologyRouting) {
        this.save(technologyRouting);
        if (!isNotBlank(technologyRouting.getProcessRouteCode())) {
            technologyRouting.setProcessRouteCode(buildProcessRouteCode(technologyRouting.getId()));
            technologyRoutingMapper.updateById(technologyRouting);
        }
        return technologyRouting.getId();
    }
    @Override
    public boolean removeTechnologyRouting(List<Long> ids) {
        if (ids == null || ids.isEmpty()) {
            return false;
        }
        technologyRoutingOperationMapper.delete(Wrappers.<TechnologyRoutingOperation>lambdaQuery()
                .in(TechnologyRoutingOperation::getTechnologyRoutingId, ids));
        return this.removeByIds(ids);
    }
    private String buildProcessRouteCode(Long id) {
        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        String idStr = String.format("%06d", id);
        return "GYLX" + dateStr + idStr;
    }
    private boolean isNotBlank(String value) {
        return value != null && !value.trim().isEmpty();
    }
}