huminmin
2026-04-27 398551392afc2ab879f837f60f95f9c9d8cf3c98
Merge branch 'dev_New_pro' of http://114.132.189.42:9002/r/product-inventory-management-after into dev_New_pro
已添加1个文件
已修改17个文件
332 ■■■■■ 文件已修改
src/main/java/com/ruoyi/production/bean/dto/ProductionBomStructureDto.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionOrderDto.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/vo/ProductionOrderRoutingOperationVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionBomStructureController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingOperationParamController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperation.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperationParam.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductionBomStructureService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductionOrderRoutingOperationParamService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationParamServiceImpl.java 86 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationServiceImpl.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionOrderMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionOrderRoutingOperationMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionBomStructureDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.production.bean.dto;
import com.ruoyi.production.pojo.ProductionBomStructure;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = true)
public class ProductionBomStructureDto extends ProductionBomStructure {
    @Schema(description = "工序名称")
    private String operationName;
    @Schema(description = "产品名称")
    private String productName;
    @Schema(description = "产品ID")
    private Long productId;
    @Schema(description = "规格型号")
    private String model;
    private String tempId;
    private String parentTempId;
    private List<ProductionBomStructureDto> children;
}
src/main/java/com/ruoyi/production/bean/dto/ProductionOrderDto.java
@@ -9,4 +9,9 @@
@Data
@Schema(name = "ProductionOrderDto", description = "生产订单查询对象")
public class ProductionOrderDto extends ProductionOrder {
    @Schema(description = "产品名称")
    private String productName;
    @Schema(description = "规格型号")
    private String model;
}
src/main/java/com/ruoyi/production/bean/vo/ProductionOrderRoutingOperationVo.java
@@ -20,4 +20,7 @@
    @Schema(description = "基础工序ID")
    private Long technologyOperationId;
    @Schema(description = "基础工序ID")
    private Long productionOrderRoutingOperationId;
}
src/main/java/com/ruoyi/production/controller/ProductionBomStructureController.java
@@ -1,14 +1,12 @@
package com.ruoyi.production.controller;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.bean.dto.ProductionBomStructureDto;
import com.ruoyi.production.bean.vo.ProductionBomStructureVo;
import com.ruoyi.production.service.ProductionBomStructureService;
import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@@ -33,4 +31,10 @@
        return R.ok(productionBomStructureService.listByBomId(bomId));
    }
    @PostMapping("/addOrUpdateBomStructs")
    @Operation(summary = "新增或修改BOM结构")
    public R addProductionBomStructure(@RequestBody ProductionBomStructureDto productionBomStructureDto) {
        return R.ok(productionBomStructureService.addProductionBomStructure(productionBomStructureDto));
    }
}
src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingOperationParamController.java
@@ -4,12 +4,11 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamDto;
import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamSyncDto;
import com.ruoyi.production.bean.vo.ProductionOrderRoutingOperationParamVo;
import com.ruoyi.production.pojo.ProductionOrderRoutingOperationParam;
import com.ruoyi.production.service.ProductionOrderRoutingOperationParamService;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
@@ -51,7 +50,7 @@
    @PutMapping
    @Operation(summary = "修改生产订单工艺路线工序参数")
    public R<Boolean> edit(@RequestBody ProductionOrderRoutingOperationParam item) {
        return R.ok(productionOrderRoutingOperationParamService.saveProductionOrderRoutingOperationParam(item));
        return R.ok(productionOrderRoutingOperationParamService.updateById(item));
    }
    @DeleteMapping("/{id}")
@@ -60,9 +59,4 @@
        return R.ok(productionOrderRoutingOperationParamService.removeProductionOrderRoutingOperationParam(id));
    }
    @PostMapping("/sync")
    @Operation(summary = "按订单工艺路线工序同步工序参数")
    public R<Integer> sync(@RequestBody ProductionOrderRoutingOperationParamSyncDto syncDto) {
        return R.ok(productionOrderRoutingOperationParamService.syncProductionOrderRoutingOperationParam(syncDto));
    }
}
src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperation.java
@@ -28,7 +28,7 @@
    @Schema(description = "生产订单id")
    private Long productionOrderId;
    @Schema(description = "工艺路线工序表id")
    @Schema(description = "工艺路线工序表id(额外新增的时候这个字段是空的)")
    private Long technologyRoutingOperationId;
    @Schema(description = "生产订单工艺路线id")
