From b2bfc3c8c094d7b46f1e41fc75b26221ce945dab Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 21 四月 2026 16:04:57 +0800
Subject: [PATCH] feat(technology): 添加工艺路线查询功能并完善相关接口

---
 src/main/java/com/ruoyi/technology/bean/dto/TechnologyRoutingDto.java                           |    9 +
 src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingOperationParamServiceImpl.java |  202 +++++++++++++++++++++++++++-
 src/main/resources/mapper/technology/TechnologyRoutingMapper.xml                                |   67 ++++++++-
 src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationParamController.java    |   70 ++++++++-
 src/main/java/com/ruoyi/technology/mapper/TechnologyRoutingMapper.java                          |   14 -
 src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java               |   14 -
 src/main/java/com/ruoyi/technology/service/TechnologyRoutingOperationParamService.java          |   27 ++-
 src/main/resources/application-dev.yml                                                          |    2 
 src/main/java/com/ruoyi/technology/bean/vo/TechnologyRoutingVo.java                             |   12 +
 src/main/resources/application.yml                                                              |    2 
 10 files changed, 360 insertions(+), 59 deletions(-)

diff --git a/src/main/java/com/ruoyi/technology/bean/dto/TechnologyRoutingDto.java b/src/main/java/com/ruoyi/technology/bean/dto/TechnologyRoutingDto.java
index d960f31..d725056 100644
--- a/src/main/java/com/ruoyi/technology/bean/dto/TechnologyRoutingDto.java
+++ b/src/main/java/com/ruoyi/technology/bean/dto/TechnologyRoutingDto.java
@@ -2,14 +2,21 @@
 
 import com.ruoyi.technology.pojo.TechnologyRouting;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 @EqualsAndHashCode(callSuper = true)
 @Data
-@ApiModel(value = "TechnologyRoutingDto瀵硅薄", description = "宸ヨ壓璺嚎琛�")
+@ApiModel(value = "TechnologyRoutingDto瀵硅薄", description = "宸ヨ壓璺嚎鏌ヨ鍙傛暟")
 public class TechnologyRoutingDto extends TechnologyRouting {
 
+    @ApiModelProperty("浜у搧鍚嶇О")
+    private String productName;
 
+    @ApiModelProperty("瑙勬牸鍚嶇О")
+    private String model;
 
+    @ApiModelProperty("BOM缂栧彿")
+    private String bomNo;
 }
diff --git a/src/main/java/com/ruoyi/technology/bean/vo/TechnologyRoutingVo.java b/src/main/java/com/ruoyi/technology/bean/vo/TechnologyRoutingVo.java
index 34a007d..aa67cd4 100644
--- a/src/main/java/com/ruoyi/technology/bean/vo/TechnologyRoutingVo.java
+++ b/src/main/java/com/ruoyi/technology/bean/vo/TechnologyRoutingVo.java
@@ -2,11 +2,21 @@
 
 import com.ruoyi.technology.pojo.TechnologyRouting;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 @EqualsAndHashCode(callSuper = true)
 @Data
-@ApiModel(value = "TechnologyRoutingVo瀵硅薄", description = "宸ヨ壓璺嚎琛�")
+@ApiModel(value = "TechnologyRoutingVo瀵硅薄", description = "宸ヨ壓璺嚎杩斿洖瀵硅薄")
 public class TechnologyRoutingVo extends TechnologyRouting {
+
+    @ApiModelProperty("浜у搧鍚嶇О")
+    private String productName;
+
+    @ApiModelProperty("瑙勬牸鍚嶇О")
+    private String model;
+
+    @ApiModelProperty("BOM缂栧彿")
+    private String bomNo;
 }
diff --git a/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationParamController.java b/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationParamController.java
index 19e1197..9a17e82 100644
--- a/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationParamController.java
+++ b/src/main/java/com/ruoyi/technology/controller/TechnologyRoutingOperationParamController.java
@@ -1,18 +1,68 @@
 package com.ruoyi.technology.controller;
 
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.technology.bean.dto.TechnologyRoutingOperationParamDto;
+import com.ruoyi.technology.bean.dto.TechnologyRoutingOperationParamSyncDto;
+import com.ruoyi.technology.bean.vo.TechnologyRoutingOperationParamVo;
+import com.ruoyi.technology.pojo.TechnologyRoutingOperationParam;
+import com.ruoyi.technology.service.TechnologyRoutingOperationParamService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
 
