From 973677d7792dbe440bd032ff4cc138458c89b06e Mon Sep 17 00:00:00 2001
From: yaowanxin <3588231647@qq.com>
Date: 星期四, 15 一月 2026 17:00:01 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/jtwy' into jtwy

---
 src/main/resources/mapper/production/ProductProcessMapper.xml                    |    6 
 src/main/java/com/ruoyi/production/pojo/ProductStructure.java                    |   17 
 src/main/java/com/ruoyi/production/mapper/ProductProcessMapper.java              |    2 
 src/main/java/com/ruoyi/production/pojo/ProductBom.java                          |   72 ++++++
 src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java |   32 +-
 src/main/java/com/ruoyi/production/controller/ProductStructureController.java    |   21 +
 src/main/java/com/ruoyi/production/pojo/ProcessRoute.java                        |    5 
 src/main/java/com/ruoyi/production/service/ProductBomService.java                |   24 ++
 src/main/java/com/ruoyi/production/dto/ProcessRouteDto.java                      |    2 
 src/main/resources/mapper/production/ProcessRouteMapper.xml                      |    3 
 src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java   |   25 ++
 src/main/java/com/ruoyi/production/pojo/ProductProcess.java                      |   17 +
 src/main/java/com/ruoyi/basic/pojo/ProductModel.java                             |    3 
 src/main/java/com/ruoyi/production/controller/ProductProcessController.java      |   19 +
 src/main/java/com/ruoyi/CodeGenerator.java                                       |  130 +++++++++++
 src/main/resources/mapper/production/ProductBomMapper.xml                        |   48 ++++
 src/main/java/com/ruoyi/production/service/impl/ProductBomServiceImpl.java       |   49 ++++
 src/main/java/com/ruoyi/production/mapper/ProductBomMapper.java                  |   26 ++
 src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java          |    9 
 src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java            |    3 
 src/main/java/com/ruoyi/production/service/ProductStructureService.java          |    4 
 src/main/java/com/ruoyi/production/dto/ProductBomDto.java                        |   18 +
 src/main/resources/mapper/production/ProductStructureMapper.xml                  |   21 +
 src/main/java/com/ruoyi/production/pojo/ProcessRouteItem.java                    |    2 
 src/main/java/com/ruoyi/production/controller/ProductBomController.java          |   87 +++++++
 src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java     |    2 
 src/main/java/com/ruoyi/production/service/ProductProcessService.java            |    3 
 27 files changed, 588 insertions(+), 62 deletions(-)

