ERP中Bom的替代料

news/2024/11/17 7:36:42/

替代料

那么好的日子不写代码不肝博客岂不是浪费生命。关于bom做过erp的小伙伴应该都清楚,那么关于替代料应该也都知道,就是当某一个物料供应方没货源后我们的生产不至于因为没原料而停滞不前。于是我们做的erp也是增加了替代料的功能。
有不理解的小朋友先看一下效果图吧:
bom列表
这张图片就是我们的bom列表,点击编辑之后显示的就是这条bom的信息和它的组成物料表,如下图:
bom组成
这张图片上面展示的就是这条bom的信息,下面展示的就是组成这个产品的原料表,点击替代后效果和这张图是一奶同胞的效果,只不过上面展示的是这条物料的信息,下面展示的是它的可替代料表。
替代料
有图片作参考是不是就清晰很多了,那么接下来我们来说一下原理。

功能实现及原理

因为这是半成品的bom,在定义上还不属于成熟的成品,所以是和物料同放进物料表的,我们要做的就是在数据库里面新增一张关系表,里面要有bom的id,物料的id,替代料的id这三个id是必不可少的。
那么接下来说一下功能的实现,首先是第一张图片的实现,无外乎是一个查询,连表查询一下bom的关系表和物料表,代码粘一下就不具体解释了。

  public async Task<Result<PageApi<ProductionDto>>> GetProductionData(BOMSearchDto model){RefAsync<int> totalCount = 0;var key = model.Key?.Trim();try{// SQL invar dbResult = await Db.Queryable<MaterialModel, PublicUnits>((f, a) => new JoinQueryInfos(JoinType.Left, f.PublicUnitsId == a.Id)).Where(f => SqlFunc.Subqueryable<SemiProductionBom>().Where(s => s.ProductionId == f.Id).Any()).WhereIF(!string.IsNullOrWhiteSpace(key), f => f.Encode.Contains(key) || f.Name.Contains(key) || f.Description.Contains(key)).Select((f, a) => new ProductionDto{ProductionId = f.Id,ProductionCode = f.Encode,ProductionName = f.Name,ProductionDesc = f.Description,ProductionUintSymbol = a.Symbol}).ToPageListAsync(model.Page, model.Limit, totalCount);return Result<PageApi<ProductionDto>>.IsSuccess(new PageApi<ProductionDto>{Items = dbResult,Total = totalCount});}catch (Exception ex){return Result<PageApi<ProductionDto>>.IsError(ex);}}

只粘了一个service里的实现代码,控制器的代码就不粘了,比较简单。主要是通过连表查询来显示出来bom的信息。加下来是点击编辑进入这条bom下物料的信息。

public async Task<Result<ProductionDto>> GetProductionDataById(int productionId = 0){if (productionId <= 0){return Result<ProductionDto>.IsFailed(message: "请输入有效id!");}var dbResult = await Db.Queryable<MaterialModel, PublicUnits>((f, a) => new JoinQueryInfos(JoinType.Left, f.PublicUnitsId == a.Id)).Where(f => f.Id.Equals(productionId)).Select((f, a) => new ProductionDto{ProductionId = f.Id,ProductionCode = f.Encode,ProductionName = f.Name,ProductionDesc = f.Description,ProductionUintSymbol = a.Symbol}).FirstAsync();if (dbResult == null){return Result<ProductionDto>.IsFailed(message: "未查询到数据!");}return Result<ProductionDto>.IsSuccess(dbResult);}

通过传递过来的id进行查询来实现上半部分的功能,这点应该是比较简单的。
在这里插入图片描述
在视图里面我们获取这条物料的id,然后作为条件传递给红圈选中的方法。

 public async Task<Result<PageApi<ProductionBOMDto>>> GetProductionBOMData(BOMSearchDto model){RefAsync<int> totalCount = 0;try{// SQL invar dbResult = await Db.Queryable<SemiProductionBom, MaterialModel, PublicUnits>((f, a, b) => new JoinQueryInfos(JoinType.Left, f.MaterialId == a.Id,JoinType.Left, a.PublicUnitsId == b.Id)).Where(f => f.ProductionId == model.ProductionId).Select((f, a, b) => new ProductionBOMDto{Id = f.Id,MaterialId=a.Id,MaterialCode = a.Encode,MaterialName = a.Name,MaterialDesc = a.Description,MaterialUintSymbol = b.Symbol,MaterialUsage = f.MaterialUsage,Base = f.Base,MaterialType = f.MaterialType}).ToPageListAsync(model.Page, model.Limit, totalCount);return Result<PageApi<ProductionBOMDto>>.IsSuccess(new PageApi<ProductionBOMDto>{Items = dbResult,Total = totalCount});}catch (Exception ex){return Result<PageApi<ProductionBOMDto>>.IsError(ex);}}

这样做我们可以查到他下面的组成原料的所有信息,点击替代的时候有一点需要注意的是上面部分既要显示所选的这条物料的信息,还要显示出来它的上一级bom名字。

[HttpGet][Display(Name = "视图_半成品BOM物料替代")]public async Task<IActionResult> SemiProductionBOMEditMaterial2(int Id = 0){var dbResult = await _productionBOMService.GetProductionMaterialDataById(Id);Id = dbResult.Data.ProductionId;ViewBag.IsName = await _productionBOMService.GetProductionMaterialDataById2(Id);if (!dbResult.Success){return Json(ResultApi<ProductionBOMDto>.Result(dbResult));}return View(dbResult.Data);}

这样的话我们可以得到bom的id,那么我们需要在service里面在写一个通过bom的id来查询名字的方法,这样就实现了页面上即有原料的信息也有bom的名字。
接下来是查询下面的替代料信息。

public async Task<Result<PageApi<ProductionSubstituteDto>>> GetProductionBOMData2(SearchDto model,int materialId = 0,int productionId = 0){RefAsync<int> totalCount = 0;try{// SQL invar dbResult = await Db.Queryable<MaterialModel, PublicUnits, MaterialSubstitute>((f, a, b) => new JoinQueryInfos(JoinType.Left, f.PublicUnitsId == a.Id,JoinType.Left, f.Id==b.TiDaiId)).Where(f => SqlFunc.Subqueryable<MaterialSubstitute>().Where(s => s.BomId == productionId&&s.YuanLiaoId==materialId&&s.TiDaiId==f.Id).Any()).Select((f, a, b) => new ProductionSubstituteDto{Id = b.Id,ProductionSubstituteCode = f.Encode,ProductionSubstituteName = f.Name,ProductionSubstituteDesc = f.Description,ProductionSubstituteSymbol = a.Symbol,ProductionSubstituteXuHao = b.XuHao}).ToPageListAsync(model.Page, model.Limit, totalCount);//var dbResult = await Db.Queryable<MaterialSubstitute, SemiProductionBom, MaterialModel, PublicUnits>((f, a, b, c) => new JoinQueryInfos(//   JoinType.Left, f.BomId == a.Id,//   JoinType.Left, f.YuanLiaoId == b.Id,//   JoinType.Left, b.PublicUnitsId == c.Id//  ))//  .Where((f, a, b, c) => f.BomId == productionId && f.YuanLiaoId == materialId)//    .Select((f, a, b, c) => new ProductionSubstituteDto//    {//        Id = f.Id,//        ProductionSubstituteCode = b.Encode,//        ProductionSubstituteName = b.Name,//        ProductionSubstituteDesc = b.Description,//        ProductionSubstituteSymbol = c.Symbol,//        ProductionSubstituteXuHao = f.XuHao//    })                    //.ToPageListAsync(model.Page, model.Limit, totalCount);//sql in//var dbResult = Db.Queryable<MaterialModel>().Where(it =>SqlFunc.Subqueryable<MaterialSubstitute>().Where(s => s.TiDaiId == it.Id).Any()).ToList();//原生SQL//var dbResult = Db.Ado.GetDataTable("select * from mtt_Material_Model where TypeId in(select TiDaiId from mtt_Material_Substitute where BomId=@bomid and YuanLiaoId=@yuanliaoid)", new { bomid = productionId, yuanliaoid = materialId });//var Sqlmate = "select * from mtt_Material_Model where TypeId in(select TiDaiId from mtt_Material_Substitute where BomId='" + productionId + "'and YuanLiaoId='" + materialId + "')";//var dbResult = Db.Ado.GetDataTable(Sqlmate);//List<ProductionSubstituteDto> ps = new List<ProductionSubstituteDto>();//ps = ConvertReToList(dbResult);return Result<PageApi<ProductionSubstituteDto>>.IsSuccess(new PageApi<ProductionSubstituteDto>{Items = dbResult,Total = totalCount});}catch (Exception ex){return Result<PageApi<ProductionSubstituteDto>>.IsError(ex);}}

这就用到了SQLSugar中的SQL in用法。代码中也有原生SQL语句,所以我们可以清晰的看出,我们是通过传过来的bom的id和原料的id来去关系表中查替代料的id,然后在拿我们查询到的id去物料表中查询相对应的信息。
这样页面上能看到的功能就可以实现了,还有增加修改就不细说了,但是需要注意一点的就是当你的替代料进行增加和修改的时候,一定不要忘了传bom的id还有物料的id。

切记!!!

兄弟们切记写代码一定要养成一个良好的代码习惯。
第一,一定要写注释;
第二,一定要规范命名。
如果两者都没遵循的话,你会发现你的代码不光乱到别人看不懂,你自己也看不懂。
一定要写注释,写注释,写注释!!!


http://www.ppmy.cn/news/230450.html

相关文章

erp框架 saas_Saas模式ERP系统

Saas 模式 ERP 系统 SAAS 模式 ERP &#xff0c;一凌网最新研发基于 SAAS 模式 ERP 应用管理软件&#xff0c;软件采用先进的面 向对象的四代语言开发&#xff0c;程序采用“ B/S ”模式。这样&#xff0c;既能满足局域网内的高速&#xff0c;也能实 现远程访问。 面向对象&…

ERP系统

ERP是Enterprise Resource Planning&#xff08;企业资源计划&#xff09;的简称&#xff0c;是上个世纪90年代美国一家IT公司根据当时计算机信息、IT技术发展及企业对供应链管理的需求&#xff0c;预测在今后信息时代企业管理信息系统的发展趋势和即将发生变革&#xff0c;而提…

企业资源计划——ERP

目录 ERP概述ERP发展概述订货点法MRP闭环MRPMRP2ERPERP的管理思想 ERP的概念和生产类型 ERP概述 ERP是指建立在IT的基础上&#xff0c;通过标准化的数据和优化的业务操作流程&#xff0c;建立一个涵盖企业内部资源和外部资源的公相集成信息平台&#xff0c;实现将企业的人财物…

CRM和ERP的区别与联系

ERP是企业资源计划的英文缩写&#xff08;Enterprise Resource Planning&#xff09; CRM是客户关系管理的英文缩写&#xff08;Customer Relationship Management&#xff09; 一、CRM和ERP的区别是什么呢&#xff0c;首先要明白的是两者的概念。 ERP是通过提升公司内部资源的…

ERP库存管理

一、物料管理 1、物料管理的重要性 物料管理的特性&#xff1a;相关性、流动性、价值。 物料管理的意义&#xff1a;保证供需链物料畅通、对生产计划的支持与监控、物料的价值意义。 2、物料经理 物料经理的核心&#xff1a;平衡库存水平、保证物料满足生产和市场的需求。 …

ERP项目基础概念整理

目录 前言简介发展历史特征主要功能模块实施优势缺点国内外ERP软件&#xff08;待续&#xff09; 前言 一直在关注ERP这个领域&#xff0c;并且也从事相关的项目。对于ERP这种大而繁的系统&#xff0c;了解也仅限于有限的几个模块&#xff0c;并没有一个全局的观念&#xff0c…

服装ERP管理系统

吉天服装管家erp系统减少了传统ERP软件的操作方式带来的烦琐工作 基础资料无需事先定义设置&#xff0c;系统自动根据单据内容产生 多颜色、多尺码交叉对应&#xff0c;单据样式丰富、详细 产品信息自动匹配查找&#xff0c;大大提高了制单效率 图片存贮方便快捷&#xff0…

国产ERP有没有机会击败SAP ?

国产ERP有没有机会击败SAP &#xff1f; 笔者认为&#xff0c;如果没有中国政府部门的强势支持和帮助&#xff0c;完全凭市场竞争&#xff0c;国产ERP软件系统根本没可能击败SAP。这是过去三十年中国企业信息化建设的实践所证明了的。 对于企业的基本需求而言&#xff0c;国产的…