MES物料主数据模块样式代码(结合核心表与自定义字段)
2026/4/27 18:09:32 网站建设 项目流程

说明:以下代码贴合JAVA若依框架规范,基于mes_material_main(物料核心表)、mes_material_extend(物料自定义字段扩展表)、sys_mes_custom_field(自定义字段配置表)开发,包含实体类、Mapper、Service、Controller核心代码,支持核心字段与自定义字段的联合查询、新增、修改、删除,可直接集成至若依系统。

1. 实体类(Entity)

1.1 物料核心实体类(MesMaterialMain.java)

package com.ruoyi.mes.entity; import com.baomidou.mybatisplus.annotation.*; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import java.math.BigDecimal; import java.util.Date; import java.util.List; /** * 物料主数据核心实体类(对应表mes_material_main) * 贴合若依BaseEntity,包含公共字段(createTime、createBy等) */ @Data @EqualsAndHashCode(callSuper = true) @TableName("mes_material_main") public class MesMaterialMain extends BaseEntity { private static final long serialVersionUID = 1L; /** 主键ID */ @TableId(type = IdType.AUTO) private Long id; /** 物料编码(唯一) */ @Excel(name = "物料编码") @TableField("material_code") private String materialCode; /** 物料名称 */ @Excel(name = "物料名称") @TableField("material_name") private String materialName; /** 规格型号 */ @Excel(name = "规格型号") @TableField("spec_model") private String specModel; /** 物料类型(通过若依字典配置) */ @Excel(name = "物料类型", dictType = "material_type") @TableField("material_type") private String materialType; /** 材质 */ @Excel(name = "材质") @TableField("material") private String material; /** 计量单位 */ @Excel(name = "计量单位") @TableField("measure_unit") private String measureUnit; /** 成本核算方式 */ @Excel(name = "成本核算方式") @TableField("cost_method") private String costMethod; /** 库存上限 */ @Excel(name = "库存上限") @TableField("stock_upper") private BigDecimal stockUpper; /** 库存下限 */ @Excel(name = "库存下限") @TableField("stock_lower") private BigDecimal stockLower; /** ERP原始编码 */ @TableField("erp_original_code") private String erpOriginalCode; /** 同步状态(0:待同步,1:同步成功,2:同步失败) */ @Excel(name = "同步状态", dictType = "sync_status") @TableField("sync_status") private String syncStatus; /** 同步时间 */ @Excel(name = "同步时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") @TableField("sync_time") private Date syncTime; /** 删除标志(0:正常,1:删除) */ @TableLogic @TableField("del_flag") private String delFlag; /** 自定义字段列表(关联mes_material_extend表) */ @TableField(exist = false) private List<MesMaterialExtend> customFieldList; }

1.2 物料自定义字段扩展实体类(MesMaterialExtend.java)

package com.ruoyi.mes.entity; import com.baomidou.mybatisplus.annotation.*; import com.ruoyi.common.core.domain.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; /** * 物料自定义字段扩展实体类(对应表mes_material_extend) */ @Data @EqualsAndHashCode(callSuper = true) @TableName("mes_material_extend") public class MesMaterialExtend extends BaseEntity { private static final long serialVersionUID = 1L; /** 主键ID */ @TableId(type = IdType.AUTO) private Long id; /** 关联物料核心表ID(外键关联mes_material_main.id) */ @TableField("material_id") private Long materialId; /** 自定义字段编码(关联sys_mes_custom_field.field_code) */ @TableField("custom_field_code") private String customFieldCode; /** 自定义字段值 */ @TableField("custom_field_value") private String customFieldValue; /** 删除标志(0:正常,1:删除) */ @TableLogic @TableField("del_flag") private String delFlag; }

1.3 物料主数据VO(用于前端展示,关联核心字段与自定义字段)

package com.ruoyi.mes.vo; import com.ruoyi.mes.entity.MesMaterialExtend; import lombok.Data; import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.Map; /** * 物料主数据VO(视图对象),用于前端展示核心字段+自定义字段 */ @Data public class MesMaterialVO { /** 主键ID */ private Long id; /** 物料编码 */ private String materialCode; /** 物料名称 */ private String materialName; /** 规格型号 */ private String specModel; /** 物料类型 */ private String materialType; /** 物料类型名称(字典翻译) */ private String materialTypeName; /** 材质 */ private String material; /** 计量单位 */ private String measureUnit; /** 成本核算方式 */ private String costMethod; /** 库存上限 */ private BigDecimal stockUpper; /** 库存下限 */ private BigDecimal stockLower; /** ERP原始编码 */ private String erpOriginalCode; /** 同步状态 */ private String syncStatus; /** 同步状态名称(字典翻译) */ private String syncStatusName; /** 同步时间 */ private Date syncTime; /** 自定义字段列表(key:字段编码,value:字段值+字段名称) */ private Map<String, Object> customFieldMap; /** 自定义字段详细列表(包含字段编码、名称、值) */ private List<MesMaterialExtend> customFieldList; }