diff --git a/src/main/java/com/ruoyi/CodeGenerator.java b/src/main/java/com/ruoyi/CodeGenerator.java
new file mode 100644
index 0000000..856da1d
--- /dev/null
+++ b/src/main/java/com/ruoyi/CodeGenerator.java
@@ -0,0 +1,130 @@
+package com.ruoyi;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.generator.FastAutoGenerator;
+import com.baomidou.mybatisplus.generator.config.*;
+import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
+import com.baomidou.mybatisplus.generator.config.po.TableField;
+import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
+import com.baomidou.mybatisplus.generator.fill.Column;
+
+import java.util.Collections;
+import java.util.Scanner;
+
+// 婕旂ず渚嬪瓙锛屾墽琛� main 鏂规硶鎺у埗鍙拌緭鍏ユā鍧楄〃鍚嶅洖杞﹁嚜鍔ㄧ敓鎴愬搴旈」鐩洰褰曚腑
+public class CodeGenerator {
+
+    public static String database_url = "jdbc:mysql://1.15.17.182:9999/product-inventory-management-jtwy";
+    public static String database_username = "root";
+    public static String database_password= "xd@123456..";
+    public static String author = "鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃";
+    public static String model = "production"; // 妯″潡
+    public static String setParent = "com.ruoyi."+ model; // 鍖呰矾寰�
+    public static String tablePrefix = ""; // 璁剧疆杩囨护琛ㄥ墠缂�
+    public static void main(String[] args) {
+        String projectPath = System.getProperty("user.dir");
+        FastAutoGenerator.create(database_url, database_username, database_password)
+                // 鍏ㄥ眬閰嶇疆
+                .globalConfig(builder -> {
+                    builder.author(author) // 璁剧疆浣滆��
+                            .commentDate("yyyy-MM-dd hh:mm:ss")   //娉ㄩ噴鏃ユ湡
+                            .outputDir(projectPath  + "/src/main/java") // 鎸囧畾杈撳嚭鐩綍
+                            .disableOpenDir() //绂佹鎵撳紑杈撳嚭鐩綍锛岄粯璁ゆ墦寮�
+                            .enableSwagger() // 寮�鍚痵wagger
+
+                    ;
+                })
+                // 鏁版嵁婧愰厤缃紙鏍稿績锛氳嚜瀹氫箟绫诲瀷杞崲锛屽己鍒秚enant_id涓篖ong锛�
+                .dataSourceConfig(builder -> {
+                    builder.typeConvert(new MySqlTypeConvert() {
+                        /**
+                         * 鑷畾涔夊瓧娈电被鍨嬭浆鎹�
+                         * @param globalConfig 鍏ㄥ眬閰嶇疆
+                         * @param tableField 琛ㄥ瓧娈典俊鎭�
+                         * @return 杞崲鍚庣殑瀛楁绫诲瀷
+                         */
+                        @Override
+                        public DbColumnType processTypeConvert(GlobalConfig globalConfig, TableField tableField) {
+                            // 寮哄埗tenant_id瀛楁绫诲瀷涓篖ong
+                            if ("tenant_id".equalsIgnoreCase(tableField.getName())) {
+                                return DbColumnType.LONG;
+                            }
+                            // 鍏朵粬瀛楁浣跨敤榛樿杞崲瑙勫垯
+                            return (DbColumnType) super.processTypeConvert(globalConfig, tableField);
+                        }
+                    });
+                })
+                // 鍖呴厤缃�
+                .packageConfig(builder -> {
+                    builder.entity("pojo");
+                    builder.parent(setParent) // 璁剧疆鐖跺寘鍚�
+                            .pathInfo(Collections.singletonMap(OutputFile.xml, projectPath  +  "/src/main/resources/mapper/"+model)); // 璁剧疆mapperXml鐢熸垚璺緞
+                })
+                // 绛栫暐閰嶇疆
+                .strategyConfig(builder -> {
+                    builder.addInclude(scanner("琛ㄥ悕锛屽涓┖鏍煎垎鍓�").split(" ")) // 璁剧疆闇�瑕佺敓鎴愮殑琛ㄥ悕
+                            .addTablePrefix(tablePrefix) // 璁剧疆杩囨护琛ㄥ墠缂�
+                            // Entity 绛栫暐閰嶇疆
+                            .entityBuilder()
+                            .enableLombok() //寮�鍚� Lombok
+                            .naming(NamingStrategy.underline_to_camel)  //鏁版嵁搴撹〃鏄犲皠鍒板疄浣撶殑鍛藉悕绛栫暐锛氫笅鍒掔嚎杞┘宄板懡
+                            .columnNaming(NamingStrategy.underline_to_camel)    //鏁版嵁搴撹〃瀛楁鏄犲皠鍒板疄浣撶殑鍛藉悕绛栫暐锛氫笅鍒掔嚎杞┘宄板懡
+                            .enableFileOverride() // 瑕嗙洊宸茬粡鐢熸垚鐨凟ntity鏂囦欢
+                            .logicDeleteColumnName("state")
+                            .addTableFills(
+                                    new Column("create_time", FieldFill.INSERT),
+                                    new Column("update_time", FieldFill.INSERT_UPDATE),
+                                    new Column("create_user", FieldFill.INSERT),
+                                    new Column("update_user", FieldFill.INSERT_UPDATE),
+                                    new Column("tenant_id", FieldFill.INSERT)
+                            )
+                            .idType(IdType.AUTO) // 鑷涓婚敭
+
+                            // Mapper 绛栫暐閰嶇疆
+                            .mapperBuilder()
+                            .enableFileOverride() // 瑕嗙洊宸茬敓鎴怣apper鏂囦欢
+                            .enableBaseResultMap() // 鑷姩鐢熸垚resultMap
+                            .mapperAnnotation(org.apache.ibatis.annotations.Mapper.class)
+
+                            // Service 绛栫暐閰嶇疆
+                            .serviceBuilder()
+                            .formatServiceFileName("%sService") //鏍煎紡鍖� service 鎺ュ彛鏂囦欢鍚嶇О锛�%s杩涜鍖归厤琛ㄥ悕锛屽 UserService
+                            .formatServiceImplFileName("%sServiceImpl") //鏍煎紡鍖� service 瀹炵幇绫绘枃浠跺悕绉帮紝%s杩涜鍖归厤琛ㄥ悕锛屽 UserServiceImpl
+                            .enableFileOverride() // 瑕嗙洊宸茬敓鎴愭枃浠�
+
+                            // Controller 绛栫暐閰嶇疆
+                            .controllerBuilder()
+                            .enableFileOverride() // 瑕嗙洊宸茬敓鎴愭枃浠�
+                            .enableRestStyle() // 寮�鍚敓鎴怈RestController 鎺у埗鍣�
+                    ;
+                })
+                //5銆佹ā鏉垮紩鎿�
+                .templateEngine(new FreemarkerTemplateEngine())	//榛樿
+                .execute();
+    }
+
+    /**
+     * <p>
+     * 璇诲彇鎺у埗鍙板唴瀹�
+     * </p>
+     */
+    public static String scanner(String tip) {
+        Scanner scanner = new Scanner(System.in);
+        StringBuilder help = new StringBuilder();
+        help.append("璇疯緭鍏�" + tip + "锛�");
+        System.out.println(help.toString());
+        if (scanner.hasNext()) {
+            String ipt = scanner.next();
+
+            if (StringUtils.isNotBlank(ipt)) {
+                return ipt;
+            }
+        }
+        throw new MybatisPlusException("璇疯緭鍏ユ纭殑" + tip + "锛�");
+    }
+}
diff --git a/src/main/java/com/ruoyi/basic/pojo/ProductModel.java b/src/main/java/com/ruoyi/basic/pojo/ProductModel.java
index d5e0aac..3e4fef7 100644
--- a/src/main/java/com/ruoyi/basic/pojo/ProductModel.java
+++ b/src/main/java/com/ruoyi/basic/pojo/ProductModel.java
@@ -29,9 +29,6 @@
     @Excel(name = "浜у搧鍚嶇О")
     private String productName;
 
