已添加7个文件
已修改29个文件
739 ■■■■ 文件已修改
doc/宁夏-中盛建材.sql 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/controller/BaseParamController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/BaseParamService.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/BaseParamServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProcessRouteItemController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProcessRouteItemParamController.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductOrderController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProcessRouteItemDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProcessRouteItemParamDto.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductBomDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductStructureDto.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProcessRouteItemParamMapper.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProcessRoute.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProcessRouteItemParam.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProcessRouteItemParamService.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProcessRouteItemService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductOrderService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProcessRouteItemParamServiceImpl.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProcessRouteItemServiceImpl.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/dto/ProductionPlanDto.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/dto/ProductionPlanSummaryDto.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/dto/QualityTestStandardBindingDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/pojo/QualityInspect.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProcessRouteItemMapper.xml 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProcessRouteItemParamMapper.xml 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProcessRouteMapper.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductBomMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductOrderMapper.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductProcessRouteItemMapper.xml 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductStructureMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/productionPlan/ProductionPlanMapper.xml 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/quality/QualityTestStandardBindingMapper.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/ÄþÏÄ-ÖÐÊ¢½¨²Ä.sql
@@ -234,3 +234,37 @@
ALTER TABLE `product-inventory-management-zsjc`.`customer`
    ADD COLUMN `form_instance_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '宜搭表单实例ID' AFTER `customer_type`,
    ADD COLUMN `form_modified_time` datetime(0) NULL DEFAULT NULL COMMENT '宜搭修改时间' AFTER `form_instance_id`;
ALTER TABLE `process_route`
    ADD COLUMN `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态:0-草稿,1-已批准' AFTER `bom_id`;