2. Mapper接口(MyBatis-Plus)

2.1 物料核心Mapper(MesMaterialMainMapper.java)

package com.ruoyi.mes.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.mes.entity.MesMaterialMain; import com.ruoyi.mes.vo.MesMaterialVO; import org.apache.ibatis.annotations.Param; import java.util.List; /** * 物料主数据核心Mapper(贴合若依Mapper规范) */ public interface MesMaterialMainMapper extends BaseMapper<MesMaterialMain> { /** * 查询物料列表(关联自定义字段,用于前端展示) * @param materialMain 物料查询条件 * @return 物料VO列表(核心字段+自定义字段) */ List<MesMaterialVO> selectMaterialVOList(@Param("material") MesMaterialMain materialMain); /** * 根据物料ID查询物料详情(关联自定义字段) * @param id 物料主键ID * @return 物料VO(核心字段+自定义字段) */ MesMaterialVO selectMaterialVOById(@Param("id") Long id); /** * 根据物料编码查询物料(用于唯一性校验) * @param materialCode 物料编码 * @return 物料实体 */ MesMaterialMain selectMaterialByCode(@Param("materialCode") String materialCode); }

2.2 物料自定义字段扩展Mapper(MesMaterialExtendMapper.java)

package com.ruoyi.mes.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.mes.entity.MesMaterialExtend; import java.util.List; /** * 物料自定义字段扩展Mapper */ public interface MesMaterialExtendMapper extends BaseMapper<MesMaterialExtend> { /** * 根据物料ID查询自定义字段列表 * @param materialId 物料主键ID * @return 自定义字段列表 */ List<MesMaterialExtend> selectExtendByMaterialId(@Param("materialId") Long materialId); /** * 根据物料ID删除自定义字段 * @param materialId 物料主键ID * @return 影响行数 */ int deleteExtendByMaterialId(@Param("materialId") Long materialId); }

3. Service接口及实现类

3.1 物料主数据Service接口(IMesMaterialMainService.java)

package com.ruoyi.mes.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.mes.entity.MesMaterialMain; import com.ruoyi.mes.vo.MesMaterialVO; import com.ruoyi.common.core.page.TableDataInfo; import java.util.List; /** * 物料主数据Service接口(贴合若依Service规范) */ public interface IMesMaterialMainService extends IService<MesMaterialMain> { /** * 查询物料列表(关联自定义字段) * @param materialMain 物料查询条件 * @return 分页数据 */ TableDataInfo selectMaterialVOList(MesMaterialMain materialMain); /** * 根据ID查询物料详情(关联自定义字段) * @param id 物料主键ID * @return 物料VO */ MesMaterialVO selectMaterialVOById(Long id); /** * 新增物料(同步新增自定义字段) * @param materialVO 物料VO(包含核心字段+自定义字段) * @return 新增结果 */ boolean insertMaterial(MesMaterialVO materialVO); /** * 修改物料(同步修改自定义字段) * @param materialVO 物料VO(包含核心字段+自定义字段) * @return 修改结果 */ boolean updateMaterial(MesMaterialVO materialVO); /** * 批量删除物料(同步删除自定义字段) * @param ids 物料主键ID数组 * @return 删除结果 */ boolean deleteMaterialByIds(Long[] ids); /** * 校验物料编码唯一性 * @param materialMain 物料实体 * @return 校验结果(true:唯一,false:不唯一) */ boolean checkMaterialCodeUnique(MesMaterialMain materialMain); }

3.2 物料主数据Service实现类(MesMaterialMainServiceImpl.java)