@@ -64,4 +64,7 @@
    @Schema(description = "工序名称")
    private String operationName;
    @Schema(description = "工序表id")
    private Long technologyOperationId;
}
src/main/java/com/ruoyi/production/pojo/ProductionOrderRoutingOperationParam.java
@@ -3,8 +3,6 @@
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;
@@ -84,9 +82,9 @@
    @Schema(description = "工序参数ID")
    private Long technologyOperationParamId;
    @Schema(description = "工艺路线工序ID")
    private Long technologyRoutingOperationId;
    @Schema(description = "标准值")
    private String standardValue;
    @Schema(description = "生产订单工艺路线工序ID")
    private Long productionOrderRoutingOperationId;
}
src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
@@ -26,12 +26,6 @@
    @Schema(description = "报工人员")
    private String userName;
    @Schema(description = "生产项目id")
    private Long productProcessRouteItemId;
    @Schema(description = "工单id")
    private Long workOrderId;
    @Schema(description = "生产工序工单id")
    private Long productionOperationTaskId;
@@ -51,9 +45,6 @@
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @Schema(description = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @Schema(description = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
src/main/java/com/ruoyi/production/service/ProductionBomStructureService.java
@@ -1,6 +1,7 @@
package com.ruoyi.production.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.production.bean.dto.ProductionBomStructureDto;
import com.ruoyi.production.bean.vo.ProductionBomStructureVo;
import com.ruoyi.production.pojo.ProductionBomStructure;
@@ -18,4 +19,5 @@
    List<ProductionBomStructureVo> listByBomId(Long bomId);
    Boolean addProductionBomStructure(ProductionBomStructureDto productionBomStructureDto);
}
src/main/java/com/ruoyi/production/service/ProductionOrderRoutingOperationParamService.java
@@ -4,7 +4,6 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamDto;
import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamSyncDto;
import com.ruoyi.production.bean.vo.ProductionOrderRoutingOperationParamVo;
import com.ruoyi.production.pojo.ProductionOrderRoutingOperationParam;
@@ -31,5 +30,4 @@
    boolean removeProductionOrderRoutingOperationParam(Long id);
    int syncProductionOrderRoutingOperationParam(ProductionOrderRoutingOperationParamSyncDto syncDto);
}
src/main/java/com/ruoyi/production/service/impl/ProductionBomStructureServiceImpl.java
@@ -1,17 +1,18 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.production.bean.dto.ProductionBomStructureDto;
import com.ruoyi.production.bean.vo.ProductionBomStructureVo;
import com.ruoyi.production.mapper.ProductionBomStructureMapper;
import com.ruoyi.production.pojo.ProductionBomStructure;
import com.ruoyi.production.service.ProductionBomStructureService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
 * <p>
