using System; using System.Linq; using SqlSugar; using Infrastructure.Attribute; using Infrastructure.Extensions; using DOAN.Model; using DOAN.Model.Dto; using DOAN.Repository; using DOAN.Model.MES.mm.Dto; using DOAN.Model.MES.mm; using DOAN.Service.group.IService; using SqlSugar.Extensions; using DOAN.Model.MES.product; using DOAN.Model.MES.base_; using Microsoft.Extensions.Logging; using NPOI; using DOAN.Model.MES.ERP; using DOAN.Service.MES.mm.IService; using Mapster; using Microsoft.AspNetCore.Http.HttpResults; using Infrastructure.Converter; namespace DOAN.Service.MES.mm { /// /// 物料需求计划Service业务层处理 /// [AppService(ServiceType = typeof(IMmRequirePlanService), ServiceLifetime = LifeTime.Transient)] public class MmRequirePlanService : BaseService, IMmRequirePlanService { private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); /// /// 生成物料需求计划 /// /// /// /// public int GenerateMmRequirePlan(DateTime plan_date, string name) { int result = 0; plan_date = plan_date.ToLocalTime().Date; Dictionary need_Materials = new Dictionary(); Dictionary> need_Materials_workOrder = new Dictionary>(); List mmRequirePlans = new List(); //获取当天所有工单 List ProWorkorderList = Context.Queryable().Where(it => it.WorkorderDate == plan_date).ToList(); //优化获取BOM List boms_All = Context.Queryable().Where(it => SqlFunc.Subqueryable().Where(pw => pw.ProductionCode == it.InvCode).Any()).ToList(); if (ProWorkorderList != null && ProWorkorderList.Count > 0) { foreach (var workorder_item in ProWorkorderList) { //遍历每个工单的产品 if (!string.IsNullOrEmpty(workorder_item.ProductionCode)) { //每个产品的原材料 BOM //var query= Context.Queryable().Where(it => it.InvCode == workorder_item.ProductionCode); List boms = boms_All.Where(it => it.InvCode == workorder_item.ProductionCode).ToList(); if (boms != null && boms.Count > 0) { //遍历所有子件 foreach (var item in boms) { float need_num = (workorder_item.DeliveryNum ?? 1) * (float.Parse(item.Iusequantity)); if (need_Materials.ContainsKey(item.SubInvCode)) { float pre_num = need_Materials[item.SubInvCode]; need_Materials[item.SubInvCode] = pre_num + need_num; } else { need_Materials.Add(item.SubInvCode, need_num); } if (need_Materials_workOrder.ContainsKey(item.SubInvCode)) { need_Materials_workOrder[item.SubInvCode].Add(workorder_item.Workorder); } else { need_Materials_workOrder.Add(item.SubInvCode, new HashSet() { workorder_item.Workorder }); } } } } } } if (need_Materials.Count > 0) { string[] SubInvCode = need_Materials.Keys.ToArray(); List baseMaterialList = Context.Queryable().Where(it => SubInvCode.Contains(it.Code)).ToList(); if (baseMaterialList != null && baseMaterialList.Count() > 0) { string[] search_codes = baseMaterialList.Select(it => it.Code).ToArray(); var childDb = Context.AsTenant().GetConnectionWithAttr(); var search_code_List = childDb.Queryable().Where(it => search_codes.Contains(it.InvCode)).ToList(); foreach (var item in baseMaterialList) { decimal IQuantity = search_code_List.Where(it => it.InvCode == item.Code).Select(it => it.IQuantity).FirstOrDefault(); MmRequirePlan mmRequirePlan = new MmRequirePlan(); mmRequirePlan.Id = XueHua; mmRequirePlan.MaterialCode = item.Code; mmRequirePlan.MaterialName = item.Name; mmRequirePlan.RequireNum = (decimal)(need_Materials.TryGetValue(item.Code, out float value) ? value : default(float)); mmRequirePlan.WhQuantity = IQuantity; mmRequirePlan.RequireDate = plan_date; if (mmRequirePlan.RequireNum > mmRequirePlan.WhQuantity) { mmRequirePlan.IsSufficient = 1; } else { mmRequirePlan.IsSufficient = 2; } mmRequirePlan.CreatedBy = name; mmRequirePlan.CreatedTime = DateTime.Now; if (need_Materials_workOrder.ContainsKey(item.Code)) { mmRequirePlan.WorkorderArray = String.Join(", ", need_Materials_workOrder[item.Code].ToArray()); } mmRequirePlans.Add(mmRequirePlan); } } } if (mmRequirePlans.Count > 0) { UseTran2(() => { Context.Deleteable().Where(it => it.RequireDate == plan_date).ExecuteCommand(); result = Context.Insertable(mmRequirePlans).ExecuteCommand(); }); } return result; } /// /// 查询物料需求计划列表 /// /// /// public PagedInfo GetList(MmRequirePlanQueryDto parm) { var predicate = Expressionable.Create() .AndIF(!string.IsNullOrEmpty(parm.MaterialCode), it => it.MaterialCode.Contains(parm.MaterialCode)) .AndIF(!string.IsNullOrEmpty(parm.MaterialName), it => it.MaterialName.Contains(parm.MaterialName)) .AndIF(parm.RequireDate != null && parm.RequireDate > DateTime.MinValue, it => it.RequireDate == parm.RequireDate.Value.ToLocalTime().Date) ; var response = Queryable() .Where(predicate.ToExpression()) .ToPage(parm); if (response != null && response.Result != null && response.Result.Count > 0) { foreach (var item in response.Result) { item.LackQuantity = (item.RequireNum - item.WhQuantity) > 0 ? (item.RequireNum - item.WhQuantity) : 0; } } return response; } /// /// 获取详情 /// /// /// public MmRequirePlan GetInfo(string Id) { var response = Queryable() .Where(x => x.Id == Id) .First(); return response; } /// /// 添加物料需求计划 /// /// /// public MmRequirePlan AddMmRequirePlan(MmRequirePlan model) { model.Id = XueHua; model.RequireDate = model.RequireDate.Value.Date; return Context.Insertable(model).ExecuteReturnEntity(); } /// /// 修改物料需求计划 /// /// /// public int UpdateMmRequirePlan(MmRequirePlan model) { //var response = Update(w => w.Id == model.Id, it => new MmRequirePlan() //{ // MaterialCode = model.MaterialCode, // MaterialName = model.MaterialName, // RequireNum = model.RequireNum, // RequireDate = model.RequireDate, // IsSufficient = model.IsSufficient, // SufficientTime = model.SufficientTime, // CreatedBy = model.CreatedBy, // CreatedTime = model.CreatedTime, // UpdatedBy = model.UpdatedBy, // UpdatedTime = model.UpdatedTime, // Name = model.Name, //}); //return response; return Update(model, true); } /// /// 更新物料状态 /// /// /// /// /// public int UpdateMaterialStatus(string id, int status, string name) { return Context.Updateable().SetColumns(it => it.IsSufficient == status) .SetColumns(it => it.UpdatedBy == name) .SetColumns(it => it.UpdatedTime == DateTime.Now) .Where(it => it.Id == id) .ExecuteCommand(); } public int AllUpdateMaterialStatus(DateTime? handledate, int status, string name) { return Context.Updateable().SetColumns(it => it.IsSufficient == status) .SetColumns(it => it.UpdatedBy == name) .SetColumns(it => it.UpdatedTime == DateTime.Now) .Where(it => it.RequireDate == handledate.Value.ToLocalTime()) .ExecuteCommand(); } /// /// 检测是否可以和ERP库存通讯 /// /// public bool CheckCommunicationERPInventory() { var childDb = Context.AsTenant().GetConnectionWithAttr(); return childDb.Queryable().Any(); } /// /// 根据产线和日期生成物料需求计划 /// /// /// public int GenerateMaterialRequirePlanByline(MmRequirePlanQueryDto2 parm, string CreatedBy) { //查询当日线下所有工单 parm.RequireDate = DOANConvertDateTime.ConvertLocalDate(parm.RequireDate); int result = 0; Dictionary need_Materials = new Dictionary(); Dictionary> need_Materials_workOrder = new Dictionary>(); List mmRequirePlans = new List(); //获取当天所有工单 List ProWorkorderList = Context.Queryable().Where(it => it.LineCode == parm.line_code) .Where(it => it.WorkorderDate == parm.RequireDate).ToList(); if (ProWorkorderList != null && ProWorkorderList.Count > 0) { foreach (var workorder_item in ProWorkorderList) { //遍历每个工单的产品 if (!string.IsNullOrEmpty(workorder_item.ProductionCode)) { //每个产品的原材料 BOM //var query= Context.Queryable().Where(it => it.InvCode == workorder_item.ProductionCode); List boms = Context.Queryable().Where(it => it.InvCode == workorder_item.ProductionCode).ToList(); if (boms != null && boms.Count > 0) { //遍历所有子件 foreach (var item in boms) { float need_num = (workorder_item.DeliveryNum ?? 1) * (float.Parse(item.Iusequantity)); if (need_Materials.ContainsKey(item.SubInvCode)) { float pre_num = need_Materials[item.SubInvCode]; need_Materials[item.SubInvCode] = pre_num + need_num; if (need_Materials.ContainsKey("20102806-Y73-01")) { Console.WriteLine("子20102806-Y73-01--" + workorder_item.ProductionCode+"--"+need_Materials["20102806-Y73-01"]); } } else { need_Materials.Add(item.SubInvCode, need_num); if (need_Materials.ContainsKey("20102806-Y73-01")) { Console.WriteLine("子20102806-Y73-01--" + workorder_item.ProductionCode + "--" + "init" +need_Materials["20102806-Y73-01"]); } } } } } } } //20102901 if (need_Materials.Count > 0) { string[] SubInvCode = need_Materials.Keys.ToArray(); List baseMaterialList = Context.Queryable().Where(it => SubInvCode.Contains(it.Code)).ToList(); if (baseMaterialList != null && baseMaterialList.Count() > 0) { string[] search_codes = baseMaterialList.Select(it => it.Code).ToArray(); foreach (var item in baseMaterialList) { MmRequirePlanByline mmRequirePlan = new MmRequirePlanByline(); mmRequirePlan.Id = XueHua; mmRequirePlan.MaterialCode = item.Code; mmRequirePlan.MaterialName = item.Name; mmRequirePlan.RequireNum = (decimal)(need_Materials.TryGetValue(item.Code, out float value) ? value : default(float)); mmRequirePlan.RequireDate = parm.RequireDate; mmRequirePlan.LineCode = parm.line_code; mmRequirePlan.Color = item.Color; mmRequirePlan.Specification = item.Specification; mmRequirePlan.Unit = item.Unit; mmRequirePlan.CreatedBy = CreatedBy; mmRequirePlan.CreatedTime = DateTime.Now; mmRequirePlans.Add(mmRequirePlan); } } } if (mmRequirePlans.Count > 0) { UseTran2(() => { Context.Deleteable().Where(it => it.RequireDate == parm.RequireDate).WhereIF(!string.IsNullOrEmpty(parm.line_code),it => it.LineCode == parm.line_code).ExecuteCommand(); result = Context.Insertable(mmRequirePlans).ExecuteCommand(); }); } return result; } public PagedInfo GetMaterialRequirePlanByline(MmRequirePlanQueryDto2 parm) { var predicate = Expressionable.Create() .AndIF(!string.IsNullOrEmpty(parm.MaterialCode), it => it.MaterialCode.Contains(parm.MaterialCode)) .AndIF(!string.IsNullOrEmpty(parm.MaterialName), it => it.MaterialName.Contains(parm.MaterialName)) .AndIF(parm.RequireDate != null && parm.RequireDate > DateTime.MinValue, it => it.RequireDate == parm.RequireDate.ToLocalTime().Date) .AndIF(!string.IsNullOrEmpty(parm.line_code), it => it.LineCode == parm.line_code) ; var response = Context.Queryable() .Where(predicate.ToExpression()) .ToPage(parm); return response; } } }