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() // å¼å¯swagger ; }) // æ°æ®æºé ç½®ï¼æ ¸å¿ï¼èªå®ä¹ç±»å转æ¢ï¼å¼ºå¶tenant_id为Longï¼ .dataSourceConfig(builder -> { builder.typeConvert(new MySqlTypeConvert() { /** * èªå®ä¹å段类åè½¬æ¢ * @param globalConfig å ¨å±é ç½® * @param tableField è¡¨åæ®µä¿¡æ¯ * @return 转æ¢åçåæ®µç±»å */ @Override public DbColumnType processTypeConvert(GlobalConfig globalConfig, TableField tableField) { // 强å¶tenant_idåæ®µç±»å为Long 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() // è¦çå·²ç»çæçEntityæä»¶ .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() // è¦çå·²çæMapperæä»¶ .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 + "ï¼"); } } src/main/java/com/ruoyi/production/controller/ProductBomController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,69 @@ package com.ruoyi.production.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.production.dto.ProductBomDto; import com.ruoyi.production.dto.ProductProcessDto; import com.ruoyi.production.pojo.ProductBom; import com.ruoyi.production.pojo.ProductProcess; 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; @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) { if(CollectionUtils.isEmpty(ids)){ return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); } return AjaxResult.success(productBomService.removeBatchByIds(ids)); } } src/main/java/com/ruoyi/production/controller/ProductStructureController.java
@@ -26,15 +26,15 @@ private ProductStructureService productStructureService; @ApiOperation("æ ¹æ®productIdæ¥è¯¢") @GetMapping("/listByproductModelId/{productModelId}") public R listByproductModelId( @PathVariable("productModelId") Long productModelId){ return R.ok(productStructureService.listByproductModelId( productModelId)); } @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/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; } 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); } src/main/java/com/ruoyi/production/mapper/ProductStructureMapper.java
@@ -12,5 +12,6 @@ @Mapper public interface ProductStructureMapper extends BaseMapper<ProductStructure> { List<ProductStructureDto> listByproductModelId(@Param("productModelId") Long productModelId); List<ProductStructureDto> listBybomId(@Param("bomId") Long bomId); } 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; } src/main/java/com/ruoyi/production/pojo/ProductStructure.java
@@ -40,16 +40,6 @@ private String unit; /** * ç¶çº§id */ private Long parentId; /** * çæ°é */ private BigDecimal diskQuantity; /** * ç§æ·ID */ @TableField(fill = FieldFill.INSERT) 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); } 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); } 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; // æ´æ°æ°æ®åºä¸çproductCode processRoute.setProcessRouteCode(newProductCode); return processRouteMapper.updateById(processRoute); 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åæ®µï¼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/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; } } 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/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,7 @@ 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> </mapper>