-    @Excel(name = "浜у搧缂栫爜")
-    private String productCode;
-
     /**
      * 瑙勬牸鍨嬪彿
      */
diff --git a/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
index bc3840f..cf9ef84 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
@@ -48,14 +48,7 @@
         if (productModelDto.getId() == null) {
             ProductModel productModel = new ProductModel();
             BeanUtils.copyProperties(productModelDto,productModel);
-            productModelMapper.insert(productModel);
-
-            String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
-            String idStr = String.format("%06d", productModel.getId()); // 鍏綅琛�0
-            String newProductCode = "BM" + dateStr + idStr;
-            // 鏇存柊鏁版嵁搴撲腑鐨刾roductCode
-            productModel.setProductCode(newProductCode);
-            return productModelMapper.updateById(productModel);
+            return productModelMapper.insert(productModel);
         } else {
             return productModelMapper.updateById(productModelDto);
         }
diff --git a/src/main/java/com/ruoyi/production/controller/ProductBomController.java b/src/main/java/com/ruoyi/production/controller/ProductBomController.java
new file mode 100644
index 0000000..b8d9416
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/controller/ProductBomController.java
@@ -0,0 +1,87 @@
+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.dto.ProductProcessDto;
+import com.ruoyi.production.pojo.ProcessRoute;
+import com.ruoyi.production.pojo.ProductBom;
+import com.ruoyi.production.pojo.ProductProcess;
+import com.ruoyi.production.service.ProcessRouteService;
+import com.ruoyi.production.service.ProductBomService;
+import com.ruoyi.production.service.ProductProcessService;
+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));
+        if (list.size()>0){
+            return AjaxResult.error("璇OM宸茬粡瀛樺湪瀵瑰簲鐨勫伐鑹鸿矾绾�,鏃犳硶杩涜鍒犻櫎");
+        }
+        if(CollectionUtils.isEmpty(ids)){
+            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+        }
+        return AjaxResult.success(productBomService.removeBatchByIds(ids));
+    }
+
+    @GetMapping("/getByModel")
+    @Log(title = "BOM-鏍规嵁閫夋嫨鐨勮鏍煎瀷鍙穒d鏌ヨ瀛樺湪鐨刡om", businessType = BusinessType.OTHER)
+    @ApiOperation("BOM-鏍规嵁閫夋嫨鐨勮鏍煎瀷鍙穒d鏌ヨ瀛樺湪鐨刡om")
+    public AjaxResult getByModel(Long productModelId) {
+        List<ProductBom> productBoms = productBomService.list(Wrappers.<ProductBom>lambdaQuery().eq(ProductBom::getProductModelId, productModelId));
+        return AjaxResult.success(productBoms);
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/production/controller/ProductProcessController.java b/src/main/java/com/ruoyi/production/controller/ProductProcessController.java
index 77920b2..cff0c60 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductProcessController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductProcessController.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.pojo.Customer;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.device.pojo.DeviceRepair;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
@@ -18,7 +19,9 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 @RestController
@@ -66,5 +69,21 @@
     @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, "宸ュ簭妯℃澘");
     }
 }
