0b3cbc9c80c5544bfc0f9aeea8a89141dd5abe0d..c26e400f6e83774286243b7210686a96d7cdcde3
2026-01-19 liyong
feat(production): 新增工艺/bom/工艺路线内容
c26e40 对比 | 目录
2026-01-19 liyong
feat(production): 新增工艺路线和BOM管理功能
55fb3f 对比 | 目录
已添加37个文件
已修改17个文件
1551 ■■■■■ 文件已修改
src/main/java/com/ruoyi/basic/controller/ProductController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/IProductService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProcessRouteController.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProcessRouteItemController.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductBomController.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductProcessController.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductStructureController.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/SalesLedgerWorkController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProcessRouteDto.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProcessRouteItemDto.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProcessSchedulingDto.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductBomDto.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductProcessDto.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductStructureDto.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductionDispatchAddDto.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductionReportDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/SalesLedgerProductionAccountingDto.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProcessRouteItemMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProcessRouteMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductBomMapper.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductProcessMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProcessRoute.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProcessRouteItem.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductBom.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductProcess.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductStructure.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProcessRouteItemService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProcessRouteService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductBomService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductProcessService.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductStructureService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/SalesLedgerWorkService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProcessRouteItemServiceImpl.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductBomServiceImpl.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/SalesLedgerWorkServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/pojo/QualityInspect.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/basic/ProductModelMapper.xml 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProcessRouteItemMapper.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProcessRouteMapper.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductBomMapper.xml 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductProcessMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductStructureMapper.xml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/controller/ProductController.java
@@ -12,6 +12,7 @@
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -102,4 +103,10 @@
    public AjaxResult importProduct(MultipartFile file) {
        return AjaxResult.success(productModelService.importProduct(file));
    }
    @ApiOperation("分页查询所有产品型号")
    @GetMapping("/pageModel")
    public IPage<ProductModel> listPageProductModel(Page<ProductModel> page, ProductModel productModel) {
        return productService.listPageProductModel(page, productModel);
    }
}
src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java
@@ -1,7 +1,10 @@
package com.ruoyi.basic.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.basic.pojo.ProductModel;
import org.apache.ibatis.annotations.Param;
/**
@@ -11,5 +14,6 @@
 * @date 2025-05-19
 */
public interface ProductModelMapper extends BaseMapper<ProductModel> {
    IPage<ProductModel> listPageProductModel(Page<ProductModel> page, @Param("c") ProductModel productModel);
}
src/main/java/com/ruoyi/basic/service/IProductService.java
@@ -1,9 +1,12 @@
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.dto.ProductDto;
import com.ruoyi.basic.dto.ProductTreeDto;
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.basic.pojo.ProductModel;
import java.util.List;
@@ -15,4 +18,6 @@
    List<ProductTreeDto> selectProductList(ProductDto productDto);
    IPage<ProductModel> listPageProductModel(Page<ProductModel> page, ProductModel productModel);
}
src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.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.dto.ProductDto;
import com.ruoyi.basic.dto.ProductTreeDto;
@@ -52,7 +54,10 @@
        return tree;
    }
    @Override
    public IPage<ProductModel> listPageProductModel(Page<ProductModel> page, ProductModel productModel) {
        return productModelMapper.listPageProductModel(page, productModel);
    }
    // é€’归构建子节点
    private List<ProductTreeDto> buildChildrenNodes(Long parentId) {
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java
@@ -9,6 +9,7 @@
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -31,4 +32,6 @@
    List<ProcurementPageDtoCopy> listCopy();
    List<ProcurementPageDto> list();
    BigDecimal getSumQuantity(@Param("productModelId") Long productModelId);
}
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java
@@ -7,6 +7,7 @@
import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -18,4 +19,7 @@
    IPage<ProcurementRecordOutPageDto> listPage(Page page,@Param("req") ProcurementRecordOutPageDto procurementDto);
    List<ProcurementRecordOutPageDto> list();
    BigDecimal getSumQuantity(@Param("productModelId") Long productModelId);
    ProcurementRecordOut selectCode(@Param("format") String format);
}
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
@@ -77,4 +77,8 @@
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    private Integer type;
    private Long productModelId;
}
src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.procurementrecord.utils;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
@Component
@RequiredArgsConstructor
public class StockUtils {
    private final ProcurementRecordOutMapper procurementRecordOutMapper;
    private final ProcurementRecordMapper procurementRecordMapper;
    // èŽ·å–å•†å“å…¥åº“æ•°é‡,出库数量,剩余库存
    public Map<String, BigDecimal> getStockQuantity(Long productModelId) {
        // å…¥åº“数量
        BigDecimal sumQuantity = procurementRecordMapper.getSumQuantity(productModelId);
        // å‡ºåº“数量
        BigDecimal outQuantity = procurementRecordOutMapper.getSumQuantity(productModelId);
        // å‰©ä½™åº“å­˜
        BigDecimal stockQuantity = outQuantity.compareTo(sumQuantity) > 0 ? BigDecimal.ZERO : sumQuantity.subtract(outQuantity);
        Map<String, BigDecimal> stockMap = new HashMap<>();
        stockMap.put("inboundNum", sumQuantity);
        stockMap.put("outboundNum", outQuantity);
        stockMap.put("stockQuantity", stockQuantity);
        return stockMap;
    }
}
src/main/java/com/ruoyi/production/controller/ProcessRouteController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProcessRouteDto;
import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.production.service.ProcessRouteService;
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;
@RestController
@RequestMapping("processRoute")
@Api(tags = "工艺路线")
public class ProcessRouteController {
    @Autowired
    private ProcessRouteService processRouteService;
    @GetMapping("page")
    @ApiOperation("分页查询")
    public R page(Page<ProcessRouteDto>  page, ProcessRouteDto processRouteDto) {
        return R.ok(processRouteService.pageProcessRouteDto(page, processRouteDto));
    }
    @ApiOperation("新增工艺路线")
    @PostMapping ()
    public R add(@RequestBody  ProcessRoute processRoute) {
        return R.ok(processRouteService.saveProcessRoute(processRoute));
    }
    @ApiOperation("修改工艺路线")
    @PutMapping ()
    public R update(@RequestBody  ProcessRoute processRoute) {
        return R.ok(processRouteService.updateById(processRoute));
    }
    @ApiOperation("删除工艺路线")
    @DeleteMapping("/{ids}")
    public R delete(@PathVariable("ids") Long[] ids) {
        return R.ok(processRouteService.batchDelete(Arrays.asList(ids)));
    }
}
src/main/java/com/ruoyi/production/controller/ProcessRouteItemController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
package com.ruoyi.production.controller;
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.framework.web.domain.R;
import com.ruoyi.production.dto.ProcessRouteItemDto;
import com.ruoyi.production.pojo.ProcessRouteItem;
import com.ruoyi.production.service.ProcessRouteItemService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("processRouteItem")
@Api(tags = "工艺路线明细")
public class ProcessRouteItemController {
    @Autowired
    private ProcessRouteItemService processRouteItemService;
    @GetMapping("list")
    public R listProcessRouteItemDto(ProcessRouteItemDto processRouteItemDto) {
        return R.ok(processRouteItemService.listProcessRouteItemDto(processRouteItemDto));
    }
    @PostMapping ()
    @ApiOperation("新增修改")
    public R addOrUpdate(@RequestBody ProcessRouteItem processRouteItem) {
        return R.ok(processRouteItemService.saveOrUpdate(processRouteItem));
    }
    @PostMapping ("/sort")
    @ApiOperation("排序")
    public R sort(@RequestBody ProcessRouteItem processRouteItem) {
        return R.ok(processRouteItemService.sort(processRouteItem));
    }
    @ApiOperation("删除工艺路线明细")
    @DeleteMapping("/batchDelete/{id}")
    @Log(title = "删除", businessType = BusinessType.DELETE)
    public AjaxResult batchDelete(@PathVariable("id") Long id) {
        return AjaxResult.success(processRouteItemService.batchDelete(id));
    }
}
src/main/java/com/ruoyi/production/controller/ProductBomController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
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.ProductBomDto;
import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.production.pojo.ProductBom;
import com.ruoyi.production.service.ProcessRouteService;
import com.ruoyi.production.service.ProductBomService;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
 * BOM主表 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-15 09:59:27
 */