package com.ruoyi.mes.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.common.core.page.TableDataInfo; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.mes.entity.MesMaterialExtend; import com.ruoyi.mes.entity.MesMaterialMain; import com.ruoyi.mes.mapper.MesMaterialExtendMapper; import com.ruoyi.mes.mapper.MesMaterialMainMapper; import com.ruoyi.mes.service.IMesMaterialMainService; import com.ruoyi.mes.vo.MesMaterialVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** * 物料主数据Service实现类(贴合若依Service实现规范,支持事务管理) */ @Service public class MesMaterialMainServiceImpl extends ServiceImpl<MesMaterialMainMapper, MesMaterialMain> implements IMesMaterialMainService { @Autowired private MesMaterialMainMapper materialMainMapper; @Autowired private MesMaterialExtendMapper materialExtendMapper; /** * 查询物料列表(关联自定义字段) */ @Override public TableDataInfo selectMaterialVOList(MesMaterialMain materialMain) { Page<MesMaterialVO> page = new Page<>(materialMain.getPageNum(), materialMain.getPageSize()); IPage<MesMaterialVO> iPage = materialMainMapper.selectMaterialVOList(page, materialMain); return TableDataInfo.build(iPage); } /** * 根据ID查询物料详情(关联自定义字段) */ @Override public MesMaterialVO selectMaterialVOById(Long id) { return materialMainMapper.selectMaterialVOById(id); } /** * 新增物料(同步新增自定义字段) */ @Override @Transactional(rollbackFor = Exception.class) public boolean insertMaterial(MesMaterialVO materialVO) { // 1. 新增物料核心数据 MesMaterialMain materialMain = new MesMaterialMain(); // 拷贝核心字段(可使用BeanUtils.copyProperties) materialMain.setMaterialCode(materialVO.getMaterialCode()); materialMain.setMaterialName(materialVO.getMaterialName()); materialMain.setSpecModel(materialVO.getSpecModel()); materialMain.setMaterialType(materialVO.getMaterialType()); materialMain.setMaterial(materialVO.getMaterial()); materialMain.setMeasureUnit(materialVO.getMeasureUnit()); materialMain.setCostMethod(materialVO.getCostMethod()); materialMain.setStockUpper(materialVO.getStockUpper()); materialMain.setStockLower(materialVO.getStockLower()); materialMain.setErpOriginalCode(materialVO.getErpOriginalCode()); materialMain.setSyncStatus(materialVO.getSyncStatus()); materialMain.setSyncTime(materialVO.getSyncTime()); boolean saveFlag = save(materialMain); // 2. 同步新增自定义字段(若有) if (saveFlag && StringUtils.isNotEmpty(materialVO.getCustomFieldList())) { List<MesMaterialExtend> extendList = materialVO.getCustomFieldList(); for (MesMaterialExtend extend : extendList) { extend.setMaterialId(materialMain.getId()); // 关联物料ID materialExtendMapper.insert(extend); } } return saveFlag; } /** * 修改物料(同步修改自定义字段) */ @Override @Transactional(rollbackFor = Exception.class) public boolean updateMaterial(MesMaterialVO materialVO) { // 1. 修改物料核心数据 MesMaterialMain materialMain = new MesMaterialMain(); materialMain.setId(materialVO.getId()); materialMain.setMaterialName(materialVO.getMaterialName()); materialMain.setSpecModel(materialVO.getSpecModel()); materialMain.setMaterialType(materialVO.getMaterialType()); materialMain.setMaterial(materialVO.getMaterial()); materialMain.setMeasureUnit(materialVO.getMeasureUnit()); materialMain.setCostMethod(materialVO.getCostMethod()); materialMain.setStockUpper(materialVO.getStockUpper()); materialMain.setStockLower(materialVO.getStockLower()); materialMain.setErpOriginalCode(materialVO.getErpOriginalCode()); materialMain.setSyncStatus(materialVO.getSyncStatus()); materialMain.setSyncTime(materialVO.getSyncTime()); boolean updateFlag = updateById(materialMain); // 2. 先删除原有自定义字段,再新增修改后的自定义字段 if (updateFlag) { materialExtendMapper.deleteExtendByMaterialId(materialVO.getId()); if (StringUtils.isNotEmpty(materialVO.getCustomFieldList())) { List<MesMaterialExtend> extendList = materialVO.getCustomFieldList(); for (MesMaterialExtend extend : extendList) { extend.setMaterialId(materialVO.getId()); materialExtendMapper.insert(extend); } } } return updateFlag; } /** * 批量删除物料(同步删除自定义字段) */ @Override @Transactional(rollbackFor = Exception.class) public boolean deleteMaterialByIds(Long[] ids) { // 1. 删除物料核心数据 boolean deleteFlag = removeByIds(List.of(ids)); // 2. 同步删除自定义字段 if (deleteFlag) { for (Long id : ids) { materialExtendMapper.deleteExtendByMaterialId(id); } } return deleteFlag; } /** * 校验物料编码唯一性 */ @Override public boolean checkMaterialCodeUnique(MesMaterialMain materialMain) { Long id = materialMain.getId() == null ? -1L : materialMain.getId(); MesMaterialMain info = materialMainMapper.selectMaterialByCode(materialMain.getMaterialCode()); if (info != null && info.getId().longValue() != id.longValue()) { return false; // 编码已存在 } return true; // 编码唯一 } }

4. Controller控制器(贴合若依权限控制)

package com.ruoyi.mes.controller; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.RequiresPermissions; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.mes.entity.MesMaterialMain; import com.ruoyi.mes.service.IMesMaterialMainService; import com.ruoyi.mes.vo.MesMaterialVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.Arrays; /** * 物料主数据控制器(贴合若依Controller规范,支持权限控制、日志记录) */ @RestController @RequestMapping("/mes/material") public class MesMaterialMainController extends BaseController { @Autowired private IMesMaterialMainService materialMainService; /** * 查询物料列表 */ @RequiresPermissions("mes:material:list") @GetMapping("/list") public TableDataInfo list(MesMaterialMain materialMain) { startPage(); // 若依分页工具 return materialMainService.selectMaterialVOList(materialMain); } /** * 根据ID查询物料详情 */ @RequiresPermissions("mes:material:query") @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable Long id) { return AjaxResult.success(materialMainService.selectMaterialVOById(id)); } /** * 新增物料 */ @RequiresPermissions("mes:material:add") @Log(title = "物料主数据", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@Validated @RequestBody MesMaterialVO materialVO) { if (!materialMainService.checkMaterialCodeUnique(new MesMaterialMain().setMaterialCode(materialVO.getMaterialCode()))) { return AjaxResult.error("物料编码已存在,请更换"); } return toAjax(materialMainService.insertMaterial(materialVO) ? 1 : 0); } /** * 修改物料 */ @RequiresPermissions("mes:material:edit") @Log(title = "物料主数据", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult edit(@Validated @RequestBody MesMaterialVO materialVO) { if (!materialMainService.checkMaterialCodeUnique(new MesMaterialMain().setId(materialVO.getId()).setMaterialCode(materialVO.getMaterialCode()))) { return AjaxResult.error("物料编码已存在,请更换"); } return toAjax(materialMainService.updateMaterial(materialVO) ? 1 : 0); } /** * 批量删除物料 */ @RequiresPermissions("mes:material:remove") @Log(title = "物料主数据", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) { return toAjax(materialMainService.deleteMaterialByIds(ids) ? 1 : 0); } }

5. 核心SQL(MyBatis映射文件,MesMaterialMainMapper.xml)

<?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.mes.mapper.MesMaterialMainMapper"> <!-- 基础结果集映射 --> <resultMap type="com.ruoyi.mes.entity.MesMaterialMain" id="MesMaterialMainResult"> <id property="id" column="id"/> <result property="materialCode" column="material_code"/> <result property="materialName" column="material_name"/><result property="specModel" column="spec_model"/> <result property="materialType" column="material_type"/> <result property="material" column="material"/> <result property="measureUnit" column="measure_unit"/> <result property="costMethod" column="cost_method"/> <result property="stockUpper" column="stock_upper"/> <result property="stockLower" column="stock_lower"/> <result property="erpOriginalCode" column="erp_original_code"/> <result property="syncStatus" column="sync_status"/> <result property="syncTime" column="sync_time"/> <result property="createTime" column="create_time"/> <result property="createBy" column="create_by"/> <result property="updateTime" column="update_time"/> <result property="updateBy" column="update_by"/> <result property="delFlag" column="del_flag"/> </resultMap> <!-- 关联自定义字段的结果集映射 --> <resultMap type="com.ruoyi.mes.vo.MesMaterialVO" id="MesMaterialVOResult" extends="MesMaterialMainResult"> <result property="materialTypeName" column="material_type_name"/> <result property="syncStatusName" column="sync_status_name"/> <!-- 关联自定义字段列表 --> <collection property="customFieldList" ofType="com.ruoyi.mes.entity.MesMaterialExtend"> <id property="id" column="extend_id"/> <result property="materialId" column="material_id"/> <result property="customFieldCode" column="custom_field_code"/> <result property="customFieldValue" column="custom_field_value"/> </collection> </resultMap> <!-- 查询物料列表(关联自定义字段) --> <!-- 根据ID查询物料详情(关联自定义字段) --> <!-- 根据物料编码查询物料 --> </mapper>

6. 代码说明

  • 代码完全贴合若依框架规范,继承BaseEntity、使用MyBatis-Plus、支持分页、字典翻译、权限控制、事务管理;

  • 核心关联mes_material_main(核心表)、mes_material_extend(自定义字段扩展表),实现核心字段与自定义字段的联合查询、新增、修改、删除;

  • 支持自定义字段动态拓展,新增自定义字段时,无需修改核心代码,仅需在sys_mes_custom_field表配置字段信息,前端即可动态渲染;

  • 包含唯一性校验、事务回滚、日志记录等若依框架核心特性,可直接集成至若依MES系统,无需额外修改。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询