diff --git a/src/main/java/com/ruoyi/production/controller/ProductStructureController.java b/src/main/java/com/ruoyi/production/controller/ProductStructureController.java
index 26594f6..2f99a00 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductStructureController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductStructureController.java
@@ -1,7 +1,12 @@
 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.framework.web.domain.R;
+import com.ruoyi.production.dto.ProductProcessDto;
 import com.ruoyi.production.dto.ProductStructureDto;
 import com.ruoyi.production.pojo.ProductStructure;
 import com.ruoyi.production.service.ProductStructureService;
@@ -15,21 +20,21 @@
 
 @RequestMapping("productStructure")
 @RestController
-@Api(tags = "浜у搧缁撴瀯")
+@Api(tags = "BOM")
 public class ProductStructureController {
     @Autowired
     private ProductStructureService productStructureService;
 
 
-    @ApiOperation("鏍规嵁productId鏌ヨ")
-    @GetMapping("/listByproductModelId/{productModelId}")
-    public R listByproductModelId( @PathVariable("productModelId") Long productModelId){
-        return R.ok(productStructureService.listByproductModelId( productModelId));
-    }
-
-    @ApiOperation("鏂板浜у搧缁撴瀯")
+    @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));
+    }
 }
diff --git a/src/main/java/com/ruoyi/production/dto/ProcessRouteDto.java b/src/main/java/com/ruoyi/production/dto/ProcessRouteDto.java
index 5689dae..232a00c 100644
--- a/src/main/java/com/ruoyi/production/dto/ProcessRouteDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProcessRouteDto.java
@@ -13,4 +13,6 @@
 
     @ApiModelProperty("瑙勬牸")
     private String model;
+
+    private String bomNo;
 }