@RestController
@RequestMapping("/productBom")
public class ProductBomController {
    @Autowired
    private ProductBomService productBomService;
    @Autowired
    private ProcessRouteService processRouteService;
    @GetMapping("/listPage")
    @Log(title = "BOM-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("BOM-分页查询")
    public AjaxResult listPage(Page page, ProductBomDto productBomDto) {
        IPage<ProductBomDto> listPage = productBomService.listPage(page, productBomDto);
        return AjaxResult.success(listPage);
    }
    @ApiModelProperty("新增BOM")
    @PostMapping("/add")
    @Log(title = "新增", businessType = BusinessType.INSERT)
    public AjaxResult add( @RequestBody ProductBom productBom) {
        return productBomService.add(productBom);
    }
    @ApiOperation("更新BOM")
    @Log(title = "修改", businessType = BusinessType.UPDATE)
    @PutMapping("/update")
    public AjaxResult update(@RequestBody ProductBom productBom) {
        return AjaxResult.success(productBomService.updateById(productBom));
    }
    @ApiOperation("删除BOM")
    @DeleteMapping("/batchDelete")
    @Log(title = "删除", businessType = BusinessType.DELETE)
    public AjaxResult batchDelete(@RequestBody List<Integer> ids) {
//        List<ProcessRoute> list = processRouteService.list(Wrappers.<ProcessRoute>lambdaQuery().in(ProcessRoute::getBomId, ids));
//        List<ProductProcessRoute> list2 = productProcessRouteService.list(Wrappers.<ProductProcessRoute>lambdaQuery().in(ProductProcessRoute::getBomId, ids));
//        if (list.size()>0 || list2.size()>0){
//            return AjaxResult.error("该BOM已经存在对应的工艺路线,无法进行删除");
//        }
        if(CollectionUtils.isEmpty(ids)){
            return AjaxResult.error("请选择至少一条数据");
        }
        return AjaxResult.success(productBomService.removeBatchByIds(ids));
    }
    @GetMapping("/getByModel")
    @Log(title = "BOM-根据选择的规格型号id查询存在的bom", businessType = BusinessType.OTHER)
    @ApiOperation("BOM-根据选择的规格型号id查询存在的bom")
    public AjaxResult getByModel(Long productModelId) {
        List<ProductBom> productBoms = productBomService.list(Wrappers.<ProductBom>lambdaQuery().eq(ProductBom::getProductModelId, productModelId));
        return AjaxResult.success(productBoms);
    }
}
src/main/java/com/ruoyi/production/controller/ProductProcessController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.ProductProcessDto;
import com.ruoyi.production.pojo.ProductProcess;
import com.ruoyi.production.service.impl.ProductProcessServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@RestController
@Api(tags = "工序")
@RequestMapping("/productProcess")
public class ProductProcessController extends BaseController {
    @Autowired
    private ProductProcessServiceImpl productProcessService;
    @GetMapping("/listPage")
    @Log(title = "工序-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("工序-分页查询")
    public AjaxResult listPage(Page page, ProductProcessDto productProcessDto) {
        IPage<ProductProcessDto> listPage = productProcessService.listPage(page, productProcessDto);
        return AjaxResult.success(listPage);
    }
    @ApiModelProperty("新增工序")
    @PostMapping()
    @Log(title = "新增", businessType = BusinessType.INSERT)
    public AjaxResult add( @RequestBody ProductProcessDto productProcessDto) {
        return productProcessService.add(productProcessDto);
    }
    @ApiOperation("更新工序")
    @Log(title = "修改", businessType = BusinessType.UPDATE)
    @PutMapping("/update")
    public AjaxResult update(@RequestBody ProductProcess productProcess) {
        return AjaxResult.success(productProcessService.updateById(productProcess));
    }
    @ApiOperation("删除工序")
    @DeleteMapping("/batchDelete")
    @Log(title = "删除", businessType = BusinessType.DELETE)
    public AjaxResult batchDelete(@RequestBody List<Integer> ids) {
        return AjaxResult.success(productProcessService.batchDelete(ids));
    }
    @ApiOperation("查询所有工序")
    @GetMapping("/list")
    public AjaxResult list() {
        return AjaxResult.success(productProcessService.list());
        }
    /**
     * å¯¼å…¥å·¥åº
     */
    @Log(title = "工序", businessType = BusinessType.IMPORT)
    @PostMapping("/importData")
    public AjaxResult importData(MultipartFile file) throws Exception {
        return productProcessService.importData(file);
    }
    @PostMapping("/downloadTemplate")
    @Log(title = "工序-下载模板", businessType = BusinessType.EXPORT)
    public void downloadTemplate(HttpServletResponse response) {
        ExcelUtil<ProductProcess> util = new ExcelUtil<ProductProcess>(ProductProcess.class);
        util.importTemplateExcel(response, "工序模板");
    }
}
src/main/java/com/ruoyi/production/controller/ProductStructureController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.production.controller;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.service.ProductStructureService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RequestMapping("productStructure")
@RestController
@Api(tags = "BOM")
public class ProductStructureController {
    @Autowired
    private ProductStructureService productStructureService;
    @ApiOperation("新增BOM")
    @PostMapping()
    public R addOrUpdate(@RequestBody ProductStructureDto productStructureDto){
        return R.ok(productStructureService.addProductStructureDto(productStructureDto));
    }
    @ApiOperation("BOM查看详情")
    @GetMapping("/listBybomId/{bomId}")
    public R listBybomId( @PathVariable("bomId") Long bomId){
        return R.ok(productStructureService.listBybomId(bomId));
    }
}
src/main/java/com/ruoyi/production/controller/SalesLedgerWorkController.java
@@ -7,12 +7,8 @@
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.ProcessSchedulingDto;
import com.ruoyi.production.dto.ProductionReportDto;
import com.ruoyi.production.dto.SalesLedgerSchedulingProcessDto;
import com.ruoyi.production.dto.SalesLedgerWorkDto;
import com.ruoyi.production.pojo.SalesLedgerWork;
import com.ruoyi.production.service.SalesLedgerWorkService;
import com.ruoyi.production.service.impl.SalesLedgerWorkServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
src/main/java/com/ruoyi/production/dto/ProcessRouteDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProcessRoute;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class ProcessRouteDto extends ProcessRoute {
    private Long productId;
    private String productName;
    @ApiModelProperty("规格")
    private String model;
    private String bomNo;
}
src/main/java/com/ruoyi/production/dto/ProcessRouteItemDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProcessRouteItem;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class ProcessRouteItemDto extends ProcessRouteItem {
    @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;
    private Long productId;
    private String model;
}
src/main/java/com/ruoyi/production/dto/ProcessSchedulingDto.java
@@ -5,7 +5,6 @@
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * @author :yys
@@ -30,7 +29,6 @@
    @ApiModelProperty(value = "排产数量")
    private BigDecimal schedulingNum;
    /**
     * å·¥æ—¶å®šé¢
     */
@@ -38,15 +36,47 @@
    private BigDecimal workHours;
    /**
     * äº§çº¿
     */
    @ApiModelProperty(value = "产线")
    private String productionLine;
    /**
     * å·¥åº
     */
    @ApiModelProperty(value = "工序")
    private String process;
    /**
     * æŽ’产日期
     */
    @ApiModelProperty(value = "排产日期")
    private String schedulingDate;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty(value = "备注")
    private String remark;
    /**
     * æŸè€—
     */
    @ApiModelProperty(value = "损耗")
    private String loss;
    /**
     * å£å‘³åˆ†ç±»
     */
    @ApiModelProperty(value = "口味分类")
    private String type;
    /**
     * é¢†ç”¨
     */
    @ApiModelProperty(value = "领用")
    private String receive;
}
src/main/java/com/ruoyi/production/dto/ProductBomDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProductBom;
import lombok.Data;
//分页查询回显数据
@Data
public class ProductBomDto extends ProductBom {
    //产品名称
    private String productName;
    //产品规格型号
    private String productModelName;
}
src/main/java/com/ruoyi/production/dto/ProductProcessDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProductProcess;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@Data
@ApiModel
public class ProductProcessDto extends ProductProcess {
}
src/main/java/com/ruoyi/production/dto/ProductStructureDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProductStructure;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class ProductStructureDto extends ProductStructure {
    @ApiModelProperty(value = "工艺名称")
    private String processName;
    @ApiModelProperty(value = "产品名称")
    private String productName;
    @ApiModelProperty(value = "产品id")
    private Long productId;
    private String model;
    private List<ProductStructure> productStructureList;
}
src/main/java/com/ruoyi/production/dto/ProductionDispatchAddDto.java
@@ -38,4 +38,19 @@
    @ApiModelProperty(value = "排产日期")
    private String schedulingDate;
    /**
     * ç”Ÿäº§ç‚’机
     */
    private String speculativeTradingName;
    /**
     * äº§çº¿
     */
    @ApiModelProperty(value = "产线")
    private String productionLine;
    /**
     * è§„格型号
     */
    private String specificationModel;
}
src/main/java/com/ruoyi/production/dto/ProductionReportDto.java
@@ -38,4 +38,16 @@
    @ApiModelProperty(value = "生产日期")
    private String schedulingDate;
    /**
     * å…¥åº“单价
     */
    @ApiModelProperty(value = "入库单价")
    private BigDecimal unitPrice;
    /**
     * å…¥åº“总价
     */
    @ApiModelProperty(value = "入库总价")
    private BigDecimal totalPrice;
}
src/main/java/com/ruoyi/production/dto/SalesLedgerProductionAccountingDto.java
@@ -1,5 +1,7 @@
package com.ruoyi.production.dto;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -12,6 +14,7 @@
 */