-/**
- * <p>
- * 鐢熶骇璁㈠崟宸ヨ壓璺嚎宸ュ簭鍙傛暟琛� 鍓嶇鎺у埗鍣�
- * </p>
- *
- * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
- * @since 2026-04-20 10:22:16
- */
+import java.util.List;
+
 @RestController
 @RequestMapping("/technologyRoutingOperationParam")
+@Api(tags = "鐢熶骇璁㈠崟宸ヨ壓璺嚎宸ュ簭鍙傛暟")
+@RequiredArgsConstructor
 public class TechnologyRoutingOperationParamController {
 
+    private final TechnologyRoutingOperationParamService technologyRoutingOperationParamService;
+
+    @GetMapping("/page")
+    @ApiOperation("鐢熶骇璁㈠崟宸ヨ壓璺嚎宸ュ簭鍙傛暟鍒嗛〉鏌ヨ")
+    public R<IPage<TechnologyRoutingOperationParamVo>> page(Page<TechnologyRoutingOperationParamDto> page,
+                                                            TechnologyRoutingOperationParamDto dto) {
+        return R.ok(technologyRoutingOperationParamService.pageTechnologyRoutingOperationParam(page, dto));
+    }
+
+    @GetMapping("/list")
+    @ApiOperation("鐢熶骇璁㈠崟宸ヨ壓璺嚎宸ュ簭鍙傛暟鍒楄〃")
+    public R<List<TechnologyRoutingOperationParamVo>> list(TechnologyRoutingOperationParamDto dto) {
+        return R.ok(technologyRoutingOperationParamService.listTechnologyRoutingOperationParam(dto));
+    }
+
+    @GetMapping("/{id}")
+    @ApiOperation("鐢熶骇璁㈠崟宸ヨ壓璺嚎宸ュ簭鍙傛暟璇︽儏")
+    public R<TechnologyRoutingOperationParamVo> getInfo(@PathVariable("id") Long id) {
+        return R.ok(technologyRoutingOperationParamService.getTechnologyRoutingOperationParamInfo(id));
+    }
+
+    @PostMapping
+    @ApiOperation("鏂板鐢熶骇璁㈠崟宸ヨ壓璺嚎宸ュ簭鍙傛暟")
+    public R<Boolean> add(@RequestBody TechnologyRoutingOperationParam technologyRoutingOperationParam) {
+        return R.ok(technologyRoutingOperationParamService.saveTechnologyRoutingOperationParam(technologyRoutingOperationParam));
+    }
+
+    @PutMapping
+    @ApiOperation("淇敼鐢熶骇璁㈠崟宸ヨ壓璺嚎宸ュ簭鍙傛暟")
+    public R<Boolean> edit(@RequestBody TechnologyRoutingOperationParam technologyRoutingOperationParam) {
+        return R.ok(technologyRoutingOperationParamService.saveTechnologyRoutingOperationParam(technologyRoutingOperationParam));
+    }
+
+    @DeleteMapping("/{id}")
+    @ApiOperation("鍒犻櫎鐢熶骇璁㈠崟宸ヨ壓璺嚎宸ュ簭鍙傛暟")
+    public R<Boolean> remove(@PathVariable("id") Long id) {
+        return R.ok(technologyRoutingOperationParamService.removeTechnologyRoutingOperationParam(id));
+    }
+
+    @PostMapping("/sync")
+    @ApiOperation("鎸夊伐鑹鸿矾绾垮伐搴忓悓姝ュ伐搴忓弬鏁�")
+    public R<Integer> sync(@RequestBody TechnologyRoutingOperationParamSyncDto syncDto) {
+        return R.ok(technologyRoutingOperationParamService.syncTechnologyRoutingOperationParam(syncDto));
+    }
 }