CREATE TABLE `process_route_item_param`
(
    `id`               bigint  NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `route_item_id`    bigint  NOT NULL COMMENT '关联工艺路线明细ID (process_route_item.id)',
    `param_id`         bigint  NOT NULL COMMENT '关联基础参数定义ID (base_param.id)',
    `process_param_id` bigint                                                        DEFAULT NULL COMMENT '来源工序参数ID',
    `standard_value`   varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '此路线节点设定的标准值',
    `min_value`        decimal(10, 2)                                                DEFAULT NULL COMMENT '此路线节点设定的标准最小值',
    `max_value`        decimal(10, 2)                                                DEFAULT NULL COMMENT '此路线节点设定的标准最大值',
    `is_required`      tinyint NOT NULL                                              DEFAULT '0' COMMENT '是否必填',
    `sort`             int     NOT NULL                                              DEFAULT '0' COMMENT '排序',
    `tenant_id`        bigint                                                        DEFAULT NULL COMMENT '租户ID',
    `create_time`      datetime                                                      DEFAULT CURRENT_TIMESTAMP,
    `update_time`      datetime                                                      DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`) USING BTREE,
    KEY `idx_route_item_id` (`route_item_id`) USING BTREE,
    KEY `idx_param_id` (`param_id`) USING BTREE
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COLLATE = utf8mb4_0900_ai_ci COMMENT ='工艺路线工序参数表';
ALTER TABLE `product-inventory-management-zsjc`.`quality_inspect`
    ADD COLUMN `inspect_nature` varchar(255) NULL COMMENT '检测性质' AFTER `test_standard_id`,
ADD COLUMN `sample_code` varchar(255) NULL COMMENT '试样编号' AFTER `inspect_nature`,
ADD COLUMN `sample_state` varchar(255) NULL COMMENT '试样状态' AFTER `sample_code`,
ADD COLUMN `sample_time` date NULL COMMENT '取样日期' AFTER `sample_state`,
ADD COLUMN `license_plate_number` varchar(255) NULL COMMENT '车牌号' AFTER `sample_time`;
src/main/java/com/ruoyi/basic/controller/BaseParamController.java
@@ -1,5 +1,7 @@
package com.ruoyi.basic.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.pojo.BaseParam;
import com.ruoyi.basic.service.BaseParamService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
@@ -31,9 +33,9 @@
    @GetMapping("list")
    @Log(title = "基础参数数据集合", businessType = BusinessType.OTHER)
    @ApiOperation("基础参数数据集合")
    public AjaxResult baseParamList(BaseParam baseParam) {
        List<BaseParam> list = baseParamService.baseParamList(baseParam);
        return AjaxResult.success(list);
    public AjaxResult baseParamList(Page<BaseParam> page, BaseParam baseParam) {
        IPage<BaseParam> paramList = baseParamService.baseParamList(page, baseParam);
        return AjaxResult.success(paramList);
    }
    @PostMapping("/add")
src/main/java/com/ruoyi/basic/service/BaseParamService.java
@@ -1,5 +1,7 @@
package com.ruoyi.basic.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.basic.pojo.BaseParam;
@@ -15,7 +17,7 @@
 * @since 2026/03/13 16:40
 */
public interface BaseParamService extends IService<BaseParam> {
    List<BaseParam> baseParamList(BaseParam baseParam);
    IPage<BaseParam> baseParamList(Page<BaseParam> page, BaseParam baseParam);
    int addBaseParam(BaseParam baseParam);
src/main/java/com/ruoyi/basic/service/impl/BaseParamServiceImpl.java
@@ -1,6 +1,8 @@
package com.ruoyi.basic.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.mapper.BaseParamMapper;
import com.ruoyi.basic.pojo.BaseParam;
@@ -32,24 +34,24 @@
public class BaseParamServiceImpl extends ServiceImpl<BaseParamMapper, BaseParam> implements BaseParamService {
    @Override
    public List<BaseParam> baseParamList(BaseParam baseParam) {
    public IPage<BaseParam> baseParamList(Page<BaseParam> page, BaseParam baseParam) {
        LambdaQueryWrapper<BaseParam> queryWrapper = new LambdaQueryWrapper<>();
        if (StringUtils.isNotEmpty(baseParam.getParamName())) {
            queryWrapper.like(BaseParam::getParamName, baseParam.getParamName());
        }
        List<BaseParam> list = list(queryWrapper);
        if (list == null || list.isEmpty()) {
            return new ArrayList<>(0);
        Page<BaseParam> paramPage = page(page, queryWrapper);
        if (paramPage == null || paramPage.getRecords().isEmpty()) {
            return new Page<>();
        }
        // å¤„理日期格式展示
        list.forEach(item -> {
        paramPage.getRecords().forEach(item -> {
            if (Integer.valueOf(4).equals(item.getParamType()) && StringUtils.isNotEmpty(item.getParamFormat())) {
                item.setParamFormat(toUpperCasePattern(item.getParamFormat()));
            }
        });
        return list;
        return paramPage;
    }
    @Override
src/main/java/com/ruoyi/production/controller/ProcessRouteItemController.java
@@ -32,13 +32,13 @@
        return R.ok(processRouteItemService.listProcessRouteItemDto(processRouteItemDto));
    }
    @PostMapping ()
    @ApiOperation("新增修改")
    @PostMapping()
    @ApiOperation("新增修改工序")
    public R addOrUpdate(@RequestBody ProcessRouteItem processRouteItem) {
        return R.ok(processRouteItemService.saveOrUpdate(processRouteItem));
        return R.ok(processRouteItemService.saveOrUpdateProcess(processRouteItem));
    }
    @PostMapping ("/sort")
    @PostMapping("/sort")
    @ApiOperation("排序")
    public R sort(@RequestBody ProcessRouteItem processRouteItem) {
        return R.ok(processRouteItemService.sort(processRouteItem));
src/main/java/com/ruoyi/production/controller/ProcessRouteItemParamController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.ProcessRouteItemParamDto;
import com.ruoyi.production.pojo.ProcessRouteItemParam;
import com.ruoyi.production.service.ProcessRouteItemParamService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
/**
 * <br>
 * å·¥è‰ºè·¯çº¿å·¥åºå‚数实例控制层
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/16 11:15
 */
@RestController
@RequestMapping("/ProcessRouteItemParam")
@Api("工艺路线工序参数实例控制层")
public class ProcessRouteItemParamController {
    @Autowired
    private ProcessRouteItemParamService processRouteItemParamService;
    @GetMapping("/pageList")
    @ApiOperation("工艺绑定的工序参数分页查询")
    @Log(title = "工艺绑定的工序参数分页查询", businessType = BusinessType.OTHER)
    public AjaxResult listPage(Page<ProcessRouteItemParam> page, ProcessRouteItemParam param) {
        IPage<ProcessRouteItemParamDto> paramIPage = processRouteItemParamService.pageList(page, param);
        return AjaxResult.success(paramIPage);
    }
    @ApiOperation("修改参数实例值")
    @PutMapping("/edit")
    @Log(title = "修改参数", businessType = BusinessType.UPDATE)
    public AjaxResult edit(@RequestBody ProcessRouteItemParam param) {
        return AjaxResult.success(processRouteItemParamService.updateById(param));
    }
    @ApiOperation("删除参数")
    @DeleteMapping("/remove/{ids}")
    @Log(title = "删除参数", businessType = BusinessType.DELETE)
    public AjaxResult remove(@PathVariable Long[] ids) {
        return AjaxResult.success(processRouteItemParamService.removeByIds(Arrays.asList(ids)));
    }
    @ApiOperation("初始化工序参数")
    @PostMapping("/init")
    @Log(title = "初始化参数", businessType = BusinessType.INSERT)
    public AjaxResult init(Long routeItemId, Long processId) {
        return AjaxResult.success(processRouteItemParamService.initParams(routeItemId, processId));
    }
    @ApiOperation("新增单个参数实例")
    @PostMapping("/save")
    @Log(title = "新增参数", businessType = BusinessType.INSERT)
    public AjaxResult save(@RequestBody ProcessRouteItemParam param) {
        processRouteItemParamService.saveParam(param);
        return AjaxResult.success();
    }
}
src/main/java/com/ruoyi/production/controller/ProductOrderController.java
@@ -30,7 +30,7 @@
    @ApiOperation("分页查询")
    @GetMapping("page")
    public R page(ProductOrderDto productOrder, Page page) {
    public R page(ProductOrderDto productOrder, Page<ProductOrder> page) {
        return R.ok(productOrderService.pageProductOrder(page, productOrder));
    }
src/main/java/com/ruoyi/production/dto/ProcessRouteItemDto.java
@@ -12,20 +12,18 @@
    @ApiModelProperty(value = "工序名称")
    private String processName;
    @ApiModelProperty(value = "工艺路线名称")
    private String routeName;
    @ApiModelProperty(value = "生产炒机")
    private String speculativeTradingName;
    @ApiModelProperty(value = "产品名称")
    private String productName;
    @ApiModelProperty(value = "单位")
    private String unit;
    @ApiModelProperty(value = "产品ID")
    private Long productId;
    @ApiModelProperty(value = "产品规格")
    private String model;
    @ApiModelProperty("工序参数个数")
    private Integer paramCount;
}
src/main/java/com/ruoyi/production/dto/ProcessRouteItemParamDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProcessRouteItemParam;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * <br>
 * å·¥è‰ºè·¯çº¿å·¥åºå‚数实例Dto
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/16 11:23
 */
@Data
public class ProcessRouteItemParamDto extends ProcessRouteItemParam {
    @ApiModelProperty("参数名称")
    private String paramName;
    @ApiModelProperty("参数唯一标识")
    private String paramKey;
    @ApiModelProperty("单位")
    private String unit;
    @ApiModelProperty("参数类型(1数字 2文本 3下拉选择 4时间)")
    private Integer paramType;
    @ApiModelProperty("参数格式")
    private String paramFormat;
    @ApiModelProperty("值模式(1单值 2区间)")
    private Integer valueMode;
}
src/main/java/com/ruoyi/production/dto/ProductBomDto.java
@@ -15,4 +15,7 @@
    //产品规格型号
    private String productModelName;
    //产品编码
    private String productCode;
}
src/main/java/com/ruoyi/production/dto/ProductStructureDto.java
@@ -15,12 +15,17 @@
    @ApiModelProperty(value = "工艺名称")
    private String processName;
    @ApiModelProperty(value = "产品编码")
    private String productCode;
    @ApiModelProperty(value = "产品名称")
    private String productName;
    @ApiModelProperty(value = "产品id")
    //宁夏-中盛建材使用新的产品表关联product_material
    private Long productId;
    @ApiModelProperty(value = "规格型号")
    private String model;
    @TableField(exist = false)
src/main/java/com/ruoyi/production/mapper/ProcessRouteItemParamMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.ruoyi.production.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.production.dto.ProcessRouteItemParamDto;
import com.ruoyi.production.pojo.ProcessRouteItemParam;
import org.apache.ibatis.annotations.Param;
/**
 * <br>
 * å·¥è‰ºè·¯çº¿å·¥åºå‚数实例 Mapper
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/16 11:11
 */
public interface ProcessRouteItemParamMapper extends BaseMapper<ProcessRouteItemParam> {
    IPage<ProcessRouteItemParamDto> selectParamPage(@Param("page") Page<ProcessRouteItemParam> page, @Param("p") ProcessRouteItemParam param);
    /**
     * æ ¹æ®å·¥åº ID åˆå§‹åŒ–参数到工艺路线明细实例
     *
     * @param routeItemId å·¥è‰ºè·¯çº¿æ˜Žç»†ID
     * @param processId   å·¥åºID
     * @param tenantId    ç§Ÿæˆ·ID
     */
    int insertFromProcessTemplate(@Param("routeItemId") Long routeItemId, @Param("processId") Long processId, @Param("tenantId") Long tenantId);
    Integer selectMaxSortByRouteItemId(Long routeItemId);
}
src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java
@@ -16,7 +16,7 @@
@Mapper
public interface ProductOrderMapper extends BaseMapper<ProductOrder> {
    IPage<ProductOrderDto> pageProductOrder(Page page, @Param("c") ProductOrderDto productOrder);
    IPage<ProductOrderDto> pageProductOrder(Page<ProductOrder> page, @Param("c") ProductOrderDto productOrder);
    List<ProcessRoute> listProcessRoute(@Param("productModelId") Long productModelId);
src/main/java/com/ruoyi/production/pojo/ProcessRoute.java
@@ -41,4 +41,7 @@
    @ApiModelProperty(value = "BOM的ID")
    private Integer bomId;
    @ApiModelProperty(value = "状态:0-草稿,1-已批准")
    private Boolean status;
}
src/main/java/com/ruoyi/production/pojo/ProcessRouteItemParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * <br>
 * å·¥è‰ºè·¯çº¿å·¥åºå‚数实例
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/16 11:07
 */
@Data
@TableName("process_route_item_param")
@ApiModel("工艺路线工序参数实例表")
public class ProcessRouteItemParam {
    @TableId(value = "id", type = IdType.AUTO)
    @ApiModelProperty("主键ID")
    private Long id;
    @ApiModelProperty("关联工艺路线明细ID (process_route_item.id)")
    private Long routeItemId;
    @ApiModelProperty("关联基础参数定义ID (base_param.id)")
    private Long paramId;
    @ApiModelProperty("来源工序参数ID")
    private Long processParamId;
    @ApiModelProperty("此路线节点设定的标准值")
    private String standardValue;
    @ApiModelProperty("此路线节点设定的标准最小值")
    private BigDecimal minValue;
    @ApiModelProperty("此路线节点设定的标准最大值")
    private BigDecimal maxValue;
    @ApiModelProperty("是否必填")
    private Integer isRequired;
    @ApiModelProperty("排序")
    private Integer sort;
    @ApiModelProperty("租户ID")
    private Long tenantId;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty("创建时间")
    private LocalDateTime createTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty("更新时间")
    private LocalDateTime updateTime;
}
src/main/java/com/ruoyi/production/service/ProcessRouteItemParamService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.production.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.production.dto.ProcessRouteItemParamDto;
import com.ruoyi.production.pojo.ProcessRouteItemParam;
/**
 * <br>
 * å·¥è‰ºè·¯çº¿å·¥åºå‚数实例 Service
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/16 11:11
 */
public interface ProcessRouteItemParamService extends IService<ProcessRouteItemParam> {
    IPage<ProcessRouteItemParamDto> pageList(Page<ProcessRouteItemParam> page, ProcessRouteItemParam param);
    boolean initParams(Long routeItemId, Long processId);
    void saveParam(ProcessRouteItemParam param);
}
src/main/java/com/ruoyi/production/service/ProcessRouteItemService.java
@@ -15,4 +15,6 @@
    int sort(ProcessRouteItem processRouteItem);
    String batchDelete(Long id);
    boolean saveOrUpdateProcess(ProcessRouteItem processRouteItem);
}
src/main/java/com/ruoyi/production/service/ProductOrderService.java
@@ -14,7 +14,7 @@
public interface ProductOrderService extends IService<ProductOrder> {
    IPage<ProductOrderDto> pageProductOrder(Page page, ProductOrderDto productOrder);
    IPage<ProductOrderDto> pageProductOrder(Page<ProductOrder> page, ProductOrderDto productOrder);
    int bindingRoute(ProductOrder productOrder);
src/main/java/com/ruoyi/production/service/impl/ProcessRouteItemParamServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
package com.ruoyi.production.service.impl;
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.basic.pojo.BaseParam;
import com.ruoyi.basic.service.BaseParamService;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.production.dto.ProcessRouteItemParamDto;
import com.ruoyi.production.mapper.ProcessRouteItemParamMapper;
import com.ruoyi.production.pojo.ProcessRouteItemParam;
import com.ruoyi.production.service.ProcessRouteItemParamService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
/**
 * <br>
 * å·¥è‰ºè·¯çº¿å·¥åºå‚数实例 ServiceImpl
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/03/16 11:11
 */
@Slf4j
@Service
public class ProcessRouteItemParamServiceImpl extends ServiceImpl<ProcessRouteItemParamMapper, ProcessRouteItemParam> implements ProcessRouteItemParamService {
    @Autowired
    private BaseParamService baseParamService;
    @Override
    public IPage<ProcessRouteItemParamDto> pageList(Page<ProcessRouteItemParam> page, ProcessRouteItemParam param) {
        return baseMapper.selectParamPage(page, param);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean initParams(Long routeItemId, Long processId) {
        Long tenantId = SecurityUtils.getLoginUser().getTenantId();
        if (tenantId == null) {
            tenantId = 208L;
        }
        return baseMapper.insertFromProcessTemplate(routeItemId, processId, tenantId) > 0;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveParam(ProcessRouteItemParam param) {
        if (param == null) {
            throw new ServiceException("新增失败,参数不能为空");
        }
        if (param.getRouteItemId() == null || param.getParamId() == null) {
            throw new ServiceException("关联工序ID和参数项ID不能为空");
        }
        Long tenantId = SecurityUtils.getLoginUser().getTenantId();
        Long count = baseMapper.selectCount(Wrappers.<ProcessRouteItemParam>lambdaQuery()
                .eq(ProcessRouteItemParam::getRouteItemId, param.getRouteItemId())
                .eq(ProcessRouteItemParam::getParamId, param.getParamId())
                .eq(ProcessRouteItemParam::getTenantId, tenantId));
        if (count > 0) {
            throw new ServiceException("该工序已存在此参数项,请勿重复添加");
        }
        BaseParam baseParam = baseParamService.getById(param.getParamId());
        if (baseParam == null) {
            throw new ServiceException("新增失败,改基础参数不存在");
        }
        Integer maxSort = baseMapper.selectMaxSortByRouteItemId(param.getRouteItemId());
        param.setId(null);
        param.setProcessParamId(null);
        param.setSort(maxSort);
        param.setCreateTime(LocalDateTime.now());
        param.setTenantId(tenantId);
        this.save(param);
    }
}
src/main/java/com/ruoyi/production/service/impl/ProcessRouteItemServiceImpl.java
@@ -1,13 +1,17 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.SecurityUtils;
import com.ruoyi.production.dto.ProcessRouteItemDto;
import com.ruoyi.production.mapper.ProcessRouteItemMapper;
import com.ruoyi.production.mapper.ProcessRouteItemParamMapper;
import com.ruoyi.production.pojo.ProcessRouteItem;
import com.ruoyi.production.pojo.ProcessRouteItemParam;
import com.ruoyi.production.service.ProcessRouteItemService;
import com.ruoyi.production.service.ProductMaterialSkuService;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -22,6 +26,12 @@
    @Autowired
    private  ProcessRouteItemMapper processRouteItemMapper;
    @Autowired
    private ProcessRouteItemParamMapper processRouteItemParamMapper;
    @Autowired
    private ProductMaterialSkuService productMaterialSkuService;
    @Override
    public List<ProcessRouteItemDto> listProcessRouteItemDto(ProcessRouteItemDto processRouteItemDto) {
@@ -73,6 +83,9 @@
        Long routeId = deleteProcessRouteItem.getRouteId();
        // åˆ é™¤æŒ‡å®šæ•°æ®
        processRouteItemMapper.deleteById(id);
        //  åˆ é™¤å¯¹åº”的参数列表
        processRouteItemParamMapper.delete(new LambdaQueryWrapper<ProcessRouteItemParam>().eq(ProcessRouteItemParam::getRouteItemId,id));
        // æŸ¥è¯¢è¯¥å·¥è‰ºè·¯çº¿çš„æ‰€æœ‰å·¥åºå¹¶æŒ‰ç…§é¡ºåºæŽ’序
        List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(Wrappers.<ProcessRouteItem>lambdaQuery()
                .eq(ProcessRouteItem::getRouteId, routeId)
@@ -87,4 +100,35 @@
        }
        return "删除成功";
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean saveOrUpdateProcess(ProcessRouteItem processRouteItem) {
        if (processRouteItem == null) {
            throw new ServiceException("数据不能为空");
        }
        if (processRouteItem.getProductModelId() != null) {
            Object product = productMaterialSkuService.getById(processRouteItem.getProductModelId());
            if (product == null) {
                throw new ServiceException("操作失败:关联的产品(ID:" + processRouteItem.getProductModelId() + ")不存在");
            }
        } else {
            throw new ServiceException("产品ID不能为空");
        }
        Long tenantId = SecurityUtils.getLoginUser().getTenantId();
        processRouteItem.setTenantId(tenantId);
        boolean result;
        if (processRouteItem.getId() == null) {
            Long maxSort = processRouteItemMapper.selectCount(Wrappers.<ProcessRouteItem>lambdaQuery().eq(ProcessRouteItem::getRouteId, processRouteItem.getRouteId()));
            processRouteItem.setDragSort((int) (maxSort + 1));
            result = this.save(processRouteItem);
            processRouteItemParamMapper.insertFromProcessTemplate(processRouteItem.getId(), processRouteItem.getProcessId(), tenantId);
        } else {
            result = this.updateById(processRouteItem);
        }
        return result;
    }
}
src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
@@ -46,21 +46,24 @@
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Integer saveProcessRoute(ProcessRoute processRoute) {
        this.save(processRoute);
        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        String idStr = String.format("%06d", processRoute.getId());
        String newProductCode = "GYLX" + dateStr + idStr;
        // æ›´æ–°æ•°æ®åº“中的productCode
        processRoute.setProcessRouteCode(newProductCode);
        return processRouteMapper.updateById(processRoute);
        save(processRoute);
        if (processRoute.getProcessRouteCode() == null || processRoute.getProcessRouteCode().trim().isEmpty()) {
            String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
            String idStr = String.format("%06d", processRoute.getId());
            String newProductCode = "GYLX" + dateStr + idStr;
            processRoute.setProcessRouteCode(newProductCode);
            return processRouteMapper.updateById(processRoute);
        }
        return 1;
    }
    @Override
    public int batchDelete(List<Long> ids) {
        //先判断是否已经引用了
        List<ProductOrder> productOrders = productOrderMapper.selectList(Wrappers.<ProductOrder>lambdaQuery().in(ProductOrder::getRouteId, ids));
        if (productOrders.size()>0){
        if (productOrders.size() > 0) {
            throw new RuntimeException("该工艺路线生产已引用,不能删除");
        }
        //删除工艺路线详情
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -77,7 +77,7 @@
    private StockUtils stockUtils;
    @Override
    public IPage<ProductOrderDto> pageProductOrder(Page page, ProductOrderDto productOrder) {
    public IPage<ProductOrderDto> pageProductOrder(Page<ProductOrder> page, ProductOrderDto productOrder) {
        return productOrderMapper.pageProductOrder(page, productOrder);
    }
src/main/java/com/ruoyi/productionPlan/dto/ProductionPlanDto.java
@@ -33,11 +33,11 @@
     */
    @ApiModelProperty("产品规格")
    @Excel(name = "产品规格")
    private String specification;
    private String model;
    @ApiModelProperty("产品单位")
    @Excel(name = "产品单位")
    private String baseUnit;
    private String unit;
    @ApiModelProperty(value = "生产计划id集合")
    private List<Long> ids;
src/main/java/com/ruoyi/productionPlan/dto/ProductionPlanSummaryDto.java
@@ -35,7 +35,7 @@
     * äº§å“è§„æ ¼
     */
    @ApiModelProperty("产品规格")
    private String specification;
    private String model;
    /**
     * äº§å“é•¿åº¦
@@ -71,6 +71,6 @@
     * åŸºæœ¬å•位
     */
    @ApiModelProperty("基本单位")
    private String baseUnit;
    private String unit;
}
src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
@@ -122,8 +122,8 @@
        }
        // æ ¡éªŒæ˜¯å¦å­˜åœ¨ä¸åŒçš„产品规格
        String firstProductSpec = plans.get(0).getSpecification();
        if (plans.stream().anyMatch(p -> p.getSpecification() == null || !p.getSpecification().equals(firstProductSpec))) {
        String firstProductSpec = plans.get(0).getModel();
        if (plans.stream().anyMatch(p -> p.getModel() == null || !p.getModel().equals(firstProductSpec))) {
            throw new BaseException("合并失败,存在不同的产品规格");
        }
src/main/java/com/ruoyi/quality/dto/QualityTestStandardBindingDto.java
@@ -8,6 +8,8 @@
public class QualityTestStandardBindingDto {
    private String productName;
    private String model;
    private String materialCode;
    private Long qualityTestStandardBindingId;
}
src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -73,6 +73,7 @@
     * å…³è”产品id
     */
    @NotBlank(message = "产品id不能为空")
    //宁夏-中盛建材使用新的产品表关联product_material_sku
    private Long productId;
    /**
@@ -157,4 +158,35 @@
    private String workOrderNo;
    @TableField(exist = false)
    private String purchaseContractNo;
    /**
     * å–样日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "取样日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date sampleTime;
    /**
     * æ£€æµ‹æ€§è´¨
     */
    @Excel(name = "检测性质")
    private String inspectNature;
    /**
     * è¯•样编号
     */
    @Excel(name = "试样编号")
    private String sampleCode;
    /**
     * è¯•样状态
     */
    @Excel(name = "试样状态")
    private String sampleState;
    /**
     * è½¦ç‰Œå·
     */
    @Excel(name = "车牌号")
    private String licensePlateNumber;
}
src/main/resources/mapper/production/ProcessRouteItemMapper.xml
@@ -15,21 +15,21 @@
    <select id="listProcessRouteItemDto" resultType="com.ruoyi.production.dto.ProcessRouteItemDto">
        select pri.*,
               pr.description ,
               pp.name as process_name,
               pm.speculative_trading_name,
               pm.product_id,
               pm.model,
               p.product_name,
               pm.unit
        from
            process_route_item pri
                left join product_model pm on pri.product_model_id = pm.id
                left join product_process pp on pp.id = pri.process_id
                left join product p on p.id = pm.product_id
                left join process_route pr on pr.id = pri.route_id
        where
            pri.route_id = #{c.routeId}
               pr.description,
               pp.name                             as process_name,
               pms.product_id,
               pms.model,
               pm.product_name,
               pm.unit,
               (SELECT COUNT(1)
                FROM process_route_item_param prip
                WHERE prip.route_item_id = pri.id) as paramCount
        from process_route_item pri
                 left join process_route pr on pr.id = pri.route_id
                 left join product_process pp on pp.id = pri.process_id
                 left join product_material_sku pms on pms.id = pri.product_model_id
                 left join product_material pm on pm.id = pms.product_id
        where pri.route_id = #{c.routeId}
        order by pri.drag_sort
    </select>
</mapper>
src/main/resources/mapper/production/ProcessRouteItemParamMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.production.mapper.ProcessRouteItemParamMapper">
    <resultMap id="ProcessRouteItemParamResultMap" type="com.ruoyi.production.pojo.ProcessRouteItemParam">
        <id property="id" column="id"/>
        <result property="routeItemId" column="route_item_id"/>
        <result property="paramId" column="param_id"/>
        <result property="processParamId" column="process_param_id"/>
        <result property="standardValue" column="standard_value"/>
        <result property="minValue" column="min_value"/>
        <result property="maxValue" column="max_value"/>
        <result property="isRequired" column="is_required"/>
        <result property="sort" column="sort"/>
        <result property="tenantId" column="tenant_id"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
    </resultMap>
    <insert id="insertFromProcessTemplate">
        INSERT INTO process_route_item_param (route_item_id, param_id, process_param_id,
                                              standard_value, min_value, max_value,
                                              is_required, sort, tenant_id, create_time)
        SELECT #{routeItemId},
               param_id,
               id,
               standard_value,
               min_value,
               max_value,
               is_required,
               sort,
               #{tenantId},
               NOW()
        FROM product_process_param
        WHERE process_id = #{processId}
    </insert>
    <select id="selectParamPage" resultType="com.ruoyi.production.dto.ProcessRouteItemParamDto">
        select
        prip.*,
        bp.param_name,
        bp.param_key,
        bp.unit,
        bp.param_type,
        bp.param_format,
        bp.value_mode
        from process_route_item_param prip
        left join base_param bp on prip.param_id = bp.id
        <where>
            <if test="p.routeItemId != null">
                and prip.route_item_id = #{p.routeItemId}
            </if>
            <if test="p.tenantId != null">
                and prip.tenant_id = #{p.tenantId}
            </if>
        </where>
        order by prip.sort asc, prip.id asc
    </select>
    <select id="selectMaxSortByRouteItemId" resultType="java.lang.Integer">
        SELECT MAX(sort)
        FROM process_route_item_param
        WHERE route_item_id = #{routeItemId}
    </select>
</mapper>
src/main/resources/mapper/production/ProcessRouteMapper.xml
@@ -4,25 +4,30 @@
    <resultMap id="basicMap" type="com.ruoyi.production.pojo.ProcessRoute">
            <id property="id" column="id"/>
            <result property="productModelId" column="product_model_id"/>
            <result property="description" column="description"/>
            <result property="tenantId" column="tenant_id"/>
            <result property="createTime" column="create_time"/>
            <result property="updateTime" column="update_time"/>
        <id property="id" column="id"/>
        <result property="productModelId" column="product_model_id"/>
        <result property="description" column="description"/>
        <result property="tenantId" column="tenant_id"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
        <result property="status" column="status"/>
    </resultMap>
    <select id="pageProcessRouteDto" resultType="com.ruoyi.production.dto.ProcessRouteDto">
        select ps.*, p.product_name,pm.product_id,pm.model,pb.bom_no
        select
        ps.*,
        pm.product_name, pms.product_id, pms.model, pb.bom_no
        from process_route ps
        left join product_bom pb on ps.bom_id = pb.id
        left join product_model pm on ps.product_model_id = pm.id
        left join product p on pm.product_id = p.id
        left join product_material_sku pms on ps.product_model_id = pms.id
        left join product_material pm on pms.product_id = pm.id
        <where>
            <if test="c.model != null and c.model != ''">
                and pm.model like concat('%',#{c.model},'%')
                and pms.model like concat('%', #{c.model}, '%')
            </if>
        </where>
        order by ps.id asc
        order by ps.id
    </select>
</mapper>
src/main/resources/mapper/production/ProductBomMapper.xml
@@ -21,7 +21,8 @@
        SELECT
        pb.*,
        pms.model AS productModelName,
        pm.product_name AS productName
        pm.product_name AS productName,
        pms.material_code AS productCode
        FROM product_bom pb
        LEFT JOIN product_material_sku pms ON pb.product_model_id = pms.id
        LEFT JOIN product_material pm ON pms.product_id = pm.id
src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -5,14 +5,14 @@
    <resultMap id="basicMap" type="com.ruoyi.production.pojo.ProductOrder">
        <id property="id" column="id"/>
        <result property="productModelId" column="product_model_id"/>
        <result property="tenantId" column="tenant_id"/>
        <result property="salesLedgerId" column="sales_ledger_id"/>
        <result property="routeId" column="route_id"/>
        <result property="npsNo" column="nps_no"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
        <result property="planCompleteTime" column="plan_complete_time"/>
    </resultMap>
    <select id="pageProductOrder" resultType="com.ruoyi.production.dto.ProductOrderDto">
        select po.*,
        ppr.process_route_code,
@@ -34,8 +34,8 @@
    <select id="listProcessRoute" resultType="com.ruoyi.production.pojo.ProcessRoute">
        select pr.*
        from process_route pr
                 left join product_model pm on pr.product_model_id = pm.id
        where pm.id = #{productModelId}
                 left join product_material_sku pms on pms.id = pr.product_model_id
        where pms.id = #{productModelId}
    </select>
    <select id="listProcessBom" resultType="com.ruoyi.production.dto.ProductStructureDto">
        select ps.id,
src/main/resources/mapper/production/ProductProcessRouteItemMapper.xml
@@ -10,16 +10,17 @@
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
    </resultMap>
    <select id="listItem" resultType="com.ruoyi.production.dto.ProductProcessRouteItemDto">
        select ppri.*,
               pp.name as process_name,
               pm.model,
               pp.name                                                      as process_name,
               pms.model,
               pm.unit,
               p.product_name,
               case when pwo.complete_quantity>0 then true else false end as is_complete
               pm.product_name,
               case when pwo.complete_quantity > 0 then true else false end as is_complete
        from product_process_route_item ppri
                 left join product_model pm on ppri.product_model_id = pm.id
                 left join product p on pm.product_id = p.id
                 left join product_material_sku pms on ppri.product_model_id = pms.id
                 left join product_material pm on pms.product_id = pm.id
                 left join product_process pp on pp.id = ppri.process_id
                 left join product_work_order pwo on pwo.product_process_route_item_id = ppri.id
        where ppri.product_order_id = #{orderId}
src/main/resources/mapper/production/ProductStructureMapper.xml
@@ -17,7 +17,8 @@
               pm.product_name as product_name,
               pp.name         as process_name,
               pms.product_id as product_id,
               pms.model       as model
               pms.model       as model,
               pms.material_code       as productCode
        from product_structure ps
                 left join product_material_sku pms on ps.product_model_id = pms.id
                 left join product_material pm on pms.product_id = pm.id
src/main/resources/mapper/productionPlan/ProductionPlanMapper.xml
@@ -38,25 +38,25 @@
        SELECT
        pp.*,
        pms.material_code AS materialCode,
        pms.specification AS specification,
        pms.material_id AS productMaterialId,
        pm.material_name AS productName,
        pm.base_unit
        pms.model,
        pms.product_id AS productMaterialId,
        pm.product_name AS productName,
        pm.unit
        FROM production_plan pp
        left join product_material_sku pms on pp.product_material_sku_id = pms.id
        left join product_material pm on pms.material_id = pm.id
        left join product_material pm on pms.product_id = pm.id
        WHERE 1 = 1
        <if test="c.customerName != null and c.customerName != '' ">
            AND pp.customer_name LIKE CONCAT('%',#{c.customerName},'%')
        </if>
        <if test="c.productName != null and c.productName != '' ">
            AND pm.material_name LIKE CONCAT('%',#{c.productName},'%')
            AND pm.product_name LIKE CONCAT('%',#{c.productName},'%')
        </if>
        <if test="c.materialCode != null and c.materialCode != '' ">
            AND pms.material_code LIKE CONCAT('%',#{c.materialCode},'%')
        </if>
        <if test="c.specification != null and c.specification != '' ">
            AND pms.specification LIKE CONCAT('%',#{c.specification},'%')
        <if test="c.model != null and c.model != '' ">
            AND pms.model LIKE CONCAT('%',#{c.model},'%')
        </if>
        <if test="c.applyNo != null and c.applyNo != '' ">
            AND pp.apply_no LIKE CONCAT('%',#{c.applyNo},'%')
@@ -73,52 +73,52 @@
    <select id="selectSummaryByProductType" resultType="com.ruoyi.productionPlan.dto.ProductionPlanSummaryDto">
        SELECT
        sku.material_code AS materialCode,
        pm.material_name AS productName,
        sku.specification AS specification,
        pm.product_name AS productName,
        sku.model,
        pp.length,
        pp.width,
        pp.height,
        pm.base_unit AS baseUnit,
        pm.unit AS unit,
        COALESCE(SUM(pp.quantity),0) AS quantity,
        COALESCE(SUM(pp.volume),0) AS volume
        FROM production_plan pp
        LEFT JOIN product_material_sku sku
        ON pp.product_material_sku_id = sku.id
        LEFT JOIN product_material pm
        ON sku.material_id = pm.id
        ON sku.product_id = pm.id
        <where>
            <if test="materialCode != null and materialCode != ''">
                AND sku.material_code LIKE CONCAT('%', #{materialCode}, '%')
            </if>
            <if test="productName != null and productName != ''">
                AND pm.material_name LIKE CONCAT('%', #{productName}, '%')
                AND pm.product_name LIKE CONCAT('%', #{productName}, '%')
            </if>
            <if test="specification != null and specification != ''">
                AND sku.specification LIKE CONCAT('%', #{specification}, '%')
            <if test="model != null and model != ''">
                AND sku.model LIKE CONCAT('%', #{model}, '%')
            </if>
        </where>
        GROUP BY
        sku.material_code,
        pm.material_name,
        sku.specification,
        pm.product_name,
        sku.model,
        pp.length,
        pp.width,
        pp.height,
        pm.base_unit
        pm.unit
    </select>
    <select id="selectWithMaterialByIds" resultType="com.ruoyi.productionPlan.dto.ProductionPlanDto">
        SELECT
        pp.*,
        pms.material_code AS materialCode,
        pms.specification AS specification,
        pm.material_name AS productName,
        pm.base_unit
        pms.model,
        pm.product_name AS productName,
        pm.unit
        FROM production_plan pp
        LEFT JOIN product_material_sku pms ON pp.product_material_sku_id = pms.id
        LEFT JOIN product_material pm ON pms.material_id = pm.id
        LEFT JOIN product_material pm ON pms.product_id = pm.id
        WHERE pp.id IN
        <foreach collection="ids" item="id" open="(" separator="," close=")">
            #{id}
src/main/resources/mapper/quality/QualityTestStandardBindingMapper.xml
@@ -14,10 +14,13 @@
        <result column="tenant_id" property="tenantId"/>
    </resultMap>
    <select id="listBinding" resultType="com.ruoyi.quality.dto.QualityTestStandardBindingDto">
        select t2.product_name,
        select t3.product_name ,
               t2.model ,
               t2.material_code ,
               t1.id qualityTestStandardBindingId
        from quality_test_standard_binding t1
                 left join product t2 on t1.product_id = t2.id
                 left join product_material_sku t2 on t1.product_id = t2.id
                 left join product_material t3 on t2.product_id = t3.id
        where t1.test_standard_id = #{testStandardId}
    </select>