@Data
@ApiModel
@ExcelIgnoreUnannotated
public class SalesLedgerProductionAccountingDto extends SalesLedgerProductDto{
    /**
@@ -24,6 +27,7 @@
     * æŽ’产人名称
     */
    @ApiModelProperty(value = "生产人名称")
    @Excel(name = "生产人")
    private String schedulingUserName;
@@ -31,29 +35,34 @@
     * å·¥èµ„
     */
    @ApiModelProperty(value = "工资")
    @Excel(name = "工资")
    private BigDecimal wages;
    /**
     * ç”Ÿäº§æ•°é‡
     */
    @ApiModelProperty(value = "生产数量")
    @Excel(name = "生产数量")
    private BigDecimal finishedNum;
    /**
     * å·¥æ—¶å®šé¢
     */
    @ApiModelProperty(value = "工时定额")
    @Excel(name = "工时定额")
    private BigDecimal workHours;
    /**
     * å·¥åº
     */
    @ApiModelProperty(value = "工序")
    @Excel(name = "工序")
    private String process;
    /**
     * æŽ’产日期
     */
    @ApiModelProperty(value = "排产日期")
    @Excel(name = "生产日期")
    private String schedulingDate;
    @ApiModelProperty(value = "开始时间")
src/main/java/com/ruoyi/production/mapper/ProcessRouteItemMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.production.dto.ProcessRouteItemDto;
import com.ruoyi.production.pojo.ProcessRouteItem;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface ProcessRouteItemMapper  extends BaseMapper<ProcessRouteItem> {
    List<ProcessRouteItemDto> listProcessRouteItemDto(@Param("c") ProcessRouteItemDto processRouteItemDto);
}
src/main/java/com/ruoyi/production/mapper/ProcessRouteMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
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.ProcessRouteDto;
import com.ruoyi.production.pojo.ProcessRoute;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface ProcessRouteMapper extends BaseMapper<ProcessRoute> {
    IPage<ProcessRouteDto> pageProcessRouteDto(Page<ProcessRouteDto> page,@Param("c") ProcessRouteDto processRouteDto);
}
src/main/java/com/ruoyi/production/mapper/ProductBomMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
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.ProductBomDto;
import com.ruoyi.production.pojo.ProductBom;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * BOM主表 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-15 09:59:27
 */
@Mapper
public interface ProductBomMapper extends BaseMapper<ProductBom> {
    IPage<ProductBomDto> listPage(Page page, @Param("c") ProductBomDto productBomDto);
    ProductBomDto getById(@Param("bomId") Long bomId);
}
src/main/java/com/ruoyi/production/mapper/ProductProcessMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
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.ProductProcessDto;
import com.ruoyi.production.pojo.ProductProcess;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface ProductProcessMapper extends BaseMapper<ProductProcess> {
    IPage<ProductProcessDto> listPage(Page page,@Param("productProcessDto") ProductProcessDto productProcessDto);
}
src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.pojo.ProductStructure;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface ProductStructureMapper  extends BaseMapper<ProductStructure> {
    List<ProductStructureDto> listBybomId(@Param("bomId") Long bomId);
    List<ProductStructureDto> listBybomAndProcess(@Param("bomId") Long bomId, @Param("processId") Long processId);
}
src/main/java/com/ruoyi/production/pojo/ProcessRoute.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@TableName("process_route")
@Data
@ApiModel(value = "processRoute", description = "工艺路线主表")
public class ProcessRoute {
    @ApiModelProperty(value = "序号")
    private Long id;
    @ApiModelProperty(value = "产品ID")
    //product_model
    private Long productModelId;
    @ApiModelProperty(value = "描述")
    private String description;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "工艺路线编码")
    private String processRouteCode;
    @ApiModelProperty(value = "BOM的ID")
    private Long bomId;
}
src/main/java/com/ruoyi/production/pojo/ProcessRouteItem.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("process_route_item")
@ApiModel(value = "processRouteItem", description = "工艺路线子表")
public class ProcessRouteItem {
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "工艺路线id")
    private Long routeId;
    @ApiModelProperty(value = "工序id")
    private Long processId;
    @ApiModelProperty(value ="产品id")
    private Long productModelId;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value ="拖动排序")
    private Integer dragSort;
}
src/main/java/com/ruoyi/production/pojo/ProductBom.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
 * BOM主表
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-15 09:59:27
 */