@@ -54,4 +55,88 @@
        return tree;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean addProductionBomStructure(ProductionBomStructureDto dto) {
        Long orderBomId = dto.getProductionOrderBomId();
        List<ProductionBomStructureDto> flatDtoList = new ArrayList<>();
        flattenTree(dto.getChildren(), flatDtoList);
        List<ProductionBomStructure> dbList = this.list(new LambdaQueryWrapper<ProductionBomStructure>()
                .eq(ProductionBomStructure::getProductionOrderBomId, orderBomId));
        Set<Long> frontendIds = new HashSet<>();
        for (ProductionBomStructureDto item : flatDtoList) {
            if (item.getId() != null) {
                frontendIds.add(item.getId());
            }
        }
        Set<Long> deleteIds = new HashSet<>();
        for (ProductionBomStructure dbItem : dbList) {
            if (!frontendIds.contains(dbItem.getId())) {
                deleteIds.add(dbItem.getId());
            }
        }
        if (!deleteIds.isEmpty()) {
            this.removeByIds(deleteIds);
        }
        List<ProductionBomStructure> insertList = new ArrayList<>();
        List<ProductionBomStructure> updateList = new ArrayList<>();
        Map<String, ProductionBomStructure> tempEntityMap = new HashMap<>();
        for (ProductionBomStructureDto item : flatDtoList) {
            ProductionBomStructure entity = new ProductionBomStructure();
            BeanUtils.copyProperties(item, entity);
            entity.setProductionOrderBomId(orderBomId);
            if (item.getId() == null) {
                entity.setParentId(null);
                insertList.add(entity);
                tempEntityMap.put(item.getTempId(), entity);
            } else {
                updateList.add(entity);
            }
        }
        if (!insertList.isEmpty()) {
            this.saveBatch(insertList);
        }
        List<ProductionBomStructure> parentFixList = new ArrayList<>();
        for (ProductionBomStructureDto item : flatDtoList) {
            if (item.getId() == null && item.getParentTempId() != null) {
                ProductionBomStructure child = tempEntityMap.get(item.getTempId());
                if (child == null) {
                    continue;
                }
                ProductionBomStructure parent = tempEntityMap.get(item.getParentTempId());
                Long realParentId = parent != null ? parent.getId() : Long.valueOf(item.getParentTempId());
                child.setParentId(realParentId);
                parentFixList.add(child);
            }
        }
        if (!parentFixList.isEmpty()) {
            this.updateBatchById(parentFixList);
        }
        if (!updateList.isEmpty()) {
            this.updateBatchById(updateList);
        }
        return true;
    }
    /**
     * å°†æ ‘形结构拍平成列表,便于统一保存。
     */
    private void flattenTree(List<ProductionBomStructureDto> source, List<ProductionBomStructureDto> result) {
        if (source == null) {
            return;
        }
        for (ProductionBomStructureDto node : source) {
            result.add(node);
            flattenTree(node.getChildren(), result);
        }
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationParamServiceImpl.java
@@ -8,7 +8,6 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamDto;
import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamSyncDto;
import com.ruoyi.production.bean.vo.ProductionOrderRoutingOperationParamVo;
import com.ruoyi.production.mapper.ProductionOrderMapper;
import com.ruoyi.production.mapper.ProductionOrderRoutingOperationMapper;
@@ -17,7 +16,9 @@
import com.ruoyi.production.pojo.ProductionOrderRoutingOperation;
import com.ruoyi.production.pojo.ProductionOrderRoutingOperationParam;
import com.ruoyi.production.service.ProductionOrderRoutingOperationParamService;
import com.ruoyi.technology.mapper.TechnologyParamMapper;
import com.ruoyi.technology.mapper.TechnologyRoutingOperationParamMapper;
import com.ruoyi.technology.pojo.TechnologyParam;
import com.ruoyi.technology.pojo.TechnologyRoutingOperationParam;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@@ -34,6 +35,7 @@
    private final ProductionOrderRoutingOperationParamMapper productionOrderRoutingOperationParamMapper;
    private final ProductionOrderRoutingOperationMapper productionOrderRoutingOperationMapper;
    private final ProductionOrderMapper productionOrderMapper;
    private final TechnologyParamMapper technologyParamMapper;
    private final TechnologyRoutingOperationParamMapper technologyRoutingOperationParamMapper;
    @Override
@@ -57,7 +59,7 @@
    @Override
    public boolean saveProductionOrderRoutingOperationParam(ProductionOrderRoutingOperationParam item) {
        ProductionOrderRoutingOperation routingOperation = getRoutingOperation(item.getTechnologyRoutingOperationId());
        ProductionOrderRoutingOperation routingOperation = getRoutingOperation(item.getProductionOrderRoutingOperationId());
        fillFromSourceParam(item, routingOperation);
        validateManualFields(item);
        checkDuplicate(item);
@@ -69,62 +71,12 @@
        return this.removeById(id);
    }
    @Override
    public int syncProductionOrderRoutingOperationParam(ProductionOrderRoutingOperationParamSyncDto syncDto) {
        if (syncDto == null || syncDto.getProductionOrderRoutingOperationId() == null) {
            throw new ServiceException("productionOrderRoutingOperationId is required");
        }
        ProductionOrderRoutingOperation routingOperation = getRoutingOperation(syncDto.getProductionOrderRoutingOperationId());
        List<TechnologyRoutingOperationParam> sourceParamList = technologyRoutingOperationParamMapper.selectList(
                Wrappers.<TechnologyRoutingOperationParam>lambdaQuery()
                        .eq(TechnologyRoutingOperationParam::getTechnologyRoutingOperationId, routingOperation.getTechnologyRoutingOperationId())
                        .orderByAsc(TechnologyRoutingOperationParam::getId)
        );
        boolean replaceExisting = syncDto.getReplaceExisting() == null || syncDto.getReplaceExisting();
        if (replaceExisting) {
            productionOrderRoutingOperationParamMapper.delete(
                    Wrappers.<ProductionOrderRoutingOperationParam>lambdaQuery()
                            .eq(ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationId, routingOperation.getId())
            );
        }
        int successCount = 0;
        for (TechnologyRoutingOperationParam sourceParam : sourceParamList) {
            boolean exists = productionOrderRoutingOperationParamMapper.selectCount(
                    Wrappers.<ProductionOrderRoutingOperationParam>lambdaQuery()
                            .eq(ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationId, routingOperation.getId())
                            .eq(ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationParamId, sourceParam.getId())
            ) > 0;
            if (!replaceExisting && exists) {
                continue;
            }
            ProductionOrderRoutingOperationParam target = new ProductionOrderRoutingOperationParam();
            target.setTechnologyRoutingOperationId(routingOperation.getId());
            target.setTechnologyRoutingOperationParamId(sourceParam.getId());
            target.setProductionOrderId(routingOperation.getProductionOrderId());
            target.setTechnologyOperationId(sourceParam.getTechnologyOperationId());
            target.setTechnologyOperationParamId(sourceParam.getTechnologyOperationParamId());
            target.setParamId(sourceParam.getParamId());
            target.setParamCode(sourceParam.getParamCode());
            target.setParamName(sourceParam.getParamName());
            target.setParamType(sourceParam.getParamType());
            target.setParamFormat(sourceParam.getParamFormat());
            target.setUnit(sourceParam.getUnit());
            target.setIsRequired(sourceParam.getIsRequired());
            target.setRemark(sourceParam.getRemark());
            target.setStandardValue(sourceParam.getStandardValue());
            productionOrderRoutingOperationParamMapper.insert(target);
            successCount++;
        }
        return successCount;
    }
    private LambdaQueryWrapper<ProductionOrderRoutingOperationParam> buildQueryWrapper(ProductionOrderRoutingOperationParamDto dto) {
        ProductionOrderRoutingOperationParam query = dto == null ? new ProductionOrderRoutingOperationParam() : dto;
        return Wrappers.<ProductionOrderRoutingOperationParam>lambdaQuery()
                .eq(query.getId() != null, ProductionOrderRoutingOperationParam::getId, query.getId())
                .eq(query.getProductionOrderId() != null, ProductionOrderRoutingOperationParam::getProductionOrderId, query.getProductionOrderId())
                .eq(query.getTechnologyRoutingOperationId() != null,
                        ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationId, query.getTechnologyRoutingOperationId())
                .eq(query.getProductionOrderRoutingOperationId() != null, ProductionOrderRoutingOperationParam::getProductionOrderRoutingOperationId, query.getProductionOrderRoutingOperationId())
                .eq(query.getTechnologyOperationId() != null,
                        ProductionOrderRoutingOperationParam::getTechnologyOperationId, query.getTechnologyOperationId())
                .eq(query.getTechnologyRoutingOperationParamId() != null,
@@ -135,7 +87,7 @@
                        ProductionOrderRoutingOperationParam::getParamCode, query.getParamCode())
                .like(query.getParamName() != null && !query.getParamName().trim().isEmpty(),
                        ProductionOrderRoutingOperationParam::getParamName, query.getParamName())
                .orderByAsc(ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationId)
                .orderByAsc(ProductionOrderRoutingOperationParam::getProductionOrderRoutingOperationId)
                .orderByAsc(ProductionOrderRoutingOperationParam::getId);
    }
@@ -151,25 +103,28 @@
    }
    private void fillFromSourceParam(ProductionOrderRoutingOperationParam item, ProductionOrderRoutingOperation routingOperation) {
        item.setTechnologyRoutingOperationId(routingOperation.getId());
        item.setProductionOrderId(routingOperation.getProductionOrderId());
        item.setProductionOrderRoutingOperationId(routingOperation.getId());
        ProductionOrder productionOrder = productionOrderMapper.selectById(routingOperation.getProductionOrderId());
        if (productionOrder == null) {
            throw new ServiceException("Production order not found");
        }
        if (item.getTechnologyRoutingOperationParamId() == null) {
        if (item.getParamId() == null) {
            return;
        }
        TechnologyRoutingOperationParam sourceParam = technologyRoutingOperationParamMapper.selectById(item.getTechnologyRoutingOperationParamId());
        TechnologyParam sourceParam = technologyParamMapper.selectById(item.getParamId());
        if (sourceParam == null) {
            throw new ServiceException("Technology routing operation param not found");
            throw new ServiceException("Technology  param not found");
        }
        if (!routingOperation.getTechnologyRoutingOperationId().equals(sourceParam.getTechnologyRoutingOperationId())) {
            throw new ServiceException("Source param does not belong to routing operation");
        if (item.getTechnologyOperationParamId() != null) {
            TechnologyRoutingOperationParam sourceRoutingOperationParam = technologyRoutingOperationParamMapper.selectById(item.getTechnologyOperationParamId());
            item.setTechnologyOperationId(sourceRoutingOperationParam.getTechnologyOperationId());
            item.setTechnologyOperationParamId(sourceRoutingOperationParam.getTechnologyOperationParamId());
            if (item.getStandardValue() == null) {
                item.setStandardValue(sourceRoutingOperationParam.getStandardValue());
            }
        }
        item.setTechnologyOperationId(sourceParam.getTechnologyOperationId());
        item.setTechnologyOperationParamId(sourceParam.getTechnologyOperationParamId());
        item.setParamId(sourceParam.getParamId());
        item.setParamId(sourceParam.getId());
        item.setParamCode(sourceParam.getParamCode());
        item.setParamName(sourceParam.getParamName());
        item.setParamType(sourceParam.getParamType());
@@ -178,9 +133,6 @@
        item.setIsRequired(sourceParam.getIsRequired());
        if (item.getRemark() == null || item.getRemark().trim().isEmpty()) {
            item.setRemark(sourceParam.getRemark());
        }
        if (item.getStandardValue() == null) {
            item.setStandardValue(sourceParam.getStandardValue());
        }
    }
@@ -196,7 +148,7 @@
    private void checkDuplicate(ProductionOrderRoutingOperationParam item) {
        boolean duplicate = productionOrderRoutingOperationParamMapper.selectCount(
                Wrappers.<ProductionOrderRoutingOperationParam>lambdaQuery()
                        .eq(ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationId, item.getTechnologyRoutingOperationId())
                        .eq(ProductionOrderRoutingOperationParam::getProductionOrderRoutingOperationId, item.getProductionOrderRoutingOperationId())
                        .eq(item.getTechnologyRoutingOperationParamId() != null,
                                ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationParamId, item.getTechnologyRoutingOperationParamId())
                        .eq(item.getTechnologyRoutingOperationParamId() == null && item.getParamCode() != null,
src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationServiceImpl.java
@@ -1,17 +1,24 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.mapper.ProductionOperationTaskMapper;
import com.ruoyi.production.mapper.ProductionOrderRoutingOperationMapper;
import com.ruoyi.production.mapper.ProductionOrderRoutingOperationParamMapper;
import com.ruoyi.production.mapper.ProductionProductMainMapper;
import com.ruoyi.production.pojo.ProductionOperationTask;
import com.ruoyi.production.pojo.ProductionOrderRoutingOperation;
import com.ruoyi.production.pojo.ProductionOrderRoutingOperationParam;
import com.ruoyi.production.pojo.ProductionProductMain;
import com.ruoyi.production.service.ProductionOrderRoutingOperationService;
import com.ruoyi.production.service.ProductionProductMainService;
import com.ruoyi.technology.mapper.TechnologyOperationParamMapper;
import com.ruoyi.technology.mapper.TechnologyParamMapper;
import com.ruoyi.technology.pojo.TechnologyOperationParam;
import com.ruoyi.technology.pojo.TechnologyParam;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -19,6 +26,7 @@
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
@Service
@@ -31,10 +39,36 @@
    private final ProductionOperationTaskMapper productionOperationTaskMapper;
    private final ProductionProductMainMapper productionProductMainMapper;
    private final ProductionProductMainService productionProductMainService;
    private final TechnologyOperationParamMapper technologyOperationParamMapper;
    private final TechnologyParamMapper technologyParamMapper;
    private final ProductionOrderRoutingOperationParamMapper productionOrderRoutingOperationParamMapper;
    @Override
    public R addRouteItem(ProductionOrderRoutingOperation productionOrderRoutingOperation) {
        int insert = productionOrderRoutingOperationMapper.insert(productionOrderRoutingOperation);
        //工序关联的参数需要同步新增
        List<TechnologyOperationParam> technologyOperationParams = technologyOperationParamMapper.selectList(Wrappers.<TechnologyOperationParam>lambdaQuery()
                .eq(TechnologyOperationParam::getTechnologyOperationId, productionOrderRoutingOperation.getTechnologyOperationId()));
        if (CollectionUtils.isNotEmpty(technologyOperationParams)){
            ArrayList<ProductionOrderRoutingOperationParam> productionOrderRoutingOperationParams = new ArrayList<>();
            for (TechnologyOperationParam technologyOperationParam : technologyOperationParams) {
                TechnologyParam technologyParam = technologyParamMapper.selectById(technologyOperationParam.getTechnologyParamId());
                ProductionOrderRoutingOperationParam productionOrderRoutingOperationParam = new ProductionOrderRoutingOperationParam();
                productionOrderRoutingOperationParam.setProductionOrderId(productionOrderRoutingOperation.getProductionOrderId());
                productionOrderRoutingOperationParam.setProductionOrderRoutingOperationId(productionOrderRoutingOperation.getId());
                productionOrderRoutingOperationParam.setParamCode(technologyParam.getParamCode());
                productionOrderRoutingOperationParam.setParamName(technologyParam.getParamName());
                productionOrderRoutingOperationParam.setParamType(technologyParam.getParamType());
                productionOrderRoutingOperationParam.setParamFormat(technologyParam.getParamFormat());
                productionOrderRoutingOperationParam.setUnit(technologyParam.getUnit());
                productionOrderRoutingOperationParam.setIsRequired(technologyParam.getIsRequired());
                productionOrderRoutingOperationParam.setRemark(technologyParam.getRemark());
                productionOrderRoutingOperationParam.setParamId(technologyParam.getId());
                productionOrderRoutingOperationParam.setTechnologyOperationId(productionOrderRoutingOperation.getTechnologyOperationId());
                productionOrderRoutingOperationParams.add(productionOrderRoutingOperationParam);
            }
            productionOrderRoutingOperationParamMapper.insert(productionOrderRoutingOperationParams);
        }
        String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        if (insert > 0) {
            ProductionOperationTask lastTask = productionOperationTaskMapper.selectOne(
src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
@@ -237,6 +237,7 @@
            targetOperation.setDragSort(sourceOperation.getDragSort());
            targetOperation.setIsQuality(sourceOperation.getIsQuality());
            targetOperation.setOperationName(operationNameMap.get(sourceOperation.getTechnologyOperationId()));
            targetOperation.setTechnologyOperationId(sourceOperation.getTechnologyOperationId());
            productionOrderRoutingOperationMapper.insert(targetOperation);
            ProductionOperationTask task = new ProductionOperationTask();
@@ -256,7 +257,7 @@
                // å·¥åºæ‰§è¡Œå‚数同样做快照,避免工艺参数调整影响已下达订单。
                ProductionOrderRoutingOperationParam targetParam = new ProductionOrderRoutingOperationParam();
                targetParam.setProductionOrderId(productionOrder.getId());
                targetParam.setTechnologyRoutingOperationId(targetOperation.getId());
                targetParam.setProductionOrderRoutingOperationId(targetOperation.getId());
                targetParam.setTechnologyRoutingOperationParamId(sourceParam.getId());
                targetParam.setParamId(sourceParam.getParamId());
                targetParam.setTechnologyOperationId(sourceParam.getTechnologyOperationId());
@@ -312,7 +313,7 @@
            target.setProductModelId(source.getProductModelId());
            target.setTechnologyOperationId(source.getOperationId());
            target.setUnitQuantity(source.getUnitQuantity());
            target.setDemandedQuantity(resolveBomDemandQuantity(source, orderQuantity));
            target.setDemandedQuantity(source.getUnitQuantity().multiply(orderQuantity));
            target.setUnit(source.getUnit());
            productionBomStructureMapper.insert(target);
            idMap.put(source.getId(), target.getId());
@@ -571,16 +572,6 @@
        } else {
            productionOrderPickMapper.updateById(orderPick);
        }
    }
    private BigDecimal resolveBomDemandQuantity(TechnologyBomStructure source, BigDecimal orderQuantity) {
        // å·¥è‰º BOM ä¸­çš„需求量按“单件需求 * è®¢å•数量”展开成订单级需求。
        BigDecimal baseQuantity = source.getDemandedQuantity() != null ? source.getDemandedQuantity() : source.getUnitQuantity();
        baseQuantity = baseQuantity == null ? BigDecimal.ZERO : baseQuantity;
        if (baseQuantity.compareTo(BigDecimal.ZERO) <= 0) {
            return BigDecimal.ZERO;
        }
        return baseQuantity.multiply(orderQuantity);
    }
    private List<Long> parsePlanIds(String productionPlanIds) {
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -136,7 +136,6 @@
        productionProductMain.setUserId(dto.getUserId());
        productionProductMain.setUserName(dto.getUserName());
        productionProductMain.setProductionOperationTaskId(productionOperationTask.getId());
        productionProductMain.setWorkOrderId(productionOperationTask.getId());
        productionProductMain.setStatus(0);
        productionProductMainMapper.insert(productionProductMain);
src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java
@@ -66,4 +66,6 @@
    public R remove(@RequestBody List<Long> ids) {
        return R.ok(technologyRoutingService.removeTechnologyRouting(ids));
    }
    //TODO å¢žåŠ å·¥è‰ºè·¯çº¿é™„ä»¶ä¸Šä¼  @陈海杰
}
src/main/resources/mapper/production/ProductionOrderMapper.xml
@@ -65,6 +65,12 @@
                <if test="c.id != null">
                    and po.id = #{c.id}
                </if>
                <if test="c.productName != null and c.productName != ''">
                    and p.product_name like concat('%', #{c.productName}, '%')
                </if>
                <if test="c.model != null and c.model != ''">
                    and pm.model like concat('%', #{c.model}, '%')
                </if>
                <if test="c.productModelId != null">
                    and po.product_model_id = #{c.productModelId}
                </if>
src/main/resources/mapper/production/ProductionOrderRoutingOperationMapper.xml
@@ -7,7 +7,7 @@
        <id column="id" property="id" />
        <result column="production_order_id" property="productionOrderId" />
        <result column="technology_routing_operation_id" property="technologyRoutingOperationId" />
        <result column="technology_routing_id" property="technologyRoutingId" />
        <result column="order_routing_id" property="orderRoutingId" />
        <result column="product_model_id" property="productModelId" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
@@ -19,6 +19,7 @@
    <resultMap id="OperationVoResultMap" type="com.ruoyi.production.bean.vo.ProductionOrderRoutingOperationVo" extends="BaseResultMap">
        <result column="technologyOperationId" property="technologyOperationId" />
        <result column="productionOrderRoutingOperationId" property="productionOrderRoutingOperationId" />
        <result column="productName" property="productName" />
        <result column="model" property="model" />
        <result column="unit" property="unit" />
@@ -26,13 +27,14 @@
    <select id="selectVoListByOrderId" resultMap="OperationVoResultMap">
        SELECT
        poro.id AS productionOrderRoutingOperationId,
        poro.*,
        tro.technology_operation_id AS technologyOperationId,
        too.id AS technologyOperationId,
        p.product_name AS productName,
        pm.model AS model,
        pm.unit AS unit
        FROM production_order_routing_operation poro
        LEFT JOIN technology_routing_operation tro ON poro.technology_routing_operation_id = tro.id
        LEFT JOIN technology_operation too ON poro.technology_operation_id = too.id
        LEFT JOIN product_model pm ON poro.product_model_id = pm.id
        LEFT JOIN product p ON pm.product_id = p.id
        WHERE poro.production_order_id = #{orderId}