From 1dc68ebfceb2a12b3d72a7584a04f11cdf8bcd62 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 20 四月 2026 10:44:47 +0800
Subject: [PATCH] feat(technology): 添加工艺路线和工艺路线工序的CRUD功能

---
 src/main/java/com/ruoyi/technology/service/TechnologyRoutingService.java                   |   17 +-
 src/main/java/com/ruoyi/technology/service/TechnologyRoutingOperationService.java          |   20 ++-
 src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationController.java    |   57 +++++++-
 src/main/java/com/ruoyi/CodeGenerator.java                                                 |    2 
 src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java          |   68 ++++++++++-
 src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingOperationServiceImpl.java |  105 ++++++++++++++++-
 src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java             |   53 +++++++-
 7 files changed, 269 insertions(+), 53 deletions(-)

diff --git a/src/main/java/com/ruoyi/CodeGenerator.java b/src/main/java/com/ruoyi/CodeGenerator.java
index 4691f0a..50dfffc 100644
--- a/src/main/java/com/ruoyi/CodeGenerator.java
+++ b/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 = "鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃";
diff --git a/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java b/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java
index 12453d4..bed65de 100644
--- a/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java
+++ b/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)));
+    }
 }
diff --git a/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationController.java b/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationController.java
index d283c3b..32318a7 100644
--- a/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationController.java
+++ b/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));
+    }
 }
diff --git a/src/main/java/com/ruoyi/technology/service/TechnologyRoutingOperationService.java b/src/main/java/com/ruoyi/technology/service/TechnologyRoutingOperationService.java
index e47893f..b2a94d3 100644
--- a/src/main/java/com/ruoyi/technology/service/TechnologyRoutingOperationService.java
+++ b/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);
 }
diff --git a/src/main/java/com/ruoyi/technology/service/TechnologyRoutingService.java b/src/main/java/com/ruoyi/technology/service/TechnologyRoutingService.java
index 2f64516..db3456d 100644
--- a/src/main/java/com/ruoyi/technology/service/TechnologyRoutingService.java
+++ b/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);
 }
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..236d1ee 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,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);
+            }
+        }
+    }
 }
diff --git a/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java b/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java
index 2ee300a..91ffbbf 100644
--- a/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java
+++ b/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();
+    }
 }

--
Gitblit v1.9.3