@Getter
@Setter
@TableName("product_bom")
@ApiModel(value = "ProductBom对象", description = "BOM主表")
public class ProductBom implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("bom编号")
    private String bomNo;
    @ApiModelProperty("产品规格id")
    private Long productModelId;
    @ApiModelProperty("备注")
    private String remark;
    @ApiModelProperty("版本号")
    private String version;
    @ApiModelProperty("创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("创建者")
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    @ApiModelProperty("更新者")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    @ApiModelProperty("租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/production/pojo/ProductProcess.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
package com.ruoyi.production.pojo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@TableName("product_process")
@Data
@ExcelIgnoreUnannotated
@ApiModel(value = "productProcess", description = "工序表")
public class ProductProcess implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * å·¥åºåç§°
     */
    @Excel(name = "工序名称")
    private String name;
    /**
     * å·¥åºç¼–号
     */
    @Excel(name = "工序编号")
    private String no;
    /**
     * å¤‡æ³¨
     */
    @Excel(name = "备注")
    private String remark;
    /**
     * å·¥èµ„定额
     */
    @Excel(name = "工资定额")
    private BigDecimal salaryQuota;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/production/pojo/ProductStructure.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.math.BigDecimal;
@TableName("product_structure")
@Data
@ApiModel(value = "ProductStructure", description = "BOM子表")
public class ProductStructure {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * äº§å“åç§°
     */
    private Long productModelId;
    /**
     * å·¥åºid
     */
    private Long processId;
    /**
     * å•位产出需要数量
     */
    private BigDecimal unitQuantity;
    /**
     * éœ€æ±‚数量
     */
    private BigDecimal demandedQuantity;
    /**
     * å•位
     */
    private String unit;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    /**
     * å…³è”BOMid
     */
    private Long bomId;
}
src/main/java/com/ruoyi/production/service/ProcessRouteItemService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.production.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.production.dto.ProcessRouteItemDto;
import com.ruoyi.production.pojo.ProcessRouteItem;
import java.util.List;
public interface ProcessRouteItemService extends IService<ProcessRouteItem> {
    List<ProcessRouteItemDto> listProcessRouteItemDto( ProcessRouteItemDto processRouteItemDto);
    int sort(ProcessRouteItem processRouteItem);
    String batchDelete(Long id);
}
src/main/java/com/ruoyi/production/service/ProcessRouteService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
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.ProcessRouteDto;
import com.ruoyi.production.pojo.ProcessRoute;
import java.util.List;
public interface ProcessRouteService extends IService<ProcessRoute> {
    IPage<ProcessRouteDto> pageProcessRouteDto(Page<ProcessRouteDto> page, ProcessRouteDto processRouteDto);
    Integer saveProcessRoute(ProcessRoute processRoute);
    int batchDelete(List<Long> ids);
}
src/main/java/com/ruoyi/production/service/ProductBomService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
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.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.ProductBomDto;
import com.ruoyi.production.pojo.ProductBom;
/**
 * <p>
 * BOM主表 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-15 09:59:27
 */
public interface ProductBomService extends IService<ProductBom> {
    IPage<ProductBomDto> listPage(Page page, ProductBomDto productBomDto);
    AjaxResult add(ProductBom productBom);
}
src/main/java/com/ruoyi/production/service/ProductProcessService.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.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.ProductProcessDto;
import com.ruoyi.production.pojo.ProductProcess;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/7/21 14:39
 */
public interface ProductProcessService extends IService<ProductProcess> {
    IPage<ProductProcessDto> listPage(Page page, ProductProcessDto productProcessDto);
    AjaxResult add(ProductProcessDto productProcessDto);
    AjaxResult importData(MultipartFile file);
    String batchDelete(List<Integer> ids);
}
src/main/java/com/ruoyi/production/service/ProductStructureService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.production.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.pojo.ProductStructure;
import java.util.List;
public interface ProductStructureService extends IService<ProductStructure> {
    Boolean addProductStructureDto(ProductStructureDto productStructureDto);
    List<ProductStructureDto> listBybomId(Long bomId);
}
src/main/java/com/ruoyi/production/service/SalesLedgerWorkService.java
@@ -3,7 +3,6 @@
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.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.ProductionReportDto;
import com.ruoyi.production.dto.SalesLedgerWorkDto;
import com.ruoyi.production.pojo.SalesLedgerWork;
src/main/java/com/ruoyi/production/service/impl/ProcessRouteItemServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,88 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.production.dto.ProcessRouteItemDto;
import com.ruoyi.production.mapper.ProcessRouteItemMapper;
import com.ruoyi.production.pojo.ProcessRouteItem;
import com.ruoyi.production.service.ProcessRouteItemService;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@AllArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class ProcessRouteItemServiceImpl extends ServiceImpl<ProcessRouteItemMapper, ProcessRouteItem> implements ProcessRouteItemService {
    @Autowired
    private  ProcessRouteItemMapper processRouteItemMapper;
    @Override
    public List<ProcessRouteItemDto> listProcessRouteItemDto(ProcessRouteItemDto processRouteItemDto) {
        return processRouteItemMapper.listProcessRouteItemDto( processRouteItemDto);
    }
    //排序
    @Override
    public int sort(ProcessRouteItem processRouteItem) {
        //查询被改动的这条数据
        ProcessRouteItem oldProcessRouteItem = processRouteItemMapper.selectById(processRouteItem.getId());
        //查询该工艺路线的所有工序并按照顺序排序
        List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(Wrappers.<ProcessRouteItem>lambdaQuery()
                .eq(ProcessRouteItem::getRouteId, oldProcessRouteItem.getRouteId())
                .orderByAsc(ProcessRouteItem::getDragSort));
        // èŽ·å–ç›®æ ‡ä½ç½®ï¼ˆç§»åŠ¨åˆ°ç¬¬å‡ ä¸ªä¹‹åŽï¼‰
        Integer targetPosition = processRouteItem.getDragSort();
        if (targetPosition != null && targetPosition >= 0) {
            // ç§»åŠ¨å…ƒç´ åˆ°æ–°çš„ä½ç½®
            processRouteItems.remove(oldProcessRouteItem);
            processRouteItems.add(targetPosition-1, oldProcessRouteItem);
            // æ›´æ–°æ‰€æœ‰å—影响的排序字段
            for (int i = 0; i < processRouteItems.size(); i++) {
                ProcessRouteItem item = processRouteItems.get(i);
                if (!item.getId().equals(oldProcessRouteItem.getId())) {
                    // æ£€æŸ¥æ˜¯å¦éœ€è¦æ›´æ–°æŽ’序值
                    if (item.getDragSort() != i+1) {
                        item.setDragSort(i+1);
                        processRouteItemMapper.updateById(item);
                    }
                } else {
                    // æ›´æ–°åŽŸè®°å½•çš„æ–°æŽ’åºä½ç½®
                    oldProcessRouteItem.setDragSort(targetPosition);
                    processRouteItemMapper.updateById(oldProcessRouteItem);
                }
            }
            return 1;
        }
        return 0;
    }
    @Override
    public String batchDelete(Long id) {
        // æŸ¥è¯¢è¦åˆ é™¤çš„æ•°æ®
        ProcessRouteItem deleteProcessRouteItem = processRouteItemMapper.selectById(id);
        if (deleteProcessRouteItem == null) {
            return "删除失败,未找到对应数据";
        }
        Long routeId = deleteProcessRouteItem.getRouteId();
        // åˆ é™¤æŒ‡å®šæ•°æ®
        processRouteItemMapper.deleteById(id);
        // æŸ¥è¯¢è¯¥å·¥è‰ºè·¯çº¿çš„æ‰€æœ‰å·¥åºå¹¶æŒ‰ç…§é¡ºåºæŽ’序
        List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(Wrappers.<ProcessRouteItem>lambdaQuery()
                .eq(ProcessRouteItem::getRouteId, routeId)
                .orderByAsc(ProcessRouteItem::getDragSort));
        // é‡æ–°è®¾ç½®æŽ’序值,使序号连续
        for (int i = 0; i < processRouteItems.size(); i++) {
            ProcessRouteItem item = processRouteItems.get(i);
            if (!item.getDragSort().equals(i+1)) {
                item.setDragSort(i+1);
                processRouteItemMapper.updateById(item);
            }
        }
        return "删除成功";
    }
}
src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
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.production.dto.ProcessRouteDto;
import com.ruoyi.production.mapper.ProcessRouteItemMapper;
import com.ruoyi.production.mapper.ProcessRouteMapper;
import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.production.pojo.ProcessRouteItem;
import com.ruoyi.production.service.ProcessRouteService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
@Service
@AllArgsConstructor
@Slf4j
public class ProcessRouteServiceImpl extends ServiceImpl<ProcessRouteMapper, ProcessRoute> implements ProcessRouteService {
    @Autowired
    private ProcessRouteMapper processRouteMapper;
    @Autowired
    private ProcessRouteItemMapper processRouteItemMapper;
    @Override
    public IPage<ProcessRouteDto> pageProcessRouteDto(Page<ProcessRouteDto> page, ProcessRouteDto processRouteDto) {
        return processRouteMapper.pageProcessRouteDto(page, processRouteDto);
    }
    @Override
    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);
    }
    @Override
    public int batchDelete(List<Long> ids) {
//        //先判断是否已经引用了
//        List<ProductOrder> productOrders = productOrderMapper.selectList(Wrappers.<ProductOrder>lambdaQuery().in(ProductOrder::getRouteId, ids));
//        if (productOrders.size()>0){
//            throw new RuntimeException("该工艺路线生产已引用,不能删除");
//        }
        //删除工艺路线详情
        processRouteItemMapper.delete(Wrappers.<ProcessRouteItem>lambdaQuery().in(ProcessRouteItem::getRouteId, ids));
        return processRouteMapper.deleteBatchIds(ids);
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductBomServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
package com.ruoyi.production.service.impl;
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.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.ProductBomDto;
import com.ruoyi.production.mapper.ProductBomMapper;
import com.ruoyi.production.pojo.ProductBom;
import com.ruoyi.production.service.ProductBomService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * <p>
 * BOM主表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-15 09:59:27
 */
@Service
public class ProductBomServiceImpl extends ServiceImpl<ProductBomMapper, ProductBom> implements ProductBomService {
    @Autowired
    private ProductBomMapper productBomMapper;
    @Override
    public IPage<ProductBomDto> listPage(Page page, ProductBomDto productBomDto) {
        return productBomMapper.listPage(page,productBomDto);
    }
    @Override
    public AjaxResult add(ProductBom productBom) {
        boolean save = productBomMapper.insert(productBom) > 0;
        if (save) {
            // æ ¹æ®id生成no字段:GX + 8位数字(不足8位前面补0)
            String no = "BM." + String.format("%05d", productBom.getId());
            productBom.setBomNo(no);
            productBomMapper.updateById(productBom);
            return AjaxResult.success();
        }
        return AjaxResult.error();
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,81 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
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.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.ProductProcessDto;
import com.ruoyi.production.mapper.ProcessRouteItemMapper;
import com.ruoyi.production.mapper.ProductProcessMapper;
import com.ruoyi.production.pojo.ProcessRouteItem;
import com.ruoyi.production.pojo.ProductProcess;
import com.ruoyi.production.service.ProductProcessService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@Service
public class ProductProcessServiceImpl extends ServiceImpl<ProductProcessMapper, ProductProcess> implements ProductProcessService {
    @Autowired
    private ProductProcessMapper productProcessMapper;
    @Autowired
    private ProcessRouteItemMapper processRouteItemMapper;
//    @Autowired
//    private ProductProcessRouteItemMapper productProcessRouteItemMapper;
    @Override
    public IPage<ProductProcessDto> listPage(Page page, ProductProcessDto productProcessDto) {
        return productProcessMapper.listPage(page, productProcessDto);
    }
    @Override
    public AjaxResult add(ProductProcessDto productProcessDto) {
        ProductProcess productProcess = new ProductProcess();
        BeanUtils.copyProperties(productProcessDto,productProcess);
        boolean save = productProcessMapper.insert(productProcess) > 0;
        if (save && ObjectUtils.isNull(productProcessDto.getNo())) {
            // æ ¹æ®id生成no字段:GX + 8位数字(不足8位前面补0)
            String no = "GX" + String.format("%08d", productProcess.getId());
            productProcess.setNo(no);
            productProcessMapper.updateById(productProcess);
            return AjaxResult.success();
        }
        return AjaxResult.success();
    }
    @Override
    public AjaxResult importData(MultipartFile file) {
        try {
            ExcelUtil<ProductProcess> util = new ExcelUtil<ProductProcess>(ProductProcess.class);
            List<ProductProcess> productProcessList = util.importExcel(file.getInputStream());
            if(CollectionUtils.isEmpty(productProcessList)){
                return AjaxResult.warn("模板错误或导入数据为空");
            }
            this.saveOrUpdateBatch(productProcessList);
            return AjaxResult.success(true);
        }catch (Exception e){
            e.printStackTrace();
            return AjaxResult.error("导入失败");
        }
    }
    @Override
    public String batchDelete(List<Integer> ids) {
        //查询是否生产中已经引用了这些工序
        List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(Wrappers.<ProcessRouteItem>lambdaQuery().in(ProcessRouteItem::getProcessId, ids));
//        List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().in(ProductProcessRouteItem::getProcessId, ids));
//        if (!CollectionUtils.isEmpty(processRouteItems) || !CollectionUtils.isEmpty(productProcessRouteItems)){
//            throw new RuntimeException("该工序已经被使用,无法删除");
//        }
        productProcessMapper.deleteBatchIds(ids);
        return null;
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.mapper.ProductStructureMapper;
import com.ruoyi.production.pojo.ProductStructure;
import com.ruoyi.production.service.ProductStructureService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
@Slf4j
public class ProductStructureServiceImpl extends ServiceImpl<ProductStructureMapper, ProductStructure> implements ProductStructureService {
    @Autowired
    private  ProductStructureMapper productStructureMapper;
    @Override
    public Boolean addProductStructureDto(ProductStructureDto productStructureDto) {
        this.remove(new QueryWrapper<ProductStructure>().lambda().eq(ProductStructure::getBomId, productStructureDto.getBomId()));
        productStructureDto.getProductStructureList().forEach(productStructure -> {
            productStructure.setBomId(productStructureDto.getBomId());
        });
        return this.saveBatch(productStructureDto.getProductStructureList());
    }
    @Override
    public List<ProductStructureDto> listBybomId(Long bomId) {
        List<ProductStructureDto> tree = productStructureMapper.listBybomId(bomId);
        return tree;
    }
}
src/main/java/com/ruoyi/production/service/impl/SalesLedgerWorkServiceImpl.java
@@ -4,14 +4,12 @@
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.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.ProductionReportDto;
import com.ruoyi.production.dto.SalesLedgerWorkDto;
import com.ruoyi.production.mapper.SalesLedgerProductionAccountingMapper;
import com.ruoyi.production.mapper.SalesLedgerWorkMapper;
import com.ruoyi.production.pojo.SalesLedgerProductionAccounting;
import com.ruoyi.production.pojo.SalesLedgerWork;
import com.ruoyi.production.service.SalesLedgerProductionAccountingService;
import com.ruoyi.production.service.SalesLedgerWorkService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -137,6 +137,16 @@
     * ç±»åˆ«(0:未提交;1:已提交)
     */
    private Integer inspectState;
    private Long purchaseLedgerId;
    /**
     * æŠ¥å·¥id
     */
    private Long productMainId;
    private Long productModelId;
    //不合格现象
    private String defectivePhenomena;
}
src/main/resources/mapper/basic/ProductModelMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
<?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.basic.mapper.ProductModelMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.basic.pojo.ProductModel">
        <id column="id" property="id" />
        <result column="product_id" property="productId" />
        <result column="model" property="model" />
        <result column="unit" property="unit" />
        <result column="tenant_id" property="tenantId" />
        <result column="product_name" property="productName" />
        <result column="product_id" property="productId" />
    </resultMap>
    <select id="listPageProductModel" resultType="com.ruoyi.basic.pojo.ProductModel">
        select pm.*,p.product_name
        from product_model pm
        left join product p on pm.product_id = p.id
        <where>
            <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>
        </where>
        order by  pm.id
    </select>
    <select id="selectLatestRecord" resultType="com.ruoyi.basic.pojo.ProductModel">
            SELECT * FROM product_model
            ORDER BY create_time DESC, id DESC
            LIMIT 1
    </select>
</mapper>
src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -163,4 +163,9 @@
                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
                  left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
    </select>
    <select id="getSumQuantity" resultType="BigDecimal">
        select COALESCE(sum(inbound_num), 0)
        from procurement_record_storage
        where product_model_id = #{productModelId}
    </select>
</mapper>
src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
@@ -50,4 +50,17 @@
                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
                  left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
    </select>
    <select id="getSumQuantity" resultType="BigDecimal">
        select COALESCE(sum(inbound_num), 0)
        from procurement_record_out
        where
            product_model_id = #{productModelId}
    </select>
    <select id="selectCode" resultType="com.ruoyi.procurementrecord.pojo.ProcurementRecordOut">
        select *
        from procurement_record_out
        where code like concat('%', #{format})
        order by id desc
        limit 1
    </select>
</mapper>
src/main/resources/mapper/production/ProcessRouteItemMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
<?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.ProcessRouteItemMapper">
    <resultMap id="basicMap" type="com.ruoyi.production.pojo.ProcessRouteItem">
        <id property="id" column="id"/>
        <result property="routeId" column="route_id"/>
        <result property="processId" column="process_id"/>
        <result property="productModelId" column="product_model_id"/>
        <result property="tenantId" column="tenant_id"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
        <result property="dragSort" column="drag_sort"/>
    </resultMap>
    <select id="listProcessRouteItemDto" resultType="com.ruoyi.production.dto.ProcessRouteItemDto">
        select pri.*,
               pr.description ,
               pp.name as process_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}
        order by pri.drag_sort
    </select>
</mapper>
src/main/resources/mapper/production/ProcessRouteMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
<?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.ProcessRouteMapper">
    <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"/>
    </resultMap>
    <select id="pageProcessRouteDto" resultType="com.ruoyi.production.dto.ProcessRouteDto">
        select ps.*, p.product_name,pm.product_id,pm.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
        <where>
            <if test="c.model != null and c.model != ''">
                and pm.model like concat('%',#{c.model},'%')
            </if>
        </where>
        order by ps.id asc
    </select>
</mapper>
src/main/resources/mapper/production/ProductBomMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
<?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.ProductBomMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductBom">
        <id column="id" property="id"/>
        <result column="product_model_id" property="productModelId"/>
        <result column="bom_no" property="bomNo"/>
        <result column="remark" property="remark"/>
        <result column="version" property="version"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
        <result column="create_user" property="createUser"/>
        <result column="update_user" property="updateUser"/>
        <result column="tenant_id" property="tenantId"/>
    </resultMap>
    <select id="listPage" resultType="com.ruoyi.production.dto.ProductBomDto">
        select * from (select pb.*,
        pm.model productModelName,
        p.product_name productName
        from product_bom pb
        left join product_model pm on pb.product_model_id = pm.id
        left join product p on pm.product_id = p.id)A
        where 1=1
        <if test="c.productModelName != null">
            and productModelName = #{c.productModelName}
        </if>
        <if test="c.productName != null">
            and productName = #{c.productName}
        </if>
        <if test="c.bomNo != null">
            and bom_no = #{c.bomNo}
        </if>
        <if test="c.version != null">
            and version = #{c.version}
        </if>
    </select>
    <select id="getById" resultType="com.ruoyi.production.dto.ProductBomDto">
        select pb.*,
               pm.model productModelName,
               p.product_name productName
        from product_bom pb
                 left join product_model pm on pb.product_model_id = pm.id
                 left join product p on pm.product_id = p.id
    </select>
</mapper>
src/main/resources/mapper/production/ProductProcessMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
<?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.ProductProcessMapper">
    <select id="listPage" resultType="com.ruoyi.production.dto.ProductProcessDto">
        SELECT
        *
        FROM
        product_process p
        <where>
            <if test="productProcessDto.name != null and productProcessDto.name != '' ">
                AND  p.name LIKE CONCAT('%',#{productProcessDto.name},'%')
            </if>
            <if test="productProcessDto.no != null and productProcessDto.no != '' ">
                AND  p.no LIKE CONCAT('%',#{productProcessDto.no},'%')
            </if>
        </where>
        order by p.id asc
    </select>
</mapper>
src/main/resources/mapper/production/ProductStructureMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
<?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.ProductStructureMapper">
    <resultMap id="basicMap" type="com.ruoyi.production.pojo.ProductStructure">
        <id property="id" column="id"/>
        <result property="productModelId" column="product_model_id"/>
        <result property="processId" column="process_id"/>
        <result property="unitQuantity" column="unit_quantity"/>
        <result property="demandedQuantity" column="demanded_quantity"/>
        <result property="unit" column="unit"/>
        <result property="tenantId" column="tenant_id"/>
    </resultMap>
    <select id="listBybomId" resultType="com.ruoyi.production.dto.ProductStructureDto">
        select ps.*,
               p.product_name,
               pp.name as  process_name,
               pm.product_id,
               pm.model
        from
            product_structure ps
                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_process pp on ps.process_id = pp.id
        where ps.bom_id = #{bomId}
        order by ps.id
    </select>
    <select id="listByproductModelId" resultType="com.ruoyi.production.dto.ProductStructureDto">
        select ps.*,
               p.product_name,
               pp.name as  process_name,
               pm.product_id,
               pm.model
        from
            product_structure 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_process pp on ps.process_id = pp.id
        where pb.product_model_id = #{productModelId}
        order by ps.id
    </select>
</mapper>