diff --git a/src/main/java/com/ruoyi/technology/mapper/TechnologyRoutingMapper.java b/src/main/java/com/ruoyi/technology/mapper/TechnologyRoutingMapper.java
index e688c4f..7a29f1b 100644
--- a/src/main/java/com/ruoyi/technology/mapper/TechnologyRoutingMapper.java
+++ b/src/main/java/com/ruoyi/technology/mapper/TechnologyRoutingMapper.java
@@ -1,20 +1,18 @@
 package com.ruoyi.technology.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.technology.bean.dto.TechnologyRoutingDto;
+import com.ruoyi.technology.bean.vo.TechnologyRoutingVo;
 import com.ruoyi.technology.pojo.TechnologyRouting;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
-/**
- * <p>
- * 宸ヨ壓璺嚎琛� Mapper 鎺ュ彛
- * </p>
- *
- * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
- * @since 2026-04-20 10:06:33
- */
 @Mapper
 public interface TechnologyRoutingMapper extends BaseMapper<TechnologyRouting> {
 
+    IPage<TechnologyRoutingVo> pageTechnologyRouting(Page<TechnologyRoutingDto> page, @Param("c") TechnologyRoutingDto technologyRoutingDto);
+
     int updateProductModelByBomId(@Param("productModelId") Long productModelId, @Param("bomId") Long bomId);
 }
diff --git a/src/main/java/com/ruoyi/technology/service/TechnologyRoutingOperationParamService.java b/src/main/java/com/ruoyi/technology/service/TechnologyRoutingOperationParamService.java
index 8bd7ebe..5d39eb6 100644
--- a/src/main/java/com/ruoyi/technology/service/TechnologyRoutingOperationParamService.java
+++ b/src/main/java/com/ruoyi/technology/service/TechnologyRoutingOperationParamService.java
@@ -1,16 +1,27 @@
 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.bean.dto.TechnologyRoutingOperationParamDto;
+import com.ruoyi.technology.bean.dto.TechnologyRoutingOperationParamSyncDto;
+import com.ruoyi.technology.bean.vo.TechnologyRoutingOperationParamVo;
 import com.ruoyi.technology.pojo.TechnologyRoutingOperationParam;
 
-/**
- * <p>
- * 鐢熶骇璁㈠崟宸ヨ壓璺嚎宸ュ簭鍙傛暟琛� 鏈嶅姟绫�
- * </p>
- *
- * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
- * @since 2026-04-20 10:22:16
- */
+import java.util.List;
+
 public interface TechnologyRoutingOperationParamService extends IService<TechnologyRoutingOperationParam> {
 
+    IPage<TechnologyRoutingOperationParamVo> pageTechnologyRoutingOperationParam(Page<TechnologyRoutingOperationParamDto> page,
+                                                                                 TechnologyRoutingOperationParamDto technologyRoutingOperationParamDto);
+
+    List<TechnologyRoutingOperationParamVo> listTechnologyRoutingOperationParam(TechnologyRoutingOperationParamDto technologyRoutingOperationParamDto);
+
+    TechnologyRoutingOperationParamVo getTechnologyRoutingOperationParamInfo(Long id);
+
+    boolean saveTechnologyRoutingOperationParam(TechnologyRoutingOperationParam technologyRoutingOperationParam);
+
+    boolean removeTechnologyRoutingOperationParam(Long id);
+
+    int syncTechnologyRoutingOperationParam(TechnologyRoutingOperationParamSyncDto syncDto);
 }
diff --git a/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingOperationParamServiceImpl.java b/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingOperationParamServiceImpl.java
index c10da3f..44b59ed 100644
--- a/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingOperationParamServiceImpl.java
+++ b/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingOperationParamServiceImpl.java
@@ -1,20 +1,204 @@
 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.common.exception.ServiceException;
+import com.ruoyi.technology.bean.dto.TechnologyRoutingOperationParamDto;
+import com.ruoyi.technology.bean.dto.TechnologyRoutingOperationParamSyncDto;
+import com.ruoyi.technology.bean.vo.TechnologyRoutingOperationParamVo;
+import com.ruoyi.technology.mapper.TechnologyOperationParamMapper;
+import com.ruoyi.technology.mapper.TechnologyParamMapper;
+import com.ruoyi.technology.mapper.TechnologyRoutingOperationMapper;
 import com.ruoyi.technology.mapper.TechnologyRoutingOperationParamMapper;