diff --git a/src/main/java/com/ruoyi/production/dto/ProductBomDto.java b/src/main/java/com/ruoyi/production/dto/ProductBomDto.java
new file mode 100644
index 0000000..ab695ca
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/ProductBomDto.java
@@ -0,0 +1,18 @@
+package com.ruoyi.production.dto;
+
+import com.ruoyi.production.pojo.ProductBom;
+import lombok.Data;
+
+import java.util.List;
+
+//鍒嗛〉鏌ヨ鍥炴樉鏁版嵁
+@Data
+public class ProductBomDto extends ProductBom {
+
+    //浜у搧鍚嶇О
+    private String productName;
+
+    //浜у搧瑙勬牸鍨嬪彿
+    private String productModelName;
+
+}
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductBomMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductBomMapper.java
new file mode 100644
index 0000000..1183335
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/mapper/ProductBomMapper.java
@@ -0,0 +1,26 @@
+package com.ruoyi.production.mapper;
+
+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.dto.ProductProcessDto;
+import com.ruoyi.production.pojo.ProductBom;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+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);
+}
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductProcessMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductProcessMapper.java
index 9bf001c..f21c308 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductProcessMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductProcessMapper.java
@@ -5,8 +5,10 @@
 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);
 }
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java
index 0460c75..9ab7ba7 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java
@@ -12,5 +12,8 @@
 
 @Mapper
 public interface ProductStructureMapper  extends BaseMapper<ProductStructure> {
+
+    List<ProductStructureDto> listBybomId(@Param("bomId") Long bomId);
+
     List<ProductStructureDto> listByproductModelId(@Param("productModelId") Long productModelId);
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProcessRoute.java b/src/main/java/com/ruoyi/production/pojo/ProcessRoute.java
index 88034cb..d55a17d 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProcessRoute.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProcessRoute.java
@@ -3,6 +3,7 @@
 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;
 
@@ -10,6 +11,7 @@
 
 @TableName("process_route")
 @Data
+@ApiModel(value = "processRoute", description = "宸ヨ壓璺嚎涓昏〃")
 public class ProcessRoute {
 
     @ApiModelProperty(value = "搴忓彿")
@@ -35,4 +37,7 @@
 
     @ApiModelProperty(value = "宸ヨ壓璺嚎缂栫爜")
     private String processRouteCode;
+
+    @ApiModelProperty(value = "BOM鐨処D")
+    private Long bomId;
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProcessRouteItem.java b/src/main/java/com/ruoyi/production/pojo/ProcessRouteItem.java
index 66cbfdd..ffd1ee4 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProcessRouteItem.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProcessRouteItem.java
@@ -1,6 +1,7 @@
 package com.ruoyi.production.pojo;
 
 import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -8,6 +9,7 @@
 
 @Data
 @TableName("process_route_item")
+@ApiModel(value = "processRouteItem", description = "宸ヨ壓璺嚎瀛愯〃")
 public class ProcessRouteItem {
 
     @TableId(type = IdType.AUTO)
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductBom.java b/src/main/java/com/ruoyi/production/pojo/ProductBom.java
new file mode 100644
index 0000000..802724a
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/pojo/ProductBom.java
@@ -0,0 +1,72 @@
+package com.ruoyi.production.pojo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+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;
+
+/**
+ * <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;
+}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductProcess.java b/src/main/java/com/ruoyi/production/pojo/ProductProcess.java
index 21ca82a..d25f9cf 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductProcess.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductProcess.java
@@ -1,7 +1,12 @@
 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;
@@ -9,6 +14,8 @@
 
 @TableName("product_process")
 @Data
+@ExcelIgnoreUnannotated
+@ApiModel(value = "productProcess", description = "宸ュ簭琛�")
 public class ProductProcess implements Serializable {
 
     private static final long serialVersionUID = 1L;
@@ -19,34 +26,42 @@
     /**
      * 宸ュ簭鍚嶇О
      */
+    @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.UPDATE)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime updateTime;
 
     /**
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductStructure.java b/src/main/java/com/ruoyi/production/pojo/ProductStructure.java
index 8a53b2e..de0d605 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductStructure.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductStructure.java
@@ -1,12 +1,14 @@
 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;
@@ -40,20 +42,15 @@
     private String unit;
 
     /**
-     * 鐖剁骇id
-     */
-    private Long parentId;
-
-    /**
-     * 鐩樻暟閲�
-     */
-    private BigDecimal diskQuantity;
-
-    /**
      * 绉熸埛ID
      */
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
 
+    /**
+     * 鍏宠仈BOMid
+     */
+    private Long bomId;
+
 
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductBomService.java b/src/main/java/com/ruoyi/production/service/ProductBomService.java
new file mode 100644
index 0000000..0736338
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/ProductBomService.java
@@ -0,0 +1,24 @@
+package com.ruoyi.production.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.production.dto.ProductBomDto;
+import com.ruoyi.production.dto.ProductProcessDto;
+import com.ruoyi.production.pojo.ProductBom;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <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);
+}
diff --git a/src/main/java/com/ruoyi/production/service/ProductProcessService.java b/src/main/java/com/ruoyi/production/service/ProductProcessService.java
index 42ec232..a5ab6c3 100644
--- a/src/main/java/com/ruoyi/production/service/ProductProcessService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductProcessService.java
@@ -8,6 +8,7 @@
 import com.ruoyi.production.dto.*;
 import com.ruoyi.production.pojo.ProductProcess;
 import com.ruoyi.production.pojo.SalesLedgerScheduling;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import java.util.List;
