using System; 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; namespace DOAN.Service.group { /// /// 物料需求计划Service业务层处理 /// [AppService(ServiceType = typeof(IMmRequirePlanService), ServiceLifetime = LifeTime.Transient)] public class MmRequirePlanService : BaseService, IMmRequirePlanService { /// /// 生成物料需求计划 /// /// /// /// 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(); 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; } 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(); } } }