+import com.ruoyi.technology.pojo.TechnologyOperationParam;
+import com.ruoyi.technology.pojo.TechnologyParam;
+import com.ruoyi.technology.pojo.TechnologyRoutingOperation;
 import com.ruoyi.technology.pojo.TechnologyRoutingOperationParam;
 import com.ruoyi.technology.service.TechnologyRoutingOperationParamService;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
-/**
- * <p>
- * 鐢熶骇璁㈠崟宸ヨ壓璺嚎宸ュ簭鍙傛暟琛� 鏈嶅姟瀹炵幇绫�
- * </p>
- *
- * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
- * @since 2026-04-20 10:22:16
- */
+import java.util.List;
+
 @Service
-public class TechnologyRoutingOperationParamServiceImpl extends ServiceImpl<TechnologyRoutingOperationParamMapper, TechnologyRoutingOperationParam> implements TechnologyRoutingOperationParamService {
+@Transactional(rollbackFor = Exception.class)
+@RequiredArgsConstructor
+public class TechnologyRoutingOperationParamServiceImpl extends ServiceImpl<TechnologyRoutingOperationParamMapper, TechnologyRoutingOperationParam>
+        implements TechnologyRoutingOperationParamService {
 
+    private final TechnologyRoutingOperationParamMapper technologyRoutingOperationParamMapper;
+    private final TechnologyRoutingOperationMapper technologyRoutingOperationMapper;
+    private final TechnologyOperationParamMapper technologyOperationParamMapper;
+    private final TechnologyParamMapper technologyParamMapper;
+
+    @Override
+    public IPage<TechnologyRoutingOperationParamVo> pageTechnologyRoutingOperationParam(Page<TechnologyRoutingOperationParamDto> page,
+                                                                                        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));
+    }
+
+    @Override
+    public List<TechnologyRoutingOperationParamVo> listTechnologyRoutingOperationParam(TechnologyRoutingOperationParamDto dto) {
+        return BeanUtil.copyToList(this.list(buildQueryWrapper(dto)), TechnologyRoutingOperationParamVo.class);
+    }
+
+    @Override
+    public TechnologyRoutingOperationParamVo getTechnologyRoutingOperationParamInfo(Long id) {
+        TechnologyRoutingOperationParam item = this.getById(id);
+        if (item == null) {
+            return null;
+        }
+        return BeanUtil.copyProperties(item, TechnologyRoutingOperationParamVo.class);
+    }
+
+    @Override
+    public boolean saveTechnologyRoutingOperationParam(TechnologyRoutingOperationParam item) {
+        TechnologyRoutingOperation routingOperation = getRoutingOperation(item.getTechnologyRoutingOperationId());
+        fillFromOperationParam(item, routingOperation);
+        validateManualFields(item);
+        checkDuplicate(item);
+        return this.saveOrUpdate(item);
+    }
+
+    @Override
+    public boolean removeTechnologyRoutingOperationParam(Long id) {
+        return this.removeById(id);
+    }
+
+    @Override
+    public int syncTechnologyRoutingOperationParam(TechnologyRoutingOperationParamSyncDto syncDto) {
+        if (syncDto == null || syncDto.getTechnologyRoutingOperationId() == null) {
+            throw new ServiceException("technologyRoutingOperationId is required");
+        }
+        TechnologyRoutingOperation routingOperation = getRoutingOperation(syncDto.getTechnologyRoutingOperationId());
+        List<TechnologyOperationParam> operationParamList = technologyOperationParamMapper.selectList(
+                Wrappers.<TechnologyOperationParam>lambdaQuery()
+                        .eq(TechnologyOperationParam::getTechnologyOperationId, routingOperation.getTechnologyOperationId())
+                        .orderByAsc(TechnologyOperationParam::getId)
+        );
+        boolean replaceExisting = syncDto.getReplaceExisting() == null || syncDto.getReplaceExisting();
+        if (replaceExisting) {
+            technologyRoutingOperationParamMapper.delete(
+                    Wrappers.<TechnologyRoutingOperationParam>lambdaQuery()
+                            .eq(TechnologyRoutingOperationParam::getTechnologyRoutingOperationId, routingOperation.getId())
+            );
+        }
+        int successCount = 0;
+        for (TechnologyOperationParam operationParam : operationParamList) {
+            boolean exists = technologyRoutingOperationParamMapper.selectCount(
+                    Wrappers.<TechnologyRoutingOperationParam>lambdaQuery()
+                            .eq(TechnologyRoutingOperationParam::getTechnologyRoutingOperationId, routingOperation.getId())
+                            .eq(TechnologyRoutingOperationParam::getTechnologyOperationParamId, operationParam.getId())
+            ) > 0;
+            if (!replaceExisting && exists) {
+                continue;
+            }
+            TechnologyRoutingOperationParam snapshot = new TechnologyRoutingOperationParam();
+            snapshot.setTechnologyRoutingOperationId(routingOperation.getId());
+            snapshot.setTechnologyOperationParamId(operationParam.getId());
+            snapshot.setTechnologyOperationId(operationParam.getTechnologyOperationId());
+            snapshot.setStandardValue(operationParam.getStandardValue());
+            fillFromOperationParam(snapshot, routingOperation);
+            technologyRoutingOperationParamMapper.insert(snapshot);
+            successCount++;
+        }
+        return successCount;
+    }
+
+    private LambdaQueryWrapper<TechnologyRoutingOperationParam> buildQueryWrapper(TechnologyRoutingOperationParamDto dto) {
+        TechnologyRoutingOperationParam query = dto == null ? new TechnologyRoutingOperationParam() : dto;
+        return Wrappers.<TechnologyRoutingOperationParam>lambdaQuery()
+                .eq(query.getId() != null, TechnologyRoutingOperationParam::getId, query.getId())
+                .eq(query.getTechnologyRoutingOperationId() != null,
+                        TechnologyRoutingOperationParam::getTechnologyRoutingOperationId, query.getTechnologyRoutingOperationId())
+                .eq(query.getTechnologyOperationId() != null,
+                        TechnologyRoutingOperationParam::getTechnologyOperationId, query.getTechnologyOperationId())
+                .eq(query.getTechnologyOperationParamId() != null,
+                        TechnologyRoutingOperationParam::getTechnologyOperationParamId, query.getTechnologyOperationParamId())
+                .eq(query.getParamId() != null, TechnologyRoutingOperationParam::getParamId, query.getParamId())
+                .eq(query.getParamType() != null, TechnologyRoutingOperationParam::getParamType, query.getParamType())
+                .like(query.getParamCode() != null && !query.getParamCode().isEmpty(),
+                        TechnologyRoutingOperationParam::getParamCode, query.getParamCode())
+                .like(query.getParamName() != null && !query.getParamName().isEmpty(),
+                        TechnologyRoutingOperationParam::getParamName, query.getParamName())
+                .orderByAsc(TechnologyRoutingOperationParam::getTechnologyRoutingOperationId)
+                .orderByAsc(TechnologyRoutingOperationParam::getId);
+    }
+
+    private TechnologyRoutingOperation getRoutingOperation(Long technologyRoutingOperationId) {
+        if (technologyRoutingOperationId == null) {
+            throw new ServiceException("technologyRoutingOperationId is required");
+        }
+        TechnologyRoutingOperation routingOperation = technologyRoutingOperationMapper.selectById(technologyRoutingOperationId);
+        if (routingOperation == null) {
+            throw new ServiceException("Technology routing operation not found");
+        }
+        return routingOperation;
+    }
+
+    private void fillFromOperationParam(TechnologyRoutingOperationParam item, TechnologyRoutingOperation routingOperation) {
+        if (item.getTechnologyOperationId() == null) {
+            item.setTechnologyOperationId(routingOperation.getTechnologyOperationId());
+        } else if (!item.getTechnologyOperationId().equals(routingOperation.getTechnologyOperationId())) {
+            throw new ServiceException("technologyOperationId does not match routing operation");
+        }
+        if (item.getTechnologyOperationParamId() == null) {
+            return;
+        }
+        TechnologyOperationParam operationParam = technologyOperationParamMapper.selectById(item.getTechnologyOperationParamId());
+        if (operationParam == null) {
+            throw new ServiceException("Technology operation param not found");
+        }
+        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");
+        }
+        item.setParamId(technologyParam.getId());
+        item.setParamCode(technologyParam.getParamCode());
+        item.setParamName(technologyParam.getParamName());
+        item.setParamType(technologyParam.getParamType());
+        item.setParamFormat(technologyParam.getParamFormat());
+        item.setUnit(technologyParam.getUnit());
+        item.setIsRequired(technologyParam.getIsRequired());
+        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) {
+        boolean duplicate = technologyRoutingOperationParamMapper.selectCount(
+                Wrappers.<TechnologyRoutingOperationParam>lambdaQuery()
+                        .eq(TechnologyRoutingOperationParam::getTechnologyRoutingOperationId, item.getTechnologyRoutingOperationId())
+                        .eq(item.getTechnologyOperationParamId() != null,
+                                TechnologyRoutingOperationParam::getTechnologyOperationParamId, item.getTechnologyOperationParamId())
+                        .eq(item.getTechnologyOperationParamId() == 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");
+        }
+    }
 }
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 62b74e6..6066cb7 100644
--- a/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java
+++ b/src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java
@@ -6,6 +6,7 @@
 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.common.utils.OrderUtils;
 import com.ruoyi.technology.bean.dto.TechnologyRoutingDto;
 import com.ruoyi.technology.bean.vo.TechnologyRoutingVo;