@@ -20,4 +21,6 @@
     IPage<ProductProcessDto> listPage(Page page, ProductProcessDto productProcessDto);
 
     AjaxResult add(ProductProcessDto productProcessDto);
+
+    AjaxResult importData(MultipartFile file);
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductStructureService.java b/src/main/java/com/ruoyi/production/service/ProductStructureService.java
index c75c150..b85a040 100644
--- a/src/main/java/com/ruoyi/production/service/ProductStructureService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductStructureService.java
@@ -10,8 +10,8 @@
 public interface ProductStructureService extends IService<ProductStructure> {
 
 
-    ProductModelDto listByproductModelId(Long productId);
-
     Boolean addProductStructureDto(ProductStructureDto productStructureDto);
 
+    List<ProductStructureDto> listBybomId(Long bomId);
+
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
index 9fafe5f..a5427d2 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
@@ -35,7 +35,7 @@
         this.save(processRoute);
         String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
         String idStr = String.format("%06d", processRoute.getId());
-        String newProductCode = "GY" + dateStr + idStr;
+        String newProductCode = "GYLX" + dateStr + idStr;
         // 鏇存柊鏁版嵁搴撲腑鐨刾roductCode
         processRoute.setProcessRouteCode(newProductCode);
         return processRouteMapper.updateById(processRoute);
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductBomServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductBomServiceImpl.java
new file mode 100644
index 0000000..d519593
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductBomServiceImpl.java
@@ -0,0 +1,49 @@
+package com.ruoyi.production.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.production.dto.ProductBomDto;
+import com.ruoyi.production.dto.ProductProcessDto;
+import com.ruoyi.production.pojo.ProductBom;
+import com.ruoyi.production.mapper.ProductBomMapper;
+import com.ruoyi.production.pojo.ProductProcess;
+import com.ruoyi.production.service.ProductBomService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.BeanUtils;
+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瀛楁锛欸X + 8浣嶆暟瀛楋紙涓嶈冻8浣嶅墠闈㈣ˉ0锛�
+            String no = "BM." + String.format("%05d", productBom.getId());
+            productBom.setBomNo(no);
+            productBomMapper.updateById(productBom);
+            return AjaxResult.success();
+        }
+        return AjaxResult.error();
+    }
+}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
index e44ae02..6a8cf73 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
@@ -1,8 +1,11 @@
 package com.ruoyi.production.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.pojo.Customer;
+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.ProductProcessMapper;
@@ -11,6 +14,10 @@
 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 {
@@ -27,7 +34,7 @@
         ProductProcess productProcess = new ProductProcess();
         BeanUtils.copyProperties(productProcessDto,productProcess);
         boolean save = productProcessMapper.insert(productProcess) > 0;
-        if (save) {
+        if (save && ObjectUtils.isNotNull(productProcessDto.getNo())) {
             // 鏍规嵁id鐢熸垚no瀛楁锛欸X + 8浣嶆暟瀛楋紙涓嶈冻8浣嶅墠闈㈣ˉ0锛�
             String no = "GX" + String.format("%08d", productProcess.getId());
             productProcess.setNo(no);
@@ -37,4 +44,20 @@
         }
         return AjaxResult.error();
     }
+
+    @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("瀵煎叆澶辫触");
+        }
+    }
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java
index b54617f..310a723 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java
@@ -1,13 +1,16 @@
 package com.ruoyi.production.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.basic.dto.ProductModelDto;
+import com.ruoyi.basic.dto.ProductTreeDto;
 import com.ruoyi.basic.mapper.ProductMapper;
 import com.ruoyi.basic.mapper.ProductModelMapper;
 import com.ruoyi.basic.pojo.Product;
 import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.production.dto.ProductStructureDto;
+import com.ruoyi.production.mapper.ProductBomMapper;
 import com.ruoyi.production.mapper.ProductStructureMapper;
 import com.ruoyi.production.pojo.ProductStructure;
 import com.ruoyi.production.service.ProductStructureService;
@@ -17,7 +20,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.HashMap;
+import java.util.ArrayList;
 import java.util.List;
 
 @Service
@@ -27,29 +30,22 @@
 
     @Autowired
     private  ProductStructureMapper productStructureMapper;