@@ -43,15 +44,7 @@
 
     @Override
     public IPage<TechnologyRoutingVo> pageTechnologyRouting(Page<TechnologyRoutingDto> page, TechnologyRoutingDto technologyRoutingDto) {
-        LambdaQueryWrapper<TechnologyRouting> queryWrapper = Wrappers.lambdaQuery();
-        queryWrapper.eq(technologyRoutingDto.getId() != null, TechnologyRouting::getId, technologyRoutingDto.getId())
-                .eq(technologyRoutingDto.getProductModelId() != null, TechnologyRouting::getProductModelId, technologyRoutingDto.getProductModelId())
-                .eq(technologyRoutingDto.getBomId() != null, TechnologyRouting::getBomId, technologyRoutingDto.getBomId())
-                .like(isNotBlank(technologyRoutingDto.getProcessRouteCode()), TechnologyRouting::getProcessRouteCode, technologyRoutingDto.getProcessRouteCode())
-                .like(isNotBlank(technologyRoutingDto.getDescription()), TechnologyRouting::getDescription, technologyRoutingDto.getDescription())
-                .orderByDesc(TechnologyRouting::getId);
-        Page<TechnologyRouting> entityPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
-        return this.page(entityPage, queryWrapper).convert(item -> BeanUtil.copyProperties(item, TechnologyRoutingVo.class));
+        return technologyRoutingMapper.pageTechnologyRouting(page, technologyRoutingDto);
     }
 
     @Override
@@ -67,6 +60,7 @@
     public Long saveTechnologyRouting(TechnologyRouting technologyRouting) {
         String code = OrderUtils.countTodayByCreateTime(technologyRoutingMapper, "GYLX", "process_route_code");
         technologyRouting.setProcessRouteCode(code);
+        technologyRoutingMapper.insert(technologyRouting);
         // 甯﹀叆bom浜у搧缁撴瀯
         syncRoutingOperationsByBom(technologyRouting);
         return technologyRouting.getId();
@@ -111,7 +105,7 @@
                         .orderByAsc(TechnologyBomStructure::getId)
         );
         if (bomStructures.isEmpty()) {
-            return;
+            throw new ServiceException("bom浜у搧缁撴瀯涓虹┖锛�");
         }
 
         // 鍚屼竴涓� BOM 涓彲鑳介噸澶嶅紩鐢ㄧ浉鍚屽伐搴忥紝杩欓噷鎸夐娆″嚭鐜伴『搴忓幓閲嶃��
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index d310d3e..a99516f 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -74,7 +74,7 @@
     druid:
       # 涓诲簱鏁版嵁婧�
       master:
-        url: jdbc:mysql://localhost:3306/product-inventory-management-new?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        url: jdbc:mysql://localhost:3306/product-inventory-management-new-pro?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
         username: root
         password: 123456
       # 浠庡簱鏁版嵁婧�
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 69ec550..c79d967 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,4 +1,4 @@
 # Spring閰嶇疆
 spring:
   profiles:
-    active: dev-pro
+    active: dev
diff --git a/src/main/resources/mapper/technology/TechnologyRoutingMapper.xml b/src/main/resources/mapper/technology/TechnologyRoutingMapper.xml
index fcf2890..231905b 100644
--- a/src/main/resources/mapper/technology/TechnologyRoutingMapper.xml
+++ b/src/main/resources/mapper/technology/TechnologyRoutingMapper.xml
@@ -2,19 +2,66 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.technology.mapper.TechnologyRoutingMapper">
 
-    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
     <resultMap id="BaseResultMap" type="com.ruoyi.technology.pojo.TechnologyRouting">
-        <id column="id" property="id" />
-        <result column="product_model_id" property="productModelId" />
-        <result column="description" property="description" />
-        <result column="create_time" property="createTime" />
-        <result column="update_time" property="updateTime" />
-        <result column="process_route_code" property="processRouteCode" />
-        <result column="bom_id" property="bomId" />
-        <result column="create_user" property="createUser" />
-        <result column="dept_id" property="deptId" />
+        <id column="id" property="id"/>
+        <result column="product_model_id" property="productModelId"/>
+        <result column="description" property="description"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="process_route_code" property="processRouteCode"/>
+        <result column="bom_id" property="bomId"/>
+        <result column="create_user" property="createUser"/>
+        <result column="dept_id" property="deptId"/>
     </resultMap>
 
+    <select id="pageTechnologyRouting" resultType="com.ruoyi.technology.bean.vo.TechnologyRoutingVo">
+        select tr.id,
+               tr.product_model_id as productModelId,
+               tr.description,
+               tr.create_time as createTime,
+               tr.update_time as updateTime,
+               tr.process_route_code as processRouteCode,
+               tr.bom_id as bomId,
+               tr.create_user as createUser,
+               tr.dept_id as deptId,
+               p.product_name as productName,
+               pm.model,
+               tb.bom_no as bomNo
+        from technology_routing tr
+        left join product_model pm on tr.product_model_id = pm.id
+        left join product p on pm.product_id = p.id
+        left join technology_bom tb on tr.bom_id = tb.id
+        <where>
+            <if test="c != null">
+                <if test="c.id != null">
+                    and tr.id = #{c.id}
+                </if>
+                <if test="c.productModelId != null">
+                    and tr.product_model_id = #{c.productModelId}
+                </if>
+                <if test="c.bomId != null">
+                    and tr.bom_id = #{c.bomId}
+                </if>
+                <if test="c.processRouteCode != null and c.processRouteCode != ''">
+                    and tr.process_route_code like concat('%', #{c.processRouteCode}, '%')
+                </if>
+                <if test="c.description != null and c.description != ''">
+                    and tr.description like concat('%', #{c.description}, '%')
+                </if>
+                <if test="c.model != null and c.model != ''">
+                    and pm.model like concat('%', #{c.model}, '%')
+                </if>
+                <if test="c.productName != null and c.productName != ''">
+                    and p.product_name like concat('%', #{c.productName}, '%')
+                </if>
+                <if test="c.bomNo != null and c.bomNo != ''">
+                    and tb.bom_no like concat('%', #{c.bomNo}, '%')
+                </if>
+            </if>
+        </where>
+        order by tr.id desc
+    </select>
+
     <update id="updateProductModelByBomId">
         update technology_routing
         set product_model_id = #{productModelId}

--
Gitblit v1.9.3