-    @Autowired
-    private ProductModelMapper productModelMapper;
-    @Autowired
-    private ProductMapper productMapper;
 
-    @Override
-    public ProductModelDto listByproductModelId(Long productModelId) {
-        ProductModel productModel = productModelMapper.selectById(productModelId);
-        Product product = productMapper.selectById(productModel.getProductId());
-        ProductModelDto productModelDto = new ProductModelDto();
-        BeanUtils.copyProperties(productModel,productModelDto);
-        productModelDto.setProductName(product.getProductName());
-        List<ProductStructureDto> productStructureDtos = productStructureMapper.listByproductModelId(productModelId);
-        productModelDto.setProductStructureList(productStructureDtos);
-        return productModelDto;
-    }
+
 
     @Override
     public Boolean addProductStructureDto(ProductStructureDto productStructureDto) {
-        this.remove(new QueryWrapper<ProductStructure>().lambda().eq(ProductStructure::getParentId, productStructureDto.getParentId()));
+        this.remove(new QueryWrapper<ProductStructure>().lambda().eq(ProductStructure::getBomId, productStructureDto.getBomId()));
         productStructureDto.getProductStructureList().forEach(productStructure -> {
-            productStructure.setParentId(productStructureDto.getParentId());
+            productStructure.setBomId(productStructureDto.getBomId());
         });
         return this.saveBatch(productStructureDto.getProductStructureList());
     }
+
+    @Override
+    public List<ProductStructureDto> listBybomId(Long bomId) {
+        List<ProductStructureDto> tree = productStructureMapper.listBybomId(bomId);
+        return tree;
+
+    }
 }
diff --git a/src/main/resources/mapper/production/ProcessRouteMapper.xml b/src/main/resources/mapper/production/ProcessRouteMapper.xml
index c5e09fc..51c11b4 100644
--- a/src/main/resources/mapper/production/ProcessRouteMapper.xml
+++ b/src/main/resources/mapper/production/ProcessRouteMapper.xml
@@ -13,8 +13,9 @@
     </resultMap>
 
     <select id="pageProcessRouteDto" resultType="com.ruoyi.production.dto.ProcessRouteDto">
-        select ps.*, p.product_name,pm.product_id,pm.model
+        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>
diff --git a/src/main/resources/mapper/production/ProductBomMapper.xml b/src/main/resources/mapper/production/ProductBomMapper.xml
new file mode 100644
index 0000000..ec06cd3
--- /dev/null
+++ b/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>
diff --git a/src/main/resources/mapper/production/ProductProcessMapper.xml b/src/main/resources/mapper/production/ProductProcessMapper.xml
index 37822b7..a2292e2 100644
--- a/src/main/resources/mapper/production/ProductProcessMapper.xml
+++ b/src/main/resources/mapper/production/ProductProcessMapper.xml
@@ -4,11 +4,7 @@
 
     <select id="listPage" resultType="com.ruoyi.production.dto.ProductProcessDto">
         SELECT
-        p.id,
-        p.name,
-        p.no,
-        p.remark,
-        p.salary_quota
+        *
         FROM
         product_process p
         <where>
diff --git a/src/main/resources/mapper/production/ProductStructureMapper.xml b/src/main/resources/mapper/production/ProductStructureMapper.xml
index df5a966..1833487 100644
--- a/src/main/resources/mapper/production/ProductStructureMapper.xml
+++ b/src/main/resources/mapper/production/ProductStructureMapper.xml
@@ -9,11 +9,9 @@
         <result property="unitQuantity" column="unit_quantity"/>
         <result property="demandedQuantity" column="demanded_quantity"/>
         <result property="unit" column="unit"/>
-        <result property="diskQuantity" column="disk_quantity"/>
         <result property="tenantId" column="tenant_id"/>
     </resultMap>
-
-    <select id="listByproductModelId" resultType="com.ruoyi.production.dto.ProductStructureDto">
+    <select id="listBybomId" resultType="com.ruoyi.production.dto.ProductStructureDto">
         select ps.*,
                p.product_name,
                pp.name as  process_name,
@@ -24,7 +22,22 @@
                 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.parent_id = #{productModelId}
+        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>

--
Gitblit v1.9.3